@urun-sh/react 0.2.47 → 0.2.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.js +1 -1
- package/dist/auth.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/auth.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var u=Object.defineProperty;var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var c=(e,n)=>{for(var t in n)u(e,t,{get:n[t],enumerable:!0})},p=(e,n,t,_)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of f(n))!U.call(e,o)&&o!==t&&u(e,o,{get:()=>n[o],enumerable:!(_=i(n,o))||_.enumerable});return e};var N=e=>p(u({},"__esModule",{value:!0}),e);var T={};c(T,{authMode:()=>d,urunPublicEnv:()=>s,usesWorkOSAuth:()=>E});module.exports=N(T);function r(e){return e&&e.trim()?e.trim():void 0}function s(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return r(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return r(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return r(typeof process<"u"?process.env?.[e]:void 0)}}function d(){let e=s("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||s("VERCEL_ENV")==="production"?"workos":s("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function E(){return d()==="workos"}0&&(module.exports={authMode,urunPublicEnv,usesWorkOSAuth});
|
package/dist/auth.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function n(e){return e&&e.trim()?e.trim():void 0}function r(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return n(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return n(typeof process<"u"?process.env?.[e]:void 0)}}function o(){let e=r("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||r("VERCEL_ENV")==="production"?"workos":r("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function
|
|
1
|
+
function n(e){return e&&e.trim()?e.trim():void 0}function r(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return n(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return n(typeof process<"u"?process.env?.[e]:void 0)}}function o(){let e=r("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||r("VERCEL_ENV")==="production"?"workos":r("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function s(){return o()==="workos"}export{o as authMode,r as urunPublicEnv,s as usesWorkOSAuth};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
"use strict";var nr=Object.defineProperty;var eo=Object.getOwnPropertyDescriptor;var to=Object.getOwnPropertyNames;var ro=Object.prototype.hasOwnProperty;var no=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},oo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of to(t))!ro.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=eo(t,n))||o.enumerable});return e};var so=e=>oo(nr({},"__esModule",{value:!0}),e);var Oo={};no(Oo,{Audio:()=>Rt,Camera:()=>Cr,ComponentRenderer:()=>cn,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>Ie,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>Tt,Image:()=>bn,ImageFrame:()=>Sn,ImageFrameSchema:()=>hn,MetricsPanel:()=>yn,MetricsPanelSchema:()=>vn,Mic:()=>An,OPERATOR_CHORD_LABEL:()=>Or,OPERATOR_TOKEN_STORAGE_KEY:()=>Ir,ProgressCard:()=>dn,ProgressCardSchema:()=>ln,ReprojectedVideo:()=>on,Session:()=>Gr,StatusBadge:()=>mn,StatusBadgeSchema:()=>pn,TextStream:()=>gn,TextStreamSchema:()=>fn,UrunActivationOverlay:()=>Zt,UrunAudio:()=>En,UrunAuthProvider:()=>or,UrunCamera:()=>Un,UrunControlSender:()=>qn,UrunDocPanel:()=>Vn,UrunErrorBoundary:()=>ze,UrunEventSpine:()=>Hn,UrunIdleWarning:()=>Xn,UrunJwtProvider:()=>Mr,UrunProvider:()=>qr,UrunSessionClock:()=>$n,UrunSessionEnded:()=>Jn,UrunSessionGate:()=>Kn,UrunSessionStatus:()=>jn,UrunSessionWaking:()=>Xt,UrunStreamTail:()=>Dn,UrunVoice:()=>xn,Video:()=>qe,Voice:()=>Pt,authMode:()=>pt,createDocStore:()=>qt,describeSessionPhase:()=>tr.describeSessionPhase,formatPayload:()=>ot,getUrunAudioContext:()=>bt,isWakingPhase:()=>tr.isWakingPhase,parseJsonObject:()=>Wt,pushCapped:()=>Ae,readOperatorToken:()=>sr,registerComponent:()=>an,resumeUrunAudioContext:()=>Ct,urunPublicEnv:()=>Te,useActivation:()=>Gt,useApp:()=>Wr,useChat:()=>Jr,useCompletion:()=>Kr,useConfirmOnLeave:()=>_t,useDocStore:()=>nt,useImageFrame:()=>gr,useInputPresence:()=>Xr,useMetricsPanel:()=>hr,useOperatorOverride:()=>Mt,useProgressCard:()=>pr,useReferenceImage:()=>Mn,useRequest:()=>Br,useSession:()=>Yr,useSessionDoc:()=>On,useSessionEndsAt:()=>Rr,useSessionIdle:()=>Er,useSessionPhase:()=>fe,useSessionTrack:()=>_n,useSessionWake:()=>Jt,useStatusBadge:()=>mr,useStreamMessages:()=>jt,useTextStream:()=>fr,useUrunAudioLevel:()=>Vt,useUrunAuth:()=>At,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Ar});module.exports=so(Oo);var le=require("react");var xr=require("react"),dt=require("react/jsx-runtime"),ze=class extends xr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,dt.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,dt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,dt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var wr=require("react"),Je=(0,wr.createContext)(null);function Ve(e){return e&&e.trim()?e.trim():void 0}function Te(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return Ve(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ve(typeof process<"u"?process.env?.[e]:void 0)}}function pt(){let e=Te("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Te("VERCEL_ENV")==="production"?"workos":Te("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ar(){return pt()==="workos"}var Xe=require("react"),_r=require("react/jsx-runtime"),Ur=(0,Xe.createContext)(null);function or({getAccessToken:e,children:t}){let r=(0,Xe.useMemo)(()=>({getAccessToken:e}),[e]);return(0,_r.jsx)(Ur.Provider,{value:r,children:t})}var Mr=or;function At(){return(0,Xe.useContext)(Ur)}var Ut=require("react"),Ir="urun.operator_token",Lr=null,Nr="op",Or="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Dr(){return typeof window<"u"}function sr(){return Lr}function io(){if(!Dr())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Nr);if(!r)return null;Lr=r,t.delete(Nr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function ao(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Mt(e){let t=(0,Ut.useRef)(e);t.current=e,(0,Ut.useEffect)(()=>{if(!Dr())return;io();let r=o=>{if(!ao(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Vr=require("react");function _t(e=!0){(0,Vr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var Ne=require("react/jsx-runtime"),uo="/api/urun-token",co=1e4;function lo(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Fr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function po(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Ne.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Ne.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ne.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function qr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:R}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(h&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);_t(g);let[m,f]=(0,le.useState)(),[P,C]=(0,le.useState)(null),w=(0,le.useRef)(void 0),S=(0,le.useRef)(null),[y,x]=(0,le.useState)(null);Mt(j=>x({jwt:j}));let T=At(),O=Te("NEXT_PUBLIC_SESSION_TOKEN")??Te("NEXT_PUBLIC_URUN_JWT"),d=pt(),k=y!==null,b=d==="workos"&&!n&&!k&&!h,_=n??(d==="jwt"?O:void 0)??m?.token,H=k?y.jwt:_,X=s??Te("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=b&&!H&&!T?.getAccessToken,N=t??m?.orgId,D=e??m?.gatewayUrl,z=h&&m===void 0,$=h&&m!==void 0&&!D?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,W=I?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,ee=P??$??W,ie=u??uo,te=(0,le.useCallback)(async j=>{if(!j?.forceRefresh){let ce=w.current;if(!ce)return ce;let ae=lo(ce);if(ae===null||ae-Date.now()>co)return ce}return(await(S.current??(S.current=(async()=>{try{let ce=await Fr(ie);return w.current=ce.token,f(ce),ce}finally{S.current=null}})()))).token},[ie]),B=(0,le.useMemo)(()=>({appId:p,baseUrl:D??"",orgId:N??"",jwt:H,getAccessToken:b?T?.getAccessToken:h&&!k?te:void 0,authProvider:X,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,T,D,X,H,i,N,a,c,b,k,h,te]);return(0,le.useEffect)(()=>{if(!h)return;let j=new AbortController;return C(null),(async()=>{try{let re=await Fr(ie,j.signal);w.current=re.token,f(re)}catch(re){if(j.signal.aborted)return;C(re instanceof Error?re:new Error(String(re)))}})(),()=>j.abort()},[h,ie]),(0,Ne.jsx)(ze,{fallback:l,children:ee?po(v,ee):z?(0,Ne.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ne.jsx)(Je.Provider,{value:B,children:R})})}var de=require("react"),Hr=require("@urun-sh/core");function mo(e,t){return`${e}:${JSON.stringify(t??{})}`}function fo(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Fe=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Wr(){let e=(0,de.useContext)(Je);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,de.useReducer)(i=>i+1,0),r=(0,de.useRef)(new Map),o=(0,de.useRef)(new Map),n=(0,de.useRef)(null),s=(0,de.useMemo)(()=>(0,Hr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,de.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Fe.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Fe.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=Fe.get(u);!l||l.refCount!==0||(Fe.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,de.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=mo(u,l),R=r.current.get(v);if(R&&!R.disposed)return R;let h=fo(e,u,l),p=Fe.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Fe.delete(h),o.current.get(h)===p&&o.current.delete(h),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Fe.set(h,p)),o.current.get(h)!==p&&(o.current.set(h,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}var oe=require("react");function Ge(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function go(e){return e instanceof Error?e:new Error(String(e))}function Br(e,t){let r=(0,oe.useMemo)(()=>Ge(e),[e]),[o,n]=(0,oe.useState)(void 0),[s,i]=(0,oe.useState)(null),[a,u]=(0,oe.useState)(!1),c=(0,oe.useRef)(t);c.current=t;let g=(0,oe.useRef)(0),l=(0,oe.useRef)(null),v=(0,oe.useRef)(!0);(0,oe.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let R=(0,oe.useCallback)(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,C=()=>v.current&&g.current===P;C()&&(u(!0),i(null));try{let w=await r.request(m,{...c.current,signal:f.signal});return C()&&(n(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let S=go(w);throw C()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=(0,oe.useCallback)(m=>{R(m).catch(()=>{})},[R]),p=(0,oe.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:R,data:o,error:s,isPending:a,reset:p}}var se=require("react");function jr(e){return e instanceof Error?e:new Error(String(e))}var ho=e=>typeof e=="string"?e:String(e);function Kr(e,t){let r=(0,se.useMemo)(()=>Ge(e),[e]),[o,n]=(0,se.useState)(""),[s,i]=(0,se.useState)(!1),[a,u]=(0,se.useState)(null),c=(0,se.useRef)(t);c.current=t;let g=(0,se.useRef)(0),l=(0,se.useRef)(null),v=(0,se.useRef)(!0);(0,se.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let R=(0,se.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=(0,se.useCallback)(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,P=c.current,C=P?.parseChunk??ho,w=P?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:x,onError:T,...O}=P??{},d="",k;try{k=r.requestStream(w(p),O),l.current=k}catch(b){let _=jr(b);f()&&(u(_),i(!1),P?.onError?.(_));return}try{for await(let b of k){if(g.current!==m)break;d+=C(b),f()&&n(d)}f()&&(i(!1),P?.onFinish?.(d))}catch(b){let _=jr(b);f()&&(u(_),i(!1),P?.onError?.(_))}finally{l.current===k&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:R,isStreaming:s,error:a}}var Y=require("react");function $r(e){return e instanceof Error?e:new Error(String(e))}var So=e=>typeof e=="string"?e:String(e),zr=0;function cr(e){return zr+=1,`${e}-${zr}`}function Jr(e,t){let r=(0,Y.useMemo)(()=>Ge(e),[e]),[o,n]=(0,Y.useState)(()=>(t?.initialMessages??[]).map(C=>({id:C.id??cr("msg"),role:C.role,content:C.content}))),[s,i]=(0,Y.useState)(""),[a,u]=(0,Y.useState)(!1),[c,g]=(0,Y.useState)(null),l=(0,Y.useRef)(t);l.current=t;let v=(0,Y.useRef)(o);v.current=o;let R=(0,Y.useRef)(s);R.current=s;let h=(0,Y.useRef)(0),p=(0,Y.useRef)(null),m=(0,Y.useRef)(!0);(0,Y.useEffect)(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=(0,Y.useCallback)(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=(0,Y.useCallback)(async C=>{let w=C===void 0,S=(w?R.current:C)??"";if(!S.trim())return;p.current?.cancel();let x=++h.current,T=()=>m.current&&h.current===x,O=l.current,d=O?.parseChunk??So,k={id:cr("msg"),role:"user",content:S},b={id:cr("msg"),role:"assistant",content:""},_=[...v.current,k].map(B=>({role:B.role,content:B.content})),H=[...v.current,k,b];v.current=H,n(H),w&&i(""),g(null),u(!0);let X=O?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:D,onFinish:z,onError:$,...W}=O??{},ee=B=>{n(j=>j.map(re=>re.id===b.id?{...re,content:B}:re))},ie="",te;try{te=r.requestStream(X(_),W),p.current=te}catch(B){let j=$r(B);T()&&(g(j),u(!1),O?.onError?.(j));return}try{for await(let B of te){if(h.current!==x)break;ie+=d(B),T()&&ee(ie)}T()&&(u(!1),O?.onFinish?.({...b,content:ie}))}catch(B){let j=$r(B);T()&&(g(j),u(!1),O?.onError?.(j))}finally{p.current===te&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:f,isStreaming:a,error:c}}var G=require("react"),Ye=require("@urun-sh/core"),lr=[];function Xr(e,t={}){let{field:r=Ye.INPUT_PRESENCE_FIELD,hz:o=Ye.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,G.useMemo)(()=>s?(0,Ye.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,G.useRef)(null);a.current=i;let[u,c]=(0,G.useState)(!1),[g,l]=(0,G.useState)(lr),v=(0,G.useRef)(!1);(0,G.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let R=(0,G.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),h=(0,G.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,G.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),h())},x=b=>{S()&&(a.current?.keyDown(b.key),R())},T=b=>{a.current?.keyUp(b.key),R()},O=b=>{S()&&a.current?.movePointer(b.movementX,b.movementY)},d=b=>{S()&&a.current?.setButtons(b.buttons)},k=()=>{h()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",x),n.addEventListener("keyup",T),n.addEventListener("mousemove",O),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",x),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",O),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,h,R]);let p=(0,G.useCallback)(S=>{S.requestPointerLock?.()},[]),m=(0,G.useCallback)(()=>{v.current=!0,c(!0)},[]),f=(0,G.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),P=(0,G.useCallback)(S=>{a.current?.keyDown(S),R()},[R]),C=(0,G.useCallback)(S=>{a.current?.keyUp(S),R()},[R]),w=(0,G.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:P,releaseKey:C,movePointer:w}}var ue=require("react"),nn=require("@urun-sh/core");var L=require("react"),rn=require("@urun-sh/core");var mt=require("react"),Zr=require("react/jsx-runtime"),dr=(0,mt.createContext)(null);function Gr({session:e,children:t}){return(0,Zr.jsx)(dr.Provider,{value:e,children:t})}function Re(){return(0,mt.useContext)(dr)}function Yr(){let e=(0,mt.useContext)(dr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var ft=require("react/jsx-runtime");function vo(e,t){return e-t>>>0<2147483648}var Qr=1e3;function yo(...e){console.debug("[video]",...e)}function en(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function tn(e,t,r){return r?[r,t]:[e,t]}var qe=(0,L.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:R,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:C,onFrameMarkerUnsupported:w}=t,S=Re(),y=o??S,x=(0,L.useRef)(null),T=(0,L.useRef)(null),[O,d]=(0,L.useState)(!1),[k,b]=(0,L.useState)(!1),_=(0,L.useRef)(!1),H=(0,L.useRef)(m);H.current=m;let X=(0,L.useRef)(f);X.current=f;let I=(0,L.useRef)(C);I.current=C;let N=(0,L.useRef)(w);N.current=w;let D=(0,L.useRef)(P??null);D.current=P??null;let z=(0,L.useRef)(null),$=(0,L.useRef)(null),W=(0,L.useCallback)((E,q=!1)=>{if(!q&&E===z.current||(z.current=E,$.current?.(),$.current=null,_.current=!1,b(!1),!E))return;let A=x.current;if(!A)return;let Z=D.current,ne=Z?.rtpTimestamp??null,ke=!1,U=()=>{ke||(ke=!0,N.current?.())};Z&&ne==null&&U();let Pe=Z!=null&&ne!=null,Ee=be=>{$.current?.(),$.current=null,_.current=!0,b(!0),X.current?.(),be&&I.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let be=!1,Ke=0,ut=(Tr,rr)=>{if(!be){if(Pe){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){U(),Ee(!1);return}if(!vo(wt,ne)){Ke=A.requestVideoFrameCallback(ut);return}Ee(!0);return}Ee(!1)}};Ke=A.requestVideoFrameCallback(ut),$.current=()=>{be=!0,A.cancelVideoFrameCallback?.(Ke)};return}Pe&&U();let he=()=>{let be=A.getVideoPlaybackQuality?.();(be?be.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&Ee(!1)};A.addEventListener("loadeddata",he),A.addEventListener("timeupdate",he),A.addEventListener("playing",he),$.current=()=>{A.removeEventListener("loadeddata",he),A.removeEventListener("timeupdate",he),A.removeEventListener("playing",he)},he()},[]);(0,L.useEffect)(()=>()=>{$.current?.(),$.current=null},[]);let ee=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,ie=(0,L.useRef)(ee);(0,L.useEffect)(()=>{if(ie.current===ee||(ie.current=ee,ee==null))return;let E=z.current;E&&W(E,!0)},[ee,W]);let te=(0,L.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let E=x.current;return E&&E.srcObject!==T.current&&(E.srcObject=T.current),T.current},[]),B=(0,L.useCallback)(E=>{let q=x.current;if(!q)return;let A=q.play();!A||typeof A.catch!="function"||A.catch(Z=>yo(`play() failed (${E})`,Z))},[]),j=(0,L.useCallback)(E=>{let q=te();if(q){for(let A of q.getVideoTracks())A!==E&&q.removeTrack(A);if(E&&!q.getVideoTracks().includes(E)){q.addTrack(E);let A=x.current;A&&(A.srcObject=q)}E&&B("track-attach"),d(E!==null),W(E),H.current?.(E)}},[te,B,W]),re=(0,L.useCallback)(E=>{let q=te();if(q){for(let A of q.getAudioTracks())A!==E&&q.removeTrack(A);E&&!q.getAudioTracks().includes(E)&&q.addTrack(E),E&&B("audio-attach")}},[te,B]),ce=(0,L.useCallback)(E=>{x.current=E,E&&(a&&(E.muted=!0,E.defaultMuted=!0,E.setAttribute("muted","")),E.setAttribute("playsinline",""),E.setAttribute("webkit-playsinline",""),te())},[te,a]);(0,L.useImperativeHandle)(r,()=>({get element(){return x.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return _.current}}),[]);let ae=(0,rn.derivedLegRole)(n)!==void 0;(0,L.useEffect)(()=>{ae&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ae,n]);let Me=i!==void 0;return(0,L.useEffect)(()=>{if(Me){j(i??null);return}if(ae){j(null);return}if(!y)return;let E=en(y,tn(n,"video")),q=()=>{let U=T.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==q()&&(j(U),U)){let Pe=()=>{q()===U&&j(null)};U.addEventListener("ended",Pe)}},Z=E.track;Z&&Z.readyState==="live"&&A(Z);let ne=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ke=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{ne(),clearInterval(ke)}},[y,n,ae,Me,i,j]),(0,L.useEffect)(()=>{if(Me||!y||s===!1||ae)return;let E=en(y,tn(n,"audio",s)),q=()=>{let U=T.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==q()&&(re(U),U)){let Pe=()=>{q()===U&&re(null)};U.addEventListener("ended",Pe)}},Z=E.track;Z&&Z.readyState==="live"&&A(Z);let ne=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ke=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{ne(),clearInterval(ke)}},[y,n,ae,s,Me,re]),(0,ft.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":O?"true":"false","data-urun-video-framed":k?"true":"false",children:[(0,ft.jsx)("video",{ref:ce,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),O?null:R,h===void 0?null:(0,ft.jsx)("div",{"data-urun-video-poster":"","aria-hidden":k||void 0,style:{position:"absolute",inset:0,...k?{opacity:0,pointerEvents:"none"}:null},children:h}),p]})});var gt=require("react/jsx-runtime"),ko={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},on=(0,ue.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ue.useRef)(null),R=(0,ue.useRef)(null),h=(0,ue.useRef)(0),p=(0,ue.useRef)(g);p.current=g;let m=(0,ue.useMemo)(()=>(0,nn.createCameraWarp)(p.current),[]);return(0,ue.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return R.current},warp:m,get lastDrawTs(){return h.current}}),[m]),(0,ue.useEffect)(()=>{if(!i)return;let f=0,P=0,C=null,w=y=>{typeof y.requestVideoFrameCallback=="function"&&(C=y,P=y.requestVideoFrameCallback(function x(){m.frameArrived(),P=y.requestVideoFrameCallback(x)}))},S=y=>{f=requestAnimationFrame(S);let x=R.current,T=v.current?.element??null;if(!x||!T||(T!==C&&(C&&P&&C.cancelVideoFrameCallback?.(P),w(T)),T.readyState<2))return;m.tick(y);let O=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(x.clientWidth*O)),k=Math.max(1,Math.round(x.clientHeight*O));(x.width!==d||x.height!==k)&&(x.width=d,x.height=k);let b=x.getContext("2d");if(!b)return;let _=m.transform(),H=T.videoWidth||d,X=T.videoHeight||k,N=Math.max(d/H,k/X)*(1+a)*_.scale;b.setTransform(N,0,0,N,d/2+_.translateX*d,k/2+_.translateY*k),b.drawImage(T,-H/2,-X/2),h.current=y};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),C&&P&&C.cancelVideoFrameCallback?.(P)}},[i,a,m]),(0,ue.useEffect)(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=x=>{f()&&m.keyDown(x.key)},C=x=>m.keyUp(x.key),w=x=>{f()&&m.pointerDelta(x.movementX,x.movementY)},S=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",C),l.addEventListener("mousemove",w),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",C),l.removeEventListener("mousemove",w),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,m]),i?(0,gt.jsxs)(qe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,gt.jsx)("canvas",{ref:R,style:ko,"data-urun-warp":""}),n]}):(0,gt.jsx)(qe,{ref:v,...s,children:n})});var sn=new Map;function an(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);sn.set(e,{component:t,schema:r})}function un(e,t){let r=sn.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var He=require("react/jsx-runtime");function cn({name:e,props:t,fallback:r}){let o=un(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,He.jsx)(He.Fragment,{children:r}):(0,He.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,He.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,He.jsx)(n,{...o.validatedProps})}var Ze=require("zod"),We=require("react/jsx-runtime"),ln=Ze.z.object({step:Ze.z.number().min(0),total:Ze.z.number().min(1),label:Ze.z.string().optional(),variant:Ze.z.enum(["default","success","error"]).default("default")});function pr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function dn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,We.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,We.jsx)("div",{className:"urun-progress-label",children:o}),(0,We.jsx)("div",{className:"urun-progress-bar",children:(0,We.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,We.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Nt=require("zod"),ht=require("react/jsx-runtime"),pn=Nt.z.object({state:Nt.z.enum(["thinking","generating","idle","error"]),message:Nt.z.string().optional()}),bo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??bo[t]??t;return{state:t,message:n,isActive:o}}function mn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,ht.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,ht.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,ht.jsx)("span",{className:"urun-status-message",children:r})]})}var St=require("react"),It=require("zod"),vt=require("react/jsx-runtime"),fn=It.z.object({text:It.z.string(),streaming:It.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function gn(e){let{text:t,streaming:r}=fr(e),o=(0,St.useRef)(null),n=(0,St.useRef)(0);return(0,St.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,vt.jsxs)("div",{className:"urun-text-stream",children:[(0,vt.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,vt.jsx)("span",{className:"urun-text-cursor"})]})}var yt=require("zod"),kt=require("react/jsx-runtime"),hn=yt.z.object({src:yt.z.string().url(),alt:yt.z.string().optional(),caption:yt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Sn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,kt.jsxs)("figure",{className:"urun-image-frame",children:[(0,kt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,kt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var xe=require("zod"),Qe=require("react/jsx-runtime"),vn=xe.z.object({metrics:xe.z.array(xe.z.object({label:xe.z.string(),value:xe.z.union([xe.z.string(),xe.z.number()]),unit:xe.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function yn(e){let{metrics:t}=hr(e);return(0,Qe.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Qe.jsxs)("div",{className:"urun-metric-card",children:[(0,Qe.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Qe.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var kn=require("react");var Cn=require("react/jsx-runtime"),bn=(0,kn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Cn.jsx)(qe,{ref:r,stream:o,...n})});var J=require("react"),Pn=require("@urun-sh/core");var Lt=null;function Co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function bt(){if(Lt)return Lt;let e=Co();return e?(Lt=new e,Lt):null}function Ct(){let e=bt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Tn=require("react/jsx-runtime"),Ro=1e3,Rn=200;function Sr(...e){console.debug("[audio]",...e)}var Rt=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=Re(),v=o??l,R=(0,J.useRef)(null),h=(0,J.useRef)(null),p=(0,J.useRef)(null),m=(0,J.useRef)(null),f=(0,J.useRef)(u);f.current=u;let P=(0,J.useRef)(c);P.current=c;let C=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,P.current?.(d))},[]),w=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=R.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=(0,J.useCallback)(d=>{let k=R.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||C(!0)}).catch(_=>{let H=_ instanceof Error?_.name:String(_);if(H==="AbortError"){Sr(`play() aborted (${d}); retrying in ${Rn}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Rn);return}if(H==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),C(!1);return}Sr(`play() failed (${d})`,_)})},[C]),y=(0,J.useCallback)(d=>{let k=w();if(k){for(let b of k.getAudioTracks())b!==d&&k.removeTrack(b);d&&!k.getAudioTracks().includes(d)&&k.addTrack(d),d&&S("track-attach"),f.current?.(d)}},[w,S]),x=(0,J.useCallback)(()=>{let d=R.current;d&&(w(),d.muted=!1,S("gesture"),Ct(),C(!0))},[w,S,C]);(0,J.useImperativeHandle)(r,()=>({unlock:x,get unlocked(){return p.current===!0},get element(){return R.current}}),[x]);let T=(0,J.useCallback)(d=>{R.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),w()),g?.(d)},[w,g]),O=s!==void 0;return(0,J.useEffect)(()=>{if(O){y(s??null);return}if(!v)return;let d=v.stream(n),k=()=>{let I=h.current;return I?I.getAudioTracks()[0]??null:null},b=I=>{if(I!==k()&&(y(I),I)){let N=()=>{k()===I&&y(null)};I.addEventListener("ended",N)}},_=d.track;_&&_.readyState==="live"&&b(_);let H=d.on("track",I=>{I&&I.readyState!=="live"||b(I)}),X=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&b(I)},Ro);return()=>{H(),clearInterval(X)}},[v,n,O,s,y]),(0,J.useEffect)(()=>(0,Pn.observePageLifecycle)(()=>{Ct(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{m.current&&clearTimeout(m.current)},[]),(0,Tn.jsx)("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),En=Rt;var K=require("react"),et=require("@urun-sh/core");var wn=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ot(...e){console.debug("[voice]",...e)}var Pt=(0,K.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:R,onUnlockChange:h,capture:p}=t,m=Re(),f=o??m,P=(0,K.useRef)(null),C=(0,K.useRef)(null),w=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),x=(0,K.useRef)(g);x.current=g;let T=(0,K.useRef)(l);T.current=l;let O=(0,K.useRef)(v);O.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,x.current?.(N))},[]),k=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],w.current?.release(),w.current=null,C.current&&(C.current=null,O.current?.(null))},[]),b=(0,K.useCallback)(async()=>{let N=w.current;if(N){let W=await N.update(i);return C.current=N.stream,O.current?.(N.stream),W}let z=await(p??(0,et.sharedCaptureController)()).claim("audio",i);w.current=z,S.current=[z.onTrack((W,ee)=>{C.current=ee,O.current?.(ee),y.current&&f?.stream(n).attach(W).catch(ie=>Ot("mic re-attach after one-capture re-acquire failed",ie))}),z.onLost(W=>{w.current=null,S.current=[],C.current=null,O.current?.(null),d(!1),T.current?.(W)})],C.current=z.stream,O.current?.(z.stream);let $=z.track;if(!$)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return $},[p,i,f,n,d]),_=(0,K.useCallback)(async()=>{k(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,k,d]),H=(0,K.useCallback)(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let N;try{N=await b()}catch($){k();let W=(0,et.sessionFailureFromMediaError)($,f.status);throw T.current?.(W),W}f.connect?.();let D;for(let $=1;$<=u;$++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(N),d(!0);return}catch(W){D=W,Ot(`start attempt ${$}/${u} failed`,W),$<u&&await new Promise(ee=>setTimeout(ee,c))}k(),d(!1);let z=D instanceof Error?D:new Error(String(D??"voice start failed"));throw T.current?.(z),z},[f,n,a,u,c,b,k,d]);(0,K.useImperativeHandle)(r,()=>({start:H,stop:_,unlock:()=>P.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return P.current}}),[H,_]);let X=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!f||!y.current||X.current)return;let N=C.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await f.stream(n).attach(N)}catch(D){Ot("foreground mic re-assert failed (will retry on next pass)",D)}return}X.current=!0;try{let D=await b();await f.stream(n).attach(D)}catch(D){let z=D instanceof Error?D:new Error(String(D));Ot("foreground mic re-acquire failed",z),T.current?.(z)}finally{X.current=!1}},[f,n,b]);return(0,K.useEffect)(()=>{let N=()=>{I()};return f&&typeof f.onRecovery=="function"?f.onRecovery(N):(0,et.observePageLifecycle)(N)},[f,I]),(0,K.useEffect)(()=>k,[k]),s?(0,wn.jsx)(Rt,{ref:P,session:f,stream:n,onTrack:R,onUnlockChange:h}):null}),xn=Pt;var ve=require("react");var Dt=require("react");var yr={level:0,speaking:!1};function Vt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Dt.useState)(yr);return(0,Dt.useEffect)(()=>{if(!e){i(yr);return}let a=bt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),R=setInterval(()=>{g.getByteTimeDomainData(l);let h=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;h+=f*f}let p=Math.sqrt(h/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(R),c.disconnect(),i(yr)}},[e,r,o,n]),s}var we=require("react/jsx-runtime"),Po={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Eo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},An=(0,ve.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,R=Re(),h=o??R,p=(0,ve.useRef)(null),[m,f]=(0,ve.useState)(null),P=(0,ve.useRef)(l);P.current=l;let{level:C,speaking:w}=Vt(a?m:null);return(0,ve.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,ve.useEffect)(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),(0,we.jsxs)(we.Fragment,{children:[(0,we.jsx)(Pt,{ref:p,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:S=>{f(S),P.current?.(S)}}),a?(0,we.jsx)("span",{className:u,style:Po,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":w?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(C*100)/100,children:(0,we.jsx)("span",{style:Eo,children:(0,we.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var tt=require("@urun-sh/core"),M=require("react");var me=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function To(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function xo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Cr=(0,M.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:R,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:C,capture:w,flipControl:S="auto",flipControlClassName:y,onDevices:x}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",O=Re(),d=o??O,k=(0,M.useRef)(null),b=(0,M.useRef)(null),_=(0,M.useRef)(null),H=(0,M.useRef)([]),X=(0,M.useRef)(null),I=(0,M.useRef)(!1),N=(0,M.useRef)(!1),D=(0,M.useRef)(T),[z,$]=(0,M.useState)(T),[W,ee]=(0,M.useState)(!1),[ie,te]=(0,M.useState)(null),[B,j]=(0,M.useState)(!1),[re]=(0,M.useState)(To),ce=(0,M.useRef)(p);ce.current=p;let ae=(0,M.useRef)(m);ae.current=m;let Me=(0,M.useRef)(f);Me.current=f;let E=(0,M.useRef)(P);E.current=P;let q=(0,M.useRef)(x);q.current=x;let A=(0,M.useCallback)(V=>{I.current!==V&&(I.current=V,ee(V),ce.current?.(V))},[]);(0,M.useEffect)(()=>{if(!W){te(null);return}let V=!1,F=()=>{xo().then(Ce=>{V||(te(Ce),Ce&&q.current?.(Ce))})};F();let Se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Se?.addEventListener=="function"?(Se.addEventListener("devicechange",F),()=>{V=!0,Se.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[W]);let Z=(0,M.useCallback)(V=>{let F=k.current;F&&(F.muted=!0,F.defaultMuted=!0,F.setAttribute("muted",""),F.setAttribute("playsinline",""),F.setAttribute("webkit-playsinline",""),F.srcObject=V,V&&F.play()?.catch?.(Se=>kr("preview play() failed",Se)))},[]),ne=(0,M.useCallback)(()=>{N.current=!1,X.current?.(),X.current=null;for(let V of H.current)V();H.current=[],_.current?.release(),_.current=null,b.current&&(b.current=null,Me.current?.(null),E.current?.(null)),Z(null)},[Z]),ke=(0,M.useCallback)((V,F)=>{X.current?.(),b.current=F,Z(F),Me.current?.(F);let Se=()=>{b.current===F&&(kr("camera track ended (device removed or permission revoked)"),ne(),A(!1))};V.addEventListener("ended",Se),X.current=()=>V.removeEventListener("ended",Se)},[Z,ne,A]),U=(0,M.useCallback)(async V=>{let F=n!==!1;if(F&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let Se={...br,...s,facingMode:V},Ce;try{let _e=_.current;if(_e)Ce=await _e.update(Se);else{let ct=await(w??(0,tt.sharedCaptureController)()).claim("video",Se);if(_.current=ct,H.current=[ct.onTrack((lt,Zn)=>{ke(lt,Zn),I.current&&(!F||!d||d.stream(n).attachVideo(lt).then(()=>E.current?.(lt)).catch(Qn=>kr("camera re-publish after one-capture re-acquire failed",Qn)))}),ct.onLost(lt=>{_.current=null,H.current=[],ne(),A(!1),ae.current?.(lt)})],!ct.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ct.track}}catch(_e){let $e=(0,tt.sessionFailureFromMediaError)(_e,d?.status);throw ae.current?.($e),$e}D.current=V,$(V),ke(Ce,_.current?.stream??new MediaStream([Ce]));try{F&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=F?n:!1}catch(_e){ne(),A(!1);let $e=_e instanceof Error?_e:new Error(String(_e));throw ae.current?.($e),$e}E.current?.(Ce),A(!0)},[d,n,s,l,w,ke,ne,A]),Pe=(0,M.useCallback)(V=>U(V?.facingMode??D.current),[U]),Ee=(0,M.useCallback)(async V=>{let F=N.current===n;I.current&&D.current===V&&F||await U(V)},[U,n]),he=(0,M.useCallback)(()=>U(D.current==="environment"?"user":"environment"),[U]),be=(0,M.useCallback)(async()=>{ne(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,ne,A]),Ke=(0,M.useCallback)(async V=>{let F=k.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,tt.captureStillFromVideo)(F,V)},[]);(0,M.useImperativeHandle)(r,()=>({start:Pe,stop:be,flip:he,setFacingMode:Ee,capturePhoto:Ke,get active(){return I.current},get facingMode(){return D.current},get stream(){return b.current},get element(){return k.current}}),[Pe,be,he,Ee,Ke]);let ut=(0,M.useRef)(Ee);if(ut.current=Ee,(0,M.useEffect)(()=>{c&&(n!==!1&&!d||ut.current(T).catch(()=>{}))},[c,d,T,n]),(0,M.useEffect)(()=>ne,[ne]),!v)return null;let Tr=g==="auto"?z==="user":g,rr=W&&(S===!0||S==="auto"&&re&&(ie?.length??0)>1),wt=()=>{B||(j(!0),he().catch(()=>{}).finally(()=>j(!1)))};return(0,me.jsxs)("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":z,children:[(0,me.jsx)("video",{ref:k,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Tr?{transform:"scaleX(-1)"}:{}}}),rr?(0,me.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:wt,disabled:B,className:y,style:y?{opacity:B?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:B?.6:1},children:(0,me.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,me.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,me.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,me.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,me.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,me.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),Un=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,me.jsx)(Cr,{ref:o,...r,visible:t,autoStart:!1})});var rt=require("@urun-sh/core"),Q=require("react");function Mn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,Q.useState)(null),[a,u]=(0,Q.useState)(null),[c,g]=(0,Q.useState)(!1),[l,v]=(0,Q.useState)(null),[R]=(0,Q.useState)(rt.cameraCaptureAvailable),h=(0,Q.useRef)(n);h.current=n;let p=(0,Q.useRef)(null),m=(0,Q.useRef)(0),f=(0,Q.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),h.current?.(y)},[]);(0,Q.useEffect)(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=(0,Q.useCallback)(async y=>{let x=++m.current;g(!0),v(null);try{let T=await y();if(m.current!==x)return;f(T)}catch(T){if(m.current!==x)return;v((0,rt.referenceImageErrorMessage)(T))}finally{m.current===x&&g(!1)}},[f]),C=(0,Q.useCallback)(y=>P(()=>(0,rt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),w=(0,Q.useCallback)(y=>P(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),S=(0,Q.useCallback)(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:C,capture:w,clear:S,busy:c,error:l,cameraAvailable:R}}var Ft=require("react");function _n(e,t){let[r,o]=(0,Ft.useState)(null);return(0,Ft.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Ln=require("react");var Ht=require("react");var Nn=require("zustand/vanilla"),In=require("zustand"),wo=()=>{};function qt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Nn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):wo,u=(c=>(0,In.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function nt(e,t){let r=(0,Ht.useMemo)(()=>qt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Ht.useEffect)(()=>r.bind(),[r]),r}function On(e,t,r){let n=nt(e,t)(r??(a=>a)),s=(0,Ln.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var Bt=require("react");var Ie=200;function Ae(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ot(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function jt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Bt.useState)([]);return(0,Bt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Ae(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ye=require("react/jsx-runtime");function Dn({session:e,name:t,cap:r,className:o}){let n=jt(e,t,{cap:r});return(0,ye.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ye.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ye.jsx)("code",{children:t}),(0,ye.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ye.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ye.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ye.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ye.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ye.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ot(s.payload)]},`${s.at}-${i}`))})]})}var Et=require("react");var pe=require("react/jsx-runtime");function Tt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Et.useState)(""),[i,a]=(0,Et.useState)(null),u=(0,Et.useCallback)(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,pe.jsxs)("div",{className:"urun-doc-patch",children:[(0,pe.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,pe.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,pe.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,pe.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Vn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=nt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,pe.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,pe.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,pe.jsx)("code",{children:t}),(0,pe.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,pe.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,pe.jsx)(Tt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Kt=require("react");var Ue=require("react/jsx-runtime");function Fn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function qn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Kt.useState)([]);return(0,Kt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Ae(u,{at:Date.now(),direction:"in",text:Fn(ot(a))},r))}):void 0),[e,t,r]),(0,Ue.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ue.jsx)(Tt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ae(u,{at:Date.now(),direction:"out",text:Fn(a)},r))}}),(0,Ue.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ue.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ue.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ue.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ue.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var $t=require("react");var Be=require("react/jsx-runtime");function Hn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,$t.useState)([]),a=t.join(","),u=r.join(",");return(0,$t.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(R=>Ae(R,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",R=>c("track",`${l}: ${R?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Be.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Be.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>(0,Be.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Be.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Be.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var Qt=require("@urun-sh/core");var zt=require("react");function fe(e){let[t,r]=(0,zt.useState)(e?.phase??null);return(0,zt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Bn=require("@urun-sh/core");var st=require("react"),Wn=require("@urun-sh/core");function Jt(e){let t=fe(e),r=(0,Wn.isWakingPhase)(t?.name),o=(0,st.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,st.useState)(s);return(0,st.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Le=require("react/jsx-runtime");function Xt({session:e,render:t,className:r}){let o=Jt(e);return!o.waking||!o.phase?null:(0,Le.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)("span",{className:"urun-session-waking-label",children:(0,Bn.describeSessionPhase)(o.phase)})," ",(0,Le.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Yt=require("react");var Oe=require("react"),Ao={event:null,elapsedMs:0};function Gt(e,t){let[r,o]=(0,Oe.useState)(null),n=(0,Oe.useRef)(0);(0,Oe.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,Oe.useState)(0);return(0,Oe.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ao}var it=require("react/jsx-runtime"),Uo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Mo(e){let[t,r]=(0,Yt.useState)(!1);return(0,Yt.useEffect)(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Gt(e,t),i=Mo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,it.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,it.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,it.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Uo[u]})," ",(0,it.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ge=require("react/jsx-runtime"),_o={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function jn({session:e,className:t}){let r=fe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,ge.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ge.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ge.jsx)("span",{className:"urun-session-status-label",children:_o[o]}),n?(0,ge.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Kn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=fe(e);if(s?.name==="live")return(0,ge.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ge.jsx)(Zt,{session:e})]});let i=r?r(s):(0,ge.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Qt.isWakingPhase)(s.name)?(0,ge.jsx)(Xt,{session:e}):s&&s.name!=="idle"?(0,Qt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ge.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ge.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var er=require("react");var zn=require("react/jsx-runtime");function Rr(e){return fe(e)?.endsAt??null}function No(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function $n({session:e,urgentMs:t=6e4,className:r}){let n=Rr(e)?.getTime()??null,[s,i]=(0,er.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,er.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=No(s);return(0,zn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var xt=require("react/jsx-runtime"),Io=new Set(["expired","ended","error"]);function Jn({session:e,onNewSession:t,children:r,className:o}){let n=fe(e);if(!n||!Io.has(n.name))return null;let s=r?r(n):(0,xt.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,xt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,xt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var De=require("react"),je=require("react/jsx-runtime");function Pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Er(e){let t=(0,De.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,De.useState)(()=>t?Pr(t.get("idle")):null);return(0,De.useEffect)(()=>{if(!t){o(null);return}return o(Pr(t.get("idle"))),t.on("change",()=>o(Pr(t.get("idle"))))},[t]),r}function Lo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Xn({session:e,onStillHere:t,className:r}){let o=Er(e),n=o?.deadlineEpochS??null,[s,i]=(0,De.useState)(null);if((0,De.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,je.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,je.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,je.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,je.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Lo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,je.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var at=require("react"),Gn=require("@urun-sh/core");function Yn(e){let t=(0,at.useContext)(Je),[r,o]=(0,at.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return(0,at.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,R=()=>{(0,Gn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};R();let h=setInterval(R,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[n,s,i,a,u,c,g,l]),r}var tr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var or=Object.defineProperty;var to=Object.getOwnPropertyDescriptor;var ro=Object.getOwnPropertyNames;var no=Object.prototype.hasOwnProperty;var oo=(e,t)=>{for(var r in t)or(e,r,{get:t[r],enumerable:!0})},so=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ro(t))!no.call(e,n)&&n!==r&&or(e,n,{get:()=>t[n],enumerable:!(o=to(t,n))||o.enumerable});return e};var io=e=>so(or({},"__esModule",{value:!0}),e);var Do={};oo(Do,{Audio:()=>Et,Camera:()=>Rr,ComponentRenderer:()=>ln,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>Ie,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>wt,Image:()=>Rn,ImageFrame:()=>vn,ImageFrameSchema:()=>Sn,MetricsPanel:()=>kn,MetricsPanelSchema:()=>yn,Mic:()=>An,OPERATOR_CHORD_LABEL:()=>Or,OPERATOR_TOKEN_STORAGE_KEY:()=>Ir,ProgressCard:()=>pn,ProgressCardSchema:()=>dn,ReprojectedVideo:()=>sn,Session:()=>Yr,StatusBadge:()=>fn,StatusBadgeSchema:()=>mn,TextStream:()=>hn,TextStreamSchema:()=>gn,UrunActivationOverlay:()=>Qt,UrunAudio:()=>Tn,UrunAuthProvider:()=>mt,UrunCamera:()=>Mn,UrunControlSender:()=>Hn,UrunDocPanel:()=>Fn,UrunErrorBoundary:()=>Xe,UrunEventSpine:()=>Wn,UrunIdleWarning:()=>Gn,UrunJwtProvider:()=>Mr,UrunProvider:()=>Hr,UrunSessionClock:()=>Xn,UrunSessionEnded:()=>Jn,UrunSessionGate:()=>$n,UrunSessionStatus:()=>Kn,UrunSessionWaking:()=>Gt,UrunStreamTail:()=>Vn,UrunVoice:()=>xn,Video:()=>qe,Voice:()=>Pt,authMode:()=>pt,createDocStore:()=>Ht,describeSessionPhase:()=>rr.describeSessionPhase,formatPayload:()=>ot,getUrunAudioContext:()=>Rt,isWakingPhase:()=>rr.isWakingPhase,parseJsonObject:()=>Bt,pushCapped:()=>Me,readOperatorToken:()=>sr,registerComponent:()=>un,resumeUrunAudioContext:()=>Ct,urunPublicEnv:()=>ve,useActivation:()=>Yt,useApp:()=>Br,useChat:()=>Jr,useCompletion:()=>$r,useConfirmOnLeave:()=>Nt,useDocStore:()=>nt,useImageFrame:()=>gr,useInputPresence:()=>Gr,useMetricsPanel:()=>hr,useOperatorOverride:()=>_t,useProgressCard:()=>pr,useReferenceImage:()=>_n,useRequest:()=>jr,useSession:()=>Zr,useSessionDoc:()=>Dn,useSessionEndsAt:()=>Cr,useSessionIdle:()=>Pr,useSessionPhase:()=>me,useSessionTrack:()=>Nn,useSessionWake:()=>Jt,useStatusBadge:()=>mr,useStreamMessages:()=>Kt,useTextStream:()=>fr,useUrunAudioLevel:()=>Ft,useUrunAuth:()=>At,useUrunPrewake:()=>Zn,usesWorkOSAuth:()=>Ur});module.exports=io(Do);var ae=require("react");var wr=require("react"),dt=require("react/jsx-runtime"),Xe=class extends wr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,dt.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,dt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,dt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var xr=require("react"),ze=(0,xr.createContext)(null);function we(e){return e&&e.trim()?e.trim():void 0}function ve(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return we(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return we(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return we(typeof process<"u"?process.env?.[e]:void 0)}}function pt(){let e=ve("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ve("VERCEL_ENV")==="production"?"workos":ve("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ur(){return pt()==="workos"}var Je=require("react"),_r=require("react/jsx-runtime"),Ar=(0,Je.createContext)(null);function mt({getAccessToken:e,children:t}){let r=(0,Je.useMemo)(()=>({getAccessToken:e}),[e]);return(0,_r.jsx)(Ar.Provider,{value:r,children:t})}var Mr=mt;function At(){return(0,Je.useContext)(Ar)}var Mt=require("react"),Ir="urun.operator_token",Lr=null,Nr="op",Or="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Dr(){return typeof window<"u"}function sr(){return Lr}function ao(){if(!Dr())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Nr);if(!r)return null;Lr=r,t.delete(Nr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function uo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function _t(e){let t=(0,Mt.useRef)(e);t.current=e,(0,Mt.useEffect)(()=>{if(!Dr())return;ao();let r=o=>{if(!uo(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Vr=require("react");function Nt(e=!0){(0,Vr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var xe=require("react/jsx-runtime"),co="/api/urun-token",lo=1e4;function po(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Fr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function qr(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 mo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,xe.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,xe.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,xe.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Hr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:C}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(h&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Nt(g);let[m,f]=(0,ae.useState)(),[P,E]=(0,ae.useState)(null),U=(0,ae.useRef)(void 0),S=(0,ae.useRef)(null),[k,x]=(0,ae.useState)(null);_t(oe=>x({jwt:oe}));let T=At(),D=ve("NEXT_PUBLIC_SESSION_TOKEN")??ve("NEXT_PUBLIC_URUN_JWT"),d=pt(),b=k!==null,R=d==="workos"&&!n&&!b&&!h,_=n??(d==="jwt"?D:void 0)??m?.token,V=b?k.jwt:_,z=s??ve("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),L=R&&!V&&!T?.getAccessToken,N=t??m?.orgId,F=e??m?.gatewayUrl,$=h&&m===void 0,K=h&&m!==void 0&&!F?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,B=L?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,ee=P??K??B,ie=qr("NEXT_PUBLIC_URUN_TOKEN_URL",ve("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??co,te=qr("NEXT_PUBLIC_URUN_EVENTS_URL",ve("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,W=(0,ae.useCallback)(async oe=>{if(!oe?.forceRefresh){let I=U.current;if(!I)return I;let w=po(I);if(w===null||w-Date.now()>lo)return I}return(await(S.current??(S.current=(async()=>{try{let I=await Fr(ie);return U.current=I.token,f(I),I}finally{S.current=null}})()))).token},[ie]),Y=(0,ae.useCallback)(async()=>V,[V]),ge=typeof V=="string"&&V.trim().length>0,Ve=R?T?.getAccessToken:h&&!b?W:ge?Y:void 0,ce=(0,ae.useMemo)(()=>({appId:p,baseUrl:F??"",orgId:N??"",jwt:V,getAccessToken:R?T?.getAccessToken:h&&!b?W:void 0,authProvider:z,eventsUrl:te,sessionKey:a,releaseOnLeave:c,priority:b?"preempt":void 0}),[p,T,F,z,V,te,N,a,c,R,b,h,W]);return(0,ae.useEffect)(()=>{if(!h)return;let oe=new AbortController;return E(null),(async()=>{try{let y=await Fr(ie,oe.signal);U.current=y.token,f(y)}catch(y){if(oe.signal.aborted)return;E(y instanceof Error?y:new Error(String(y)))}})(),()=>oe.abort()},[h,ie]),(0,xe.jsx)(Xe,{fallback:l,children:ee?mo(v,ee):$?(0,xe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,xe.jsx)(ze.Provider,{value:ce,children:Ve?(0,xe.jsx)(mt,{getAccessToken:Ve,children:C}):C})})}var le=require("react"),Wr=require("@urun-sh/core");function fo(e,t){return`${e}:${JSON.stringify(t??{})}`}function go(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Fe=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Br(){let e=(0,le.useContext)(ze);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,le.useReducer)(i=>i+1,0),r=(0,le.useRef)(new Map),o=(0,le.useRef)(new Map),n=(0,le.useRef)(null),s=(0,le.useMemo)(()=>(0,Wr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,le.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Fe.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Fe.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=Fe.get(u);!l||l.refCount!==0||(Fe.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,le.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=fo(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let h=go(e,u,l),p=Fe.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Fe.delete(h),o.current.get(h)===p&&o.current.delete(h),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Fe.set(h,p)),o.current.get(h)!==p&&(o.current.set(h,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}var ne=require("react");function Ge(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function ho(e){return e instanceof Error?e:new Error(String(e))}function jr(e,t){let r=(0,ne.useMemo)(()=>Ge(e),[e]),[o,n]=(0,ne.useState)(void 0),[s,i]=(0,ne.useState)(null),[a,u]=(0,ne.useState)(!1),c=(0,ne.useRef)(t);c.current=t;let g=(0,ne.useRef)(0),l=(0,ne.useRef)(null),v=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=(0,ne.useCallback)(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,E=()=>v.current&&g.current===P;E()&&(u(!0),i(null));try{let U=await r.request(m,{...c.current,signal:f.signal});return E()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let S=ho(U);throw E()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=(0,ne.useCallback)(m=>{C(m).catch(()=>{})},[C]),p=(0,ne.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}var se=require("react");function Kr(e){return e instanceof Error?e:new Error(String(e))}var So=e=>typeof e=="string"?e:String(e);function $r(e,t){let r=(0,se.useMemo)(()=>Ge(e),[e]),[o,n]=(0,se.useState)(""),[s,i]=(0,se.useState)(!1),[a,u]=(0,se.useState)(null),c=(0,se.useRef)(t);c.current=t;let g=(0,se.useRef)(0),l=(0,se.useRef)(null),v=(0,se.useRef)(!0);(0,se.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=(0,se.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=(0,se.useCallback)(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,P=c.current,E=P?.parseChunk??So,U=P?.buildPayload??(R=>({prompt:R}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:k,onFinish:x,onError:T,...D}=P??{},d="",b;try{b=r.requestStream(U(p),D),l.current=b}catch(R){let _=Kr(R);f()&&(u(_),i(!1),P?.onError?.(_));return}try{for await(let R of b){if(g.current!==m)break;d+=E(R),f()&&n(d)}f()&&(i(!1),P?.onFinish?.(d))}catch(R){let _=Kr(R);f()&&(u(_),i(!1),P?.onError?.(_))}finally{l.current===b&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:C,isStreaming:s,error:a}}var G=require("react");function Xr(e){return e instanceof Error?e:new Error(String(e))}var vo=e=>typeof e=="string"?e:String(e),zr=0;function cr(e){return zr+=1,`${e}-${zr}`}function Jr(e,t){let r=(0,G.useMemo)(()=>Ge(e),[e]),[o,n]=(0,G.useState)(()=>(t?.initialMessages??[]).map(E=>({id:E.id??cr("msg"),role:E.role,content:E.content}))),[s,i]=(0,G.useState)(""),[a,u]=(0,G.useState)(!1),[c,g]=(0,G.useState)(null),l=(0,G.useRef)(t);l.current=t;let v=(0,G.useRef)(o);v.current=o;let C=(0,G.useRef)(s);C.current=s;let h=(0,G.useRef)(0),p=(0,G.useRef)(null),m=(0,G.useRef)(!0);(0,G.useEffect)(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=(0,G.useCallback)(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=(0,G.useCallback)(async E=>{let U=E===void 0,S=(U?C.current:E)??"";if(!S.trim())return;p.current?.cancel();let x=++h.current,T=()=>m.current&&h.current===x,D=l.current,d=D?.parseChunk??vo,b={id:cr("msg"),role:"user",content:S},R={id:cr("msg"),role:"assistant",content:""},_=[...v.current,b].map(W=>({role:W.role,content:W.content})),V=[...v.current,b,R];v.current=V,n(V),U&&i(""),g(null),u(!0);let z=D?.buildPayload??(W=>({messages:W})),{initialMessages:L,parseChunk:N,buildPayload:F,onFinish:$,onError:K,...B}=D??{},ee=W=>{n(Y=>Y.map(ge=>ge.id===R.id?{...ge,content:W}:ge))},ie="",te;try{te=r.requestStream(z(_),B),p.current=te}catch(W){let Y=Xr(W);T()&&(g(Y),u(!1),D?.onError?.(Y));return}try{for await(let W of te){if(h.current!==x)break;ie+=d(W),T()&&ee(ie)}T()&&(u(!1),D?.onFinish?.({...R,content:ie}))}catch(W){let Y=Xr(W);T()&&(g(Y),u(!1),D?.onError?.(Y))}finally{p.current===te&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:f,isStreaming:a,error:c}}var J=require("react"),Ye=require("@urun-sh/core"),lr=[];function Gr(e,t={}){let{field:r=Ye.INPUT_PRESENCE_FIELD,hz:o=Ye.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,J.useMemo)(()=>s?(0,Ye.createInputPresencePublisher)({awareness:{setLocalStateField:(S,k)=>s.setField(S,k)},field:r,hz:o}):null,[s,r,o]),a=(0,J.useRef)(null);a.current=i;let[u,c]=(0,J.useState)(!1),[g,l]=(0,J.useState)(lr),v=(0,J.useRef)(!1);(0,J.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let C=(0,J.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),h=(0,J.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,J.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,k=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),h())},x=R=>{S()&&(a.current?.keyDown(R.key),C())},T=R=>{a.current?.keyUp(R.key),C()},D=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},b=()=>{h()};return n.addEventListener("pointerlockchange",k),n.addEventListener("keydown",x),n.addEventListener("keyup",T),n.addEventListener("mousemove",D),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",b),()=>{n.removeEventListener("pointerlockchange",k),n.removeEventListener("keydown",x),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",D),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",b)}},[n,h,C]);let p=(0,J.useCallback)(S=>{S.requestPointerLock?.()},[]),m=(0,J.useCallback)(()=>{v.current=!0,c(!0)},[]),f=(0,J.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),P=(0,J.useCallback)(S=>{a.current?.keyDown(S),C()},[C]),E=(0,J.useCallback)(S=>{a.current?.keyUp(S),C()},[C]),U=(0,J.useCallback)((S,k)=>{a.current?.movePointer(S,k)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:P,releaseKey:E,movePointer:U}}var ue=require("react"),on=require("@urun-sh/core");var O=require("react"),nn=require("@urun-sh/core");var ft=require("react"),Qr=require("react/jsx-runtime"),dr=(0,ft.createContext)(null);function Yr({session:e,children:t}){return(0,Qr.jsx)(dr.Provider,{value:e,children:t})}function Ee(){return(0,ft.useContext)(dr)}function Zr(){let e=(0,ft.useContext)(dr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var gt=require("react/jsx-runtime");function yo(e,t){return e-t>>>0<2147483648}var en=1e3;function ko(...e){console.debug("[video]",...e)}function tn(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 rn(e,t,r){return r?[r,t]:[e,t]}var qe=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:C,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:E,onFrameMarkerUnsupported:U}=t,S=Ee(),k=o??S,x=(0,O.useRef)(null),T=(0,O.useRef)(null),[D,d]=(0,O.useState)(!1),[b,R]=(0,O.useState)(!1),_=(0,O.useRef)(!1),V=(0,O.useRef)(m);V.current=m;let z=(0,O.useRef)(f);z.current=f;let L=(0,O.useRef)(E);L.current=E;let N=(0,O.useRef)(U);N.current=U;let F=(0,O.useRef)(P??null);F.current=P??null;let $=(0,O.useRef)(null),K=(0,O.useRef)(null),B=(0,O.useCallback)((y,I=!1)=>{if(!I&&y===$.current||($.current=y,K.current?.(),K.current=null,_.current=!1,R(!1),!y))return;let w=x.current;if(!w)return;let Z=F.current,re=Z?.rtpTimestamp??null,be=!1,A=()=>{be||(be=!0,N.current?.())};Z&&re==null&&A();let Pe=Z!=null&&re!=null,Te=Re=>{K.current?.(),K.current=null,_.current=!0,R(!0),z.current?.(),Re&&L.current?.()};if(typeof w.requestVideoFrameCallback=="function"){let Re=!1,Ke=0,ut=(Tr,nr)=>{if(!Re){if(Pe){let Ut=nr?.rtpTimestamp;if(typeof Ut!="number"){A(),Te(!1);return}if(!yo(Ut,re)){Ke=w.requestVideoFrameCallback(ut);return}Te(!0);return}Te(!1)}};Ke=w.requestVideoFrameCallback(ut),K.current=()=>{Re=!0,w.cancelVideoFrameCallback?.(Ke)};return}Pe&&A();let he=()=>{let Re=w.getVideoPlaybackQuality?.();(Re?Re.totalVideoFrames>0:w.readyState>=2&&w.videoWidth>0)&&Te(!1)};w.addEventListener("loadeddata",he),w.addEventListener("timeupdate",he),w.addEventListener("playing",he),K.current=()=>{w.removeEventListener("loadeddata",he),w.removeEventListener("timeupdate",he),w.removeEventListener("playing",he)},he()},[]);(0,O.useEffect)(()=>()=>{K.current?.(),K.current=null},[]);let ee=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,ie=(0,O.useRef)(ee);(0,O.useEffect)(()=>{if(ie.current===ee||(ie.current=ee,ee==null))return;let y=$.current;y&&B(y,!0)},[ee,B]);let te=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let y=x.current;return y&&y.srcObject!==T.current&&(y.srcObject=T.current),T.current},[]),W=(0,O.useCallback)(y=>{let I=x.current;if(!I)return;let w=I.play();!w||typeof w.catch!="function"||w.catch(Z=>ko(`play() failed (${y})`,Z))},[]),Y=(0,O.useCallback)(y=>{let I=te();if(I){for(let w of I.getVideoTracks())w!==y&&I.removeTrack(w);if(y&&!I.getVideoTracks().includes(y)){I.addTrack(y);let w=x.current;w&&(w.srcObject=I)}y&&W("track-attach"),d(y!==null),B(y),V.current?.(y)}},[te,W,B]),ge=(0,O.useCallback)(y=>{let I=te();if(I){for(let w of I.getAudioTracks())w!==y&&I.removeTrack(w);y&&!I.getAudioTracks().includes(y)&&I.addTrack(y),y&&W("audio-attach")}},[te,W]),Ve=(0,O.useCallback)(y=>{x.current=y,y&&(a&&(y.muted=!0,y.defaultMuted=!0,y.setAttribute("muted","")),y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),te())},[te,a]);(0,O.useImperativeHandle)(r,()=>({get element(){return x.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return _.current}}),[]);let ce=(0,nn.derivedLegRole)(n)!==void 0;(0,O.useEffect)(()=>{ce&&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.`)},[ce,n]);let oe=i!==void 0;return(0,O.useEffect)(()=>{if(oe){Y(i??null);return}if(ce){Y(null);return}if(!k)return;let y=tn(k,rn(n,"video")),I=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},w=A=>{if(A!==I()&&(Y(A),A)){let Pe=()=>{I()===A&&Y(null)};A.addEventListener("ended",Pe)}},Z=y.track;Z&&Z.readyState==="live"&&w(Z);let re=y.on("track",A=>{A&&A.readyState!=="live"||w(A)}),be=setInterval(()=>{let A=y.track;A&&A.readyState==="live"&&w(A)},en);return()=>{re(),clearInterval(be)}},[k,n,ce,oe,i,Y]),(0,O.useEffect)(()=>{if(oe||!k||s===!1||ce)return;let y=tn(k,rn(n,"audio",s)),I=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},w=A=>{if(A!==I()&&(ge(A),A)){let Pe=()=>{I()===A&&ge(null)};A.addEventListener("ended",Pe)}},Z=y.track;Z&&Z.readyState==="live"&&w(Z);let re=y.on("track",A=>{A&&A.readyState!=="live"||w(A)}),be=setInterval(()=>{let A=y.track;A&&A.readyState==="live"&&w(A)},en);return()=>{re(),clearInterval(be)}},[k,n,ce,s,oe,ge]),(0,gt.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":D?"true":"false","data-urun-video-framed":b?"true":"false",children:[(0,gt.jsx)("video",{ref:Ve,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),D?null:C,h===void 0?null:(0,gt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":b||void 0,style:{position:"absolute",inset:0,...b?{opacity:0,pointerEvents:"none"}:null},children:h}),p]})});var ht=require("react/jsx-runtime"),bo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},sn=(0,ue.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ue.useRef)(null),C=(0,ue.useRef)(null),h=(0,ue.useRef)(0),p=(0,ue.useRef)(g);p.current=g;let m=(0,ue.useMemo)(()=>(0,on.createCameraWarp)(p.current),[]);return(0,ue.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:m,get lastDrawTs(){return h.current}}),[m]),(0,ue.useEffect)(()=>{if(!i)return;let f=0,P=0,E=null,U=k=>{typeof k.requestVideoFrameCallback=="function"&&(E=k,P=k.requestVideoFrameCallback(function x(){m.frameArrived(),P=k.requestVideoFrameCallback(x)}))},S=k=>{f=requestAnimationFrame(S);let x=C.current,T=v.current?.element??null;if(!x||!T||(T!==E&&(E&&P&&E.cancelVideoFrameCallback?.(P),U(T)),T.readyState<2))return;m.tick(k);let D=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(x.clientWidth*D)),b=Math.max(1,Math.round(x.clientHeight*D));(x.width!==d||x.height!==b)&&(x.width=d,x.height=b);let R=x.getContext("2d");if(!R)return;let _=m.transform(),V=T.videoWidth||d,z=T.videoHeight||b,N=Math.max(d/V,b/z)*(1+a)*_.scale;R.setTransform(N,0,0,N,d/2+_.translateX*d,b/2+_.translateY*b),R.drawImage(T,-V/2,-z/2),h.current=k};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),E&&P&&E.cancelVideoFrameCallback?.(P)}},[i,a,m]),(0,ue.useEffect)(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=x=>{f()&&m.keyDown(x.key)},E=x=>m.keyUp(x.key),U=x=>{f()&&m.pointerDelta(x.movementX,x.movementY)},S=()=>{f()||m.clearKeys()},k=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",E),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",k),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",E),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",k)}},[i,u,l,m]),i?(0,ht.jsxs)(qe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,ht.jsx)("canvas",{ref:C,style:bo,"data-urun-warp":""}),n]}):(0,ht.jsx)(qe,{ref:v,...s,children:n})});var an=new Map;function un(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);an.set(e,{component:t,schema:r})}function cn(e,t){let r=an.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var He=require("react/jsx-runtime");function ln({name:e,props:t,fallback:r}){let o=cn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,He.jsx)(He.Fragment,{children:r}):(0,He.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,He.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,He.jsx)(n,{...o.validatedProps})}var Ze=require("zod"),We=require("react/jsx-runtime"),dn=Ze.z.object({step:Ze.z.number().min(0),total:Ze.z.number().min(1),label:Ze.z.string().optional(),variant:Ze.z.enum(["default","success","error"]).default("default")});function pr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function pn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,We.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,We.jsx)("div",{className:"urun-progress-label",children:o}),(0,We.jsx)("div",{className:"urun-progress-bar",children:(0,We.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,We.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var It=require("zod"),St=require("react/jsx-runtime"),mn=It.z.object({state:It.z.enum(["thinking","generating","idle","error"]),message:It.z.string().optional()}),Ro={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Ro[t]??t;return{state:t,message:n,isActive:o}}function fn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,St.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,St.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,St.jsx)("span",{className:"urun-status-message",children:r})]})}var vt=require("react"),Lt=require("zod"),yt=require("react/jsx-runtime"),gn=Lt.z.object({text:Lt.z.string(),streaming:Lt.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function hn(e){let{text:t,streaming:r}=fr(e),o=(0,vt.useRef)(null),n=(0,vt.useRef)(0);return(0,vt.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,yt.jsxs)("div",{className:"urun-text-stream",children:[(0,yt.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,yt.jsx)("span",{className:"urun-text-cursor"})]})}var kt=require("zod"),bt=require("react/jsx-runtime"),Sn=kt.z.object({src:kt.z.string().url(),alt:kt.z.string().optional(),caption:kt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function vn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,bt.jsxs)("figure",{className:"urun-image-frame",children:[(0,bt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,bt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ue=require("zod"),Qe=require("react/jsx-runtime"),yn=Ue.z.object({metrics:Ue.z.array(Ue.z.object({label:Ue.z.string(),value:Ue.z.union([Ue.z.string(),Ue.z.number()]),unit:Ue.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function kn(e){let{metrics:t}=hr(e);return(0,Qe.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Qe.jsxs)("div",{className:"urun-metric-card",children:[(0,Qe.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Qe.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var bn=require("react");var Cn=require("react/jsx-runtime"),Rn=(0,bn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Cn.jsx)(qe,{ref:r,stream:o,...n})});var X=require("react"),Pn=require("@urun-sh/core");var Ot=null;function Co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Rt(){if(Ot)return Ot;let e=Co();return e?(Ot=new e,Ot):null}function Ct(){let e=Rt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var wn=require("react/jsx-runtime"),Eo=1e3,En=200;function Sr(...e){console.debug("[audio]",...e)}var Et=(0,X.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=Ee(),v=o??l,C=(0,X.useRef)(null),h=(0,X.useRef)(null),p=(0,X.useRef)(null),m=(0,X.useRef)(null),f=(0,X.useRef)(u);f.current=u;let P=(0,X.useRef)(c);P.current=c;let E=(0,X.useCallback)(d=>{p.current!==d&&(p.current=d,P.current?.(d))},[]),U=(0,X.useCallback)(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=C.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=(0,X.useCallback)(d=>{let b=C.current;if(!b)return;let R=b.play();!R||typeof R.then!="function"||R.then(()=>{b.muted||E(!0)}).catch(_=>{let V=_ instanceof Error?_.name:String(_);if(V==="AbortError"){Sr(`play() aborted (${d}); retrying in ${En}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},En);return}if(V==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),E(!1);return}Sr(`play() failed (${d})`,_)})},[E]),k=(0,X.useCallback)(d=>{let b=U();if(b){for(let R of b.getAudioTracks())R!==d&&b.removeTrack(R);d&&!b.getAudioTracks().includes(d)&&b.addTrack(d),d&&S("track-attach"),f.current?.(d)}},[U,S]),x=(0,X.useCallback)(()=>{let d=C.current;d&&(U(),d.muted=!1,S("gesture"),Ct(),E(!0))},[U,S,E]);(0,X.useImperativeHandle)(r,()=>({unlock:x,get unlocked(){return p.current===!0},get element(){return C.current}}),[x]);let T=(0,X.useCallback)(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),g?.(d)},[U,g]),D=s!==void 0;return(0,X.useEffect)(()=>{if(D){k(s??null);return}if(!v)return;let d=v.stream(n),b=()=>{let L=h.current;return L?L.getAudioTracks()[0]??null:null},R=L=>{if(L!==b()&&(k(L),L)){let N=()=>{b()===L&&k(null)};L.addEventListener("ended",N)}},_=d.track;_&&_.readyState==="live"&&R(_);let V=d.on("track",L=>{L&&L.readyState!=="live"||R(L)}),z=setInterval(()=>{let L=d.track;L&&L.readyState==="live"&&R(L)},Eo);return()=>{V(),clearInterval(z)}},[v,n,D,s,k]),(0,X.useEffect)(()=>(0,Pn.observePageLifecycle)(()=>{Ct(),p.current===!0&&S("foreground")}),[S]),(0,X.useEffect)(()=>()=>{m.current&&clearTimeout(m.current)},[]),(0,wn.jsx)("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Tn=Et;var j=require("react"),et=require("@urun-sh/core");var Un=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Dt(...e){console.debug("[voice]",...e)}var Pt=(0,j.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:C,onUnlockChange:h,capture:p}=t,m=Ee(),f=o??m,P=(0,j.useRef)(null),E=(0,j.useRef)(null),U=(0,j.useRef)(null),S=(0,j.useRef)([]),k=(0,j.useRef)(!1),x=(0,j.useRef)(g);x.current=g;let T=(0,j.useRef)(l);T.current=l;let D=(0,j.useRef)(v);D.current=v;let d=(0,j.useCallback)(N=>{k.current!==N&&(k.current=N,x.current?.(N))},[]),b=(0,j.useCallback)(()=>{for(let N of S.current)N();S.current=[],U.current?.release(),U.current=null,E.current&&(E.current=null,D.current?.(null))},[]),R=(0,j.useCallback)(async()=>{let N=U.current;if(N){let B=await N.update(i);return E.current=N.stream,D.current?.(N.stream),B}let $=await(p??(0,et.sharedCaptureController)()).claim("audio",i);U.current=$,S.current=[$.onTrack((B,ee)=>{E.current=ee,D.current?.(ee),k.current&&f?.stream(n).attach(B).catch(ie=>Dt("mic re-attach after one-capture re-acquire failed",ie))}),$.onLost(B=>{U.current=null,S.current=[],E.current=null,D.current?.(null),d(!1),T.current?.(B)})],E.current=$.stream,D.current?.($.stream);let K=$.track;if(!K)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return K},[p,i,f,n,d]),_=(0,j.useCallback)(async()=>{b(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,b,d]),V=(0,j.useCallback)(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let N;try{N=await R()}catch(K){b();let B=(0,et.sessionFailureFromMediaError)(K,f.status);throw T.current?.(B),B}f.connect?.();let F;for(let K=1;K<=u;K++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(N),d(!0);return}catch(B){F=B,Dt(`start attempt ${K}/${u} failed`,B),K<u&&await new Promise(ee=>setTimeout(ee,c))}b(),d(!1);let $=F instanceof Error?F:new Error(String(F??"voice start failed"));throw T.current?.($),$},[f,n,a,u,c,R,b,d]);(0,j.useImperativeHandle)(r,()=>({start:V,stop:_,unlock:()=>P.current?.unlock(),get active(){return k.current},get micStream(){return E.current},get audio(){return P.current}}),[V,_]);let z=(0,j.useRef)(!1),L=(0,j.useCallback)(async()=>{if(!f||!k.current||z.current)return;let N=E.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await f.stream(n).attach(N)}catch(F){Dt("foreground mic re-assert failed (will retry on next pass)",F)}return}z.current=!0;try{let F=await R();await f.stream(n).attach(F)}catch(F){let $=F instanceof Error?F:new Error(String(F));Dt("foreground mic re-acquire failed",$),T.current?.($)}finally{z.current=!1}},[f,n,R]);return(0,j.useEffect)(()=>{let N=()=>{L()};return f&&typeof f.onRecovery=="function"?f.onRecovery(N):(0,et.observePageLifecycle)(N)},[f,L]),(0,j.useEffect)(()=>b,[b]),s?(0,Un.jsx)(Et,{ref:P,session:f,stream:n,onTrack:C,onUnlockChange:h}):null}),xn=Pt;var ye=require("react");var Vt=require("react");var yr={level:0,speaking:!1};function Ft(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Vt.useState)(yr);return(0,Vt.useEffect)(()=>{if(!e){i(yr);return}let a=Rt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),C=setInterval(()=>{g.getByteTimeDomainData(l);let h=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;h+=f*f}let p=Math.sqrt(h/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(C),c.disconnect(),i(yr)}},[e,r,o,n]),s}var Ae=require("react/jsx-runtime"),Po={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},To={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},An=(0,ye.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,C=Ee(),h=o??C,p=(0,ye.useRef)(null),[m,f]=(0,ye.useState)(null),P=(0,ye.useRef)(l);P.current=l;let{level:E,speaking:U}=Ft(a?m:null);return(0,ye.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,ye.useEffect)(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),(0,Ae.jsxs)(Ae.Fragment,{children:[(0,Ae.jsx)(Pt,{ref:p,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:S=>{f(S),P.current?.(S)}}),a?(0,Ae.jsx)("span",{className:u,style:Po,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(E*100)/100,children:(0,Ae.jsx)("span",{style:To,children:(0,Ae.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(E*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var tt=require("@urun-sh/core"),M=require("react");var pe=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function wo(){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 Rr=(0,M.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:E,capture:U,flipControl:S="auto",flipControlClassName:k,onDevices:x}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",D=Ee(),d=o??D,b=(0,M.useRef)(null),R=(0,M.useRef)(null),_=(0,M.useRef)(null),V=(0,M.useRef)([]),z=(0,M.useRef)(null),L=(0,M.useRef)(!1),N=(0,M.useRef)(!1),F=(0,M.useRef)(T),[$,K]=(0,M.useState)(T),[B,ee]=(0,M.useState)(!1),[ie,te]=(0,M.useState)(null),[W,Y]=(0,M.useState)(!1),[ge]=(0,M.useState)(wo),Ve=(0,M.useRef)(p);Ve.current=p;let ce=(0,M.useRef)(m);ce.current=m;let oe=(0,M.useRef)(f);oe.current=f;let y=(0,M.useRef)(P);y.current=P;let I=(0,M.useRef)(x);I.current=x;let w=(0,M.useCallback)(q=>{L.current!==q&&(L.current=q,ee(q),Ve.current?.(q))},[]);(0,M.useEffect)(()=>{if(!B){te(null);return}let q=!1,H=()=>{xo().then(Ce=>{q||(te(Ce),Ce&&I.current?.(Ce))})};H();let Se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Se?.addEventListener=="function"?(Se.addEventListener("devicechange",H),()=>{q=!0,Se.removeEventListener?.("devicechange",H)}):()=>{q=!0}},[B]);let Z=(0,M.useCallback)(q=>{let H=b.current;H&&(H.muted=!0,H.defaultMuted=!0,H.setAttribute("muted",""),H.setAttribute("playsinline",""),H.setAttribute("webkit-playsinline",""),H.srcObject=q,q&&H.play()?.catch?.(Se=>kr("preview play() failed",Se)))},[]),re=(0,M.useCallback)(()=>{N.current=!1,z.current?.(),z.current=null;for(let q of V.current)q();V.current=[],_.current?.release(),_.current=null,R.current&&(R.current=null,oe.current?.(null),y.current?.(null)),Z(null)},[Z]),be=(0,M.useCallback)((q,H)=>{z.current?.(),R.current=H,Z(H),oe.current?.(H);let Se=()=>{R.current===H&&(kr("camera track ended (device removed or permission revoked)"),re(),w(!1))};q.addEventListener("ended",Se),z.current=()=>q.removeEventListener("ended",Se)},[Z,re,w]),A=(0,M.useCallback)(async q=>{let H=n!==!1;if(H&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let Se={...br,...s,facingMode:q},Ce;try{let Ne=_.current;if(Ne)Ce=await Ne.update(Se);else{let ct=await(U??(0,tt.sharedCaptureController)()).claim("video",Se);if(_.current=ct,V.current=[ct.onTrack((lt,Qn)=>{be(lt,Qn),L.current&&(!H||!d||d.stream(n).attachVideo(lt).then(()=>y.current?.(lt)).catch(eo=>kr("camera re-publish after one-capture re-acquire failed",eo)))}),ct.onLost(lt=>{_.current=null,V.current=[],re(),w(!1),ce.current?.(lt)})],!ct.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ct.track}}catch(Ne){let $e=(0,tt.sessionFailureFromMediaError)(Ne,d?.status);throw ce.current?.($e),$e}F.current=q,K(q),be(Ce,_.current?.stream??new MediaStream([Ce]));try{H&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=H?n:!1}catch(Ne){re(),w(!1);let $e=Ne instanceof Error?Ne:new Error(String(Ne));throw ce.current?.($e),$e}y.current?.(Ce),w(!0)},[d,n,s,l,U,be,re,w]),Pe=(0,M.useCallback)(q=>A(q?.facingMode??F.current),[A]),Te=(0,M.useCallback)(async q=>{let H=N.current===n;L.current&&F.current===q&&H||await A(q)},[A,n]),he=(0,M.useCallback)(()=>A(F.current==="environment"?"user":"environment"),[A]),Re=(0,M.useCallback)(async()=>{re(),w(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,re,w]),Ke=(0,M.useCallback)(async q=>{let H=b.current;if(!H)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,tt.captureStillFromVideo)(H,q)},[]);(0,M.useImperativeHandle)(r,()=>({start:Pe,stop:Re,flip:he,setFacingMode:Te,capturePhoto:Ke,get active(){return L.current},get facingMode(){return F.current},get stream(){return R.current},get element(){return b.current}}),[Pe,Re,he,Te,Ke]);let ut=(0,M.useRef)(Te);if(ut.current=Te,(0,M.useEffect)(()=>{c&&(n!==!1&&!d||ut.current(T).catch(()=>{}))},[c,d,T,n]),(0,M.useEffect)(()=>re,[re]),!v)return null;let Tr=g==="auto"?$==="user":g,nr=B&&(S===!0||S==="auto"&&ge&&(ie?.length??0)>1),Ut=()=>{W||(Y(!0),he().catch(()=>{}).finally(()=>Y(!1)))};return(0,pe.jsxs)("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":$,children:[(0,pe.jsx)("video",{ref:b,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Tr?{transform:"scaleX(-1)"}:{}}}),nr?(0,pe.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Ut,disabled:W,className:k,style:k?{opacity:W?.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:W?.6:1},children:(0,pe.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,pe.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,pe.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,pe.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,pe.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,pe.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,E]})}),Mn=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,pe.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var rt=require("@urun-sh/core"),Q=require("react");function _n(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,Q.useState)(null),[a,u]=(0,Q.useState)(null),[c,g]=(0,Q.useState)(!1),[l,v]=(0,Q.useState)(null),[C]=(0,Q.useState)(rt.cameraCaptureAvailable),h=(0,Q.useRef)(n);h.current=n;let p=(0,Q.useRef)(null),m=(0,Q.useRef)(0),f=(0,Q.useCallback)(k=>{p.current&&URL.revokeObjectURL(p.current),p.current=k?URL.createObjectURL(new Blob([k.bytes],{type:k.type})):null,u(p.current),i(k),h.current?.(k)},[]);(0,Q.useEffect)(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=(0,Q.useCallback)(async k=>{let x=++m.current;g(!0),v(null);try{let T=await k();if(m.current!==x)return;f(T)}catch(T){if(m.current!==x)return;v((0,rt.referenceImageErrorMessage)(T))}finally{m.current===x&&g(!1)}},[f]),E=(0,Q.useCallback)(k=>P(()=>(0,rt.normalizeReferenceImage)(k,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),U=(0,Q.useCallback)(k=>P(()=>k.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),S=(0,Q.useCallback)(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:E,capture:U,clear:S,busy:c,error:l,cameraAvailable:C}}var qt=require("react");function Nn(e,t){let[r,o]=(0,qt.useState)(null);return(0,qt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var On=require("react");var Wt=require("react");var In=require("zustand/vanilla"),Ln=require("zustand"),Uo=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,In.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):Uo,u=(c=>(0,Ln.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function nt(e,t){let r=(0,Wt.useMemo)(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Wt.useEffect)(()=>r.bind(),[r]),r}function Dn(e,t,r){let n=nt(e,t)(r??(a=>a)),s=(0,On.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 Ie=200;function Me(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ot(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Bt(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 Kt(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=>Me(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ke=require("react/jsx-runtime");function Vn({session:e,name:t,cap:r,className:o}){let n=Kt(e,t,{cap:r});return(0,ke.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ke.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ke.jsx)("code",{children:t}),(0,ke.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ke.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ke.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ke.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ke.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ke.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ot(s.payload)]},`${s.at}-${i}`))})]})}var Tt=require("react");var de=require("react/jsx-runtime");function wt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Tt.useState)(""),[i,a]=(0,Tt.useState)(null),u=(0,Tt.useCallback)(()=>{let c=Bt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,de.jsxs)("div",{className:"urun-doc-patch",children:[(0,de.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,de.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,de.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,de.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Fn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=nt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,de.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,de.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,de.jsx)("code",{children:t}),(0,de.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,de.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,de.jsx)(wt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var $t=require("react");var _e=require("react/jsx-runtime");function qn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Hn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,$t.useState)([]);return(0,$t.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Me(u,{at:Date.now(),direction:"in",text:qn(ot(a))},r))}):void 0),[e,t,r]),(0,_e.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,_e.jsx)(wt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Me(u,{at:Date.now(),direction:"out",text:qn(a)},r))}}),(0,_e.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,_e.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,_e.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,_e.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,_e.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Xt=require("react");var Be=require("react/jsx-runtime");function Wn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Xt.useState)([]),a=t.join(","),u=r.join(",");return(0,Xt.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(C=>Me(C,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Be.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Be.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>(0,Be.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Be.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Be.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var er=require("@urun-sh/core");var zt=require("react");function me(e){let[t,r]=(0,zt.useState)(e?.phase??null);return(0,zt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var jn=require("@urun-sh/core");var st=require("react"),Bn=require("@urun-sh/core");function Jt(e){let t=me(e),r=(0,Bn.isWakingPhase)(t?.name),o=(0,st.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,st.useState)(s);return(0,st.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Le=require("react/jsx-runtime");function Gt({session:e,render:t,className:r}){let o=Jt(e);return!o.waking||!o.phase?null:(0,Le.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)("span",{className:"urun-session-waking-label",children:(0,jn.describeSessionPhase)(o.phase)})," ",(0,Le.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Zt=require("react");var Oe=require("react"),Ao={event:null,elapsedMs:0};function Yt(e,t){let[r,o]=(0,Oe.useState)(null),n=(0,Oe.useRef)(0);(0,Oe.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,Oe.useState)(0);return(0,Oe.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ao}var it=require("react/jsx-runtime"),Mo={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 _o(e){let[t,r]=(0,Zt.useState)(!1);return(0,Zt.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 Qt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Yt(e,t),i=_o(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,it.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,it.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,it.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Mo[u]})," ",(0,it.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var fe=require("react/jsx-runtime"),No={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Kn({session:e,className:t}){let r=me(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,fe.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,fe.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,fe.jsx)("span",{className:"urun-session-status-label",children:No[o]}),n?(0,fe.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function $n({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=me(e);if(s?.name==="live")return(0,fe.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,fe.jsx)(Qt,{session:e})]});let i=r?r(s):(0,fe.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,er.isWakingPhase)(s.name)?(0,fe.jsx)(Gt,{session:e}):s&&s.name!=="idle"?(0,er.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,fe.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,fe.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var tr=require("react");var zn=require("react/jsx-runtime");function Cr(e){return me(e)?.endsAt??null}function Io(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 Xn({session:e,urgentMs:t=6e4,className:r}){let n=Cr(e)?.getTime()??null,[s,i]=(0,tr.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,tr.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=Io(s);return(0,zn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var xt=require("react/jsx-runtime"),Lo=new Set(["expired","ended","error"]);function Jn({session:e,onNewSession:t,children:r,className:o}){let n=me(e);if(!n||!Lo.has(n.name))return null;let s=r?r(n):(0,xt.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,xt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,xt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var De=require("react"),je=require("react/jsx-runtime");function Er(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 Pr(e){let t=(0,De.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,De.useState)(()=>t?Er(t.get("idle")):null);return(0,De.useEffect)(()=>{if(!t){o(null);return}return o(Er(t.get("idle"))),t.on("change",()=>o(Er(t.get("idle"))))},[t]),r}function Oo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Gn({session:e,onStillHere:t,className:r}){let o=Pr(e),n=o?.deadlineEpochS??null,[s,i]=(0,De.useState)(null);if((0,De.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,je.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,je.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,je.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,je.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Oo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,je.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var at=require("react"),Yn=require("@urun-sh/core");function Zn(e){let t=(0,at.useContext)(ze),[r,o]=(0,at.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return(0,at.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,C=()=>{(0,Yn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let h=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[n,s,i,a,u,c,g,l]),r}var rr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
import{a as nn,b as on,c as ht}from"./chunk-WF2OBDSX.mjs";import{useCallback as Sn,useEffect as vn,useMemo as yn,useRef as rr,useState as yt}from"react";import{Component as sn}from"react";import{jsx as Yt,jsxs as an}from"react/jsx-runtime";var Ve=class extends sn{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||an("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Yt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Yt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as un}from"react";var Te=un(null);function ke(e){return e&&e.trim()?e.trim():void 0}function ge(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ke(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ke(typeof process<"u"?process.env?.[e]:void 0)}}function Ge(){let e=ge("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ge("VERCEL_ENV")==="production"?"workos":ge("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function cn(){return Ge()==="workos"}import{useEffect as ln,useRef as dn}from"react";var pn="urun.operator_token",Qt=null,Zt="op",mn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function er(){return typeof window<"u"}function tr(){return Qt}function fn(){if(!er())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Zt);if(!r)return null;Qt=r,t.delete(Zt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function gn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function St(e){let t=dn(e);t.current=e,ln(()=>{if(!er())return;fn();let r=o=>{if(!gn(o))return;let n=tr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as hn}from"react";function vt(e=!0){hn(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as Fe,jsxs as Pn}from"react/jsx-runtime";var kn="/api/urun-token",bn=1e4;function Cn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function nr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function Rn(e,t){return typeof e=="function"?e(t):e!==void 0?e:Pn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Fe("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Fe("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function En({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:R}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(h&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);vt(g);let[m,f]=yt(),[E,C]=yt(null),x=rr(void 0),S=rr(null),[y,T]=yt(null);St(W=>T({jwt:W}));let w=ht(),I=ge("NEXT_PUBLIC_SESSION_TOKEN")??ge("NEXT_PUBLIC_URUN_JWT"),d=Ge(),k=y!==null,b=d==="workos"&&!n&&!k&&!h,M=n??(d==="jwt"?I:void 0)??m?.token,F=k?y.jwt:M,K=s??ge("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),N=b&&!F&&!w?.getAccessToken,_=t??m?.orgId,L=e??m?.gatewayUrl,j=h&&m===void 0,B=h&&m!==void 0&&!L?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,q=N?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,z=E??B??q,Y=u??kn,J=Sn(async W=>{if(!W?.forceRefresh){let ee=x.current;if(!ee)return ee;let Z=Cn(ee);if(Z===null||Z-Date.now()>bn)return ee}return(await(S.current??(S.current=(async()=>{try{let ee=await nr(Y);return x.current=ee.token,f(ee),ee}finally{S.current=null}})()))).token},[Y]),H=yn(()=>({appId:p,baseUrl:L??"",orgId:_??"",jwt:F,getAccessToken:b?w?.getAccessToken:h&&!k?J:void 0,authProvider:K,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,w,L,K,F,i,_,a,c,b,k,h,J]);return vn(()=>{if(!h)return;let W=new AbortController;return C(null),(async()=>{try{let X=await nr(Y,W.signal);x.current=X.token,f(X)}catch(X){if(W.signal.aborted)return;C(X instanceof Error?X:new Error(String(X)))}})(),()=>W.abort()},[h,Y]),Fe(Ve,{fallback:l,children:z?Rn(v,z):j?Fe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Fe(Te.Provider,{value:H,children:R})})}import{useContext as wn,useEffect as Tn,useMemo as or,useReducer as xn,useRef as kt}from"react";import{App as An}from"@urun-sh/core";function Un(e,t){return`${e}:${JSON.stringify(t??{})}`}function Mn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var be=new Map;var bt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Ct=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Rt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new bt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ct(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function _n(){let e=wn(Te);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=xn(i=>i+1,0),r=kt(new Map),o=kt(new Map),n=kt(null),s=or(()=>An(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return Tn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=be.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=be.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=be.get(u);!l||l.refCount!==0||(be.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),or(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=Un(u,l),R=r.current.get(v);if(R&&!R.disposed)return R;let h=Mn(e,u,l),p=be.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),be.delete(h),o.current.get(h)===p&&o.current.delete(h),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Rt(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},be.set(h,p)),o.current.get(h)!==p&&(o.current.set(h,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as Et,useEffect as Nn,useMemo as In,useRef as Ye,useState as Pt}from"react";function xe(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function Ln(e){return e instanceof Error?e:new Error(String(e))}function On(e,t){let r=In(()=>xe(e),[e]),[o,n]=Pt(void 0),[s,i]=Pt(null),[a,u]=Pt(!1),c=Ye(t);c.current=t;let g=Ye(0),l=Ye(null),v=Ye(!0);Nn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let R=Et(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let E=++g.current,C=()=>v.current&&g.current===E;C()&&(u(!0),i(null));try{let x=await r.request(m,{...c.current,signal:f.signal});return C()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let S=Ln(x);throw C()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=Et(m=>{R(m).catch(()=>{})},[R]),p=Et(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:R,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Dn,useMemo as Vn,useRef as Ze,useState as wt}from"react";function ir(e){return e instanceof Error?e:new Error(String(e))}var Fn=e=>typeof e=="string"?e:String(e);function qn(e,t){let r=Vn(()=>xe(e),[e]),[o,n]=wt(""),[s,i]=wt(!1),[a,u]=wt(null),c=Ze(t);c.current=t;let g=Ze(0),l=Ze(null),v=Ze(!0);Dn(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let R=sr(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=sr(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,E=c.current,C=E?.parseChunk??Fn,x=E?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:T,onError:w,...I}=E??{},d="",k;try{k=r.requestStream(x(p),I),l.current=k}catch(b){let M=ir(b);f()&&(u(M),i(!1),E?.onError?.(M));return}try{for await(let b of k){if(g.current!==m)break;d+=C(b),f()&&n(d)}f()&&(i(!1),E?.onFinish?.(d))}catch(b){let M=ir(b);f()&&(u(M),i(!1),E?.onError?.(M))}finally{l.current===k&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:R,isStreaming:s,error:a}}import{useCallback as ar,useEffect as Hn,useMemo as Wn,useRef as Ae,useState as Qe}from"react";function ur(e){return e instanceof Error?e:new Error(String(e))}var Bn=e=>typeof e=="string"?e:String(e),cr=0;function Tt(e){return cr+=1,`${e}-${cr}`}function jn(e,t){let r=Wn(()=>xe(e),[e]),[o,n]=Qe(()=>(t?.initialMessages??[]).map(C=>({id:C.id??Tt("msg"),role:C.role,content:C.content}))),[s,i]=Qe(""),[a,u]=Qe(!1),[c,g]=Qe(null),l=Ae(t);l.current=t;let v=Ae(o);v.current=o;let R=Ae(s);R.current=s;let h=Ae(0),p=Ae(null),m=Ae(!0);Hn(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=ar(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),E=ar(async C=>{let x=C===void 0,S=(x?R.current:C)??"";if(!S.trim())return;p.current?.cancel();let T=++h.current,w=()=>m.current&&h.current===T,I=l.current,d=I?.parseChunk??Bn,k={id:Tt("msg"),role:"user",content:S},b={id:Tt("msg"),role:"assistant",content:""},M=[...v.current,k].map(H=>({role:H.role,content:H.content})),F=[...v.current,k,b];v.current=F,n(F),x&&i(""),g(null),u(!0);let K=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:L,onFinish:j,onError:B,...q}=I??{},z=H=>{n(W=>W.map(X=>X.id===b.id?{...X,content:H}:X))},Y="",J;try{J=r.requestStream(K(M),q),p.current=J}catch(H){let W=ur(H);w()&&(g(W),u(!1),I?.onError?.(W));return}try{for await(let H of J){if(h.current!==T)break;Y+=d(H),w()&&z(Y)}w()&&(u(!1),I?.onFinish?.({...b,content:Y}))}catch(H){let W=ur(H);w()&&(g(W),u(!1),I?.onError?.(W))}finally{p.current===J&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:E,stop:f,isStreaming:a,error:c}}import{useCallback as he,useEffect as lr,useMemo as Kn,useRef as dr,useState as pr}from"react";import{createInputPresencePublisher as $n,INPUT_PRESENCE_DEFAULT_HZ as zn,INPUT_PRESENCE_FIELD as Jn}from"@urun-sh/core";var xt=[];function Xn(e,t={}){let{field:r=Jn,hz:o=zn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Kn(()=>s?$n({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=dr(null);a.current=i;let[u,c]=pr(!1),[g,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let R=he(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),h=he(()=>{a.current?.clear(),l(xt)},[]);lr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),h())},T=b=>{S()&&(a.current?.keyDown(b.key),R())},w=b=>{a.current?.keyUp(b.key),R()},I=b=>{S()&&a.current?.movePointer(b.movementX,b.movementY)},d=b=>{S()&&a.current?.setButtons(b.buttons)},k=()=>{h()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",T),n.addEventListener("keyup",w),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",T),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,h,R]);let p=he(S=>{S.requestPointerLock?.()},[]),m=he(()=>{v.current=!0,c(!0)},[]),f=he(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),E=he(S=>{a.current?.keyDown(S),R()},[R]),C=he(S=>{a.current?.keyUp(S),R()},[R]),x=he((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:E,releaseKey:C,movePointer:x}}import{forwardRef as io,useEffect as yr,useImperativeHandle as ao,useMemo as uo,useRef as et}from"react";import{createCameraWarp as co}from"@urun-sh/core";import{forwardRef as eo,useCallback as Ue,useEffect as qe,useImperativeHandle as to,useRef as ne,useState as fr}from"react";import{derivedLegRole as ro}from"@urun-sh/core";import{createContext as Gn,useContext as mr}from"react";import{jsx as Qn}from"react/jsx-runtime";var At=Gn(null);function Yn({session:e,children:t}){return Qn(At.Provider,{value:e,children:t})}function ue(){return mr(At)}function Zn(){let e=mr(At);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as vr,jsxs as so}from"react/jsx-runtime";function no(e,t){return e-t>>>0<2147483648}var gr=1e3;function oo(...e){console.debug("[video]",...e)}function hr(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function Sr(e,t,r){return r?[r,t]:[e,t]}var Me=eo(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:R,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:E,onFrameMarkerReached:C,onFrameMarkerUnsupported:x}=t,S=ue(),y=o??S,T=ne(null),w=ne(null),[I,d]=fr(!1),[k,b]=fr(!1),M=ne(!1),F=ne(m);F.current=m;let K=ne(f);K.current=f;let N=ne(C);N.current=C;let _=ne(x);_.current=x;let L=ne(E??null);L.current=E??null;let j=ne(null),B=ne(null),q=Ue((P,V=!1)=>{if(!V&&P===j.current||(j.current=P,B.current?.(),B.current=null,M.current=!1,b(!1),!P))return;let A=T.current;if(!A)return;let $=L.current,G=$?.rtpTimestamp??null,se=!1,U=()=>{se||(se=!0,_.current?.())};$&&G==null&&U();let le=$!=null&&G!=null,de=ie=>{B.current?.(),B.current=null,M.current=!0,b(!0),K.current?.(),ie&&N.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let ie=!1,Pe=0,Le=(Gt,gt)=>{if(!ie){if(le){let Xe=gt?.rtpTimestamp;if(typeof Xe!="number"){U(),de(!1);return}if(!no(Xe,G)){Pe=A.requestVideoFrameCallback(Le);return}de(!0);return}de(!1)}};Pe=A.requestVideoFrameCallback(Le),B.current=()=>{ie=!0,A.cancelVideoFrameCallback?.(Pe)};return}le&&U();let te=()=>{let ie=A.getVideoPlaybackQuality?.();(ie?ie.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&de(!1)};A.addEventListener("loadeddata",te),A.addEventListener("timeupdate",te),A.addEventListener("playing",te),B.current=()=>{A.removeEventListener("loadeddata",te),A.removeEventListener("timeupdate",te),A.removeEventListener("playing",te)},te()},[]);qe(()=>()=>{B.current?.(),B.current=null},[]);let z=E==null?null:`${E.rtpTimestamp??""}|${E.ptsMs??""}`,Y=ne(z);qe(()=>{if(Y.current===z||(Y.current=z,z==null))return;let P=j.current;P&&q(P,!0)},[z,q]);let J=Ue(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let P=T.current;return P&&P.srcObject!==w.current&&(P.srcObject=w.current),w.current},[]),H=Ue(P=>{let V=T.current;if(!V)return;let A=V.play();!A||typeof A.catch!="function"||A.catch($=>oo(`play() failed (${P})`,$))},[]),W=Ue(P=>{let V=J();if(V){for(let A of V.getVideoTracks())A!==P&&V.removeTrack(A);if(P&&!V.getVideoTracks().includes(P)){V.addTrack(P);let A=T.current;A&&(A.srcObject=V)}P&&H("track-attach"),d(P!==null),q(P),F.current?.(P)}},[J,H,q]),X=Ue(P=>{let V=J();if(V){for(let A of V.getAudioTracks())A!==P&&V.removeTrack(A);P&&!V.getAudioTracks().includes(P)&&V.addTrack(P),P&&H("audio-attach")}},[J,H]),ee=Ue(P=>{T.current=P,P&&(a&&(P.muted=!0,P.defaultMuted=!0,P.setAttribute("muted","")),P.setAttribute("playsinline",""),P.setAttribute("webkit-playsinline",""),J())},[J,a]);to(r,()=>({get element(){return T.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let Z=ro(n)!==void 0;qe(()=>{Z&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[Z,n]);let me=i!==void 0;return qe(()=>{if(me){W(i??null);return}if(Z){W(null);return}if(!y)return;let P=hr(y,Sr(n,"video")),V=()=>{let U=w.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==V()&&(W(U),U)){let le=()=>{V()===U&&W(null)};U.addEventListener("ended",le)}},$=P.track;$&&$.readyState==="live"&&A($);let G=P.on("track",U=>{U&&U.readyState!=="live"||A(U)}),se=setInterval(()=>{let U=P.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{G(),clearInterval(se)}},[y,n,Z,me,i,W]),qe(()=>{if(me||!y||s===!1||Z)return;let P=hr(y,Sr(n,"audio",s)),V=()=>{let U=w.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==V()&&(X(U),U)){let le=()=>{V()===U&&X(null)};U.addEventListener("ended",le)}},$=P.track;$&&$.readyState==="live"&&A($);let G=P.on("track",U=>{U&&U.readyState!=="live"||A(U)}),se=setInterval(()=>{let U=P.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{G(),clearInterval(se)}},[y,n,Z,s,me,X]),so("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":k?"true":"false",children:[vr("video",{ref:ee,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:R,h===void 0?null:vr("div",{"data-urun-video-poster":"","aria-hidden":k||void 0,style:{position:"absolute",inset:0,...k?{opacity:0,pointerEvents:"none"}:null},children:h}),p]})});import{jsx as kr,jsxs as mo}from"react/jsx-runtime";var lo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},po=io(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),R=et(null),h=et(0),p=et(g);p.current=g;let m=uo(()=>co(p.current),[]);return ao(r,()=>({get video(){return v.current},get canvas(){return R.current},warp:m,get lastDrawTs(){return h.current}}),[m]),yr(()=>{if(!i)return;let f=0,E=0,C=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(C=y,E=y.requestVideoFrameCallback(function T(){m.frameArrived(),E=y.requestVideoFrameCallback(T)}))},S=y=>{f=requestAnimationFrame(S);let T=R.current,w=v.current?.element??null;if(!T||!w||(w!==C&&(C&&E&&C.cancelVideoFrameCallback?.(E),x(w)),w.readyState<2))return;m.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(T.clientWidth*I)),k=Math.max(1,Math.round(T.clientHeight*I));(T.width!==d||T.height!==k)&&(T.width=d,T.height=k);let b=T.getContext("2d");if(!b)return;let M=m.transform(),F=w.videoWidth||d,K=w.videoHeight||k,_=Math.max(d/F,k/K)*(1+a)*M.scale;b.setTransform(_,0,0,_,d/2+M.translateX*d,k/2+M.translateY*k),b.drawImage(w,-F/2,-K/2),h.current=y};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),C&&E&&C.cancelVideoFrameCallback?.(E)}},[i,a,m]),yr(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,E=T=>{f()&&m.keyDown(T.key)},C=T=>m.keyUp(T.key),x=T=>{f()&&m.pointerDelta(T.movementX,T.movementY)},S=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",E),l.addEventListener("keyup",C),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",E),l.removeEventListener("keyup",C),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,m]),i?mo(Me,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[kr("canvas",{ref:R,style:lo,"data-urun-warp":""}),n]}):kr(Me,{ref:v,...s,children:n})});var br=new Map;function fo(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);br.set(e,{component:t,schema:r})}function Cr(e,t){let r=br.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as ho,jsx as tt}from"react/jsx-runtime";function go({name:e,props:t,fallback:r}){let o=Cr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(ho,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as He}from"zod";import{jsx as Ut,jsxs as Rr}from"react/jsx-runtime";var So=He.object({step:He.number().min(0),total:He.number().min(1),label:He.string().optional(),variant:He.enum(["default","success","error"]).default("default")});function Er(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function vo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Er(e);return Rr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Ut("div",{className:"urun-progress-label",children:o}),Ut("div",{className:"urun-progress-bar",children:Ut("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Rr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Pr,jsxs as Co}from"react/jsx-runtime";var yo=Mt.object({state:Mt.enum(["thinking","generating","idle","error"]),message:Mt.string().optional()}),ko={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function wr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??ko[t]??t;return{state:t,message:n,isActive:o}}function bo(e){let{state:t,message:r,isActive:o}=wr(e);return Co("span",{className:"urun-status-badge","data-state":t,children:[Pr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Pr("span",{className:"urun-status-message",children:r})]})}import{useRef as Tr,useEffect as Ro}from"react";import{z as _t}from"zod";import{jsx as xr,jsxs as wo}from"react/jsx-runtime";var Eo=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Ar(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Po(e){let{text:t,streaming:r}=Ar(e),o=Tr(null),n=Tr(0);return Ro(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),wo("div",{className:"urun-text-stream",children:[xr("span",{ref:o,className:"urun-text-content"}),r&&xr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as Ur,jsxs as Ao}from"react/jsx-runtime";var To=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Mr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function xo(e){let{src:t,alt:r,caption:o}=Mr(e);return Ao("figure",{className:"urun-image-frame",children:[Ur("img",{className:"urun-image",src:t,alt:r}),o&&Ur("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Se}from"zod";import{jsx as Nt,jsxs as _o}from"react/jsx-runtime";var Uo=Se.object({metrics:Se.array(Se.object({label:Se.string(),value:Se.union([Se.string(),Se.number()]),unit:Se.string().optional()}))});function _r(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Mo(e){let{metrics:t}=_r(e);return Nt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>_o("div",{className:"urun-metric-card",children:[Nt("div",{className:"urun-metric-label",children:r.label}),Nt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as No}from"react";import{jsx as Lo}from"react/jsx-runtime";var Io=No(function(t,r){let{stream:o="image",...n}=t;return Lo(Me,{ref:r,stream:o,...n})});import{forwardRef as Do,useCallback as _e,useEffect as It,useImperativeHandle as Vo,useRef as Ne}from"react";import{observePageLifecycle as Fo}from"@urun-sh/core";var nt=null;function Oo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=Oo();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Wo}from"react/jsx-runtime";var qo=1e3,Nr=200;function Lt(...e){console.debug("[audio]",...e)}var it=Do(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=ue(),v=o??l,R=Ne(null),h=Ne(null),p=Ne(null),m=Ne(null),f=Ne(u);f.current=u;let E=Ne(c);E.current=c;let C=_e(d=>{p.current!==d&&(p.current=d,E.current?.(d))},[]),x=_e(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=R.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=_e(d=>{let k=R.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||C(!0)}).catch(M=>{let F=M instanceof Error?M.name:String(M);if(F==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Nr}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Nr);return}if(F==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),C(!1);return}Lt(`play() failed (${d})`,M)})},[C]),y=_e(d=>{let k=x();if(k){for(let b of k.getAudioTracks())b!==d&&k.removeTrack(b);d&&!k.getAudioTracks().includes(d)&&k.addTrack(d),d&&S("track-attach"),f.current?.(d)}},[x,S]),T=_e(()=>{let d=R.current;d&&(x(),d.muted=!1,S("gesture"),st(),C(!0))},[x,S,C]);Vo(r,()=>({unlock:T,get unlocked(){return p.current===!0},get element(){return R.current}}),[T]);let w=_e(d=>{R.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),g?.(d)},[x,g]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),k=()=>{let N=h.current;return N?N.getAudioTracks()[0]??null:null},b=N=>{if(N!==k()&&(y(N),N)){let _=()=>{k()===N&&y(null)};N.addEventListener("ended",_)}},M=d.track;M&&M.readyState==="live"&&b(M);let F=d.on("track",N=>{N&&N.readyState!=="live"||b(N)}),K=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&b(N)},qo);return()=>{F(),clearInterval(K)}},[v,n,I,s,y]),It(()=>Fo(()=>{st(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{m.current&&clearTimeout(m.current)},[]),Wo("audio",{ref:w,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Ho=it;import{forwardRef as Bo,useCallback as Ie,useEffect as Ir,useImperativeHandle as jo,useRef as pe}from"react";import{observePageLifecycle as Ko,sessionFailureFromMediaError as $o,sharedCaptureController as zo}from"@urun-sh/core";import{jsx as Xo}from"react/jsx-runtime";var Lr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=Bo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Lr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:R,onUnlockChange:h,capture:p}=t,m=ue(),f=o??m,E=pe(null),C=pe(null),x=pe(null),S=pe([]),y=pe(!1),T=pe(g);T.current=g;let w=pe(l);w.current=l;let I=pe(v);I.current=v;let d=Ie(_=>{y.current!==_&&(y.current=_,T.current?.(_))},[]),k=Ie(()=>{for(let _ of S.current)_();S.current=[],x.current?.release(),x.current=null,C.current&&(C.current=null,I.current?.(null))},[]),b=Ie(async()=>{let _=x.current;if(_){let q=await _.update(i);return C.current=_.stream,I.current?.(_.stream),q}let j=await(p??zo()).claim("audio",i);x.current=j,S.current=[j.onTrack((q,z)=>{C.current=z,I.current?.(z),y.current&&f?.stream(n).attach(q).catch(Y=>at("mic re-attach after one-capture re-acquire failed",Y))}),j.onLost(q=>{x.current=null,S.current=[],C.current=null,I.current?.(null),d(!1),w.current?.(q)})],C.current=j.stream,I.current?.(j.stream);let B=j.track;if(!B)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return B},[p,i,f,n,d]),M=Ie(async()=>{k(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,k,d]),F=Ie(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let _;try{_=await b()}catch(B){k();let q=$o(B,f.status);throw w.current?.(q),q}f.connect?.();let L;for(let B=1;B<=u;B++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(_),d(!0);return}catch(q){L=q,at(`start attempt ${B}/${u} failed`,q),B<u&&await new Promise(z=>setTimeout(z,c))}k(),d(!1);let j=L instanceof Error?L:new Error(String(L??"voice start failed"));throw w.current?.(j),j},[f,n,a,u,c,b,k,d]);jo(r,()=>({start:F,stop:M,unlock:()=>E.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return E.current}}),[F,M]);let K=pe(!1),N=Ie(async()=>{if(!f||!y.current||K.current)return;let _=C.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await f.stream(n).attach(_)}catch(L){at("foreground mic re-assert failed (will retry on next pass)",L)}return}K.current=!0;try{let L=await b();await f.stream(n).attach(L)}catch(L){let j=L instanceof Error?L:new Error(String(L));at("foreground mic re-acquire failed",j),w.current?.(j)}finally{K.current=!1}},[f,n,b]);return Ir(()=>{let _=()=>{N()};return f&&typeof f.onRecovery=="function"?f.onRecovery(_):Ko(_)},[f,N]),Ir(()=>k,[k]),s?Xo(it,{ref:E,session:f,stream:n,onTrack:R,onUnlockChange:h}):null}),Jo=ut;import{forwardRef as Zo,useEffect as Qo,useImperativeHandle as es,useRef as Or,useState as ts}from"react";import{useEffect as Go,useState as Yo}from"react";var Ot={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Yo(Ot);return Go(()=>{if(!e){i(Ot);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),R=setInterval(()=>{g.getByteTimeDomainData(l);let h=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;h+=f*f}let p=Math.sqrt(h/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(R),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as ss,jsx as ct,jsxs as is}from"react/jsx-runtime";var rs={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},ns={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},os=Zo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,R=ue(),h=o??R,p=Or(null),[m,f]=ts(null),E=Or(l);E.current=l;let{level:C,speaking:x}=Dt(a?m:null);return es(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Qo(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),is(ss,{children:[ct(ut,{ref:p,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:S=>{f(S),E.current?.(S)}}),a?ct("span",{className:u,style:rs,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(C*100)/100,children:ct("span",{style:ns,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as as,sessionFailureFromMediaError as us,sharedCaptureController as cs}from"@urun-sh/core";import{forwardRef as Vr,useCallback as ce,useEffect as Vt,useImperativeHandle as ls,useRef as Q,useState as We}from"react";import{jsx as ve,jsxs as Dr}from"react/jsx-runtime";var Fr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ft(...e){console.debug("[camera]",...e)}function ds(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function ps(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var qr=Vr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:R,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:E,children:C,capture:x,flipControl:S="auto",flipControlClassName:y,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",I=ue(),d=o??I,k=Q(null),b=Q(null),M=Q(null),F=Q([]),K=Q(null),N=Q(!1),_=Q(!1),L=Q(w),[j,B]=We(w),[q,z]=We(!1),[Y,J]=We(null),[H,W]=We(!1),[X]=We(ds),ee=Q(p);ee.current=p;let Z=Q(m);Z.current=m;let me=Q(f);me.current=f;let P=Q(E);P.current=E;let V=Q(T);V.current=T;let A=ce(O=>{N.current!==O&&(N.current=O,z(O),ee.current?.(O))},[]);Vt(()=>{if(!q){J(null);return}let O=!1,D=()=>{ps().then(ae=>{O||(J(ae),ae&&V.current?.(ae))})};D();let re=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof re?.addEventListener=="function"?(re.addEventListener("devicechange",D),()=>{O=!0,re.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[q]);let $=ce(O=>{let D=k.current;D&&(D.muted=!0,D.defaultMuted=!0,D.setAttribute("muted",""),D.setAttribute("playsinline",""),D.setAttribute("webkit-playsinline",""),D.srcObject=O,O&&D.play()?.catch?.(re=>Ft("preview play() failed",re)))},[]),G=ce(()=>{_.current=!1,K.current?.(),K.current=null;for(let O of F.current)O();F.current=[],M.current?.release(),M.current=null,b.current&&(b.current=null,me.current?.(null),P.current?.(null)),$(null)},[$]),se=ce((O,D)=>{K.current?.(),b.current=D,$(D),me.current?.(D);let re=()=>{b.current===D&&(Ft("camera track ended (device removed or permission revoked)"),G(),A(!1))};O.addEventListener("ended",re),K.current=()=>O.removeEventListener("ended",re)},[$,G,A]),U=ce(async O=>{let D=n!==!1;if(D&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let re={...Fr,...s,facingMode:O},ae;try{let fe=M.current;if(fe)ae=await fe.update(re);else{let Oe=await(x??cs()).claim("video",re);if(M.current=Oe,F.current=[Oe.onTrack((De,tn)=>{se(De,tn),N.current&&(!D||!d||d.stream(n).attachVideo(De).then(()=>P.current?.(De)).catch(rn=>Ft("camera re-publish after one-capture re-acquire failed",rn)))}),Oe.onLost(De=>{M.current=null,F.current=[],G(),A(!1),Z.current?.(De)})],!Oe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ae=Oe.track}}catch(fe){let we=us(fe,d?.status);throw Z.current?.(we),we}L.current=O,B(O),se(ae,M.current?.stream??new MediaStream([ae]));try{D&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ae)),_.current=D?n:!1}catch(fe){G(),A(!1);let we=fe instanceof Error?fe:new Error(String(fe));throw Z.current?.(we),we}P.current?.(ae),A(!0)},[d,n,s,l,x,se,G,A]),le=ce(O=>U(O?.facingMode??L.current),[U]),de=ce(async O=>{let D=_.current===n;N.current&&L.current===O&&D||await U(O)},[U,n]),te=ce(()=>U(L.current==="environment"?"user":"environment"),[U]),ie=ce(async()=>{G(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,G,A]),Pe=ce(async O=>{let D=k.current;if(!D)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await as(D,O)},[]);ls(r,()=>({start:le,stop:ie,flip:te,setFacingMode:de,capturePhoto:Pe,get active(){return N.current},get facingMode(){return L.current},get stream(){return b.current},get element(){return k.current}}),[le,ie,te,de,Pe]);let Le=Q(de);if(Le.current=de,Vt(()=>{c&&(n!==!1&&!d||Le.current(w).catch(()=>{}))},[c,d,w,n]),Vt(()=>G,[G]),!v)return null;let Gt=g==="auto"?j==="user":g,gt=q&&(S===!0||S==="auto"&&X&&(Y?.length??0)>1),Xe=()=>{H||(W(!0),te().catch(()=>{}).finally(()=>W(!1)))};return Dr("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[ve("video",{ref:k,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Gt?{transform:"scaleX(-1)"}:{}}}),gt?ve("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Xe,disabled:H,className:y,style:y?{opacity:H?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:H?.6:1},children:Dr("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[ve("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ve("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ve("path",{d:"M14.5 10.5v1.6h-1.6"}),ve("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ve("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),ms=Vr(function({preview:t=!0,...r},o){return ve(qr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as fs,normalizeReferenceImage as gs,referenceImageErrorMessage as hs}from"@urun-sh/core";import{useCallback as Be,useEffect as Ss,useRef as qt,useState as je}from"react";function vs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=je(null),[a,u]=je(null),[c,g]=je(!1),[l,v]=je(null),[R]=je(fs),h=qt(n);h.current=n;let p=qt(null),m=qt(0),f=Be(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),h.current?.(y)},[]);Ss(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let E=Be(async y=>{let T=++m.current;g(!0),v(null);try{let w=await y();if(m.current!==T)return;f(w)}catch(w){if(m.current!==T)return;v(hs(w))}finally{m.current===T&&g(!1)}},[f]),C=Be(y=>E(()=>gs(y,{maxSize:t,type:r,quality:o,source:"file"})),[E,t,r,o]),x=Be(y=>E(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[E,t,r,o]),S=Be(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:C,capture:x,clear:S,busy:c,error:l,cameraAvailable:R}}import{useEffect as ys,useState as ks}from"react";function bs(e,t){let[r,o]=ks(null);return ys(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as Ts}from"react";import{useEffect as Ps,useMemo as ws}from"react";import{createStore as Cs}from"zustand/vanilla";import{useStore as Rs}from"zustand";var Es=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Cs(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Es,u=(c=>Rs(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Ke(e,t){let r=ws(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Ps(()=>r.bind(),[r]),r}function xs(e,t,r){let n=Ke(e,t)(r??(a=>a)),s=Ts(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as As,useState as Us}from"react";var Ce=200;function ye(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function $e(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Bt(e,t,r={}){let o=r.cap??200,[n,s]=Us([]);return As(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>ye(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as ze}from"react/jsx-runtime";function Ms({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return ze("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[ze("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),ze("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?ze("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>ze("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",$e(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as _s,useState as Hr}from"react";import{jsx as Re,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Hr(""),[i,a]=Hr(null),u=_s(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Re("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Re("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Ns({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ke(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Re("code",{children:t}),Re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Re(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as Je,jsxs as Br}from"react/jsx-runtime";function Wr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Os({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=Ls([]);return Is(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ye(u,{at:Date.now(),direction:"in",text:Wr($e(a))},r))}):void 0),[e,t,r]),Br("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Je(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ye(u,{at:Date.now(),direction:"out",text:Wr(a)},r))}}),Je("div",{className:"urun-control-sender-log",children:n.length===0?Je("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Br("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Je("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Je("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Ds,useState as Vs}from"react";import{jsx as mt,jsxs as qs}from"react/jsx-runtime";function Fs({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Vs([]),a=t.join(","),u=r.join(",");return Ds(()=>{if(i([]),!e)return;let c=(l,v)=>i(R=>ye(R,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",R=>c("track",`${l}: ${R?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>qs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as ti,isWakingPhase as ri}from"@urun-sh/core";import{useEffect as Hs,useState as Ws}from"react";function oe(e){let[t,r]=Ws(e?.phase??null);return Hs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as zs}from"@urun-sh/core";import{useEffect as Bs,useRef as js,useState as Ks}from"react";import{isWakingPhase as $s}from"@urun-sh/core";function jt(e){let t=oe(e),r=$s(t?.name),o=js(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=Ks(s);return Bs(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Js,jsx as jr,jsxs as Kr}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:jr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Kr(Js,{children:[jr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",Kr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Ys,useState as Zs}from"react";import{useEffect as $r,useRef as Xs,useState as zr}from"react";var Gs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=zr(null),n=Xs(0);$r(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=zr(0);return $r(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Gs}import{jsx as Jr,jsxs as Xr}from"react/jsx-runtime";var Qs={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function ei(e){let[t,r]=Zs(!1);return Ys(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=$t(e,t),i=ei(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Jr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Xr("div",{className:"urun-activation-overlay-card",children:[Jr("span",{className:"urun-activation-overlay-copy",children:a.hint??Qs[u]})," ",Xr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ee,jsxs as Jt}from"react/jsx-runtime";var ni={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function oi({session:e,className:t}){let r=oe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ee("span",{className:"urun-session-status-dot","data-phase":o}),Ee("span",{className:"urun-session-status-label",children:ni[o]}),n?Ee("span",{className:"urun-session-status-detail",children:n}):null]})}function si({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=oe(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ee(zt,{session:e})]});let i=r?r(s):Ee("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ri(s.name)?Ee(Kt,{session:e}):s&&s.name!=="idle"?ti(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ee("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ii,useState as ai}from"react";import{jsx as li}from"react/jsx-runtime";function Gr(e){return oe(e)?.endsAt??null}function ui(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function ci({session:e,urgentMs:t=6e4,className:r}){let n=Gr(e)?.getTime()??null,[s,i]=ai(()=>n===null?null:Math.max(0,n-Date.now()));if(ii(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=ui(s);return li("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Yr,jsxs as mi}from"react/jsx-runtime";var di=new Set(["expired","ended","error"]);function pi({session:e,onNewSession:t,children:r,className:o}){let n=oe(e);if(!n||!di.has(n.name))return null;let s=r?r(n):Yr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return mi("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Yr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Zr,useMemo as fi,useState as Qr}from"react";import{jsx as ft,jsxs as Si}from"react/jsx-runtime";function Xt(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function en(e){let t=fi(()=>e?e.doc("control"):null,[e]),[r,o]=Qr(()=>t?Xt(t.get("idle")):null);return Zr(()=>{if(!t){o(null);return}return o(Xt(t.get("idle"))),t.on("change",()=>o(Xt(t.get("idle"))))},[t]),r}function gi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function hi({session:e,onStillHere:t,className:r}){let o=en(e),n=o?.deadlineEpochS??null,[s,i]=Qr(null);if(Zr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Si("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${gi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as vi,useEffect as yi,useState as ki}from"react";import{prewake as bi}from"@urun-sh/core";function Ci(e){let t=vi(Te),[r,o]=ki(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return yi(()=>{if(!a||!u||!n||!s)return;let v=!1,R=()=>{bi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};R();let h=setInterval(R,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[n,s,i,a,u,c,g,l]),r}import{describeSessionPhase as Nl,isWakingPhase as Il}from"@urun-sh/core";export{it as Audio,qr as Camera,go as ComponentRenderer,Fr as DEFAULT_CAMERA_CONSTRAINTS,Ce as DEFAULT_LOG_CAP,Lr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Io as Image,xo as ImageFrame,To as ImageFrameSchema,Mo as MetricsPanel,Uo as MetricsPanelSchema,os as Mic,mn as OPERATOR_CHORD_LABEL,pn as OPERATOR_TOKEN_STORAGE_KEY,vo as ProgressCard,So as ProgressCardSchema,po as ReprojectedVideo,Yn as Session,bo as StatusBadge,yo as StatusBadgeSchema,Po as TextStream,Eo as TextStreamSchema,zt as UrunActivationOverlay,Ho as UrunAudio,nn as UrunAuthProvider,ms as UrunCamera,Os as UrunControlSender,Ns as UrunDocPanel,Ve as UrunErrorBoundary,Fs as UrunEventSpine,hi as UrunIdleWarning,on as UrunJwtProvider,En as UrunProvider,ci as UrunSessionClock,pi as UrunSessionEnded,si as UrunSessionGate,oi as UrunSessionStatus,Kt as UrunSessionWaking,Ms as UrunStreamTail,Jo as UrunVoice,Me as Video,ut as Voice,Ge as authMode,Ht as createDocStore,Nl as describeSessionPhase,$e as formatPayload,ot as getUrunAudioContext,Il as isWakingPhase,Wt as parseJsonObject,ye as pushCapped,tr as readOperatorToken,fo as registerComponent,st as resumeUrunAudioContext,ge as urunPublicEnv,$t as useActivation,_n as useApp,jn as useChat,qn as useCompletion,vt as useConfirmOnLeave,Ke as useDocStore,Mr as useImageFrame,Xn as useInputPresence,_r as useMetricsPanel,St as useOperatorOverride,Er as useProgressCard,vs as useReferenceImage,On as useRequest,Zn as useSession,xs as useSessionDoc,Gr as useSessionEndsAt,en as useSessionIdle,oe as useSessionPhase,bs as useSessionTrack,jt as useSessionWake,wr as useStatusBadge,Bt as useStreamMessages,Ar as useTextStream,Dt as useUrunAudioLevel,ht as useUrunAuth,Ci as useUrunPrewake,cn as usesWorkOSAuth};
|
|
2
|
+
import{a as ht,b as an,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as nr,useEffect as yn,useMemo as kn,useRef as or,useState as kt}from"react";import{Component as un}from"react";import{jsx as Zt,jsxs as cn}from"react/jsx-runtime";var Fe=class extends un{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||cn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Zt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Zt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as ln}from"react";var we=ln(null);function me(e){return e&&e.trim()?e.trim():void 0}function ue(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return me(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return me(typeof process<"u"?process.env?.[e]:void 0)}}function Ge(){let e=ue("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ue("VERCEL_ENV")==="production"?"workos":ue("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function dn(){return Ge()==="workos"}import{useEffect as pn,useRef as mn}from"react";var fn="urun.operator_token",er=null,Qt="op",gn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function tr(){return typeof window<"u"}function rr(){return er}function hn(){if(!tr())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(Qt);if(!r)return null;er=r,t.delete(Qt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Sn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function vt(e){let t=mn(e);t.current=e,pn(()=>{if(!tr())return;hn();let r=o=>{if(!Sn(o))return;let n=rr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as vn}from"react";function yt(e=!0){vn(()=>{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 xe,jsxs as Tn}from"react/jsx-runtime";var bn="/api/urun-token",Rn=1e4;function Cn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function sr(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 ir(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 En(e,t){return typeof e=="function"?e(t):e!==void 0?e:Tn("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:[xe("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),xe("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Pn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:C}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(h&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);yt(g);let[m,f]=kt(),[P,E]=kt(null),U=or(void 0),S=or(null),[k,x]=kt(null);vt(G=>x({jwt:G}));let T=St(),L=ue("NEXT_PUBLIC_SESSION_TOKEN")??ue("NEXT_PUBLIC_URUN_JWT"),d=Ge(),b=k!==null,R=d==="workos"&&!n&&!b&&!h,M=n??(d==="jwt"?L:void 0)??m?.token,O=b?k.jwt:M,j=s??ue("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=R&&!O&&!T?.getAccessToken,_=t??m?.orgId,D=e??m?.gatewayUrl,B=h&&m===void 0,W=h&&m!==void 0&&!D?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,H=I?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,X=P??W??H,Y=ir("NEXT_PUBLIC_URUN_TOKEN_URL",ue("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??bn,z=ir("NEXT_PUBLIC_URUN_EVENTS_URL",ue("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,q=nr(async G=>{if(!G?.forceRefresh){let N=U.current;if(!N)return N;let w=Cn(N);if(w===null||w-Date.now()>Rn)return N}return(await(S.current??(S.current=(async()=>{try{let N=await sr(Y);return U.current=N.token,f(N),N}finally{S.current=null}})()))).token},[Y]),K=nr(async()=>O,[O]),ee=typeof O=="string"&&O.trim().length>0,ke=R?T?.getAccessToken:h&&!b?q:ee?K:void 0,Q=kn(()=>({appId:p,baseUrl:D??"",orgId:_??"",jwt:O,getAccessToken:R?T?.getAccessToken:h&&!b?q:void 0,authProvider:j,eventsUrl:z,sessionKey:a,releaseOnLeave:c,priority:b?"preempt":void 0}),[p,T,D,j,O,z,_,a,c,R,b,h,q]);return yn(()=>{if(!h)return;let G=new AbortController;return E(null),(async()=>{try{let y=await sr(Y,G.signal);U.current=y.token,f(y)}catch(y){if(G.signal.aborted)return;E(y instanceof Error?y:new Error(String(y)))}})(),()=>G.abort()},[h,Y]),xe(Fe,{fallback:l,children:X?En(v,X):B?xe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):xe(we.Provider,{value:Q,children:ke?xe(ht,{getAccessToken:ke,children:C}):C})})}import{useContext as wn,useEffect as xn,useMemo as ar,useReducer as Un,useRef as bt}from"react";import{App as An}from"@urun-sh/core";function Mn(e,t){return`${e}:${JSON.stringify(t??{})}`}function _n(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var be=new Map;var Rt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Ct=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Et=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new Rt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ct(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Nn(){let e=wn(we);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Un(i=>i+1,0),r=bt(new Map),o=bt(new Map),n=bt(null),s=ar(()=>An(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return xn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=be.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=be.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=be.get(u);!l||l.refCount!==0||(be.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),ar(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=Mn(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let h=_n(e,u,l),p=be.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),be.delete(h),o.current.get(h)===p&&o.current.delete(h),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Et(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},be.set(h,p)),o.current.get(h)!==p&&(o.current.set(h,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as Pt,useEffect as In,useMemo as Ln,useRef as Ye,useState as Tt}from"react";function Ue(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 On(e){return e instanceof Error?e:new Error(String(e))}function Dn(e,t){let r=Ln(()=>Ue(e),[e]),[o,n]=Tt(void 0),[s,i]=Tt(null),[a,u]=Tt(!1),c=Ye(t);c.current=t;let g=Ye(0),l=Ye(null),v=Ye(!0);In(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=Pt(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,E=()=>v.current&&g.current===P;E()&&(u(!0),i(null));try{let U=await r.request(m,{...c.current,signal:f.signal});return E()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let S=On(U);throw E()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=Pt(m=>{C(m).catch(()=>{})},[C]),p=Pt(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}import{useCallback as ur,useEffect as Vn,useMemo as Fn,useRef as Ze,useState as wt}from"react";function cr(e){return e instanceof Error?e:new Error(String(e))}var qn=e=>typeof e=="string"?e:String(e);function Hn(e,t){let r=Fn(()=>Ue(e),[e]),[o,n]=wt(""),[s,i]=wt(!1),[a,u]=wt(null),c=Ze(t);c.current=t;let g=Ze(0),l=Ze(null),v=Ze(!0);Vn(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=ur(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=ur(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,P=c.current,E=P?.parseChunk??qn,U=P?.buildPayload??(R=>({prompt:R}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:k,onFinish:x,onError:T,...L}=P??{},d="",b;try{b=r.requestStream(U(p),L),l.current=b}catch(R){let M=cr(R);f()&&(u(M),i(!1),P?.onError?.(M));return}try{for await(let R of b){if(g.current!==m)break;d+=E(R),f()&&n(d)}f()&&(i(!1),P?.onFinish?.(d))}catch(R){let M=cr(R);f()&&(u(M),i(!1),P?.onError?.(M))}finally{l.current===b&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:C,isStreaming:s,error:a}}import{useCallback as lr,useEffect as Wn,useMemo as Bn,useRef as Ae,useState as Qe}from"react";function dr(e){return e instanceof Error?e:new Error(String(e))}var jn=e=>typeof e=="string"?e:String(e),pr=0;function xt(e){return pr+=1,`${e}-${pr}`}function Kn(e,t){let r=Bn(()=>Ue(e),[e]),[o,n]=Qe(()=>(t?.initialMessages??[]).map(E=>({id:E.id??xt("msg"),role:E.role,content:E.content}))),[s,i]=Qe(""),[a,u]=Qe(!1),[c,g]=Qe(null),l=Ae(t);l.current=t;let v=Ae(o);v.current=o;let C=Ae(s);C.current=s;let h=Ae(0),p=Ae(null),m=Ae(!0);Wn(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=lr(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=lr(async E=>{let U=E===void 0,S=(U?C.current:E)??"";if(!S.trim())return;p.current?.cancel();let x=++h.current,T=()=>m.current&&h.current===x,L=l.current,d=L?.parseChunk??jn,b={id:xt("msg"),role:"user",content:S},R={id:xt("msg"),role:"assistant",content:""},M=[...v.current,b].map(q=>({role:q.role,content:q.content})),O=[...v.current,b,R];v.current=O,n(O),U&&i(""),g(null),u(!0);let j=L?.buildPayload??(q=>({messages:q})),{initialMessages:I,parseChunk:_,buildPayload:D,onFinish:B,onError:W,...H}=L??{},X=q=>{n(K=>K.map(ee=>ee.id===R.id?{...ee,content:q}:ee))},Y="",z;try{z=r.requestStream(j(M),H),p.current=z}catch(q){let K=dr(q);T()&&(g(K),u(!1),L?.onError?.(K));return}try{for await(let q of z){if(h.current!==x)break;Y+=d(q),T()&&X(Y)}T()&&(u(!1),L?.onFinish?.({...R,content:Y}))}catch(q){let K=dr(q);T()&&(g(K),u(!1),L?.onError?.(K))}finally{p.current===z&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:f,isStreaming:a,error:c}}import{useCallback as he,useEffect as mr,useMemo as $n,useRef as fr,useState as gr}from"react";import{createInputPresencePublisher as Xn,INPUT_PRESENCE_DEFAULT_HZ as zn,INPUT_PRESENCE_FIELD as Jn}from"@urun-sh/core";var Ut=[];function Gn(e,t={}){let{field:r=Jn,hz:o=zn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=$n(()=>s?Xn({awareness:{setLocalStateField:(S,k)=>s.setField(S,k)},field:r,hz:o}):null,[s,r,o]),a=fr(null);a.current=i;let[u,c]=gr(!1),[g,l]=gr(Ut),v=fr(!1);mr(()=>{if(i)return()=>i.dispose()},[i]);let C=he(()=>{let S=a.current;l(S?S.heldKeys():Ut)},[]),h=he(()=>{a.current?.clear(),l(Ut)},[]);mr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,k=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),h())},x=R=>{S()&&(a.current?.keyDown(R.key),C())},T=R=>{a.current?.keyUp(R.key),C()},L=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},b=()=>{h()};return n.addEventListener("pointerlockchange",k),n.addEventListener("keydown",x),n.addEventListener("keyup",T),n.addEventListener("mousemove",L),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",b),()=>{n.removeEventListener("pointerlockchange",k),n.removeEventListener("keydown",x),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",L),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",b)}},[n,h,C]);let p=he(S=>{S.requestPointerLock?.()},[]),m=he(()=>{v.current=!0,c(!0)},[]),f=he(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),P=he(S=>{a.current?.keyDown(S),C()},[C]),E=he(S=>{a.current?.keyUp(S),C()},[C]),U=he((S,k)=>{a.current?.movePointer(S,k)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:P,releaseKey:E,movePointer:U}}import{forwardRef as ao,useEffect as Rr,useImperativeHandle as uo,useMemo as co,useRef as et}from"react";import{createCameraWarp as lo}from"@urun-sh/core";import{forwardRef as to,useCallback as Me,useEffect as qe,useImperativeHandle as ro,useRef as ne,useState as Sr}from"react";import{derivedLegRole as no}from"@urun-sh/core";import{createContext as Yn,useContext as hr}from"react";import{jsx as eo}from"react/jsx-runtime";var At=Yn(null);function Zn({session:e,children:t}){return eo(At.Provider,{value:e,children:t})}function ce(){return hr(At)}function Qn(){let e=hr(At);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as br,jsxs as io}from"react/jsx-runtime";function oo(e,t){return e-t>>>0<2147483648}var vr=1e3;function so(...e){console.debug("[video]",...e)}function yr(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 kr(e,t,r){return r?[r,t]:[e,t]}var _e=to(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:C,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:E,onFrameMarkerUnsupported:U}=t,S=ce(),k=o??S,x=ne(null),T=ne(null),[L,d]=Sr(!1),[b,R]=Sr(!1),M=ne(!1),O=ne(m);O.current=m;let j=ne(f);j.current=f;let I=ne(E);I.current=E;let _=ne(U);_.current=U;let D=ne(P??null);D.current=P??null;let B=ne(null),W=ne(null),H=Me((y,N=!1)=>{if(!N&&y===B.current||(B.current=y,W.current?.(),W.current=null,M.current=!1,R(!1),!y))return;let w=x.current;if(!w)return;let $=D.current,J=$?.rtpTimestamp??null,se=!1,A=()=>{se||(se=!0,_.current?.())};$&&J==null&&A();let de=$!=null&&J!=null,pe=ie=>{W.current?.(),W.current=null,M.current=!0,R(!0),j.current?.(),ie&&I.current?.()};if(typeof w.requestVideoFrameCallback=="function"){let ie=!1,Pe=0,Oe=(Yt,gt)=>{if(!ie){if(de){let Je=gt?.rtpTimestamp;if(typeof Je!="number"){A(),pe(!1);return}if(!oo(Je,J)){Pe=w.requestVideoFrameCallback(Oe);return}pe(!0);return}pe(!1)}};Pe=w.requestVideoFrameCallback(Oe),W.current=()=>{ie=!0,w.cancelVideoFrameCallback?.(Pe)};return}de&&A();let te=()=>{let ie=w.getVideoPlaybackQuality?.();(ie?ie.totalVideoFrames>0:w.readyState>=2&&w.videoWidth>0)&&pe(!1)};w.addEventListener("loadeddata",te),w.addEventListener("timeupdate",te),w.addEventListener("playing",te),W.current=()=>{w.removeEventListener("loadeddata",te),w.removeEventListener("timeupdate",te),w.removeEventListener("playing",te)},te()},[]);qe(()=>()=>{W.current?.(),W.current=null},[]);let X=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,Y=ne(X);qe(()=>{if(Y.current===X||(Y.current=X,X==null))return;let y=B.current;y&&H(y,!0)},[X,H]);let z=Me(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let y=x.current;return y&&y.srcObject!==T.current&&(y.srcObject=T.current),T.current},[]),q=Me(y=>{let N=x.current;if(!N)return;let w=N.play();!w||typeof w.catch!="function"||w.catch($=>so(`play() failed (${y})`,$))},[]),K=Me(y=>{let N=z();if(N){for(let w of N.getVideoTracks())w!==y&&N.removeTrack(w);if(y&&!N.getVideoTracks().includes(y)){N.addTrack(y);let w=x.current;w&&(w.srcObject=N)}y&&q("track-attach"),d(y!==null),H(y),O.current?.(y)}},[z,q,H]),ee=Me(y=>{let N=z();if(N){for(let w of N.getAudioTracks())w!==y&&N.removeTrack(w);y&&!N.getAudioTracks().includes(y)&&N.addTrack(y),y&&q("audio-attach")}},[z,q]),ke=Me(y=>{x.current=y,y&&(a&&(y.muted=!0,y.defaultMuted=!0,y.setAttribute("muted","")),y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),z())},[z,a]);ro(r,()=>({get element(){return x.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let Q=no(n)!==void 0;qe(()=>{Q&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[Q,n]);let G=i!==void 0;return qe(()=>{if(G){K(i??null);return}if(Q){K(null);return}if(!k)return;let y=yr(k,kr(n,"video")),N=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},w=A=>{if(A!==N()&&(K(A),A)){let de=()=>{N()===A&&K(null)};A.addEventListener("ended",de)}},$=y.track;$&&$.readyState==="live"&&w($);let J=y.on("track",A=>{A&&A.readyState!=="live"||w(A)}),se=setInterval(()=>{let A=y.track;A&&A.readyState==="live"&&w(A)},vr);return()=>{J(),clearInterval(se)}},[k,n,Q,G,i,K]),qe(()=>{if(G||!k||s===!1||Q)return;let y=yr(k,kr(n,"audio",s)),N=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},w=A=>{if(A!==N()&&(ee(A),A)){let de=()=>{N()===A&&ee(null)};A.addEventListener("ended",de)}},$=y.track;$&&$.readyState==="live"&&w($);let J=y.on("track",A=>{A&&A.readyState!=="live"||w(A)}),se=setInterval(()=>{let A=y.track;A&&A.readyState==="live"&&w(A)},vr);return()=>{J(),clearInterval(se)}},[k,n,Q,s,G,ee]),io("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":L?"true":"false","data-urun-video-framed":b?"true":"false",children:[br("video",{ref:ke,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),L?null:C,h===void 0?null:br("div",{"data-urun-video-poster":"","aria-hidden":b||void 0,style:{position:"absolute",inset:0,...b?{opacity:0,pointerEvents:"none"}:null},children:h}),p]})});import{jsx as Cr,jsxs as fo}from"react/jsx-runtime";var po={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},mo=ao(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),C=et(null),h=et(0),p=et(g);p.current=g;let m=co(()=>lo(p.current),[]);return uo(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:m,get lastDrawTs(){return h.current}}),[m]),Rr(()=>{if(!i)return;let f=0,P=0,E=null,U=k=>{typeof k.requestVideoFrameCallback=="function"&&(E=k,P=k.requestVideoFrameCallback(function x(){m.frameArrived(),P=k.requestVideoFrameCallback(x)}))},S=k=>{f=requestAnimationFrame(S);let x=C.current,T=v.current?.element??null;if(!x||!T||(T!==E&&(E&&P&&E.cancelVideoFrameCallback?.(P),U(T)),T.readyState<2))return;m.tick(k);let L=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(x.clientWidth*L)),b=Math.max(1,Math.round(x.clientHeight*L));(x.width!==d||x.height!==b)&&(x.width=d,x.height=b);let R=x.getContext("2d");if(!R)return;let M=m.transform(),O=T.videoWidth||d,j=T.videoHeight||b,_=Math.max(d/O,b/j)*(1+a)*M.scale;R.setTransform(_,0,0,_,d/2+M.translateX*d,b/2+M.translateY*b),R.drawImage(T,-O/2,-j/2),h.current=k};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),E&&P&&E.cancelVideoFrameCallback?.(P)}},[i,a,m]),Rr(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=x=>{f()&&m.keyDown(x.key)},E=x=>m.keyUp(x.key),U=x=>{f()&&m.pointerDelta(x.movementX,x.movementY)},S=()=>{f()||m.clearKeys()},k=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",E),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",k),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",E),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",k)}},[i,u,l,m]),i?fo(_e,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Cr("canvas",{ref:C,style:po,"data-urun-warp":""}),n]}):Cr(_e,{ref:v,...s,children:n})});var Er=new Map;function go(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Er.set(e,{component:t,schema:r})}function Pr(e,t){let r=Er.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as So,jsx as tt}from"react/jsx-runtime";function ho({name:e,props:t,fallback:r}){let o=Pr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(So,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as He}from"zod";import{jsx as Mt,jsxs as Tr}from"react/jsx-runtime";var vo=He.object({step:He.number().min(0),total:He.number().min(1),label:He.string().optional(),variant:He.enum(["default","success","error"]).default("default")});function wr(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 yo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=wr(e);return Tr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Mt("div",{className:"urun-progress-label",children:o}),Mt("div",{className:"urun-progress-bar",children:Mt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Tr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as _t}from"zod";import{jsx as xr,jsxs as Co}from"react/jsx-runtime";var ko=_t.object({state:_t.enum(["thinking","generating","idle","error"]),message:_t.string().optional()}),bo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Ur(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??bo[t]??t;return{state:t,message:n,isActive:o}}function Ro(e){let{state:t,message:r,isActive:o}=Ur(e);return Co("span",{className:"urun-status-badge","data-state":t,children:[xr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),xr("span",{className:"urun-status-message",children:r})]})}import{useRef as Ar,useEffect as Eo}from"react";import{z as Nt}from"zod";import{jsx as Mr,jsxs as wo}from"react/jsx-runtime";var Po=Nt.object({text:Nt.string(),streaming:Nt.boolean().default(!1)});function _r(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function To(e){let{text:t,streaming:r}=_r(e),o=Ar(null),n=Ar(0);return Eo(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),wo("div",{className:"urun-text-stream",children:[Mr("span",{ref:o,className:"urun-text-content"}),r&&Mr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as Nr,jsxs as Ao}from"react/jsx-runtime";var xo=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Ir(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Uo(e){let{src:t,alt:r,caption:o}=Ir(e);return Ao("figure",{className:"urun-image-frame",children:[Nr("img",{className:"urun-image",src:t,alt:r}),o&&Nr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Se}from"zod";import{jsx as It,jsxs as No}from"react/jsx-runtime";var Mo=Se.object({metrics:Se.array(Se.object({label:Se.string(),value:Se.union([Se.string(),Se.number()]),unit:Se.string().optional()}))});function Lr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function _o(e){let{metrics:t}=Lr(e);return It("div",{className:"urun-metrics-panel",children:t.map((r,o)=>No("div",{className:"urun-metric-card",children:[It("div",{className:"urun-metric-label",children:r.label}),It("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Io}from"react";import{jsx as Oo}from"react/jsx-runtime";var Lo=Io(function(t,r){let{stream:o="image",...n}=t;return Oo(_e,{ref:r,stream:o,...n})});import{forwardRef as Vo,useCallback as Ne,useEffect as Lt,useImperativeHandle as Fo,useRef as Ie}from"react";import{observePageLifecycle as qo}from"@urun-sh/core";var nt=null;function Do(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=Do();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Bo}from"react/jsx-runtime";var Ho=1e3,Or=200;function Ot(...e){console.debug("[audio]",...e)}var it=Vo(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(),v=o??l,C=Ie(null),h=Ie(null),p=Ie(null),m=Ie(null),f=Ie(u);f.current=u;let P=Ie(c);P.current=c;let E=Ne(d=>{p.current!==d&&(p.current=d,P.current?.(d))},[]),U=Ne(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=C.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=Ne(d=>{let b=C.current;if(!b)return;let R=b.play();!R||typeof R.then!="function"||R.then(()=>{b.muted||E(!0)}).catch(M=>{let O=M instanceof Error?M.name:String(M);if(O==="AbortError"){Ot(`play() aborted (${d}); retrying in ${Or}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Or);return}if(O==="NotAllowedError"){Ot(`play() blocked pending a user gesture (${d})`),E(!1);return}Ot(`play() failed (${d})`,M)})},[E]),k=Ne(d=>{let b=U();if(b){for(let R of b.getAudioTracks())R!==d&&b.removeTrack(R);d&&!b.getAudioTracks().includes(d)&&b.addTrack(d),d&&S("track-attach"),f.current?.(d)}},[U,S]),x=Ne(()=>{let d=C.current;d&&(U(),d.muted=!1,S("gesture"),st(),E(!0))},[U,S,E]);Fo(r,()=>({unlock:x,get unlocked(){return p.current===!0},get element(){return C.current}}),[x]);let T=Ne(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),g?.(d)},[U,g]),L=s!==void 0;return Lt(()=>{if(L){k(s??null);return}if(!v)return;let d=v.stream(n),b=()=>{let I=h.current;return I?I.getAudioTracks()[0]??null:null},R=I=>{if(I!==b()&&(k(I),I)){let _=()=>{b()===I&&k(null)};I.addEventListener("ended",_)}},M=d.track;M&&M.readyState==="live"&&R(M);let O=d.on("track",I=>{I&&I.readyState!=="live"||R(I)}),j=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&R(I)},Ho);return()=>{O(),clearInterval(j)}},[v,n,L,s,k]),Lt(()=>qo(()=>{st(),p.current===!0&&S("foreground")}),[S]),Lt(()=>()=>{m.current&&clearTimeout(m.current)},[]),Bo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Wo=it;import{forwardRef as jo,useCallback as Le,useEffect as Dr,useImperativeHandle as Ko,useRef as fe}from"react";import{observePageLifecycle as $o,sessionFailureFromMediaError as Xo,sharedCaptureController as zo}from"@urun-sh/core";import{jsx as Go}from"react/jsx-runtime";var Vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=jo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:C,onUnlockChange:h,capture:p}=t,m=ce(),f=o??m,P=fe(null),E=fe(null),U=fe(null),S=fe([]),k=fe(!1),x=fe(g);x.current=g;let T=fe(l);T.current=l;let L=fe(v);L.current=v;let d=Le(_=>{k.current!==_&&(k.current=_,x.current?.(_))},[]),b=Le(()=>{for(let _ of S.current)_();S.current=[],U.current?.release(),U.current=null,E.current&&(E.current=null,L.current?.(null))},[]),R=Le(async()=>{let _=U.current;if(_){let H=await _.update(i);return E.current=_.stream,L.current?.(_.stream),H}let B=await(p??zo()).claim("audio",i);U.current=B,S.current=[B.onTrack((H,X)=>{E.current=X,L.current?.(X),k.current&&f?.stream(n).attach(H).catch(Y=>at("mic re-attach after one-capture re-acquire failed",Y))}),B.onLost(H=>{U.current=null,S.current=[],E.current=null,L.current?.(null),d(!1),T.current?.(H)})],E.current=B.stream,L.current?.(B.stream);let W=B.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,f,n,d]),M=Le(async()=>{b(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,b,d]),O=Le(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let _;try{_=await R()}catch(W){b();let H=Xo(W,f.status);throw T.current?.(H),H}f.connect?.();let D;for(let W=1;W<=u;W++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(_),d(!0);return}catch(H){D=H,at(`start attempt ${W}/${u} failed`,H),W<u&&await new Promise(X=>setTimeout(X,c))}b(),d(!1);let B=D instanceof Error?D:new Error(String(D??"voice start failed"));throw T.current?.(B),B},[f,n,a,u,c,R,b,d]);Ko(r,()=>({start:O,stop:M,unlock:()=>P.current?.unlock(),get active(){return k.current},get micStream(){return E.current},get audio(){return P.current}}),[O,M]);let j=fe(!1),I=Le(async()=>{if(!f||!k.current||j.current)return;let _=E.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await f.stream(n).attach(_)}catch(D){at("foreground mic re-assert failed (will retry on next pass)",D)}return}j.current=!0;try{let D=await R();await f.stream(n).attach(D)}catch(D){let B=D instanceof Error?D:new Error(String(D));at("foreground mic re-acquire failed",B),T.current?.(B)}finally{j.current=!1}},[f,n,R]);return Dr(()=>{let _=()=>{I()};return f&&typeof f.onRecovery=="function"?f.onRecovery(_):$o(_)},[f,I]),Dr(()=>b,[b]),s?Go(it,{ref:P,session:f,stream:n,onTrack:C,onUnlockChange:h}):null}),Jo=ut;import{forwardRef as Qo,useEffect as es,useImperativeHandle as ts,useRef as Fr,useState as rs}from"react";import{useEffect as Yo,useState as Zo}from"react";var Dt={level:0,speaking:!1};function Vt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Zo(Dt);return Yo(()=>{if(!e){i(Dt);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),C=setInterval(()=>{g.getByteTimeDomainData(l);let h=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;h+=f*f}let p=Math.sqrt(h/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(C),c.disconnect(),i(Dt)}},[e,r,o,n]),s}import{Fragment as is,jsx as ct,jsxs as as}from"react/jsx-runtime";var ns={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},os={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ss=Qo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,C=ce(),h=o??C,p=Fr(null),[m,f]=rs(null),P=Fr(l);P.current=l;let{level:E,speaking:U}=Vt(a?m:null);return ts(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),es(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),as(is,{children:[ct(ut,{ref:p,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:S=>{f(S),P.current?.(S)}}),a?ct("span",{className:u,style:ns,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(E*100)/100,children:ct("span",{style:os,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(E*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as us,sessionFailureFromMediaError as cs,sharedCaptureController as ls}from"@urun-sh/core";import{forwardRef as Hr,useCallback as le,useEffect as Ft,useImperativeHandle as ds,useRef as Z,useState as We}from"react";import{jsx as ve,jsxs as qr}from"react/jsx-runtime";var Wr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function qt(...e){console.debug("[camera]",...e)}function ps(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function ms(){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 Br=Hr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:E,capture:U,flipControl:S="auto",flipControlClassName:k,onDevices:x}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",L=ce(),d=o??L,b=Z(null),R=Z(null),M=Z(null),O=Z([]),j=Z(null),I=Z(!1),_=Z(!1),D=Z(T),[B,W]=We(T),[H,X]=We(!1),[Y,z]=We(null),[q,K]=We(!1),[ee]=We(ps),ke=Z(p);ke.current=p;let Q=Z(m);Q.current=m;let G=Z(f);G.current=f;let y=Z(P);y.current=P;let N=Z(x);N.current=x;let w=le(V=>{I.current!==V&&(I.current=V,X(V),ke.current?.(V))},[]);Ft(()=>{if(!H){z(null);return}let V=!1,F=()=>{ms().then(ae=>{V||(z(ae),ae&&N.current?.(ae))})};F();let re=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof re?.addEventListener=="function"?(re.addEventListener("devicechange",F),()=>{V=!0,re.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[H]);let $=le(V=>{let F=b.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?.(re=>qt("preview play() failed",re)))},[]),J=le(()=>{_.current=!1,j.current?.(),j.current=null;for(let V of O.current)V();O.current=[],M.current?.release(),M.current=null,R.current&&(R.current=null,G.current?.(null),y.current?.(null)),$(null)},[$]),se=le((V,F)=>{j.current?.(),R.current=F,$(F),G.current?.(F);let re=()=>{R.current===F&&(qt("camera track ended (device removed or permission revoked)"),J(),w(!1))};V.addEventListener("ended",re),j.current=()=>V.removeEventListener("ended",re)},[$,J,w]),A=le(async V=>{let F=n!==!1;if(F&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let re={...Wr,...s,facingMode:V},ae;try{let ge=M.current;if(ge)ae=await ge.update(re);else{let De=await(U??ls()).claim("video",re);if(M.current=De,O.current=[De.onTrack((Ve,on)=>{se(Ve,on),I.current&&(!F||!d||d.stream(n).attachVideo(Ve).then(()=>y.current?.(Ve)).catch(sn=>qt("camera re-publish after one-capture re-acquire failed",sn)))}),De.onLost(Ve=>{M.current=null,O.current=[],J(),w(!1),Q.current?.(Ve)})],!De.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ae=De.track}}catch(ge){let Te=cs(ge,d?.status);throw Q.current?.(Te),Te}D.current=V,W(V),se(ae,M.current?.stream??new MediaStream([ae]));try{F&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ae)),_.current=F?n:!1}catch(ge){J(),w(!1);let Te=ge instanceof Error?ge:new Error(String(ge));throw Q.current?.(Te),Te}y.current?.(ae),w(!0)},[d,n,s,l,U,se,J,w]),de=le(V=>A(V?.facingMode??D.current),[A]),pe=le(async V=>{let F=_.current===n;I.current&&D.current===V&&F||await A(V)},[A,n]),te=le(()=>A(D.current==="environment"?"user":"environment"),[A]),ie=le(async()=>{J(),w(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,J,w]),Pe=le(async V=>{let F=b.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await us(F,V)},[]);ds(r,()=>({start:de,stop:ie,flip:te,setFacingMode:pe,capturePhoto:Pe,get active(){return I.current},get facingMode(){return D.current},get stream(){return R.current},get element(){return b.current}}),[de,ie,te,pe,Pe]);let Oe=Z(pe);if(Oe.current=pe,Ft(()=>{c&&(n!==!1&&!d||Oe.current(T).catch(()=>{}))},[c,d,T,n]),Ft(()=>J,[J]),!v)return null;let Yt=g==="auto"?B==="user":g,gt=H&&(S===!0||S==="auto"&&ee&&(Y?.length??0)>1),Je=()=>{q||(K(!0),te().catch(()=>{}).finally(()=>K(!1)))};return qr("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":B,children:[ve("video",{ref:b,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Yt?{transform:"scaleX(-1)"}:{}}}),gt?ve("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Je,disabled:q,className:k,style:k?{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:[ve("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ve("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ve("path",{d:"M14.5 10.5v1.6h-1.6"}),ve("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ve("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,E]})}),fs=Hr(function({preview:t=!0,...r},o){return ve(Br,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as gs,normalizeReferenceImage as hs,referenceImageErrorMessage as Ss}from"@urun-sh/core";import{useCallback as Be,useEffect as vs,useRef as Ht,useState as je}from"react";function ys(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=je(null),[a,u]=je(null),[c,g]=je(!1),[l,v]=je(null),[C]=je(gs),h=Ht(n);h.current=n;let p=Ht(null),m=Ht(0),f=Be(k=>{p.current&&URL.revokeObjectURL(p.current),p.current=k?URL.createObjectURL(new Blob([k.bytes],{type:k.type})):null,u(p.current),i(k),h.current?.(k)},[]);vs(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=Be(async k=>{let x=++m.current;g(!0),v(null);try{let T=await k();if(m.current!==x)return;f(T)}catch(T){if(m.current!==x)return;v(Ss(T))}finally{m.current===x&&g(!1)}},[f]),E=Be(k=>P(()=>hs(k,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),U=Be(k=>P(()=>k.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),S=Be(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:E,capture:U,clear:S,busy:c,error:l,cameraAvailable:C}}import{useEffect as ks,useState as bs}from"react";function Rs(e,t){let[r,o]=bs(null);return ks(()=>{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 xs}from"react";import{useEffect as Ts,useMemo as ws}from"react";import{createStore as Cs}from"zustand/vanilla";import{useStore as Es}from"zustand";var Ps=()=>{};function Wt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Cs(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Ps,u=(c=>Es(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Ke(e,t){let r=ws(()=>Wt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Ts(()=>r.bind(),[r]),r}function Us(e,t,r){let n=Ke(e,t)(r??(a=>a)),s=xs(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as As,useState as Ms}from"react";var Re=200;function ye(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function $e(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Bt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function jt(e,t,r={}){let o=r.cap??200,[n,s]=Ms([]);return As(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>ye(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as Xe}from"react/jsx-runtime";function _s({session:e,name:t,cap:r,className:o}){let n=jt(e,t,{cap:r});return Xe("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Xe("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),Xe("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?Xe("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Xe("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",$e(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Ns,useState as jr}from"react";import{jsx as Ce,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=jr(""),[i,a]=jr(null),u=Ns(()=>{let c=Bt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Ce("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Ce("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Ce("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Is({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ke(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Ce("code",{children:t}),Ce("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ce("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ce(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Ls,useState as Os}from"react";import{jsx as ze,jsxs as $r}from"react/jsx-runtime";function Kr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ds({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=Os([]);return Ls(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ye(u,{at:Date.now(),direction:"in",text:Kr($e(a))},r))}):void 0),[e,t,r]),$r("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[ze(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ye(u,{at:Date.now(),direction:"out",text:Kr(a)},r))}}),ze("div",{className:"urun-control-sender-log",children:n.length===0?ze("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>$r("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[ze("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",ze("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Vs,useState as Fs}from"react";import{jsx as mt,jsxs as Hs}from"react/jsx-runtime";function qs({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Fs([]),a=t.join(","),u=r.join(",");return Vs(()=>{if(i([]),!e)return;let c=(l,v)=>i(C=>ye(C,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>Hs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as ri,isWakingPhase as ni}from"@urun-sh/core";import{useEffect as Ws,useState as Bs}from"react";function oe(e){let[t,r]=Bs(e?.phase??null);return Ws(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as zs}from"@urun-sh/core";import{useEffect as js,useRef as Ks,useState as $s}from"react";import{isWakingPhase as Xs}from"@urun-sh/core";function Kt(e){let t=oe(e),r=Xs(t?.name),o=Ks(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]=$s(s);return js(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Js,jsx as Xr,jsxs as zr}from"react/jsx-runtime";function $t({session:e,render:t,className:r}){let o=Kt(e);return!o.waking||!o.phase?null:Xr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):zr(Js,{children:[Xr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",zr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Zs,useState as Qs}from"react";import{useEffect as Jr,useRef as Gs,useState as Gr}from"react";var Ys={event:null,elapsedMs:0};function Xt(e,t){let[r,o]=Gr(null),n=Gs(0);Jr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Gr(0);return Jr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ys}import{jsx as Yr,jsxs as Zr}from"react/jsx-runtime";var ei={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 ti(e){let[t,r]=Qs(!1);return Zs(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Xt(e,t),i=ti(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Yr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Zr("div",{className:"urun-activation-overlay-card",children:[Yr("span",{className:"urun-activation-overlay-copy",children:a.hint??ei[u]})," ",Zr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ee,jsxs as Jt}from"react/jsx-runtime";var oi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function si({session:e,className:t}){let r=oe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ee("span",{className:"urun-session-status-dot","data-phase":o}),Ee("span",{className:"urun-session-status-label",children:oi[o]}),n?Ee("span",{className:"urun-session-status-detail",children:n}):null]})}function ii({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=oe(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ee(zt,{session:e})]});let i=r?r(s):Ee("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ni(s.name)?Ee($t,{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 Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ee("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ai,useState as ui}from"react";import{jsx as di}from"react/jsx-runtime";function Qr(e){return oe(e)?.endsAt??null}function ci(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 li({session:e,urgentMs:t=6e4,className:r}){let n=Qr(e)?.getTime()??null,[s,i]=ui(()=>n===null?null:Math.max(0,n-Date.now()));if(ai(()=>{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=ci(s);return di("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 en,jsxs as fi}from"react/jsx-runtime";var pi=new Set(["expired","ended","error"]);function mi({session:e,onNewSession:t,children:r,className:o}){let n=oe(e);if(!n||!pi.has(n.name))return null;let s=r?r(n):en("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 fi("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?en("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as tn,useMemo as gi,useState as rn}from"react";import{jsx as ft,jsxs as vi}from"react/jsx-runtime";function Gt(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 nn(e){let t=gi(()=>e?e.doc("control"):null,[e]),[r,o]=rn(()=>t?Gt(t.get("idle")):null);return tn(()=>{if(!t){o(null);return}return o(Gt(t.get("idle"))),t.on("change",()=>o(Gt(t.get("idle"))))},[t]),r}function hi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Si({session:e,onStillHere:t,className:r}){let o=nn(e),n=o?.deadlineEpochS??null,[s,i]=rn(null);if(tn(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:vi("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${hi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as yi,useEffect as ki,useState as bi}from"react";import{prewake as Ri}from"@urun-sh/core";function Ci(e){let t=yi(we),[r,o]=bi(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 ki(()=>{if(!a||!u||!n||!s)return;let v=!1,C=()=>{Ri({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let h=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[n,s,i,a,u,c,g,l]),r}import{describeSessionPhase as Il,isWakingPhase as Ll}from"@urun-sh/core";export{it as Audio,Br as Camera,ho as ComponentRenderer,Wr as DEFAULT_CAMERA_CONSTRAINTS,Re as DEFAULT_LOG_CAP,Vr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Lo as Image,Uo as ImageFrame,xo as ImageFrameSchema,_o as MetricsPanel,Mo as MetricsPanelSchema,ss as Mic,gn as OPERATOR_CHORD_LABEL,fn as OPERATOR_TOKEN_STORAGE_KEY,yo as ProgressCard,vo as ProgressCardSchema,mo as ReprojectedVideo,Zn as Session,Ro as StatusBadge,ko as StatusBadgeSchema,To as TextStream,Po as TextStreamSchema,zt as UrunActivationOverlay,Wo as UrunAudio,ht as UrunAuthProvider,fs as UrunCamera,Ds as UrunControlSender,Is as UrunDocPanel,Fe as UrunErrorBoundary,qs as UrunEventSpine,Si as UrunIdleWarning,an as UrunJwtProvider,Pn as UrunProvider,li as UrunSessionClock,mi as UrunSessionEnded,ii as UrunSessionGate,si as UrunSessionStatus,$t as UrunSessionWaking,_s as UrunStreamTail,Jo as UrunVoice,_e as Video,ut as Voice,Ge as authMode,Wt as createDocStore,Il as describeSessionPhase,$e as formatPayload,ot as getUrunAudioContext,Ll as isWakingPhase,Bt as parseJsonObject,ye as pushCapped,rr as readOperatorToken,go as registerComponent,st as resumeUrunAudioContext,ue as urunPublicEnv,Xt as useActivation,Nn as useApp,Kn as useChat,Hn as useCompletion,yt as useConfirmOnLeave,Ke as useDocStore,Ir as useImageFrame,Gn as useInputPresence,Lr as useMetricsPanel,vt as useOperatorOverride,wr as useProgressCard,ys as useReferenceImage,Dn as useRequest,Qn as useSession,Us as useSessionDoc,Qr as useSessionEndsAt,nn as useSessionIdle,oe as useSessionPhase,Rs as useSessionTrack,Kt as useSessionWake,Ur as useStatusBadge,jt as useStreamMessages,_r as useTextStream,Vt as useUrunAudioLevel,St as useUrunAuth,Ci as useUrunPrewake,dn as usesWorkOSAuth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urun-sh/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.48",
|
|
4
4
|
"description": "React bindings for the urun TypeScript SDK",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dev": "tsup --watch"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@urun-sh/core": "^0.2.
|
|
56
|
+
"@urun-sh/core": "^0.2.48",
|
|
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",
|