@urun-sh/react 0.2.2 → 0.2.3

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/README.md CHANGED
@@ -29,7 +29,7 @@ function VideoPlayer() {
29
29
  }, [video.track])
30
30
 
31
31
  return (
32
- <button onClick={() => session.doc('control').set({ prompt: { text: 'A forest' } })}>
32
+ <button onClick={() => session.doc('control').set({ desired: { prompt: { text: 'A forest' } } })}>
33
33
  Generate
34
34
  </button>
35
35
  )
@@ -53,6 +53,14 @@ export default function App() {
53
53
 
54
54
  `useApp()` is render-safe: repeated `app.generate(args)` calls during React re-renders reuse the same session for the same function and args.
55
55
 
56
+ > Drive the app by writing **desired state** into the control doc (`doc('control').set({ desired: … })`),
57
+ > not an imperative `start/update/stop`. The Python runtime reads cheap config inline from the live
58
+ > `doc.desired.*` props and uses `doc.bind(construct, [live props])` (React `useMemo`) to reconstruct a
59
+ > stage on structural change — the single reconcile lane (no field-mapping). Streams are symmetric:
60
+ > `session.stream(name)` consumes the runtime's output, and `.attach(track)` makes the client the
61
+ > producer of that name. See the root `README.md` "How this mirrors the Python runtime DSL" and the
62
+ > `urun-sdk-canonical-patterns` skill.
63
+
56
64
  ## Authentication
57
65
 
58
66
  Browser clients authenticate with an organization ID plus a user/session JWT. During urun setup, the organization is provisioned with an auth provider configuration, such as a WorkOS client ID mapped to a JWKS URL.
@@ -66,8 +74,8 @@ For other auth providers, use `UrunAuthProvider` with a `getAccessToken` functio
66
74
  - `UrunProvider` — configures the app proxy.
67
75
  - `useApp()` — returns the deployed app proxy configured by `appId`.
68
76
  - `app.<function>(args?)` — starts or reconnects a running function call and returns a render-safe session proxy.
69
- - `session.stream(name)` — returns a render-safe named stream with `.track`, `.attach(track)`, `.detach()`, `.seek(seconds | 'live')`, and lifecycle events.
70
- - `session.doc(name)` — returns a render-safe synced document with `.get()`, `.set(patch)`, and lifecycle events.
77
+ - `session.stream(name)` — returns a render-safe named symmetric stream (first use decides direction) with `.track`, `.attach(track)`, `.detach()`, `.seek(seconds | 'live')`, and lifecycle events.
78
+ - `session.doc(name)` — returns a render-safe synced document with `.get()`, `.set(patch)` (write `desired.*` state), and lifecycle events.
71
79
  - `registerComponent()` and built-in components — optional generative UI support.
72
80
 
73
81
  ## Styling
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var dr=Object.create;var oe=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,fr=Object.prototype.hasOwnProperty;var gr=(r,e)=>{for(var t in e)oe(r,t,{get:e[t],enumerable:!0})},xe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of lr(e))!fr.call(r,s)&&s!==t&&oe(r,s,{get:()=>e[s],enumerable:!(n=pr(e,s))||n.enumerable});return r};var hr=(r,e,t)=>(t=r!=null?dr(mr(r)):{},xe(e||!r||!r.__esModule?oe(t,"default",{value:r,enumerable:!0}):t,r)),vr=r=>xe(oe({},"__esModule",{value:!0}),r);var Ur={};gr(Ur,{ComponentRenderer:()=>He,ImageFrame:()=>Ge,ImageFrameSchema:()=>Ze,MetricsPanel:()=>Qe,MetricsPanelSchema:()=>Ye,ProgressCard:()=>Xe,ProgressCardSchema:()=>Fe,StatusBadge:()=>Je,StatusBadgeSchema:()=>$e,TextStream:()=>Ke,TextStreamSchema:()=>We,UrunAuthProvider:()=>fe,UrunErrorBoundary:()=>z,UrunJwtProvider:()=>_e,UrunProvider:()=>Ae,UrunVideo:()=>ir,authMode:()=>G,registerComponent:()=>De,urunPublicEnv:()=>M,useApp:()=>Ne,useChat:()=>Ve,useCompletion:()=>Oe,useImageFrame:()=>Ce,useMetricsPanel:()=>Re,useProgressCard:()=>be,useRequest:()=>qe,useStatusBadge:()=>Se,useTextStream:()=>ke,useUrunAuth:()=>ae,usesWorkOSAuth:()=>Ee});module.exports=vr(Ur);var F=require("react");var Te=require("react"),Z=require("react/jsx-runtime"),z=class extends Te.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,Z.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,Z.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Z.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Pe=require("react"),ie=(0,Pe.createContext)(null);function V(r){return r&&r.trim()?r.trim():void 0}function M(r){switch(r){case"NEXT_PUBLIC_AUTH_MODE":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return V(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return V(typeof process<"u"?process.env?.[r]:void 0)}}function G(){let r=M("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return r==="jwt"||r==="customer-jwt"||r==="test-jwt"?"jwt":r==="workos"||M("VERCEL_ENV")==="production"?"workos":M("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ee(){return G()==="workos"}var H=require("react"),Ue=require("react/jsx-runtime"),we=(0,H.createContext)(null);function fe({getAccessToken:r,children:e}){let t=(0,H.useMemo)(()=>({getAccessToken:r}),[r]);return(0,Ue.jsx)(we.Provider,{value:t,children:e})}var _e=fe;function ae(){return(0,H.useContext)(we)}var ue=require("react/jsx-runtime");function Ae({baseUrl:r,orgId:e,appId:t,jwt:n,authProvider:s,fallback:i,children:a}){let[w,u]=(0,F.useState)(),m=ae(),C=M("NEXT_PUBLIC_SESSION_TOKEN")??M("NEXT_PUBLIC_URUN_JWT"),c=G(),p=c==="workos"&&!n,P=n??(c==="jwt"?C:void 0)??w,_=s??M("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),R=p&&!P,b=(0,F.useMemo)(()=>({appId:t,baseUrl:r,orgId:e,jwt:P,getAccessToken:p?m?.getAccessToken:void 0,authProvider:_}),[t,m,r,_,P,e,p]);return(0,F.useEffect)(()=>{if(!p||!m)return;let f=!1,v=m;async function g(){try{let E=await v.getAccessToken();f||u(E??void 0)}catch{f||u(void 0)}}g();let U=window.setInterval(()=>{g()},6e4);return()=>{f=!0,window.clearInterval(U)}},[m,p]),(0,ue.jsx)(z,{fallback:i,children:R?(0,ue.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,ue.jsx)(ie.Provider,{value:b,children:a})})}var O=require("react"),Ie=require("@urun-sh/core");function yr(r,e){return`${r}:${JSON.stringify(e??{})}`}var ge=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,n=>t(n))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),n=this._notify;return{append(s){t.append(s),n()},toString:()=>t.toString(),get length(){return t.length},on:(s,i)=>t.on(s,a=>{i(a),n()})}}dispose(){this._unsubscribeChange()}},he=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},ve=class{constructor(e,t){this._session=e;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;get id(){return this._session.id}get phase(){return this._session.phase}onPhase(e){return this._session.onPhase(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get presence(){return this._session.presence}doc(e){let t=this._docs.get(e);return t||(t=new ge(this._session.doc(e),this._notify),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new he(this._session.stream(e),this._notify),this._streams.set(e,t)),t}disconnect(){for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Ne(){let r=(0,O.useContext)(ie);if(!r)throw new Error("useApp must be used within <UrunProvider>");if(!r.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,O.useReducer)(s=>s+1,0),t=(0,O.useRef)(new Map),n=(0,O.useMemo)(()=>(0,Ie.App)(r.appId,{baseUrl:r.baseUrl,orgId:r.orgId,jwt:r.jwt,getAccessToken:r.getAccessToken,authProvider:r.authProvider}),[r.appId,r.baseUrl,r.orgId,r.jwt,r.getAccessToken,r.authProvider]);return(0,O.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let w=yr(i,a),u=t.current.get(w);if(u)return u;let m=new ve(n[i](a),e);return t.current.set(w,m),m}}}),[n])}var k=require("react");function X(r){let e=r;if(!e||typeof e.request!="function"||typeof e.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 e}function br(r){return r instanceof Error?r:new Error(String(r))}function qe(r,e){let t=(0,k.useMemo)(()=>X(r),[r]),[n,s]=(0,k.useState)(void 0),[i,a]=(0,k.useState)(null),[w,u]=(0,k.useState)(!1),m=(0,k.useRef)(e);m.current=e;let C=(0,k.useRef)(0),c=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>(p.current=!0,()=>{p.current=!1,c.current?.abort()}),[]);let P=(0,k.useCallback)(async b=>{c.current?.abort();let f=new AbortController;c.current=f;let v=++C.current,g=()=>p.current&&C.current===v;g()&&(u(!0),a(null));try{let U=await t.request(b,{...m.current,signal:f.signal});return g()&&(s(U),u(!1),m.current?.onSuccess?.(U)),U}catch(U){let E=br(U);throw g()&&(a(E),u(!1),m.current?.onError?.(E)),E}},[t]),_=(0,k.useCallback)(b=>{P(b).catch(()=>{})},[P]),R=(0,k.useCallback)(()=>{C.current++,c.current?.abort(),c.current=null,s(void 0),a(null),u(!1)},[]);return{mutate:_,mutateAsync:P,data:n,error:i,isPending:w,reset:R}}var T=require("react");function Me(r){return r instanceof Error?r:new Error(String(r))}var Sr=r=>typeof r=="string"?r:String(r);function Oe(r,e){let t=(0,T.useMemo)(()=>X(r),[r]),[n,s]=(0,T.useState)(""),[i,a]=(0,T.useState)(!1),[w,u]=(0,T.useState)(null),m=(0,T.useRef)(e);m.current=e;let C=(0,T.useRef)(0),c=(0,T.useRef)(null),p=(0,T.useRef)(!0);(0,T.useEffect)(()=>(p.current=!0,()=>{p.current=!1,c.current?.cancel(),c.current=null}),[]);let P=(0,T.useCallback)(()=>{C.current++,c.current?.cancel(),c.current=null,p.current&&a(!1)},[]),_=(0,T.useCallback)(async R=>{c.current?.cancel();let b=++C.current,f=()=>p.current&&C.current===b,v=m.current,g=v?.parseChunk??Sr,U=v?.buildPayload??(l=>({prompt:l}));f()&&(s(""),u(null),a(!0));let{parseChunk:E,buildPayload:pe,onFinish:I,onError:o,...d}=v??{},S="",x;try{x=t.requestStream(U(R),d),c.current=x}catch(l){let N=Me(l);f()&&(u(N),a(!1),v?.onError?.(N));return}try{for await(let l of x){if(C.current!==b)break;S+=g(l),f()&&s(S)}f()&&(a(!1),v?.onFinish?.(S))}catch(l){let N=Me(l);f()&&(u(N),a(!1),v?.onError?.(N))}finally{c.current===x&&(c.current=null)}},[t]);return{completion:n,complete:_,stop:P,isStreaming:i,error:w}}var h=require("react");function Le(r){return r instanceof Error?r:new Error(String(r))}var kr=r=>typeof r=="string"?r:String(r),je=0;function ye(r){return je+=1,`${r}-${je}`}function Ve(r,e){let t=(0,h.useMemo)(()=>X(r),[r]),[n,s]=(0,h.useState)(()=>(e?.initialMessages??[]).map(g=>({id:g.id??ye("msg"),role:g.role,content:g.content}))),[i,a]=(0,h.useState)(""),[w,u]=(0,h.useState)(!1),[m,C]=(0,h.useState)(null),c=(0,h.useRef)(e);c.current=e;let p=(0,h.useRef)(n);p.current=n;let P=(0,h.useRef)(i);P.current=i;let _=(0,h.useRef)(0),R=(0,h.useRef)(null),b=(0,h.useRef)(!0);(0,h.useEffect)(()=>(b.current=!0,()=>{b.current=!1,R.current?.cancel(),R.current=null}),[]);let f=(0,h.useCallback)(()=>{_.current++,R.current?.cancel(),R.current=null,b.current&&u(!1)},[]),v=(0,h.useCallback)(async g=>{let U=g===void 0,E=(U?P.current:g)??"";if(!E.trim())return;R.current?.cancel();let I=++_.current,o=()=>b.current&&_.current===I,d=c.current,S=d?.parseChunk??kr,x={id:ye("msg"),role:"user",content:E},l={id:ye("msg"),role:"assistant",content:""},N=[...p.current,x].map(A=>({role:A.role,content:A.content})),K=[...p.current,x,l];p.current=K,s(K),U&&a(""),C(null),u(!0);let ar=d?.buildPayload??(A=>({messages:A})),{initialMessages:Ar,parseChunk:Ir,buildPayload:Nr,onFinish:qr,onError:Mr,...ur}=d??{},cr=A=>{s(j=>j.map(me=>me.id===l.id?{...me,content:A}:me))},le="",se;try{se=t.requestStream(ar(N),ur),R.current=se}catch(A){let j=Le(A);o()&&(C(j),u(!1),d?.onError?.(j));return}try{for await(let A of se){if(_.current!==I)break;le+=S(A),o()&&cr(le)}o()&&(u(!1),d?.onFinish?.({...l,content:le}))}catch(A){let j=Le(A);o()&&(C(j),u(!1),d?.onError?.(j))}finally{R.current===se&&(R.current=null)}},[t]);return{messages:n,input:i,setInput:a,sendMessage:v,stop:f,isStreaming:w,error:m}}var Be=new Map;function De(r,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${r}"): schema must be a valid Zod schema`);Be.set(r,{component:e,schema:t})}function ze(r,e){let t=Be.get(r);if(!t)return{error:`Unknown component: "${r}"`};let n=t.schema.safeParse(e);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${r}": ${n.error.message}`}}var B=require("react/jsx-runtime");function He({name:r,props:e,fallback:t}){let n=ze(r,e);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,B.jsx)(B.Fragment,{children:t}):(0,B.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,B.jsx)("span",{className:"urun-component-error-text",children:n.error})});let s=n.Component;return(0,B.jsx)(s,{...n.validatedProps})}var $=require("zod"),D=require("react/jsx-runtime"),Fe=$.z.object({step:$.z.number().min(0),total:$.z.number().min(1),label:$.z.string().optional(),variant:$.z.enum(["default","success","error"]).default("default")});function be(r){let{step:e,total:t,label:n,variant:s="default"}=r,i=Math.min(e/t*100,100),a=e>=t;return{step:e,total:t,label:n,variant:s,percentage:i,isComplete:a}}function Xe(r){let{step:e,total:t,label:n,variant:s,percentage:i}=be(r);return(0,D.jsxs)("div",{className:"urun-progress-card","data-variant":s,children:[n&&(0,D.jsx)("div",{className:"urun-progress-label",children:n}),(0,D.jsx)("div",{className:"urun-progress-bar",children:(0,D.jsx)("div",{className:"urun-progress-fill",style:{width:`${i}%`}})}),(0,D.jsxs)("div",{className:"urun-progress-text",children:[e,"/",t]})]})}var ce=require("zod"),Y=require("react/jsx-runtime"),$e=ce.z.object({state:ce.z.enum(["thinking","generating","idle","error"]),message:ce.z.string().optional()}),Cr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Se(r){let{state:e,message:t}=r,n=e==="thinking"||e==="generating",s=t??Cr[e]??e;return{state:e,message:s,isActive:n}}function Je(r){let{state:e,message:t,isActive:n}=Se(r);return(0,Y.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,Y.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,Y.jsx)("span",{className:"urun-status-message",children:t})]})}var Q=require("react"),de=require("zod"),ee=require("react/jsx-runtime"),We=de.z.object({text:de.z.string(),streaming:de.z.boolean().default(!1)});function ke(r){let{text:e,streaming:t=!1}=r,n=e.length===0;return{text:e,streaming:t,isEmpty:n}}function Ke(r){let{text:e,streaming:t}=ke(r),n=(0,Q.useRef)(null),s=(0,Q.useRef)(0);return(0,Q.useEffect)(()=>{let i=n.current;i&&e.length!==s.current&&(i.textContent=e,s.current=e.length)},[e]),(0,ee.jsxs)("div",{className:"urun-text-stream",children:[(0,ee.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,ee.jsx)("span",{className:"urun-text-cursor"})]})}var re=require("zod"),te=require("react/jsx-runtime"),Ze=re.z.object({src:re.z.string().url(),alt:re.z.string().optional(),caption:re.z.string().optional()});function Ce(r){let{src:e,alt:t,caption:n}=r;return{src:e,alt:t??"",caption:n}}function Ge(r){let{src:e,alt:t,caption:n}=Ce(r);return(0,te.jsxs)("figure",{className:"urun-image-frame",children:[(0,te.jsx)("img",{className:"urun-image",src:e,alt:t}),n&&(0,te.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var L=require("zod"),J=require("react/jsx-runtime"),Ye=L.z.object({metrics:L.z.array(L.z.object({label:L.z.string(),value:L.z.union([L.z.string(),L.z.number()]),unit:L.z.string().optional()}))});function Re(r){return{metrics:r.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Qe(r){let{metrics:e}=Re(r);return(0,J.jsx)("div",{className:"urun-metrics-panel",children:e.map((t,n)=>(0,J.jsxs)("div",{className:"urun-metric-card",children:[(0,J.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,J.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var y=require("react"),sr=hr(require("video.js")),ft=require("video.js/dist/video-js.css");var W=require("react");var ne=require("react"),Rr=require("@urun-sh/core/internal");var xr=require("react/jsx-runtime"),er=(0,ne.createContext)(null);function rr(r){let e=(0,W.useContext)(er);if(!e)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=(0,W.useState)(null);return(0,W.useEffect)(()=>{let s=e.getState()._transport;if(!s)return;let i=s.getTrackByName?.bind(s),a=i?.(r);a&&a.readyState!=="ended"&&n(a);let w=s.on("track",u=>{let m=i?.(r);m&&m.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{w()}},[r,e]),t}var q=require("react/jsx-runtime");function tr(r){r.posterImage?.hide?.()}var Tr=`
1
+ "use strict";var dr=Object.create;var oe=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,fr=Object.prototype.hasOwnProperty;var gr=(r,e)=>{for(var t in e)oe(r,t,{get:e[t],enumerable:!0})},xe=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of lr(e))!fr.call(r,s)&&s!==t&&oe(r,s,{get:()=>e[s],enumerable:!(n=pr(e,s))||n.enumerable});return r};var hr=(r,e,t)=>(t=r!=null?dr(mr(r)):{},xe(e||!r||!r.__esModule?oe(t,"default",{value:r,enumerable:!0}):t,r)),vr=r=>xe(oe({},"__esModule",{value:!0}),r);var Ur={};gr(Ur,{ComponentRenderer:()=>He,ImageFrame:()=>Ge,ImageFrameSchema:()=>Ze,MetricsPanel:()=>Qe,MetricsPanelSchema:()=>Ye,ProgressCard:()=>Xe,ProgressCardSchema:()=>Fe,StatusBadge:()=>Je,StatusBadgeSchema:()=>$e,TextStream:()=>Ke,TextStreamSchema:()=>We,UrunAuthProvider:()=>fe,UrunErrorBoundary:()=>z,UrunJwtProvider:()=>_e,UrunProvider:()=>Ae,UrunVideo:()=>ir,authMode:()=>G,registerComponent:()=>De,urunPublicEnv:()=>M,useApp:()=>Ne,useChat:()=>Ve,useCompletion:()=>Oe,useImageFrame:()=>Re,useMetricsPanel:()=>Ce,useProgressCard:()=>be,useRequest:()=>qe,useStatusBadge:()=>Se,useTextStream:()=>ke,useUrunAuth:()=>ae,usesWorkOSAuth:()=>Ee});module.exports=vr(Ur);var F=require("react");var Te=require("react"),Z=require("react/jsx-runtime"),z=class extends Te.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,Z.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,Z.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Z.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Pe=require("react"),ie=(0,Pe.createContext)(null);function V(r){return r&&r.trim()?r.trim():void 0}function M(r){switch(r){case"NEXT_PUBLIC_AUTH_MODE":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return V(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return V(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return V(typeof process<"u"?process.env?.[r]:void 0)}}function G(){let r=M("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return r==="jwt"||r==="customer-jwt"||r==="test-jwt"?"jwt":r==="workos"||M("VERCEL_ENV")==="production"?"workos":M("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ee(){return G()==="workos"}var H=require("react"),Ue=require("react/jsx-runtime"),we=(0,H.createContext)(null);function fe({getAccessToken:r,children:e}){let t=(0,H.useMemo)(()=>({getAccessToken:r}),[r]);return(0,Ue.jsx)(we.Provider,{value:t,children:e})}var _e=fe;function ae(){return(0,H.useContext)(we)}var ue=require("react/jsx-runtime");function Ae({baseUrl:r,orgId:e,appId:t,jwt:n,authProvider:s,fallback:i,children:a}){let[w,u]=(0,F.useState)(),m=ae(),R=M("NEXT_PUBLIC_SESSION_TOKEN")??M("NEXT_PUBLIC_URUN_JWT"),c=G(),p=c==="workos"&&!n,P=n??(c==="jwt"?R:void 0)??w,_=s??M("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=p&&!P,b=(0,F.useMemo)(()=>({appId:t,baseUrl:r,orgId:e,jwt:P,getAccessToken:p?m?.getAccessToken:void 0,authProvider:_}),[t,m,r,_,P,e,p]);return(0,F.useEffect)(()=>{if(!p||!m)return;let f=!1,v=m;async function g(){try{let E=await v.getAccessToken();f||u(E??void 0)}catch{f||u(void 0)}}g();let U=window.setInterval(()=>{g()},6e4);return()=>{f=!0,window.clearInterval(U)}},[m,p]),(0,ue.jsx)(z,{fallback:i,children:C?(0,ue.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,ue.jsx)(ie.Provider,{value:b,children:a})})}var O=require("react"),Ie=require("@urun-sh/core");function yr(r,e){return`${r}:${JSON.stringify(e??{})}`}var ge=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,n=>t(n))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),n=this._notify;return{append(s){t.append(s),n()},toString:()=>t.toString(),get length(){return t.length},on:(s,i)=>t.on(s,a=>{i(a),n()})}}dispose(){this._unsubscribeChange()}},he=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},ve=class{constructor(e,t){this._session=e;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;get id(){return this._session.id}get phase(){return this._session.phase}onPhase(e){return this._session.onPhase(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(e){let t=this._docs.get(e);return t||(t=new ge(this._session.doc(e),this._notify),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new he(this._session.stream(e),this._notify),this._streams.set(e,t)),t}disconnect(){for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Ne(){let r=(0,O.useContext)(ie);if(!r)throw new Error("useApp must be used within <UrunProvider>");if(!r.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,O.useReducer)(s=>s+1,0),t=(0,O.useRef)(new Map),n=(0,O.useMemo)(()=>(0,Ie.App)(r.appId,{baseUrl:r.baseUrl,orgId:r.orgId,jwt:r.jwt,getAccessToken:r.getAccessToken,authProvider:r.authProvider}),[r.appId,r.baseUrl,r.orgId,r.jwt,r.getAccessToken,r.authProvider]);return(0,O.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let w=yr(i,a),u=t.current.get(w);if(u)return u;let m=new ve(n[i](a),e);return t.current.set(w,m),m}}}),[n])}var k=require("react");function X(r){let e=r;if(!e||typeof e.request!="function"||typeof e.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 e}function br(r){return r instanceof Error?r:new Error(String(r))}function qe(r,e){let t=(0,k.useMemo)(()=>X(r),[r]),[n,s]=(0,k.useState)(void 0),[i,a]=(0,k.useState)(null),[w,u]=(0,k.useState)(!1),m=(0,k.useRef)(e);m.current=e;let R=(0,k.useRef)(0),c=(0,k.useRef)(null),p=(0,k.useRef)(!0);(0,k.useEffect)(()=>(p.current=!0,()=>{p.current=!1,c.current?.abort()}),[]);let P=(0,k.useCallback)(async b=>{c.current?.abort();let f=new AbortController;c.current=f;let v=++R.current,g=()=>p.current&&R.current===v;g()&&(u(!0),a(null));try{let U=await t.request(b,{...m.current,signal:f.signal});return g()&&(s(U),u(!1),m.current?.onSuccess?.(U)),U}catch(U){let E=br(U);throw g()&&(a(E),u(!1),m.current?.onError?.(E)),E}},[t]),_=(0,k.useCallback)(b=>{P(b).catch(()=>{})},[P]),C=(0,k.useCallback)(()=>{R.current++,c.current?.abort(),c.current=null,s(void 0),a(null),u(!1)},[]);return{mutate:_,mutateAsync:P,data:n,error:i,isPending:w,reset:C}}var T=require("react");function Me(r){return r instanceof Error?r:new Error(String(r))}var Sr=r=>typeof r=="string"?r:String(r);function Oe(r,e){let t=(0,T.useMemo)(()=>X(r),[r]),[n,s]=(0,T.useState)(""),[i,a]=(0,T.useState)(!1),[w,u]=(0,T.useState)(null),m=(0,T.useRef)(e);m.current=e;let R=(0,T.useRef)(0),c=(0,T.useRef)(null),p=(0,T.useRef)(!0);(0,T.useEffect)(()=>(p.current=!0,()=>{p.current=!1,c.current?.cancel(),c.current=null}),[]);let P=(0,T.useCallback)(()=>{R.current++,c.current?.cancel(),c.current=null,p.current&&a(!1)},[]),_=(0,T.useCallback)(async C=>{c.current?.cancel();let b=++R.current,f=()=>p.current&&R.current===b,v=m.current,g=v?.parseChunk??Sr,U=v?.buildPayload??(l=>({prompt:l}));f()&&(s(""),u(null),a(!0));let{parseChunk:E,buildPayload:pe,onFinish:I,onError:o,...d}=v??{},S="",x;try{x=t.requestStream(U(C),d),c.current=x}catch(l){let N=Me(l);f()&&(u(N),a(!1),v?.onError?.(N));return}try{for await(let l of x){if(R.current!==b)break;S+=g(l),f()&&s(S)}f()&&(a(!1),v?.onFinish?.(S))}catch(l){let N=Me(l);f()&&(u(N),a(!1),v?.onError?.(N))}finally{c.current===x&&(c.current=null)}},[t]);return{completion:n,complete:_,stop:P,isStreaming:i,error:w}}var h=require("react");function Le(r){return r instanceof Error?r:new Error(String(r))}var kr=r=>typeof r=="string"?r:String(r),je=0;function ye(r){return je+=1,`${r}-${je}`}function Ve(r,e){let t=(0,h.useMemo)(()=>X(r),[r]),[n,s]=(0,h.useState)(()=>(e?.initialMessages??[]).map(g=>({id:g.id??ye("msg"),role:g.role,content:g.content}))),[i,a]=(0,h.useState)(""),[w,u]=(0,h.useState)(!1),[m,R]=(0,h.useState)(null),c=(0,h.useRef)(e);c.current=e;let p=(0,h.useRef)(n);p.current=n;let P=(0,h.useRef)(i);P.current=i;let _=(0,h.useRef)(0),C=(0,h.useRef)(null),b=(0,h.useRef)(!0);(0,h.useEffect)(()=>(b.current=!0,()=>{b.current=!1,C.current?.cancel(),C.current=null}),[]);let f=(0,h.useCallback)(()=>{_.current++,C.current?.cancel(),C.current=null,b.current&&u(!1)},[]),v=(0,h.useCallback)(async g=>{let U=g===void 0,E=(U?P.current:g)??"";if(!E.trim())return;C.current?.cancel();let I=++_.current,o=()=>b.current&&_.current===I,d=c.current,S=d?.parseChunk??kr,x={id:ye("msg"),role:"user",content:E},l={id:ye("msg"),role:"assistant",content:""},N=[...p.current,x].map(A=>({role:A.role,content:A.content})),K=[...p.current,x,l];p.current=K,s(K),U&&a(""),R(null),u(!0);let ar=d?.buildPayload??(A=>({messages:A})),{initialMessages:Ar,parseChunk:Ir,buildPayload:Nr,onFinish:qr,onError:Mr,...ur}=d??{},cr=A=>{s(j=>j.map(me=>me.id===l.id?{...me,content:A}:me))},le="",se;try{se=t.requestStream(ar(N),ur),C.current=se}catch(A){let j=Le(A);o()&&(R(j),u(!1),d?.onError?.(j));return}try{for await(let A of se){if(_.current!==I)break;le+=S(A),o()&&cr(le)}o()&&(u(!1),d?.onFinish?.({...l,content:le}))}catch(A){let j=Le(A);o()&&(R(j),u(!1),d?.onError?.(j))}finally{C.current===se&&(C.current=null)}},[t]);return{messages:n,input:i,setInput:a,sendMessage:v,stop:f,isStreaming:w,error:m}}var Be=new Map;function De(r,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${r}"): schema must be a valid Zod schema`);Be.set(r,{component:e,schema:t})}function ze(r,e){let t=Be.get(r);if(!t)return{error:`Unknown component: "${r}"`};let n=t.schema.safeParse(e);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${r}": ${n.error.message}`}}var B=require("react/jsx-runtime");function He({name:r,props:e,fallback:t}){let n=ze(r,e);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,B.jsx)(B.Fragment,{children:t}):(0,B.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,B.jsx)("span",{className:"urun-component-error-text",children:n.error})});let s=n.Component;return(0,B.jsx)(s,{...n.validatedProps})}var $=require("zod"),D=require("react/jsx-runtime"),Fe=$.z.object({step:$.z.number().min(0),total:$.z.number().min(1),label:$.z.string().optional(),variant:$.z.enum(["default","success","error"]).default("default")});function be(r){let{step:e,total:t,label:n,variant:s="default"}=r,i=Math.min(e/t*100,100),a=e>=t;return{step:e,total:t,label:n,variant:s,percentage:i,isComplete:a}}function Xe(r){let{step:e,total:t,label:n,variant:s,percentage:i}=be(r);return(0,D.jsxs)("div",{className:"urun-progress-card","data-variant":s,children:[n&&(0,D.jsx)("div",{className:"urun-progress-label",children:n}),(0,D.jsx)("div",{className:"urun-progress-bar",children:(0,D.jsx)("div",{className:"urun-progress-fill",style:{width:`${i}%`}})}),(0,D.jsxs)("div",{className:"urun-progress-text",children:[e,"/",t]})]})}var ce=require("zod"),Y=require("react/jsx-runtime"),$e=ce.z.object({state:ce.z.enum(["thinking","generating","idle","error"]),message:ce.z.string().optional()}),Rr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Se(r){let{state:e,message:t}=r,n=e==="thinking"||e==="generating",s=t??Rr[e]??e;return{state:e,message:s,isActive:n}}function Je(r){let{state:e,message:t,isActive:n}=Se(r);return(0,Y.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,Y.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,Y.jsx)("span",{className:"urun-status-message",children:t})]})}var Q=require("react"),de=require("zod"),ee=require("react/jsx-runtime"),We=de.z.object({text:de.z.string(),streaming:de.z.boolean().default(!1)});function ke(r){let{text:e,streaming:t=!1}=r,n=e.length===0;return{text:e,streaming:t,isEmpty:n}}function Ke(r){let{text:e,streaming:t}=ke(r),n=(0,Q.useRef)(null),s=(0,Q.useRef)(0);return(0,Q.useEffect)(()=>{let i=n.current;i&&e.length!==s.current&&(i.textContent=e,s.current=e.length)},[e]),(0,ee.jsxs)("div",{className:"urun-text-stream",children:[(0,ee.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,ee.jsx)("span",{className:"urun-text-cursor"})]})}var re=require("zod"),te=require("react/jsx-runtime"),Ze=re.z.object({src:re.z.string().url(),alt:re.z.string().optional(),caption:re.z.string().optional()});function Re(r){let{src:e,alt:t,caption:n}=r;return{src:e,alt:t??"",caption:n}}function Ge(r){let{src:e,alt:t,caption:n}=Re(r);return(0,te.jsxs)("figure",{className:"urun-image-frame",children:[(0,te.jsx)("img",{className:"urun-image",src:e,alt:t}),n&&(0,te.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var L=require("zod"),J=require("react/jsx-runtime"),Ye=L.z.object({metrics:L.z.array(L.z.object({label:L.z.string(),value:L.z.union([L.z.string(),L.z.number()]),unit:L.z.string().optional()}))});function Ce(r){return{metrics:r.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Qe(r){let{metrics:e}=Ce(r);return(0,J.jsx)("div",{className:"urun-metrics-panel",children:e.map((t,n)=>(0,J.jsxs)("div",{className:"urun-metric-card",children:[(0,J.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,J.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var y=require("react"),sr=hr(require("video.js")),ft=require("video.js/dist/video-js.css");var W=require("react");var ne=require("react"),Cr=require("@urun-sh/core/internal");var xr=require("react/jsx-runtime"),er=(0,ne.createContext)(null);function rr(r){let e=(0,W.useContext)(er);if(!e)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=(0,W.useState)(null);return(0,W.useEffect)(()=>{let s=e.getState()._transport;if(!s)return;let i=s.getTrackByName?.bind(s),a=i?.(r);a&&a.readyState!=="ended"&&n(a);let w=s.on("track",u=>{let m=i?.(r);m&&m.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{w()}},[r,e]),t}var q=require("react/jsx-runtime");function tr(r){r.posterImage?.hide?.()}var Tr=`
2
2
  [data-urun-video]{width:100%;height:100%}
3
3
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
4
4
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -6,4 +6,4 @@
6
6
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
7
7
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
8
8
  .urun-video-live .vjs-poster{background-color:transparent}
9
- `,nr="urun-video-critical-css";function Pr(){if(typeof document>"u"||document.getElementById(nr))return;let r=document.createElement("style");r.id=nr,r.textContent=Tr,document.head.appendChild(r)}var Er=["playToggle","volumePanel","fullscreenToggle"],wr=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],or=(0,y.forwardRef)(function(e,t){let{track:n,stream:s,src:i,type:a="video/mp4",className:w,videoClassName:u,poster:m,controls:C=!0,autoPlay:c=!0,muted:p=!0,onVideoElement:P,onPlayerReady:_,children:R}=e,b=typeof i=="string"&&i.length>0,f=!b,v=(0,y.useRef)(null),g=(0,y.useRef)(null),[U,E]=(0,y.useState)(!1),pe=(0,y.useCallback)(o=>{v.current=o,typeof t=="function"?t(o):t&&(t.current=o),P?.(o)},[t,P]);(0,y.useImperativeHandle)(t,()=>v.current,[]);let I=(0,y.useCallback)(()=>{let o=v.current;if(!o||!o.srcObject&&!o.src)return;p&&(o.muted=!0,o.defaultMuted=!0),o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let d=o.play();d&&typeof d.then=="function"&&d.then(()=>E(!1)).catch(S=>{(S instanceof Error?S.name:String(S))!=="AbortError"&&E(!0)})},[p]);return(0,y.useEffect)(()=>{if(typeof document>"u")return;let o=v.current;if(!o)return;Pr(),p&&(o.muted=!0,o.defaultMuted=!0,o.setAttribute("muted","")),o.autoplay=c,o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let d=(0,sr.default)(o,{controls:C,autoplay:c,muted:p,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:m,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:f?Er:wr}});f&&d.addClass("urun-video-live");let S=()=>E(!1),x=()=>{d.hasStarted(!0),tr(d),S()},l=()=>{f&&I()};return o.addEventListener("playing",x),o.addEventListener("loadedmetadata",l),f&&o.addEventListener("pause",l),g.current=d,_?.(d),()=>{o.removeEventListener("playing",x),o.removeEventListener("loadedmetadata",l),o.removeEventListener("pause",l),_?.(null),g.current&&(g.current.dispose(),g.current=null)}},[f]),(0,y.useEffect)(()=>{if(!b)return;let o=g.current;if(!o)return;let d=o.tech?.(!0)?.el?.();d&&(d.srcObject=null),o.src({src:i,type:a}),c&&I()},[b,i,a,c,I]),(0,y.useEffect)(()=>{if(!f)return;let o=g.current;if(!o)return;let d=n??null,S=s??null;!S&&d&&(S=new MediaStream([d]));let x=o.tech?.(!0)?.el?.()??v.current;if(!x)return;if(!S){x.srcObject=null,E(!1);return}x.srcObject=S,I();let l=S.getVideoTracks()[0]??d??null,N=()=>{o.hasStarted(!0),tr(o),I()},K=()=>{x.srcObject=null,E(!1)};return l&&(l.addEventListener("unmute",N),l.addEventListener("ended",K),l.muted||N()),()=>{l&&(l.removeEventListener("unmute",N),l.removeEventListener("ended",K))}},[f,n,s,I]),(0,q.jsxs)("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":f?"live":"vod",children:[(0,q.jsx)("video",{ref:pe,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),U&&(0,q.jsx)("button",{type:"button",onClick:I,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,q.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,q.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,q.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),R]})}),_r=(0,y.forwardRef)(function({name:e,...t},n){let s=rr(e);return(0,q.jsx)(or,{ref:n,...t,track:s})}),ir=(0,y.forwardRef)(function(e,t){return!!e.name&&!e.track&&!e.stream&&!(typeof e.src=="string"&&e.src)?(0,q.jsx)(_r,{ref:t,...e,name:e.name}):(0,q.jsx)(or,{ref:t,...e})});0&&(module.exports={ComponentRenderer,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAuthProvider,UrunErrorBoundary,UrunJwtProvider,UrunProvider,UrunVideo,authMode,registerComponent,urunPublicEnv,useApp,useChat,useCompletion,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useStatusBadge,useTextStream,useUrunAuth,usesWorkOSAuth});
9
+ `,nr="urun-video-critical-css";function Pr(){if(typeof document>"u"||document.getElementById(nr))return;let r=document.createElement("style");r.id=nr,r.textContent=Tr,document.head.appendChild(r)}var Er=["playToggle","volumePanel","fullscreenToggle"],wr=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],or=(0,y.forwardRef)(function(e,t){let{track:n,stream:s,src:i,type:a="video/mp4",className:w,videoClassName:u,poster:m,controls:R=!0,autoPlay:c=!0,muted:p=!0,onVideoElement:P,onPlayerReady:_,children:C}=e,b=typeof i=="string"&&i.length>0,f=!b,v=(0,y.useRef)(null),g=(0,y.useRef)(null),[U,E]=(0,y.useState)(!1),pe=(0,y.useCallback)(o=>{v.current=o,typeof t=="function"?t(o):t&&(t.current=o),P?.(o)},[t,P]);(0,y.useImperativeHandle)(t,()=>v.current,[]);let I=(0,y.useCallback)(()=>{let o=v.current;if(!o||!o.srcObject&&!o.src)return;p&&(o.muted=!0,o.defaultMuted=!0),o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let d=o.play();d&&typeof d.then=="function"&&d.then(()=>E(!1)).catch(S=>{(S instanceof Error?S.name:String(S))!=="AbortError"&&E(!0)})},[p]);return(0,y.useEffect)(()=>{if(typeof document>"u")return;let o=v.current;if(!o)return;Pr(),p&&(o.muted=!0,o.defaultMuted=!0,o.setAttribute("muted","")),o.autoplay=c,o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let d=(0,sr.default)(o,{controls:R,autoplay:c,muted:p,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:m,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:f?Er:wr}});f&&d.addClass("urun-video-live");let S=()=>E(!1),x=()=>{d.hasStarted(!0),tr(d),S()},l=()=>{f&&I()};return o.addEventListener("playing",x),o.addEventListener("loadedmetadata",l),f&&o.addEventListener("pause",l),g.current=d,_?.(d),()=>{o.removeEventListener("playing",x),o.removeEventListener("loadedmetadata",l),o.removeEventListener("pause",l),_?.(null),g.current&&(g.current.dispose(),g.current=null)}},[f]),(0,y.useEffect)(()=>{if(!b)return;let o=g.current;if(!o)return;let d=o.tech?.(!0)?.el?.();d&&(d.srcObject=null),o.src({src:i,type:a}),c&&I()},[b,i,a,c,I]),(0,y.useEffect)(()=>{if(!f)return;let o=g.current;if(!o)return;let d=n??null,S=s??null;!S&&d&&(S=new MediaStream([d]));let x=o.tech?.(!0)?.el?.()??v.current;if(!x)return;if(!S){x.srcObject=null,E(!1);return}x.srcObject=S,I();let l=S.getVideoTracks()[0]??d??null,N=()=>{o.hasStarted(!0),tr(o),I()},K=()=>{x.srcObject=null,E(!1)};return l&&(l.addEventListener("unmute",N),l.addEventListener("ended",K),l.muted||N()),()=>{l&&(l.removeEventListener("unmute",N),l.removeEventListener("ended",K))}},[f,n,s,I]),(0,q.jsxs)("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":f?"live":"vod",children:[(0,q.jsx)("video",{ref:pe,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),U&&(0,q.jsx)("button",{type:"button",onClick:I,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,q.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,q.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,q.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),C]})}),_r=(0,y.forwardRef)(function({name:e,...t},n){let s=rr(e);return(0,q.jsx)(or,{ref:n,...t,track:s})}),ir=(0,y.forwardRef)(function(e,t){return!!e.name&&!e.track&&!e.stream&&!(typeof e.src=="string"&&e.src)?(0,q.jsx)(_r,{ref:t,...e,name:e.name}):(0,q.jsx)(or,{ref:t,...e})});0&&(module.exports={ComponentRenderer,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAuthProvider,UrunErrorBoundary,UrunJwtProvider,UrunProvider,UrunVideo,authMode,registerComponent,urunPublicEnv,useApp,useChat,useCompletion,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useStatusBadge,useTextStream,useUrunAuth,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{a as ze,b as He,c as G}from"./chunk-QAEWAWV4.mjs";import{useEffect as We,useMemo as Ke,useState as Ze}from"react";import{Component as Fe}from"react";import{jsx as le,jsxs as Xe}from"react/jsx-runtime";var L=class extends Fe{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Xe("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:[le("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),le("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as $e}from"react";var D=$e(null);function N(r){return r&&r.trim()?r.trim():void 0}function U(r){switch(r){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?.[r]:void 0)}}function z(){let r=U("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return r==="jwt"||r==="customer-jwt"||r==="test-jwt"?"jwt":r==="workos"||U("VERCEL_ENV")==="production"?"workos":U("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Je(){return z()==="workos"}import{jsx as Y}from"react/jsx-runtime";function Ge({baseUrl:r,orgId:e,appId:t,jwt:n,authProvider:o,fallback:i,children:a}){let[x,u]=Ze(),m=G(),b=U("NEXT_PUBLIC_SESSION_TOKEN")??U("NEXT_PUBLIC_URUN_JWT"),c=z(),p=c==="workos"&&!n,R=n??(c==="jwt"?b:void 0)??x,T=o??U("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=p&&!R,v=Ke(()=>({appId:t,baseUrl:r,orgId:e,jwt:R,getAccessToken:p?m?.getAccessToken:void 0,authProvider:T}),[t,m,r,T,R,e,p]);return We(()=>{if(!p||!m)return;let f=!1,h=m;async function g(){try{let C=await h.getAccessToken();f||u(C??void 0)}catch{f||u(void 0)}}g();let P=window.setInterval(()=>{g()},6e4);return()=>{f=!0,window.clearInterval(P)}},[m,p]),Y(L,{fallback:i,children:S?Y("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Y(D.Provider,{value:v,children:a})})}import{useContext as Ye,useMemo as me,useReducer as Qe,useRef as er}from"react";import{App as rr}from"@urun-sh/core";function tr(r,e){return`${r}:${JSON.stringify(e??{})}`}var Q=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,n=>t(n))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,i)=>t.on(o,a=>{i(a),n()})}}dispose(){this._unsubscribeChange()}},ee=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},re=class{constructor(e,t){this._session=e;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;get id(){return this._session.id}get phase(){return this._session.phase}onPhase(e){return this._session.onPhase(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get presence(){return this._session.presence}doc(e){let t=this._docs.get(e);return t||(t=new Q(this._session.doc(e),this._notify),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new ee(this._session.stream(e),this._notify),this._streams.set(e,t)),t}disconnect(){for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function nr(){let r=Ye(D);if(!r)throw new Error("useApp must be used within <UrunProvider>");if(!r.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=Qe(o=>o+1,0),t=er(new Map),n=me(()=>rr(r.appId,{baseUrl:r.baseUrl,orgId:r.orgId,jwt:r.jwt,getAccessToken:r.getAccessToken,authProvider:r.authProvider}),[r.appId,r.baseUrl,r.orgId,r.jwt,r.getAccessToken,r.authProvider]);return me(()=>new Proxy({},{get(o,i){if(typeof i=="string")return a=>{let x=tr(i,a),u=t.current.get(x);if(u)return u;let m=new re(n[i](a),e);return t.current.set(x,m),m}}}),[n])}import{useCallback as te,useEffect as sr,useMemo as or,useRef as H,useState as ne}from"react";function M(r){let e=r;if(!e||typeof e.request!="function"||typeof e.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 e}function ir(r){return r instanceof Error?r:new Error(String(r))}function ar(r,e){let t=or(()=>M(r),[r]),[n,o]=ne(void 0),[i,a]=ne(null),[x,u]=ne(!1),m=H(e);m.current=e;let b=H(0),c=H(null),p=H(!0);sr(()=>(p.current=!0,()=>{p.current=!1,c.current?.abort()}),[]);let R=te(async v=>{c.current?.abort();let f=new AbortController;c.current=f;let h=++b.current,g=()=>p.current&&b.current===h;g()&&(u(!0),a(null));try{let P=await t.request(v,{...m.current,signal:f.signal});return g()&&(o(P),u(!1),m.current?.onSuccess?.(P)),P}catch(P){let C=ir(P);throw g()&&(a(C),u(!1),m.current?.onError?.(C)),C}},[t]),T=te(v=>{R(v).catch(()=>{})},[R]),S=te(()=>{b.current++,c.current?.abort(),c.current=null,o(void 0),a(null),u(!1)},[]);return{mutate:T,mutateAsync:R,data:n,error:i,isPending:x,reset:S}}import{useCallback as fe,useEffect as ur,useMemo as cr,useRef as F,useState as se}from"react";function ge(r){return r instanceof Error?r:new Error(String(r))}var dr=r=>typeof r=="string"?r:String(r);function pr(r,e){let t=cr(()=>M(r),[r]),[n,o]=se(""),[i,a]=se(!1),[x,u]=se(null),m=F(e);m.current=e;let b=F(0),c=F(null),p=F(!0);ur(()=>(p.current=!0,()=>{p.current=!1,c.current?.cancel(),c.current=null}),[]);let R=fe(()=>{b.current++,c.current?.cancel(),c.current=null,p.current&&a(!1)},[]),T=fe(async S=>{c.current?.cancel();let v=++b.current,f=()=>p.current&&b.current===v,h=m.current,g=h?.parseChunk??dr,P=h?.buildPayload??(l=>({prompt:l}));f()&&(o(""),u(null),a(!0));let{parseChunk:C,buildPayload:W,onFinish:w,onError:s,...d}=h??{},y="",k;try{k=t.requestStream(P(S),d),c.current=k}catch(l){let _=ge(l);f()&&(u(_),a(!1),h?.onError?.(_));return}try{for await(let l of k){if(b.current!==v)break;y+=g(l),f()&&o(y)}f()&&(a(!1),h?.onFinish?.(y))}catch(l){let _=ge(l);f()&&(u(_),a(!1),h?.onError?.(_))}finally{c.current===k&&(c.current=null)}},[t]);return{completion:n,complete:T,stop:R,isStreaming:i,error:x}}import{useCallback as he,useEffect as lr,useMemo as mr,useRef as O,useState as X}from"react";function ve(r){return r instanceof Error?r:new Error(String(r))}var fr=r=>typeof r=="string"?r:String(r),ye=0;function oe(r){return ye+=1,`${r}-${ye}`}function gr(r,e){let t=mr(()=>M(r),[r]),[n,o]=X(()=>(e?.initialMessages??[]).map(g=>({id:g.id??oe("msg"),role:g.role,content:g.content}))),[i,a]=X(""),[x,u]=X(!1),[m,b]=X(null),c=O(e);c.current=e;let p=O(n);p.current=n;let R=O(i);R.current=i;let T=O(0),S=O(null),v=O(!0);lr(()=>(v.current=!0,()=>{v.current=!1,S.current?.cancel(),S.current=null}),[]);let f=he(()=>{T.current++,S.current?.cancel(),S.current=null,v.current&&u(!1)},[]),h=he(async g=>{let P=g===void 0,C=(P?R.current:g)??"";if(!C.trim())return;S.current?.cancel();let w=++T.current,s=()=>v.current&&T.current===w,d=c.current,y=d?.parseChunk??fr,k={id:oe("msg"),role:"user",content:C},l={id:oe("msg"),role:"assistant",content:""},_=[...p.current,k].map(E=>({role:E.role,content:E.content})),j=[...p.current,k,l];p.current=j,o(j),P&&a(""),b(null),u(!0);let Ve=d?.buildPayload??(E=>({messages:E})),{initialMessages:Wr,parseChunk:Kr,buildPayload:Zr,onFinish:Gr,onError:Yr,...Be}=d??{},De=E=>{o(A=>A.map(Z=>Z.id===l.id?{...Z,content:E}:Z))},K="",B;try{B=t.requestStream(Ve(_),Be),S.current=B}catch(E){let A=ve(E);s()&&(b(A),u(!1),d?.onError?.(A));return}try{for await(let E of B){if(T.current!==w)break;K+=y(E),s()&&De(K)}s()&&(u(!1),d?.onFinish?.({...l,content:K}))}catch(E){let A=ve(E);s()&&(b(A),u(!1),d?.onError?.(A))}finally{S.current===B&&(S.current=null)}},[t]);return{messages:n,input:i,setInput:a,sendMessage:h,stop:f,isStreaming:x,error:m}}var be=new Map;function hr(r,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${r}"): schema must be a valid Zod schema`);be.set(r,{component:e,schema:t})}function Se(r,e){let t=be.get(r);if(!t)return{error:`Unknown component: "${r}"`};let n=t.schema.safeParse(e);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${r}": ${n.error.message}`}}import{Fragment as yr,jsx as $}from"react/jsx-runtime";function vr({name:r,props:e,fallback:t}){let n=Se(r,e);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?$(yr,{children:t}):$("div",{className:"urun-component-error",role:"alert",children:$("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return $(o,{...n.validatedProps})}import{z as V}from"zod";import{jsx as ie,jsxs as ke}from"react/jsx-runtime";var br=V.object({step:V.number().min(0),total:V.number().min(1),label:V.string().optional(),variant:V.enum(["default","success","error"]).default("default")});function Re(r){let{step:e,total:t,label:n,variant:o="default"}=r,i=Math.min(e/t*100,100),a=e>=t;return{step:e,total:t,label:n,variant:o,percentage:i,isComplete:a}}function Sr(r){let{step:e,total:t,label:n,variant:o,percentage:i}=Re(r);return ke("div",{className:"urun-progress-card","data-variant":o,children:[n&&ie("div",{className:"urun-progress-label",children:n}),ie("div",{className:"urun-progress-bar",children:ie("div",{className:"urun-progress-fill",style:{width:`${i}%`}})}),ke("div",{className:"urun-progress-text",children:[e,"/",t]})]})}import{z as ae}from"zod";import{jsx as Ce,jsxs as xr}from"react/jsx-runtime";var kr=ae.object({state:ae.enum(["thinking","generating","idle","error"]),message:ae.string().optional()}),Rr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function xe(r){let{state:e,message:t}=r,n=e==="thinking"||e==="generating",o=t??Rr[e]??e;return{state:e,message:o,isActive:n}}function Cr(r){let{state:e,message:t,isActive:n}=xe(r);return xr("span",{className:"urun-status-badge","data-state":e,children:[Ce("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),Ce("span",{className:"urun-status-message",children:t})]})}import{useRef as Te,useEffect as Tr}from"react";import{z as ue}from"zod";import{jsx as Pe,jsxs as wr}from"react/jsx-runtime";var Pr=ue.object({text:ue.string(),streaming:ue.boolean().default(!1)});function Ee(r){let{text:e,streaming:t=!1}=r,n=e.length===0;return{text:e,streaming:t,isEmpty:n}}function Er(r){let{text:e,streaming:t}=Ee(r),n=Te(null),o=Te(0);return Tr(()=>{let i=n.current;i&&e.length!==o.current&&(i.textContent=e,o.current=e.length)},[e]),wr("div",{className:"urun-text-stream",children:[Pe("span",{ref:n,className:"urun-text-content"}),t&&Pe("span",{className:"urun-text-cursor"})]})}import{z as J}from"zod";import{jsx as we,jsxs as Ir}from"react/jsx-runtime";var _r=J.object({src:J.string().url(),alt:J.string().optional(),caption:J.string().optional()});function _e(r){let{src:e,alt:t,caption:n}=r;return{src:e,alt:t??"",caption:n}}function Ur(r){let{src:e,alt:t,caption:n}=_e(r);return Ir("figure",{className:"urun-image-frame",children:[we("img",{className:"urun-image",src:e,alt:t}),n&&we("figcaption",{className:"urun-image-caption",children:n})]})}import{z as I}from"zod";import{jsx as ce,jsxs as qr}from"react/jsx-runtime";var Ar=I.object({metrics:I.array(I.object({label:I.string(),value:I.union([I.string(),I.number()]),unit:I.string().optional()}))});function Ue(r){return{metrics:r.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Nr(r){let{metrics:e}=Ue(r);return ce("div",{className:"urun-metrics-panel",children:e.map((t,n)=>qr("div",{className:"urun-metric-card",children:[ce("div",{className:"urun-metric-label",children:t.label}),ce("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as pe,useCallback as Ne,useEffect as de,useImperativeHandle as Vr,useRef as qe,useState as Br}from"react";import Dr from"video.js";import"video.js/dist/video-js.css";import{useContext as Or,useState as jr,useEffect as Lr}from"react";import{createContext as Mr,useState as Kt,useEffect as Zt,useRef as Gt}from"react";import{TransportSession as Qt}from"@urun-sh/core/internal";import{jsx as rn}from"react/jsx-runtime";var Ie=Mr(null);function Ae(r){let e=Or(Ie);if(!e)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=jr(null);return Lr(()=>{let o=e.getState()._transport;if(!o)return;let i=o.getTrackByName?.bind(o),a=i?.(r);a&&a.readyState!=="ended"&&n(a);let x=o.on("track",u=>{let m=i?.(r);m&&m.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{x()}},[r,e]),t}import{jsx as q,jsxs as je}from"react/jsx-runtime";function Me(r){r.posterImage?.hide?.()}var zr=`
1
+ import{a as ze,b as He,c as G}from"./chunk-QAEWAWV4.mjs";import{useEffect as We,useMemo as Ke,useState as Ze}from"react";import{Component as Fe}from"react";import{jsx as le,jsxs as Xe}from"react/jsx-runtime";var L=class extends Fe{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Xe("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:[le("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),le("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as $e}from"react";var D=$e(null);function N(r){return r&&r.trim()?r.trim():void 0}function U(r){switch(r){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?.[r]:void 0)}}function z(){let r=U("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return r==="jwt"||r==="customer-jwt"||r==="test-jwt"?"jwt":r==="workos"||U("VERCEL_ENV")==="production"?"workos":U("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Je(){return z()==="workos"}import{jsx as Y}from"react/jsx-runtime";function Ge({baseUrl:r,orgId:e,appId:t,jwt:n,authProvider:o,fallback:i,children:a}){let[x,u]=Ze(),m=G(),b=U("NEXT_PUBLIC_SESSION_TOKEN")??U("NEXT_PUBLIC_URUN_JWT"),c=z(),p=c==="workos"&&!n,R=n??(c==="jwt"?b:void 0)??x,T=o??U("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=p&&!R,v=Ke(()=>({appId:t,baseUrl:r,orgId:e,jwt:R,getAccessToken:p?m?.getAccessToken:void 0,authProvider:T}),[t,m,r,T,R,e,p]);return We(()=>{if(!p||!m)return;let f=!1,h=m;async function g(){try{let C=await h.getAccessToken();f||u(C??void 0)}catch{f||u(void 0)}}g();let P=window.setInterval(()=>{g()},6e4);return()=>{f=!0,window.clearInterval(P)}},[m,p]),Y(L,{fallback:i,children:S?Y("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Y(D.Provider,{value:v,children:a})})}import{useContext as Ye,useMemo as me,useReducer as Qe,useRef as er}from"react";import{App as rr}from"@urun-sh/core";function tr(r,e){return`${r}:${JSON.stringify(e??{})}`}var Q=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,n=>t(n))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,i)=>t.on(o,a=>{i(a),n()})}}dispose(){this._unsubscribeChange()}},ee=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},re=class{constructor(e,t){this._session=e;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;get id(){return this._session.id}get phase(){return this._session.phase}onPhase(e){return this._session.onPhase(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(e){let t=this._docs.get(e);return t||(t=new Q(this._session.doc(e),this._notify),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new ee(this._session.stream(e),this._notify),this._streams.set(e,t)),t}disconnect(){for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function nr(){let r=Ye(D);if(!r)throw new Error("useApp must be used within <UrunProvider>");if(!r.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=Qe(o=>o+1,0),t=er(new Map),n=me(()=>rr(r.appId,{baseUrl:r.baseUrl,orgId:r.orgId,jwt:r.jwt,getAccessToken:r.getAccessToken,authProvider:r.authProvider}),[r.appId,r.baseUrl,r.orgId,r.jwt,r.getAccessToken,r.authProvider]);return me(()=>new Proxy({},{get(o,i){if(typeof i=="string")return a=>{let x=tr(i,a),u=t.current.get(x);if(u)return u;let m=new re(n[i](a),e);return t.current.set(x,m),m}}}),[n])}import{useCallback as te,useEffect as sr,useMemo as or,useRef as H,useState as ne}from"react";function M(r){let e=r;if(!e||typeof e.request!="function"||typeof e.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 e}function ir(r){return r instanceof Error?r:new Error(String(r))}function ar(r,e){let t=or(()=>M(r),[r]),[n,o]=ne(void 0),[i,a]=ne(null),[x,u]=ne(!1),m=H(e);m.current=e;let b=H(0),c=H(null),p=H(!0);sr(()=>(p.current=!0,()=>{p.current=!1,c.current?.abort()}),[]);let R=te(async v=>{c.current?.abort();let f=new AbortController;c.current=f;let h=++b.current,g=()=>p.current&&b.current===h;g()&&(u(!0),a(null));try{let P=await t.request(v,{...m.current,signal:f.signal});return g()&&(o(P),u(!1),m.current?.onSuccess?.(P)),P}catch(P){let C=ir(P);throw g()&&(a(C),u(!1),m.current?.onError?.(C)),C}},[t]),T=te(v=>{R(v).catch(()=>{})},[R]),S=te(()=>{b.current++,c.current?.abort(),c.current=null,o(void 0),a(null),u(!1)},[]);return{mutate:T,mutateAsync:R,data:n,error:i,isPending:x,reset:S}}import{useCallback as fe,useEffect as ur,useMemo as cr,useRef as F,useState as se}from"react";function ge(r){return r instanceof Error?r:new Error(String(r))}var dr=r=>typeof r=="string"?r:String(r);function pr(r,e){let t=cr(()=>M(r),[r]),[n,o]=se(""),[i,a]=se(!1),[x,u]=se(null),m=F(e);m.current=e;let b=F(0),c=F(null),p=F(!0);ur(()=>(p.current=!0,()=>{p.current=!1,c.current?.cancel(),c.current=null}),[]);let R=fe(()=>{b.current++,c.current?.cancel(),c.current=null,p.current&&a(!1)},[]),T=fe(async S=>{c.current?.cancel();let v=++b.current,f=()=>p.current&&b.current===v,h=m.current,g=h?.parseChunk??dr,P=h?.buildPayload??(l=>({prompt:l}));f()&&(o(""),u(null),a(!0));let{parseChunk:C,buildPayload:W,onFinish:w,onError:s,...d}=h??{},y="",k;try{k=t.requestStream(P(S),d),c.current=k}catch(l){let _=ge(l);f()&&(u(_),a(!1),h?.onError?.(_));return}try{for await(let l of k){if(b.current!==v)break;y+=g(l),f()&&o(y)}f()&&(a(!1),h?.onFinish?.(y))}catch(l){let _=ge(l);f()&&(u(_),a(!1),h?.onError?.(_))}finally{c.current===k&&(c.current=null)}},[t]);return{completion:n,complete:T,stop:R,isStreaming:i,error:x}}import{useCallback as he,useEffect as lr,useMemo as mr,useRef as O,useState as X}from"react";function ve(r){return r instanceof Error?r:new Error(String(r))}var fr=r=>typeof r=="string"?r:String(r),ye=0;function oe(r){return ye+=1,`${r}-${ye}`}function gr(r,e){let t=mr(()=>M(r),[r]),[n,o]=X(()=>(e?.initialMessages??[]).map(g=>({id:g.id??oe("msg"),role:g.role,content:g.content}))),[i,a]=X(""),[x,u]=X(!1),[m,b]=X(null),c=O(e);c.current=e;let p=O(n);p.current=n;let R=O(i);R.current=i;let T=O(0),S=O(null),v=O(!0);lr(()=>(v.current=!0,()=>{v.current=!1,S.current?.cancel(),S.current=null}),[]);let f=he(()=>{T.current++,S.current?.cancel(),S.current=null,v.current&&u(!1)},[]),h=he(async g=>{let P=g===void 0,C=(P?R.current:g)??"";if(!C.trim())return;S.current?.cancel();let w=++T.current,s=()=>v.current&&T.current===w,d=c.current,y=d?.parseChunk??fr,k={id:oe("msg"),role:"user",content:C},l={id:oe("msg"),role:"assistant",content:""},_=[...p.current,k].map(E=>({role:E.role,content:E.content})),j=[...p.current,k,l];p.current=j,o(j),P&&a(""),b(null),u(!0);let Ve=d?.buildPayload??(E=>({messages:E})),{initialMessages:Wr,parseChunk:Kr,buildPayload:Zr,onFinish:Gr,onError:Yr,...Be}=d??{},De=E=>{o(I=>I.map(Z=>Z.id===l.id?{...Z,content:E}:Z))},K="",B;try{B=t.requestStream(Ve(_),Be),S.current=B}catch(E){let I=ve(E);s()&&(b(I),u(!1),d?.onError?.(I));return}try{for await(let E of B){if(T.current!==w)break;K+=y(E),s()&&De(K)}s()&&(u(!1),d?.onFinish?.({...l,content:K}))}catch(E){let I=ve(E);s()&&(b(I),u(!1),d?.onError?.(I))}finally{S.current===B&&(S.current=null)}},[t]);return{messages:n,input:i,setInput:a,sendMessage:h,stop:f,isStreaming:x,error:m}}var be=new Map;function hr(r,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${r}"): schema must be a valid Zod schema`);be.set(r,{component:e,schema:t})}function Se(r,e){let t=be.get(r);if(!t)return{error:`Unknown component: "${r}"`};let n=t.schema.safeParse(e);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${r}": ${n.error.message}`}}import{Fragment as yr,jsx as $}from"react/jsx-runtime";function vr({name:r,props:e,fallback:t}){let n=Se(r,e);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?$(yr,{children:t}):$("div",{className:"urun-component-error",role:"alert",children:$("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return $(o,{...n.validatedProps})}import{z as V}from"zod";import{jsx as ie,jsxs as ke}from"react/jsx-runtime";var br=V.object({step:V.number().min(0),total:V.number().min(1),label:V.string().optional(),variant:V.enum(["default","success","error"]).default("default")});function Re(r){let{step:e,total:t,label:n,variant:o="default"}=r,i=Math.min(e/t*100,100),a=e>=t;return{step:e,total:t,label:n,variant:o,percentage:i,isComplete:a}}function Sr(r){let{step:e,total:t,label:n,variant:o,percentage:i}=Re(r);return ke("div",{className:"urun-progress-card","data-variant":o,children:[n&&ie("div",{className:"urun-progress-label",children:n}),ie("div",{className:"urun-progress-bar",children:ie("div",{className:"urun-progress-fill",style:{width:`${i}%`}})}),ke("div",{className:"urun-progress-text",children:[e,"/",t]})]})}import{z as ae}from"zod";import{jsx as Ce,jsxs as xr}from"react/jsx-runtime";var kr=ae.object({state:ae.enum(["thinking","generating","idle","error"]),message:ae.string().optional()}),Rr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function xe(r){let{state:e,message:t}=r,n=e==="thinking"||e==="generating",o=t??Rr[e]??e;return{state:e,message:o,isActive:n}}function Cr(r){let{state:e,message:t,isActive:n}=xe(r);return xr("span",{className:"urun-status-badge","data-state":e,children:[Ce("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),Ce("span",{className:"urun-status-message",children:t})]})}import{useRef as Te,useEffect as Tr}from"react";import{z as ue}from"zod";import{jsx as Pe,jsxs as wr}from"react/jsx-runtime";var Pr=ue.object({text:ue.string(),streaming:ue.boolean().default(!1)});function Ee(r){let{text:e,streaming:t=!1}=r,n=e.length===0;return{text:e,streaming:t,isEmpty:n}}function Er(r){let{text:e,streaming:t}=Ee(r),n=Te(null),o=Te(0);return Tr(()=>{let i=n.current;i&&e.length!==o.current&&(i.textContent=e,o.current=e.length)},[e]),wr("div",{className:"urun-text-stream",children:[Pe("span",{ref:n,className:"urun-text-content"}),t&&Pe("span",{className:"urun-text-cursor"})]})}import{z as J}from"zod";import{jsx as we,jsxs as Ar}from"react/jsx-runtime";var _r=J.object({src:J.string().url(),alt:J.string().optional(),caption:J.string().optional()});function _e(r){let{src:e,alt:t,caption:n}=r;return{src:e,alt:t??"",caption:n}}function Ur(r){let{src:e,alt:t,caption:n}=_e(r);return Ar("figure",{className:"urun-image-frame",children:[we("img",{className:"urun-image",src:e,alt:t}),n&&we("figcaption",{className:"urun-image-caption",children:n})]})}import{z as A}from"zod";import{jsx as ce,jsxs as qr}from"react/jsx-runtime";var Ir=A.object({metrics:A.array(A.object({label:A.string(),value:A.union([A.string(),A.number()]),unit:A.string().optional()}))});function Ue(r){return{metrics:r.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Nr(r){let{metrics:e}=Ue(r);return ce("div",{className:"urun-metrics-panel",children:e.map((t,n)=>qr("div",{className:"urun-metric-card",children:[ce("div",{className:"urun-metric-label",children:t.label}),ce("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as pe,useCallback as Ne,useEffect as de,useImperativeHandle as Vr,useRef as qe,useState as Br}from"react";import Dr from"video.js";import"video.js/dist/video-js.css";import{useContext as Or,useState as jr,useEffect as Lr}from"react";import{createContext as Mr,useState as Kt,useEffect as Zt,useRef as Gt}from"react";import{TransportSession as Qt}from"@urun-sh/core/internal";import{jsx as rn}from"react/jsx-runtime";var Ae=Mr(null);function Ie(r){let e=Or(Ae);if(!e)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=jr(null);return Lr(()=>{let o=e.getState()._transport;if(!o)return;let i=o.getTrackByName?.bind(o),a=i?.(r);a&&a.readyState!=="ended"&&n(a);let x=o.on("track",u=>{let m=i?.(r);m&&m.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{x()}},[r,e]),t}import{jsx as q,jsxs as je}from"react/jsx-runtime";function Me(r){r.posterImage?.hide?.()}var zr=`
2
2
  [data-urun-video]{width:100%;height:100%}
3
3
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
4
4
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -6,4 +6,4 @@ import{a as ze,b as He,c as G}from"./chunk-QAEWAWV4.mjs";import{useEffect as We,
6
6
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
7
7
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
8
8
  .urun-video-live .vjs-poster{background-color:transparent}
9
- `,Oe="urun-video-critical-css";function Hr(){if(typeof document>"u"||document.getElementById(Oe))return;let r=document.createElement("style");r.id=Oe,r.textContent=zr,document.head.appendChild(r)}var Fr=["playToggle","volumePanel","fullscreenToggle"],Xr=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Le=pe(function(e,t){let{track:n,stream:o,src:i,type:a="video/mp4",className:x,videoClassName:u,poster:m,controls:b=!0,autoPlay:c=!0,muted:p=!0,onVideoElement:R,onPlayerReady:T,children:S}=e,v=typeof i=="string"&&i.length>0,f=!v,h=qe(null),g=qe(null),[P,C]=Br(!1),W=Ne(s=>{h.current=s,typeof t=="function"?t(s):t&&(t.current=s),R?.(s)},[t,R]);Vr(t,()=>h.current,[]);let w=Ne(()=>{let s=h.current;if(!s||!s.srcObject&&!s.src)return;p&&(s.muted=!0,s.defaultMuted=!0),s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let d=s.play();d&&typeof d.then=="function"&&d.then(()=>C(!1)).catch(y=>{(y instanceof Error?y.name:String(y))!=="AbortError"&&C(!0)})},[p]);return de(()=>{if(typeof document>"u")return;let s=h.current;if(!s)return;Hr(),p&&(s.muted=!0,s.defaultMuted=!0,s.setAttribute("muted","")),s.autoplay=c,s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let d=Dr(s,{controls:b,autoplay:c,muted:p,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:m,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:f?Fr:Xr}});f&&d.addClass("urun-video-live");let y=()=>C(!1),k=()=>{d.hasStarted(!0),Me(d),y()},l=()=>{f&&w()};return s.addEventListener("playing",k),s.addEventListener("loadedmetadata",l),f&&s.addEventListener("pause",l),g.current=d,T?.(d),()=>{s.removeEventListener("playing",k),s.removeEventListener("loadedmetadata",l),s.removeEventListener("pause",l),T?.(null),g.current&&(g.current.dispose(),g.current=null)}},[f]),de(()=>{if(!v)return;let s=g.current;if(!s)return;let d=s.tech?.(!0)?.el?.();d&&(d.srcObject=null),s.src({src:i,type:a}),c&&w()},[v,i,a,c,w]),de(()=>{if(!f)return;let s=g.current;if(!s)return;let d=n??null,y=o??null;!y&&d&&(y=new MediaStream([d]));let k=s.tech?.(!0)?.el?.()??h.current;if(!k)return;if(!y){k.srcObject=null,C(!1);return}k.srcObject=y,w();let l=y.getVideoTracks()[0]??d??null,_=()=>{s.hasStarted(!0),Me(s),w()},j=()=>{k.srcObject=null,C(!1)};return l&&(l.addEventListener("unmute",_),l.addEventListener("ended",j),l.muted||_()),()=>{l&&(l.removeEventListener("unmute",_),l.removeEventListener("ended",j))}},[f,n,o,w]),je("div",{className:x,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":f?"live":"vod",children:[q("video",{ref:W,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),P&&q("button",{type:"button",onClick:w,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:je("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[q("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:q("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),S]})}),$r=pe(function({name:e,...t},n){let o=Ae(e);return q(Le,{ref:n,...t,track:o})}),Jr=pe(function(e,t){return!!e.name&&!e.track&&!e.stream&&!(typeof e.src=="string"&&e.src)?q($r,{ref:t,...e,name:e.name}):q(Le,{ref:t,...e})});export{vr as ComponentRenderer,Ur as ImageFrame,_r as ImageFrameSchema,Nr as MetricsPanel,Ar as MetricsPanelSchema,Sr as ProgressCard,br as ProgressCardSchema,Cr as StatusBadge,kr as StatusBadgeSchema,Er as TextStream,Pr as TextStreamSchema,ze as UrunAuthProvider,L as UrunErrorBoundary,He as UrunJwtProvider,Ge as UrunProvider,Jr as UrunVideo,z as authMode,hr as registerComponent,U as urunPublicEnv,nr as useApp,gr as useChat,pr as useCompletion,_e as useImageFrame,Ue as useMetricsPanel,Re as useProgressCard,ar as useRequest,xe as useStatusBadge,Ee as useTextStream,G as useUrunAuth,Je as usesWorkOSAuth};
9
+ `,Oe="urun-video-critical-css";function Hr(){if(typeof document>"u"||document.getElementById(Oe))return;let r=document.createElement("style");r.id=Oe,r.textContent=zr,document.head.appendChild(r)}var Fr=["playToggle","volumePanel","fullscreenToggle"],Xr=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Le=pe(function(e,t){let{track:n,stream:o,src:i,type:a="video/mp4",className:x,videoClassName:u,poster:m,controls:b=!0,autoPlay:c=!0,muted:p=!0,onVideoElement:R,onPlayerReady:T,children:S}=e,v=typeof i=="string"&&i.length>0,f=!v,h=qe(null),g=qe(null),[P,C]=Br(!1),W=Ne(s=>{h.current=s,typeof t=="function"?t(s):t&&(t.current=s),R?.(s)},[t,R]);Vr(t,()=>h.current,[]);let w=Ne(()=>{let s=h.current;if(!s||!s.srcObject&&!s.src)return;p&&(s.muted=!0,s.defaultMuted=!0),s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let d=s.play();d&&typeof d.then=="function"&&d.then(()=>C(!1)).catch(y=>{(y instanceof Error?y.name:String(y))!=="AbortError"&&C(!0)})},[p]);return de(()=>{if(typeof document>"u")return;let s=h.current;if(!s)return;Hr(),p&&(s.muted=!0,s.defaultMuted=!0,s.setAttribute("muted","")),s.autoplay=c,s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let d=Dr(s,{controls:b,autoplay:c,muted:p,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:m,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:f?Fr:Xr}});f&&d.addClass("urun-video-live");let y=()=>C(!1),k=()=>{d.hasStarted(!0),Me(d),y()},l=()=>{f&&w()};return s.addEventListener("playing",k),s.addEventListener("loadedmetadata",l),f&&s.addEventListener("pause",l),g.current=d,T?.(d),()=>{s.removeEventListener("playing",k),s.removeEventListener("loadedmetadata",l),s.removeEventListener("pause",l),T?.(null),g.current&&(g.current.dispose(),g.current=null)}},[f]),de(()=>{if(!v)return;let s=g.current;if(!s)return;let d=s.tech?.(!0)?.el?.();d&&(d.srcObject=null),s.src({src:i,type:a}),c&&w()},[v,i,a,c,w]),de(()=>{if(!f)return;let s=g.current;if(!s)return;let d=n??null,y=o??null;!y&&d&&(y=new MediaStream([d]));let k=s.tech?.(!0)?.el?.()??h.current;if(!k)return;if(!y){k.srcObject=null,C(!1);return}k.srcObject=y,w();let l=y.getVideoTracks()[0]??d??null,_=()=>{s.hasStarted(!0),Me(s),w()},j=()=>{k.srcObject=null,C(!1)};return l&&(l.addEventListener("unmute",_),l.addEventListener("ended",j),l.muted||_()),()=>{l&&(l.removeEventListener("unmute",_),l.removeEventListener("ended",j))}},[f,n,o,w]),je("div",{className:x,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":f?"live":"vod",children:[q("video",{ref:W,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),P&&q("button",{type:"button",onClick:w,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:je("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[q("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:q("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),S]})}),$r=pe(function({name:e,...t},n){let o=Ie(e);return q(Le,{ref:n,...t,track:o})}),Jr=pe(function(e,t){return!!e.name&&!e.track&&!e.stream&&!(typeof e.src=="string"&&e.src)?q($r,{ref:t,...e,name:e.name}):q(Le,{ref:t,...e})});export{vr as ComponentRenderer,Ur as ImageFrame,_r as ImageFrameSchema,Nr as MetricsPanel,Ir as MetricsPanelSchema,Sr as ProgressCard,br as ProgressCardSchema,Cr as StatusBadge,kr as StatusBadgeSchema,Er as TextStream,Pr as TextStreamSchema,ze as UrunAuthProvider,L as UrunErrorBoundary,He as UrunJwtProvider,Ge as UrunProvider,Jr as UrunVideo,z as authMode,hr as registerComponent,U as urunPublicEnv,nr as useApp,gr as useChat,pr as useCompletion,_e as useImageFrame,Ue as useMetricsPanel,Re as useProgressCard,ar as useRequest,xe as useStatusBadge,Ee as useTextStream,G as useUrunAuth,Je as usesWorkOSAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "React bindings for the urun TypeScript SDK",
5
5
  "repository": {
6
6
  "type": "git",