@urun-sh/react 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, RuntimeAvailability } from '@urun-sh/core';
5
- export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, CaptureController, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
8
8
 
@@ -432,6 +432,8 @@ interface UrunVoiceProps {
432
432
  onTrack?: (track: MediaStreamTrack | null) => void;
433
433
 
434
434
  onUnlockChange?: (unlocked: boolean) => void;
435
+
436
+ capture?: CaptureController;
435
437
  }
436
438
 
437
439
  declare const DEFAULT_VOICE_CONSTRAINTS: MediaTrackConstraints;
@@ -506,6 +508,8 @@ interface UrunCameraProps {
506
508
  onTrack?: (track: MediaStreamTrack | null) => void;
507
509
 
508
510
  children?: ReactNode;
511
+
512
+ capture?: CaptureController;
509
513
  }
510
514
 
511
515
  declare const DEFAULT_CAMERA_CONSTRAINTS: MediaTrackConstraints;
@@ -730,6 +734,38 @@ interface UrunSessionGateProps {
730
734
 
731
735
  declare function UrunSessionGate({ session, children, fallback, onStartOver, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
732
736
 
737
+ declare function useSessionEndsAt(session: WorkbenchSession | null): Date | null;
738
+ interface UrunSessionClockProps {
739
+ session: WorkbenchSession | null;
740
+
741
+ urgentMs?: number;
742
+ className?: string;
743
+ }
744
+
745
+ declare function UrunSessionClock({ session, urgentMs, className }: UrunSessionClockProps): react_jsx_runtime.JSX.Element | null;
746
+
747
+ interface UrunSessionEndedProps {
748
+ session: WorkbenchSession | null;
749
+
750
+ onNewSession?: () => void;
751
+
752
+ children?: (phase: SessionPhase) => ReactNode;
753
+ className?: string;
754
+ }
755
+
756
+ declare function UrunSessionEnded({ session, onNewSession, children, className }: UrunSessionEndedProps): react_jsx_runtime.JSX.Element | null;
757
+
758
+ interface UseUrunPrewakeOptions {
759
+
760
+ app?: string;
761
+
762
+ function: string;
763
+
764
+ intervalS?: number;
765
+ }
766
+
767
+ declare function useUrunPrewake(options: UseUrunPrewakeOptions): PrewakeResult | null;
768
+
733
769
  interface SessionWake {
734
770
 
735
771
  waking: boolean;
@@ -756,4 +792,4 @@ interface UrunSessionWakingProps {
756
792
 
757
793
  declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
758
794
 
759
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
795
+ export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, RuntimeAvailability } from '@urun-sh/core';
5
- export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, CaptureController, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
8
8
 
@@ -432,6 +432,8 @@ interface UrunVoiceProps {
432
432
  onTrack?: (track: MediaStreamTrack | null) => void;
433
433
 
434
434
  onUnlockChange?: (unlocked: boolean) => void;
435
+
436
+ capture?: CaptureController;
435
437
  }
436
438
 
437
439
  declare const DEFAULT_VOICE_CONSTRAINTS: MediaTrackConstraints;
@@ -506,6 +508,8 @@ interface UrunCameraProps {
506
508
  onTrack?: (track: MediaStreamTrack | null) => void;
507
509
 
508
510
  children?: ReactNode;
511
+
512
+ capture?: CaptureController;
509
513
  }
510
514
 
511
515
  declare const DEFAULT_CAMERA_CONSTRAINTS: MediaTrackConstraints;
@@ -730,6 +734,38 @@ interface UrunSessionGateProps {
730
734
 
731
735
  declare function UrunSessionGate({ session, children, fallback, onStartOver, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
732
736
 
737
+ declare function useSessionEndsAt(session: WorkbenchSession | null): Date | null;
738
+ interface UrunSessionClockProps {
739
+ session: WorkbenchSession | null;
740
+
741
+ urgentMs?: number;
742
+ className?: string;
743
+ }
744
+
745
+ declare function UrunSessionClock({ session, urgentMs, className }: UrunSessionClockProps): react_jsx_runtime.JSX.Element | null;
746
+
747
+ interface UrunSessionEndedProps {
748
+ session: WorkbenchSession | null;
749
+
750
+ onNewSession?: () => void;
751
+
752
+ children?: (phase: SessionPhase) => ReactNode;
753
+ className?: string;
754
+ }
755
+
756
+ declare function UrunSessionEnded({ session, onNewSession, children, className }: UrunSessionEndedProps): react_jsx_runtime.JSX.Element | null;
757
+
758
+ interface UseUrunPrewakeOptions {
759
+
760
+ app?: string;
761
+
762
+ function: string;
763
+
764
+ intervalS?: number;
765
+ }
766
+
767
+ declare function useUrunPrewake(options: UseUrunPrewakeOptions): PrewakeResult | null;
768
+
733
769
  interface SessionWake {
734
770
 
735
771
  waking: boolean;
@@ -756,4 +792,4 @@ interface UrunSessionWakingProps {
756
792
 
757
793
  declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
758
794
 
759
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
795
+ export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var er=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var vt=Object.prototype.hasOwnProperty;var kt=(e,r)=>{for(var t in r)er(e,t,{get:r[t],enumerable:!0})},yt=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of ht(r))!vt.call(e,o)&&o!==t&&er(e,o,{get:()=>r[o],enumerable:!(n=St(r,o))||n.enumerable});return e};var bt=e=>yt(er({},"__esModule",{value:!0}),e);var _t={};kt(_t,{ComponentRenderer:()=>Or,DEFAULT_CAMERA_CONSTRAINTS:()=>gr,DEFAULT_LOG_CAP:()=>Q,DEFAULT_VOICE_CONSTRAINTS:()=>mr,DocPatchForm:()=>we,ImageFrame:()=>Hr,ImageFrameSchema:()=>Vr,MetricsPanel:()=>jr,MetricsPanelSchema:()=>$r,ProgressCard:()=>qr,ProgressCardSchema:()=>Ir,StatusBadge:()=>Wr,StatusBadgeSchema:()=>Lr,TextStream:()=>Br,TextStreamSchema:()=>Fr,UrunAudio:()=>Oe,UrunAuthProvider:()=>rr,UrunCamera:()=>Yr,UrunControlSender:()=>ut,UrunDocPanel:()=>at,UrunErrorBoundary:()=>ie,UrunEventSpine:()=>ct,UrunJwtProvider:()=>br,UrunProvider:()=>Cr,UrunSessionGate:()=>mt,UrunSessionStatus:()=>pt,UrunSessionWaking:()=>Xe,UrunStreamTail:()=>st,UrunVoice:()=>Gr,authMode:()=>ve,createDocStore:()=>We,describeSessionPhase:()=>Ke.describeSessionPhase,formatPayload:()=>fe,getUrunAudioContext:()=>Ue,isWakingPhase:()=>Ke.isWakingPhase,parseJsonObject:()=>Be,pushCapped:()=>K,registerComponent:()=>Nr,resumeUrunAudioContext:()=>Re,urunPublicEnv:()=>z,useApp:()=>Rr,useChat:()=>_r,useCompletion:()=>wr,useDocStore:()=>me,useImageFrame:()=>cr,useMetricsPanel:()=>lr,useProgressCard:()=>ar,useRequest:()=>xr,useSessionDoc:()=>ot,useSessionPhase:()=>ee,useSessionTrack:()=>et,useSessionWake:()=>ze,useStatusBadge:()=>ir,useStreamMessages:()=>He,useTextStream:()=>ur,useUrunAudioLevel:()=>Qr,useUrunAuth:()=>Ee,usesWorkOSAuth:()=>kr});module.exports=bt(_t);var ce=require("react");var hr=require("react"),he=require("react/jsx-runtime"),ie=class extends hr.Component{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||(0,he.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,he.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,he.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var vr=require("react"),Ae=(0,vr.createContext)(null);function ne(e){return e&&e.trim()?e.trim():void 0}function z(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ne(typeof process<"u"?process.env?.[e]:void 0)}}function ve(){let e=z("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||z("VERCEL_ENV")==="production"?"workos":z("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function kr(){return ve()==="workos"}var ue=require("react"),Tr=require("react/jsx-runtime"),yr=(0,ue.createContext)(null);function rr({getAccessToken:e,children:r}){let t=(0,ue.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Tr.jsx)(yr.Provider,{value:t,children:r})}var br=rr;function Ee(){return(0,ue.useContext)(yr)}var _e=require("react/jsx-runtime");function Cr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=(0,ce.useState)(),i=Ee(),S=z("NEXT_PUBLIC_SESSION_TOKEN")??z("NEXT_PUBLIC_URUN_JWT"),l=ve(),m=l==="workos"&&!n,x=n??(l==="jwt"?S:void 0)??u,C=o??z("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),b=m&&!x,T=(0,ce.useMemo)(()=>({appId:t,baseUrl:e,orgId:r,jwt:x,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,x,r,m]);return(0,ce.useEffect)(()=>{if(!m||!i)return;let k=!1,h=i;async function v(){try{let U=await h.getAccessToken();k||c(U??void 0)}catch{k||c(void 0)}}v();let P=window.setInterval(()=>{v()},6e4);return()=>{k=!0,window.clearInterval(P)}},[i,m]),(0,_e.jsx)(ie,{fallback:s,children:b?(0,_e.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,_e.jsx)(Ae.Provider,{value:T,children:a})})}var X=require("react"),Ur=require("@urun-sh/core");function Tt(e,r){return`${e}:${JSON.stringify(r??{})}`}var tr=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},nr=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},or=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new tr(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new nr(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Rr(){let e=(0,X.useContext)(Ae);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=(0,X.useReducer)(o=>o+1,0),t=(0,X.useRef)(new Map),n=(0,X.useMemo)(()=>(0,Ur.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,X.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Tt(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new or(n[s](a),r);return t.current.set(u,i),i}}}),[n])}var O=require("react");function le(e){let r=e;if(!r||typeof r.request!="function"||typeof r.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 r}function Ct(e){return e instanceof Error?e:new Error(String(e))}function xr(e,r){let t=(0,O.useMemo)(()=>le(e),[e]),[n,o]=(0,O.useState)(void 0),[s,a]=(0,O.useState)(null),[u,c]=(0,O.useState)(!1),i=(0,O.useRef)(r);i.current=r;let S=(0,O.useRef)(0),l=(0,O.useRef)(null),m=(0,O.useRef)(!0);(0,O.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let x=(0,O.useCallback)(async T=>{l.current?.abort();let k=new AbortController;l.current=k;let h=++S.current,v=()=>m.current&&S.current===h;v()&&(c(!0),a(null));try{let P=await t.request(T,{...i.current,signal:k.signal});return v()&&(o(P),c(!1),i.current?.onSuccess?.(P)),P}catch(P){let U=Ct(P);throw v()&&(a(U),c(!1),i.current?.onError?.(U)),U}},[t]),C=(0,O.useCallback)(T=>{x(T).catch(()=>{})},[x]),b=(0,O.useCallback)(()=>{S.current++,l.current?.abort(),l.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:x,data:n,error:s,isPending:u,reset:b}}var q=require("react");function Pr(e){return e instanceof Error?e:new Error(String(e))}var Ut=e=>typeof e=="string"?e:String(e);function wr(e,r){let t=(0,q.useMemo)(()=>le(e),[e]),[n,o]=(0,q.useState)(""),[s,a]=(0,q.useState)(!1),[u,c]=(0,q.useState)(null),i=(0,q.useRef)(r);i.current=r;let S=(0,q.useRef)(0),l=(0,q.useRef)(null),m=(0,q.useRef)(!0);(0,q.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let x=(0,q.useCallback)(()=>{S.current++,l.current?.cancel(),l.current=null,m.current&&a(!1)},[]),C=(0,q.useCallback)(async b=>{l.current?.cancel();let T=++S.current,k=()=>m.current&&S.current===T,h=i.current,v=h?.parseChunk??Ut,P=h?.buildPayload??(y=>({prompt:y}));k()&&(o(""),c(null),a(!0));let{parseChunk:U,buildPayload:J,onFinish:V,onError:d,...R}=h??{},p="",f;try{f=t.requestStream(P(b),R),l.current=f}catch(y){let _=Pr(y);k()&&(c(_),a(!1),h?.onError?.(_));return}try{for await(let y of f){if(S.current!==T)break;p+=v(y),k()&&o(p)}k()&&(a(!1),h?.onFinish?.(p))}catch(y){let _=Pr(y);k()&&(c(_),a(!1),h?.onError?.(_))}finally{l.current===f&&(l.current=null)}},[t]);return{completion:n,complete:C,stop:x,isStreaming:s,error:u}}var D=require("react");function Ar(e){return e instanceof Error?e:new Error(String(e))}var Rt=e=>typeof e=="string"?e:String(e),Er=0;function sr(e){return Er+=1,`${e}-${Er}`}function _r(e,r){let t=(0,D.useMemo)(()=>le(e),[e]),[n,o]=(0,D.useState)(()=>(r?.initialMessages??[]).map(v=>({id:v.id??sr("msg"),role:v.role,content:v.content}))),[s,a]=(0,D.useState)(""),[u,c]=(0,D.useState)(!1),[i,S]=(0,D.useState)(null),l=(0,D.useRef)(r);l.current=r;let m=(0,D.useRef)(n);m.current=n;let x=(0,D.useRef)(s);x.current=s;let C=(0,D.useRef)(0),b=(0,D.useRef)(null),T=(0,D.useRef)(!0);(0,D.useEffect)(()=>(T.current=!0,()=>{T.current=!1,b.current?.cancel(),b.current=null}),[]);let k=(0,D.useCallback)(()=>{C.current++,b.current?.cancel(),b.current=null,T.current&&c(!1)},[]),h=(0,D.useCallback)(async v=>{let P=v===void 0,U=(P?x.current:v)??"";if(!U.trim())return;b.current?.cancel();let V=++C.current,d=()=>T.current&&C.current===V,R=l.current,p=R?.parseChunk??Rt,f={id:sr("msg"),role:"user",content:U},y={id:sr("msg"),role:"assistant",content:""},_=[...m.current,f].map(N=>({role:N.role,content:N.content})),g=[...m.current,f,y];m.current=g,o(g),P&&a(""),S(null),c(!0);let I=R?.buildPayload??(N=>({messages:N})),{initialMessages:Se,parseChunk:Ze,buildPayload:Ye,onFinish:Qe,onError:ft,...M}=R??{},L=N=>{o(H=>H.map(F=>F.id===y.id?{...F,content:N}:F))},Y="",W;try{W=t.requestStream(I(_),M),b.current=W}catch(N){let H=Ar(N);d()&&(S(H),c(!1),R?.onError?.(H));return}try{for await(let N of W){if(C.current!==V)break;Y+=p(N),d()&&L(Y)}d()&&(c(!1),R?.onFinish?.({...y,content:Y}))}catch(N){let H=Ar(N);d()&&(S(H),c(!1),R?.onError?.(H))}finally{b.current===W&&(b.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:h,stop:k,isStreaming:u,error:i}}var Mr=new Map;function Nr(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Mr.set(e,{component:r,schema:t})}function Dr(e,r){let t=Mr.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var oe=require("react/jsx-runtime");function Or({name:e,props:r,fallback:t}){let n=Dr(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,oe.jsx)(oe.Fragment,{children:t}):(0,oe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,oe.jsx)("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return(0,oe.jsx)(o,{...n.validatedProps})}var de=require("zod"),se=require("react/jsx-runtime"),Ir=de.z.object({step:de.z.number().min(0),total:de.z.number().min(1),label:de.z.string().optional(),variant:de.z.enum(["default","success","error"]).default("default")});function ar(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function qr(e){let{step:r,total:t,label:n,variant:o,percentage:s}=ar(e);return(0,se.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,se.jsx)("div",{className:"urun-progress-label",children:n}),(0,se.jsx)("div",{className:"urun-progress-bar",children:(0,se.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,se.jsxs)("div",{className:"urun-progress-text",children:[r,"/",t]})]})}var Me=require("zod"),ke=require("react/jsx-runtime"),Lr=Me.z.object({state:Me.z.enum(["thinking","generating","idle","error"]),message:Me.z.string().optional()}),xt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ir(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??xt[r]??r;return{state:r,message:o,isActive:n}}function Wr(e){let{state:r,message:t,isActive:n}=ir(e);return(0,ke.jsxs)("span",{className:"urun-status-badge","data-state":r,children:[(0,ke.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,ke.jsx)("span",{className:"urun-status-message",children:t})]})}var ye=require("react"),Ne=require("zod"),be=require("react/jsx-runtime"),Fr=Ne.z.object({text:Ne.z.string(),streaming:Ne.z.boolean().default(!1)});function ur(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function Br(e){let{text:r,streaming:t}=ur(e),n=(0,ye.useRef)(null),o=(0,ye.useRef)(0);return(0,ye.useEffect)(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),(0,be.jsxs)("div",{className:"urun-text-stream",children:[(0,be.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,be.jsx)("span",{className:"urun-text-cursor"})]})}var Te=require("zod"),Ce=require("react/jsx-runtime"),Vr=Te.z.object({src:Te.z.string().url(),alt:Te.z.string().optional(),caption:Te.z.string().optional()});function cr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function Hr(e){let{src:r,alt:t,caption:n}=cr(e);return(0,Ce.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ce.jsx)("img",{className:"urun-image",src:r,alt:t}),n&&(0,Ce.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var G=require("zod"),pe=require("react/jsx-runtime"),$r=G.z.object({metrics:G.z.array(G.z.object({label:G.z.string(),value:G.z.union([G.z.string(),G.z.number()]),unit:G.z.string().optional()}))});function lr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function jr(e){let{metrics:r}=lr(e);return(0,pe.jsx)("div",{className:"urun-metrics-panel",children:r.map((t,n)=>(0,pe.jsxs)("div",{className:"urun-metric-card",children:[(0,pe.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,pe.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var A=require("react"),zr=require("@urun-sh/core");var De=null;function Pt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ue(){if(De)return De;let e=Pt();return e?(De=new e,De):null}function Re(){let e=Ue();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Xr=require("react/jsx-runtime"),wt=1e3,Jr=200;function dr(...e){console.debug("[urun-audio]",...e)}var Oe=(0,A.forwardRef)(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:S}=r,l=(0,A.useRef)(null),m=(0,A.useRef)(null),x=(0,A.useRef)(null),C=(0,A.useRef)(null),b=(0,A.useRef)(c);b.current=c;let T=(0,A.useRef)(i);T.current=i;let k=(0,A.useCallback)(d=>{x.current!==d&&(x.current=d,T.current?.(d))},[]),h=(0,A.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=l.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),v=(0,A.useCallback)(d=>{let R=l.current;if(!R)return;let p=R.play();!p||typeof p.then!="function"||p.then(()=>{R.muted||k(!0)}).catch(f=>{let y=f instanceof Error?f.name:String(f);if(y==="AbortError"){dr(`play() aborted (${d}); retrying in ${Jr}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${d}:retry`)},Jr);return}if(y==="NotAllowedError"){dr(`play() blocked pending a user gesture (${d})`),k(!1);return}dr(`play() failed (${d})`,f)})},[k]),P=(0,A.useCallback)(d=>{let R=h();if(R){for(let p of R.getAudioTracks())p!==d&&R.removeTrack(p);d&&!R.getAudioTracks().includes(d)&&R.addTrack(d),d&&v("track-attach"),b.current?.(d)}},[h,v]),U=(0,A.useCallback)(()=>{let d=l.current;d&&(h(),d.muted=!1,v("gesture"),Re(),k(!0))},[h,v,k]);(0,A.useImperativeHandle)(t,()=>({unlock:U,get unlocked(){return x.current===!0},get element(){return l.current}}),[U]);let J=(0,A.useCallback)(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),h()),S?.(d)},[h,S]),V=s!==void 0;return(0,A.useEffect)(()=>{if(V){P(s??null);return}if(!n)return;let d=n.stream(o),R=()=>{let g=m.current;return g?g.getAudioTracks()[0]??null:null},p=g=>{if(g!==R()&&(P(g),g)){let I=()=>{R()===g&&P(null)};g.addEventListener("ended",I)}},f=d.track;f&&f.readyState==="live"&&p(f);let y=d.on("track",g=>{g&&g.readyState!=="live"||p(g)}),_=setInterval(()=>{let g=d.track;g&&g.readyState==="live"&&p(g)},wt);return()=>{y(),clearInterval(_)}},[n,o,V,s,P]),(0,A.useEffect)(()=>(0,zr.observePageLifecycle)(()=>{Re(),x.current===!0&&v("foreground")}),[v]),(0,A.useEffect)(()=>()=>{C.current&&clearTimeout(C.current)},[]),(0,Xr.jsx)("audio",{ref:J,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});var E=require("react"),xe=require("@urun-sh/core");var Kr=require("react/jsx-runtime"),mr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function pr(...e){console.debug("[urun-voice]",...e)}var Gr=(0,E.forwardRef)(function(r,t){let{session:n,stream:o="audio",constraints:s=mr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:S,onMicStream:l,onTrack:m,onUnlockChange:x}=r,C=(0,E.useRef)(null),b=(0,E.useRef)(null),T=(0,E.useRef)(!1),k=(0,E.useRef)(i);k.current=i;let h=(0,E.useRef)(S);h.current=S;let v=(0,E.useRef)(l);v.current=l;let P=(0,E.useCallback)(p=>{T.current!==p&&(T.current=p,k.current?.(p))},[]),U=(0,E.useCallback)(()=>{let p=b.current;if(p){for(let f of p.getTracks())f.stop();b.current=null,v.current?.(null)}},[]),J=(0,E.useCallback)(async()=>{U(),P(!1),await n.stream(o).detach().catch(()=>{})},[n,o,U,P]),V=(0,E.useCallback)(async()=>{C.current?.unlock();let p;try{p=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(g){let I=(0,xe.sessionFailureFromMediaError)(g,n.status);throw h.current?.(I),I}U(),b.current=p,v.current?.(p);let f=p.getAudioTracks()[0];if(!f){U();let g=(0,xe.sessionFailureFromMediaError)(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw h.current?.(g),g}n.connect?.();let y;for(let g=1;g<=u;g++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(f),P(!0);return}catch(I){y=I,pr(`start attempt ${g}/${u} failed`,I),g<u&&await new Promise(Se=>setTimeout(Se,c))}U(),P(!1);let _=y instanceof Error?y:new Error(String(y??"voice start failed"));throw h.current?.(_),_},[n,o,s,a,u,c,U,P]);(0,E.useImperativeHandle)(t,()=>({start:V,stop:J,unlock:()=>C.current?.unlock(),get active(){return T.current},get micStream(){return b.current},get audio(){return C.current}}),[V,J]);let d=(0,E.useRef)(!1),R=(0,E.useCallback)(async()=>{if(!T.current||d.current)return;let p=b.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(f){pr("foreground mic re-assert failed (will retry on next pass)",f)}return}d.current=!0;try{let f=await navigator.mediaDevices.getUserMedia({audio:s,video:!1}),y=f.getAudioTracks()[0];if(!y){for(let _ of f.getTracks())_.stop();throw new Error("no microphone audio track after foreground re-acquire")}U(),b.current=f,v.current?.(f),await n.stream(o).attach(y)}catch(f){let y=f instanceof Error?f:new Error(String(f));pr("foreground mic re-acquire failed",y),h.current?.(y)}finally{d.current=!1}},[n,o,s,U]);return(0,E.useEffect)(()=>{let p=()=>{R()};return typeof n.onRecovery=="function"?n.onRecovery(p):(0,xe.observePageLifecycle)(p)},[n,R]),(0,E.useEffect)(()=>U,[U]),(0,Kr.jsx)(Oe,{ref:C,session:n,stream:o,onTrack:m,onUnlockChange:x})});var fr=require("@urun-sh/core"),w=require("react"),Ie=require("react/jsx-runtime"),gr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Zr(...e){console.debug("[urun-camera]",...e)}var Yr=(0,w.forwardRef)(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:S,videoClassName:l,onActiveChange:m,onError:x,onStream:C,onTrack:b,children:T}=r,k=(0,w.useRef)(null),h=(0,w.useRef)(null),v=(0,w.useRef)(null),P=(0,w.useRef)(!1),U=(0,w.useRef)(a),[J,V]=(0,w.useState)(a),d=(0,w.useRef)(m);d.current=m;let R=(0,w.useRef)(x);R.current=x;let p=(0,w.useRef)(C);p.current=C;let f=(0,w.useRef)(b);f.current=b;let y=(0,w.useCallback)(M=>{P.current!==M&&(P.current=M,d.current?.(M))},[]),_=(0,w.useCallback)(M=>{let L=k.current;L&&(L.muted=!0,L.srcObject=M,M&&L.play()?.catch?.(Y=>Zr("preview play() failed",Y)))},[]),g=(0,w.useCallback)(()=>{v.current?.(),v.current=null;let M=h.current;if(M){for(let L of M.getTracks())L.stop();h.current=null,p.current?.(null),f.current?.(null)}_(null)},[_]),I=(0,w.useCallback)(async M=>{let L=h.current,Y=v.current,W;try{W=await navigator.mediaDevices.getUserMedia({video:{...gr,...s,facingMode:M},audio:!1})}catch(F){let te=(0,fr.sessionFailureFromMediaError)(F,n.status);throw R.current?.(te),te}let N=W.getVideoTracks()[0];if(!N){for(let te of W.getTracks())te.stop();let F=(0,fr.sessionFailureFromMediaError)(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw R.current?.(F),F}h.current=W,U.current=M,V(M),_(W),p.current?.(W);let H=()=>{h.current===W&&(Zr("camera track ended (device removed or permission revoked)"),g(),y(!1))};N.addEventListener("ended",H),v.current=()=>N.removeEventListener("ended",H);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(N)}catch(F){N.removeEventListener("ended",H);for(let gt of W.getTracks())gt.stop();h.current===W&&(h.current=L,v.current=Y,_(L),p.current?.(L));let te=F instanceof Error?F:new Error(String(F));throw R.current?.(te),te}if(L&&L!==W){Y?.();for(let F of L.getTracks())F.stop()}f.current?.(N),y(!0)},[n,o,s,c,_,g,y]),Se=(0,w.useCallback)(M=>I(M?.facingMode??U.current),[I]),Ze=(0,w.useCallback)(async M=>{P.current&&U.current===M||await I(M)},[I]),Ye=(0,w.useCallback)(()=>I(U.current==="environment"?"user":"environment"),[I]),Qe=(0,w.useCallback)(async()=>{g(),y(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,g,y]);return(0,w.useImperativeHandle)(t,()=>({start:Se,stop:Qe,flip:Ye,setFacingMode:Ze,get active(){return P.current},get facingMode(){return U.current},get stream(){return h.current},get element(){return k.current}}),[Se,Qe,Ye,Ze]),(0,w.useEffect)(()=>g,[g]),i?(0,Ie.jsxs)("div",{className:S,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":J,children:[(0,Ie.jsx)("video",{ref:k,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?J==="user":u)?{transform:"scaleX(-1)"}:{}}}),T]}):null});var qe=require("react");var Sr={level:0,speaking:!1};function Qr(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=(0,qe.useState)(Sr);return(0,qe.useEffect)(()=>{if(!e){a(Sr);return}let u=Ue();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,S;try{i=u.createMediaStreamSource(c),S=u.createAnalyser(),S.fftSize=t,i.connect(S)}catch{return}let l=new Uint8Array(S.fftSize),x=setInterval(()=>{S.getByteTimeDomainData(l);let C=0;for(let T=0;T<l.length;T++){let k=(l[T]-128)/128;C+=k*k}let b=Math.sqrt(C/l.length);a(T=>{let k=b>o;return Math.abs(T.level-b)<.005&&T.speaking===k?T:{level:b,speaking:k}})},n);return()=>{clearInterval(x),i.disconnect(),a(Sr)}},[e,t,n,o]),s}var Le=require("react");function et(e,r){let[t,n]=(0,Le.useState)(null);return(0,Le.useEffect)(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}var nt=require("react");var Fe=require("react");var rt=require("zustand/vanilla"),tt=require("zustand"),At=()=>{};function We(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=(0,rt.createStore)(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):At,c=(i=>(0,tt.useStore)(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function me(e,r){let t=(0,Fe.useMemo)(()=>We(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return(0,Fe.useEffect)(()=>t.bind(),[t]),t}function ot(e,r,t){let o=me(e,r)(t??(u=>u)),s=(0,nt.useCallback)(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}var Ve=require("react");var Q=200;function K(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function fe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Be(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function He(e,r,t={}){let n=t.cap??200,[o,s]=(0,Ve.useState)([]);return(0,Ve.useEffect)(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>K(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}var $=require("react/jsx-runtime");function st({session:e,name:r,cap:t,className:n}){let o=He(e,r,{cap:t});return(0,$.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,$.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,$.jsx)("code",{children:r}),(0,$.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,$.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,$.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,$.jsx)("code",{children:r})," messages\u2026"]}):o.map((s,a)=>(0,$.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,$.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",fe(s.payload)]},`${s.at}-${a}`))})]})}var Pe=require("react");var B=require("react/jsx-runtime");function we({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=(0,Pe.useState)(""),[a,u]=(0,Pe.useState)(null),c=(0,Pe.useCallback)(()=>{let i=Be(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return(0,B.jsxs)("div",{className:"urun-doc-patch",children:[(0,B.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),(0,B.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,B.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?(0,B.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function at({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=me(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return(0,B.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,B.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,B.jsx)("code",{children:r}),(0,B.jsx)("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),(0,B.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?(0,B.jsx)(we,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}var $e=require("react");var Z=require("react/jsx-runtime");function it(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function ut({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=(0,$e.useState)([]);return(0,$e.useEffect)(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>K(c,{at:Date.now(),direction:"in",text:it(fe(u))},t))}):void 0),[e,r,t]),(0,Z.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,Z.jsx)(we,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>K(c,{at:Date.now(),direction:"out",text:it(u)},t))}}),(0,Z.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,Z.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>(0,Z.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,Z.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,Z.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}var je=require("react");var ae=require("react/jsx-runtime");function ct({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=(0,je.useState)([]),u=r.join(","),c=t.join(",");return(0,je.useEffect)(()=>{if(a([]),!e)return;let i=(l,m)=>a(x=>K(x,{at:Date.now(),kind:l,text:m},n)),S=[];S.push(e.onPhase(l=>i("phase",`phase \u2192 ${l.name}`)));for(let l of r){let m=e.stream(l);S.push(m.on("track",x=>i("track",`${l}: ${x?"track arrived":"track ended"}`)))}for(let l of t){let m=e.doc(l);S.push(m.on("change",()=>i("doc",`${l} changed`)))}return()=>S.forEach(l=>l())},[e,u,c,n]),(0,ae.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ae.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((i,S)=>(0,ae.jsxs)("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[(0,ae.jsx)("span",{className:"urun-event-spine-kind",children:i.kind})," ",(0,ae.jsx)("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${S}`))})}var Ge=require("@urun-sh/core");var Je=require("react");function ee(e){let[r,t]=(0,Je.useState)(e?.phase??null);return(0,Je.useEffect)(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}var dt=require("@urun-sh/core");var ge=require("react"),lt=require("@urun-sh/core");function ze(e){let r=ee(e),t=(0,lt.isWakingPhase)(r?.name),n=(0,ge.useRef)(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=(0,ge.useState)(s);return(0,ge.useEffect)(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}var re=require("react/jsx-runtime");function Xe({session:e,render:r,className:t}){let n=ze(e);return!n.waking||!n.phase?null:(0,re.jsx)("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):(0,re.jsxs)(re.Fragment,{children:[(0,re.jsx)("span",{className:"urun-session-waking-label",children:(0,dt.describeSessionPhase)(n.phase)})," ",(0,re.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}var j=require("react/jsx-runtime"),Et={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function pt({session:e,className:r}){let t=ee(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:t?.runtime?.reason??null;return(0,j.jsxs)("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[(0,j.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,j.jsx)("span",{className:"urun-session-status-label",children:Et[n]}),o?(0,j.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function mt({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=ee(e);if(s?.name==="live")return(0,j.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):(0,j.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Ge.isWakingPhase)(s.name)?(0,j.jsx)(Xe,{session:e}):s&&s.name!=="idle"?(0,Ge.describeSessionPhase)(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended");return(0,j.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?(0,j.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}var Ke=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,usesWorkOSAuth});
2
+ "use strict";var cr=Object.defineProperty;var At=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Mt=Object.prototype.hasOwnProperty;var Nt=(e,r)=>{for(var t in r)cr(e,t,{get:r[t],enumerable:!0})},_t=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Et(r))!Mt.call(e,o)&&o!==t&&cr(e,o,{get:()=>r[o],enumerable:!(n=At(r,o))||n.enumerable});return e};var Dt=e=>_t(cr({},"__esModule",{value:!0}),e);var Jt={};Nt(Jt,{ComponentRenderer:()=>Hr,DEFAULT_CAMERA_CONSTRAINTS:()=>xr,DEFAULT_LOG_CAP:()=>re,DEFAULT_VOICE_CONSTRAINTS:()=>br,DocPatchForm:()=>Oe,ImageFrame:()=>Yr,ImageFrameSchema:()=>Zr,MetricsPanel:()=>et,MetricsPanelSchema:()=>Qr,ProgressCard:()=>Jr,ProgressCardSchema:()=>jr,StatusBadge:()=>Xr,StatusBadgeSchema:()=>zr,TextStream:()=>Kr,TextStreamSchema:()=>Gr,UrunAudio:()=>He,UrunAuthProvider:()=>lr,UrunCamera:()=>at,UrunControlSender:()=>St,UrunDocPanel:()=>ft,UrunErrorBoundary:()=>ce,UrunEventSpine:()=>ht,UrunJwtProvider:()=>Er,UrunProvider:()=>Nr,UrunSessionClock:()=>Ct,UrunSessionEnded:()=>Ut,UrunSessionGate:()=>bt,UrunSessionStatus:()=>yt,UrunSessionWaking:()=>sr,UrunStreamTail:()=>mt,UrunVoice:()=>ot,authMode:()=>Pe,createDocStore:()=>Ke,describeSessionPhase:()=>ur.describeSessionPhase,formatPayload:()=>ve,getUrunAudioContext:()=>Ne,isWakingPhase:()=>ur.isWakingPhase,parseJsonObject:()=>Ye,pushCapped:()=>Y,registerComponent:()=>Vr,resumeUrunAudioContext:()=>_e,urunPublicEnv:()=>G,useApp:()=>Dr,useChat:()=>Fr,useCompletion:()=>qr,useDocStore:()=>he,useImageFrame:()=>vr,useMetricsPanel:()=>kr,useProgressCard:()=>gr,useRequest:()=>Or,useSessionDoc:()=>pt,useSessionEndsAt:()=>Tr,useSessionPhase:()=>J,useSessionTrack:()=>ut,useSessionWake:()=>or,useStatusBadge:()=>Sr,useStreamMessages:()=>er,useTextStream:()=>hr,useUrunAudioLevel:()=>it,useUrunAuth:()=>We,useUrunPrewake:()=>Pt,usesWorkOSAuth:()=>wr});module.exports=Dt(Jt);var pe=require("react");var Pr=require("react"),Te=require("react/jsx-runtime"),ce=class extends Pr.Component{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||(0,Te.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,Te.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Te.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Rr=require("react"),le=(0,Rr.createContext)(null);function ne(e){return e&&e.trim()?e.trim():void 0}function G(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ne(typeof process<"u"?process.env?.[e]:void 0)}}function Pe(){let e=G("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||G("VERCEL_ENV")==="production"?"workos":G("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function wr(){return Pe()==="workos"}var de=require("react"),Mr=require("react/jsx-runtime"),Ar=(0,de.createContext)(null);function lr({getAccessToken:e,children:r}){let t=(0,de.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Mr.jsx)(Ar.Provider,{value:t,children:r})}var Er=lr;function We(){return(0,de.useContext)(Ar)}var Fe=require("react/jsx-runtime");function Nr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=(0,pe.useState)(),i=We(),f=G("NEXT_PUBLIC_SESSION_TOKEN")??G("NEXT_PUBLIC_URUN_JWT"),d=Pe(),m=d==="workos"&&!n,k=n??(d==="jwt"?f:void 0)??u,C=o??G("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),y=m&&!k,g=(0,pe.useMemo)(()=>({appId:t,baseUrl:e,orgId:r,jwt:k,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,k,r,m]);return(0,pe.useEffect)(()=>{if(!m||!i)return;let S=!1,U=i;async function h(){try{let A=await U.getAccessToken();S||c(A??void 0)}catch{S||c(void 0)}}h();let T=window.setInterval(()=>{h()},6e4);return()=>{S=!0,window.clearInterval(T)}},[i,m]),(0,Fe.jsx)(ce,{fallback:s,children:y?(0,Fe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Fe.jsx)(le.Provider,{value:g,children:a})})}var K=require("react"),_r=require("@urun-sh/core");function Ot(e,r){return`${e}:${JSON.stringify(r??{})}`}var dr=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},pr=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},mr=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new dr(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new pr(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Dr(){let e=(0,K.useContext)(le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=(0,K.useReducer)(o=>o+1,0),t=(0,K.useRef)(new Map),n=(0,K.useMemo)(()=>(0,_r.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,K.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Ot(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new mr(n[s](a),r);return t.current.set(u,i),i}}}),[n])}var L=require("react");function me(e){let r=e;if(!r||typeof r.request!="function"||typeof r.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 r}function It(e){return e instanceof Error?e:new Error(String(e))}function Or(e,r){let t=(0,L.useMemo)(()=>me(e),[e]),[n,o]=(0,L.useState)(void 0),[s,a]=(0,L.useState)(null),[u,c]=(0,L.useState)(!1),i=(0,L.useRef)(r);i.current=r;let f=(0,L.useRef)(0),d=(0,L.useRef)(null),m=(0,L.useRef)(!0);(0,L.useEffect)(()=>(m.current=!0,()=>{m.current=!1,d.current?.abort()}),[]);let k=(0,L.useCallback)(async g=>{d.current?.abort();let S=new AbortController;d.current=S;let U=++f.current,h=()=>m.current&&f.current===U;h()&&(c(!0),a(null));try{let T=await t.request(g,{...i.current,signal:S.signal});return h()&&(o(T),c(!1),i.current?.onSuccess?.(T)),T}catch(T){let A=It(T);throw h()&&(a(A),c(!1),i.current?.onError?.(A)),A}},[t]),C=(0,L.useCallback)(g=>{k(g).catch(()=>{})},[k]),y=(0,L.useCallback)(()=>{f.current++,d.current?.abort(),d.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:k,data:n,error:s,isPending:u,reset:y}}var B=require("react");function Ir(e){return e instanceof Error?e:new Error(String(e))}var qt=e=>typeof e=="string"?e:String(e);function qr(e,r){let t=(0,B.useMemo)(()=>me(e),[e]),[n,o]=(0,B.useState)(""),[s,a]=(0,B.useState)(!1),[u,c]=(0,B.useState)(null),i=(0,B.useRef)(r);i.current=r;let f=(0,B.useRef)(0),d=(0,B.useRef)(null),m=(0,B.useRef)(!0);(0,B.useEffect)(()=>(m.current=!0,()=>{m.current=!1,d.current?.cancel(),d.current=null}),[]);let k=(0,B.useCallback)(()=>{f.current++,d.current?.cancel(),d.current=null,m.current&&a(!1)},[]),C=(0,B.useCallback)(async y=>{d.current?.cancel();let g=++f.current,S=()=>m.current&&f.current===g,U=i.current,h=U?.parseChunk??qt,T=U?.buildPayload??(R=>({prompt:R}));S()&&(o(""),c(null),a(!0));let{parseChunk:A,buildPayload:V,onFinish:_,onError:l,...x}=U??{},N="",E;try{E=t.requestStream(T(y),x),d.current=E}catch(R){let W=Ir(R);S()&&(c(W),a(!1),U?.onError?.(W));return}try{for await(let R of E){if(f.current!==g)break;N+=h(R),S()&&o(N)}S()&&(a(!1),U?.onFinish?.(N))}catch(R){let W=Ir(R);S()&&(c(W),a(!1),U?.onError?.(W))}finally{d.current===E&&(d.current=null)}},[t]);return{completion:n,complete:C,stop:k,isStreaming:s,error:u}}var I=require("react");function Lr(e){return e instanceof Error?e:new Error(String(e))}var Lt=e=>typeof e=="string"?e:String(e),Wr=0;function fr(e){return Wr+=1,`${e}-${Wr}`}function Fr(e,r){let t=(0,I.useMemo)(()=>me(e),[e]),[n,o]=(0,I.useState)(()=>(r?.initialMessages??[]).map(h=>({id:h.id??fr("msg"),role:h.role,content:h.content}))),[s,a]=(0,I.useState)(""),[u,c]=(0,I.useState)(!1),[i,f]=(0,I.useState)(null),d=(0,I.useRef)(r);d.current=r;let m=(0,I.useRef)(n);m.current=n;let k=(0,I.useRef)(s);k.current=s;let C=(0,I.useRef)(0),y=(0,I.useRef)(null),g=(0,I.useRef)(!0);(0,I.useEffect)(()=>(g.current=!0,()=>{g.current=!1,y.current?.cancel(),y.current=null}),[]);let S=(0,I.useCallback)(()=>{C.current++,y.current?.cancel(),y.current=null,g.current&&c(!1)},[]),U=(0,I.useCallback)(async h=>{let T=h===void 0,A=(T?k.current:h)??"";if(!A.trim())return;y.current?.cancel();let _=++C.current,l=()=>g.current&&C.current===_,x=d.current,N=x?.parseChunk??Lt,E={id:fr("msg"),role:"user",content:A},R={id:fr("msg"),role:"assistant",content:""},W=[...m.current,E].map(v=>({role:v.role,content:v.content})),p=[...m.current,E,R];m.current=p,o(p),T&&a(""),f(null),c(!0);let P=x?.buildPayload??(v=>({messages:v})),{initialMessages:q,parseChunk:D,buildPayload:F,onFinish:j,onError:be,...qe}=x??{},Le=v=>{o(O=>O.map($=>$.id===R.id?{...$,content:v}:$))},ie="",Ce;try{Ce=t.requestStream(P(W),qe),y.current=Ce}catch(v){let O=Lr(v);l()&&(f(O),c(!1),x?.onError?.(O));return}try{for await(let v of Ce){if(C.current!==_)break;ie+=N(v),l()&&Le(ie)}l()&&(c(!1),x?.onFinish?.({...R,content:ie}))}catch(v){let O=Lr(v);l()&&(f(O),c(!1),x?.onError?.(O))}finally{y.current===Ce&&(y.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:U,stop:S,isStreaming:u,error:i}}var Br=new Map;function Vr(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Br.set(e,{component:r,schema:t})}function $r(e,r){let t=Br.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var oe=require("react/jsx-runtime");function Hr({name:e,props:r,fallback:t}){let n=$r(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,oe.jsx)(oe.Fragment,{children:t}):(0,oe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,oe.jsx)("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return(0,oe.jsx)(o,{...n.validatedProps})}var fe=require("zod"),se=require("react/jsx-runtime"),jr=fe.z.object({step:fe.z.number().min(0),total:fe.z.number().min(1),label:fe.z.string().optional(),variant:fe.z.enum(["default","success","error"]).default("default")});function gr(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function Jr(e){let{step:r,total:t,label:n,variant:o,percentage:s}=gr(e);return(0,se.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,se.jsx)("div",{className:"urun-progress-label",children:n}),(0,se.jsx)("div",{className:"urun-progress-bar",children:(0,se.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,se.jsxs)("div",{className:"urun-progress-text",children:[r,"/",t]})]})}var Be=require("zod"),Re=require("react/jsx-runtime"),zr=Be.z.object({state:Be.z.enum(["thinking","generating","idle","error"]),message:Be.z.string().optional()}),Wt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Sr(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??Wt[r]??r;return{state:r,message:o,isActive:n}}function Xr(e){let{state:r,message:t,isActive:n}=Sr(e);return(0,Re.jsxs)("span",{className:"urun-status-badge","data-state":r,children:[(0,Re.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,Re.jsx)("span",{className:"urun-status-message",children:t})]})}var we=require("react"),Ve=require("zod"),Ae=require("react/jsx-runtime"),Gr=Ve.z.object({text:Ve.z.string(),streaming:Ve.z.boolean().default(!1)});function hr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function Kr(e){let{text:r,streaming:t}=hr(e),n=(0,we.useRef)(null),o=(0,we.useRef)(0);return(0,we.useEffect)(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),(0,Ae.jsxs)("div",{className:"urun-text-stream",children:[(0,Ae.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,Ae.jsx)("span",{className:"urun-text-cursor"})]})}var Ee=require("zod"),Me=require("react/jsx-runtime"),Zr=Ee.z.object({src:Ee.z.string().url(),alt:Ee.z.string().optional(),caption:Ee.z.string().optional()});function vr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function Yr(e){let{src:r,alt:t,caption:n}=vr(e);return(0,Me.jsxs)("figure",{className:"urun-image-frame",children:[(0,Me.jsx)("img",{className:"urun-image",src:r,alt:t}),n&&(0,Me.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var Z=require("zod"),ge=require("react/jsx-runtime"),Qr=Z.z.object({metrics:Z.z.array(Z.z.object({label:Z.z.string(),value:Z.z.union([Z.z.string(),Z.z.number()]),unit:Z.z.string().optional()}))});function kr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function et(e){let{metrics:r}=kr(e);return(0,ge.jsx)("div",{className:"urun-metrics-panel",children:r.map((t,n)=>(0,ge.jsxs)("div",{className:"urun-metric-card",children:[(0,ge.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,ge.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var M=require("react"),tt=require("@urun-sh/core");var $e=null;function Ft(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ne(){if($e)return $e;let e=Ft();return e?($e=new e,$e):null}function _e(){let e=Ne();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var nt=require("react/jsx-runtime"),Bt=1e3,rt=200;function yr(...e){console.debug("[urun-audio]",...e)}var He=(0,M.forwardRef)(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:f}=r,d=(0,M.useRef)(null),m=(0,M.useRef)(null),k=(0,M.useRef)(null),C=(0,M.useRef)(null),y=(0,M.useRef)(c);y.current=c;let g=(0,M.useRef)(i);g.current=i;let S=(0,M.useCallback)(l=>{k.current!==l&&(k.current=l,g.current?.(l))},[]),U=(0,M.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let l=d.current;return l&&l.srcObject!==m.current&&(l.srcObject=m.current),m.current},[]),h=(0,M.useCallback)(l=>{let x=d.current;if(!x)return;let N=x.play();!N||typeof N.then!="function"||N.then(()=>{x.muted||S(!0)}).catch(E=>{let R=E instanceof Error?E.name:String(E);if(R==="AbortError"){yr(`play() aborted (${l}); retrying in ${rt}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,h(`${l}:retry`)},rt);return}if(R==="NotAllowedError"){yr(`play() blocked pending a user gesture (${l})`),S(!1);return}yr(`play() failed (${l})`,E)})},[S]),T=(0,M.useCallback)(l=>{let x=U();if(x){for(let N of x.getAudioTracks())N!==l&&x.removeTrack(N);l&&!x.getAudioTracks().includes(l)&&x.addTrack(l),l&&h("track-attach"),y.current?.(l)}},[U,h]),A=(0,M.useCallback)(()=>{let l=d.current;l&&(U(),l.muted=!1,h("gesture"),_e(),S(!0))},[U,h,S]);(0,M.useImperativeHandle)(t,()=>({unlock:A,get unlocked(){return k.current===!0},get element(){return d.current}}),[A]);let V=(0,M.useCallback)(l=>{d.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),U()),f?.(l)},[U,f]),_=s!==void 0;return(0,M.useEffect)(()=>{if(_){T(s??null);return}if(!n)return;let l=n.stream(o),x=()=>{let p=m.current;return p?p.getAudioTracks()[0]??null:null},N=p=>{if(p!==x()&&(T(p),p)){let P=()=>{x()===p&&T(null)};p.addEventListener("ended",P)}},E=l.track;E&&E.readyState==="live"&&N(E);let R=l.on("track",p=>{p&&p.readyState!=="live"||N(p)}),W=setInterval(()=>{let p=l.track;p&&p.readyState==="live"&&N(p)},Bt);return()=>{R(),clearInterval(W)}},[n,o,_,s,T]),(0,M.useEffect)(()=>(0,tt.observePageLifecycle)(()=>{_e(),k.current===!0&&h("foreground")}),[h]),(0,M.useEffect)(()=>()=>{C.current&&clearTimeout(C.current)},[]),(0,nt.jsx)("audio",{ref:V,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});var w=require("react"),Se=require("@urun-sh/core");var st=require("react/jsx-runtime"),br={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function je(...e){console.debug("[urun-voice]",...e)}var ot=(0,w.forwardRef)(function(r,t){let{session:n,stream:o="audio",constraints:s=br,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:f,onMicStream:d,onTrack:m,onUnlockChange:k,capture:C}=r,y=(0,w.useRef)(null),g=(0,w.useRef)(null),S=(0,w.useRef)(null),U=(0,w.useRef)([]),h=(0,w.useRef)(!1),T=(0,w.useRef)(i);T.current=i;let A=(0,w.useRef)(f);A.current=f;let V=(0,w.useRef)(d);V.current=d;let _=(0,w.useCallback)(p=>{h.current!==p&&(h.current=p,T.current?.(p))},[]),l=(0,w.useCallback)(()=>{for(let p of U.current)p();U.current=[],S.current?.release(),S.current=null,g.current&&(g.current=null,V.current?.(null))},[]),x=(0,w.useCallback)(async()=>{let p=S.current;if(p){let F=await p.update(s);return g.current=p.stream,V.current?.(p.stream),F}let q=await(C??(0,Se.sharedCaptureController)()).claim("audio",s);S.current=q,U.current=[q.onTrack((F,j)=>{g.current=j,V.current?.(j),h.current&&n.stream(o).attach(F).catch(be=>je("mic re-attach after one-capture re-acquire failed",be))}),q.onLost(F=>{S.current=null,U.current=[],g.current=null,V.current?.(null),_(!1),A.current?.(F)})],g.current=q.stream,V.current?.(q.stream);let D=q.track;if(!D)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return D},[C,s,n,o,_]),N=(0,w.useCallback)(async()=>{l(),_(!1),await n.stream(o).detach().catch(()=>{})},[n,o,l,_]),E=(0,w.useCallback)(async()=>{y.current?.unlock();let p;try{p=await x()}catch(D){l();let F=(0,Se.sessionFailureFromMediaError)(D,n.status);throw A.current?.(F),F}n.connect?.();let P;for(let D=1;D<=u;D++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(p),_(!0);return}catch(F){P=F,je(`start attempt ${D}/${u} failed`,F),D<u&&await new Promise(j=>setTimeout(j,c))}l(),_(!1);let q=P instanceof Error?P:new Error(String(P??"voice start failed"));throw A.current?.(q),q},[n,o,a,u,c,x,l,_]);(0,w.useImperativeHandle)(t,()=>({start:E,stop:N,unlock:()=>y.current?.unlock(),get active(){return h.current},get micStream(){return g.current},get audio(){return y.current}}),[E,N]);let R=(0,w.useRef)(!1),W=(0,w.useCallback)(async()=>{if(!h.current||R.current)return;let p=g.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(P){je("foreground mic re-assert failed (will retry on next pass)",P)}return}R.current=!0;try{let P=await x();await n.stream(o).attach(P)}catch(P){let q=P instanceof Error?P:new Error(String(P));je("foreground mic re-acquire failed",q),A.current?.(q)}finally{R.current=!1}},[n,o,x]);return(0,w.useEffect)(()=>{let p=()=>{W()};return typeof n.onRecovery=="function"?n.onRecovery(p):(0,Se.observePageLifecycle)(p)},[n,W]),(0,w.useEffect)(()=>l,[l]),(0,st.jsx)(He,{ref:y,session:n,stream:o,onTrack:m,onUnlockChange:k})});var Je=require("@urun-sh/core"),b=require("react"),ze=require("react/jsx-runtime"),xr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Cr(...e){console.debug("[urun-camera]",...e)}var at=(0,b.forwardRef)(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:f,videoClassName:d,onActiveChange:m,onError:k,onStream:C,onTrack:y,children:g,capture:S}=r,U=(0,b.useRef)(null),h=(0,b.useRef)(null),T=(0,b.useRef)(null),A=(0,b.useRef)([]),V=(0,b.useRef)(null),_=(0,b.useRef)(!1),l=(0,b.useRef)(a),[x,N]=(0,b.useState)(a),E=(0,b.useRef)(m);E.current=m;let R=(0,b.useRef)(k);R.current=k;let W=(0,b.useRef)(C);W.current=C;let p=(0,b.useRef)(y);p.current=y;let P=(0,b.useCallback)(v=>{_.current!==v&&(_.current=v,E.current?.(v))},[]),q=(0,b.useCallback)(v=>{let O=U.current;O&&(O.muted=!0,O.srcObject=v,v&&O.play()?.catch?.($=>Cr("preview play() failed",$)))},[]),D=(0,b.useCallback)(()=>{V.current?.(),V.current=null;for(let v of A.current)v();A.current=[],T.current?.release(),T.current=null,h.current&&(h.current=null,W.current?.(null),p.current?.(null)),q(null)},[q]),F=(0,b.useCallback)((v,O)=>{V.current?.(),h.current=O,q(O),W.current?.(O);let $=()=>{h.current===O&&(Cr("camera track ended (device removed or permission revoked)"),D(),P(!1))};v.addEventListener("ended",$),V.current=()=>v.removeEventListener("ended",$)},[q,D,P]),j=(0,b.useCallback)(async v=>{let O={...xr,...s,facingMode:v},$;try{let ee=T.current;if(ee)$=await ee.update(O);else{let xe=await(S??(0,Je.sharedCaptureController)()).claim("video",O);if(T.current=xe,A.current=[xe.onTrack((Ue,Rt)=>{F(Ue,Rt),_.current&&n.stream(o).attachVideo(Ue).then(()=>p.current?.(Ue)).catch(wt=>Cr("camera re-publish after one-capture re-acquire failed",wt))}),xe.onLost(Ue=>{T.current=null,A.current=[],D(),P(!1),R.current?.(Ue)})],!xe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=xe.track}}catch(ee){let ue=(0,Je.sessionFailureFromMediaError)(ee,n.status);throw R.current?.(ue),ue}l.current=v,N(v),F($,T.current?.stream??new MediaStream([$]));try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo($)}catch(ee){D(),P(!1);let ue=ee instanceof Error?ee:new Error(String(ee));throw R.current?.(ue),ue}p.current?.($),P(!0)},[n,o,s,c,S,F,D,P]),be=(0,b.useCallback)(v=>j(v?.facingMode??l.current),[j]),qe=(0,b.useCallback)(async v=>{_.current&&l.current===v||await j(v)},[j]),Le=(0,b.useCallback)(()=>j(l.current==="environment"?"user":"environment"),[j]),ie=(0,b.useCallback)(async()=>{D(),P(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,D,P]);return(0,b.useImperativeHandle)(t,()=>({start:be,stop:ie,flip:Le,setFacingMode:qe,get active(){return _.current},get facingMode(){return l.current},get stream(){return h.current},get element(){return U.current}}),[be,ie,Le,qe]),(0,b.useEffect)(()=>D,[D]),i?(0,ze.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":x,children:[(0,ze.jsx)("video",{ref:U,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?x==="user":u)?{transform:"scaleX(-1)"}:{}}}),g]}):null});var Xe=require("react");var Ur={level:0,speaking:!1};function it(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=(0,Xe.useState)(Ur);return(0,Xe.useEffect)(()=>{if(!e){a(Ur);return}let u=Ne();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,f;try{i=u.createMediaStreamSource(c),f=u.createAnalyser(),f.fftSize=t,i.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),k=setInterval(()=>{f.getByteTimeDomainData(d);let C=0;for(let g=0;g<d.length;g++){let S=(d[g]-128)/128;C+=S*S}let y=Math.sqrt(C/d.length);a(g=>{let S=y>o;return Math.abs(g.level-y)<.005&&g.speaking===S?g:{level:y,speaking:S}})},n);return()=>{clearInterval(k),i.disconnect(),a(Ur)}},[e,t,n,o]),s}var Ge=require("react");function ut(e,r){let[t,n]=(0,Ge.useState)(null);return(0,Ge.useEffect)(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}var dt=require("react");var Ze=require("react");var ct=require("zustand/vanilla"),lt=require("zustand"),Vt=()=>{};function Ke(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=(0,ct.createStore)(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):Vt,c=(i=>(0,lt.useStore)(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function he(e,r){let t=(0,Ze.useMemo)(()=>Ke(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return(0,Ze.useEffect)(()=>t.bind(),[t]),t}function pt(e,r,t){let o=he(e,r)(t??(u=>u)),s=(0,dt.useCallback)(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}var Qe=require("react");var re=200;function Y(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function ve(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ye(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function er(e,r,t={}){let n=t.cap??200,[o,s]=(0,Qe.useState)([]);return(0,Qe.useEffect)(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>Y(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}var z=require("react/jsx-runtime");function mt({session:e,name:r,cap:t,className:n}){let o=er(e,r,{cap:t});return(0,z.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,z.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,z.jsx)("code",{children:r}),(0,z.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,z.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,z.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,z.jsx)("code",{children:r})," messages\u2026"]}):o.map((s,a)=>(0,z.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,z.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ve(s.payload)]},`${s.at}-${a}`))})]})}var De=require("react");var H=require("react/jsx-runtime");function Oe({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=(0,De.useState)(""),[a,u]=(0,De.useState)(null),c=(0,De.useCallback)(()=>{let i=Ye(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return(0,H.jsxs)("div",{className:"urun-doc-patch",children:[(0,H.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),(0,H.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,H.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?(0,H.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function ft({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=he(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return(0,H.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,H.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,H.jsx)("code",{children:r}),(0,H.jsx)("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),(0,H.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?(0,H.jsx)(Oe,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}var rr=require("react");var Q=require("react/jsx-runtime");function gt(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function St({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=(0,rr.useState)([]);return(0,rr.useEffect)(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>Y(c,{at:Date.now(),direction:"in",text:gt(ve(u))},t))}):void 0),[e,r,t]),(0,Q.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,Q.jsx)(Oe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>Y(c,{at:Date.now(),direction:"out",text:gt(u)},t))}}),(0,Q.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,Q.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>(0,Q.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,Q.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,Q.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}var tr=require("react");var ae=require("react/jsx-runtime");function ht({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=(0,tr.useState)([]),u=r.join(","),c=t.join(",");return(0,tr.useEffect)(()=>{if(a([]),!e)return;let i=(d,m)=>a(k=>Y(k,{at:Date.now(),kind:d,text:m},n)),f=[];f.push(e.onPhase(d=>i("phase",`phase \u2192 ${d.name}`)));for(let d of r){let m=e.stream(d);f.push(m.on("track",k=>i("track",`${d}: ${k?"track arrived":"track ended"}`)))}for(let d of t){let m=e.doc(d);f.push(m.on("change",()=>i("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,u,c,n]),(0,ae.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ae.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((i,f)=>(0,ae.jsxs)("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[(0,ae.jsx)("span",{className:"urun-event-spine-kind",children:i.kind})," ",(0,ae.jsx)("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${f}`))})}var ar=require("@urun-sh/core");var nr=require("react");function J(e){let[r,t]=(0,nr.useState)(e?.phase??null);return(0,nr.useEffect)(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}var kt=require("@urun-sh/core");var ke=require("react"),vt=require("@urun-sh/core");function or(e){let r=J(e),t=(0,vt.isWakingPhase)(r?.name),n=(0,ke.useRef)(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=(0,ke.useState)(s);return(0,ke.useEffect)(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}var te=require("react/jsx-runtime");function sr({session:e,render:r,className:t}){let n=or(e);return!n.waking||!n.phase?null:(0,te.jsx)("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):(0,te.jsxs)(te.Fragment,{children:[(0,te.jsx)("span",{className:"urun-session-waking-label",children:(0,kt.describeSessionPhase)(n.phase)})," ",(0,te.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}var X=require("react/jsx-runtime"),$t={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function yt({session:e,className:r}){let t=J(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return(0,X.jsxs)("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[(0,X.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,X.jsx)("span",{className:"urun-session-status-label",children:$t[n]}),o?(0,X.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function bt({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=J(e);if(s?.name==="live")return(0,X.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):(0,X.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,ar.isWakingPhase)(s.name)?(0,X.jsx)(sr,{session:e}):s&&s.name!=="idle"?(0,ar.describeSessionPhase)(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,X.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?(0,X.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}var ir=require("react");var xt=require("react/jsx-runtime");function Tr(e){return J(e)?.endsAt??null}function Ht(e){let r=Math.max(0,Math.floor(e/1e3)),t=Math.floor(r/60),n=r%60;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}`}function Ct({session:e,urgentMs:r=6e4,className:t}){let o=Tr(e)?.getTime()??null,[s,a]=(0,ir.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,ir.useEffect)(()=>{if(o===null){a(null);return}let c=()=>a(Math.max(0,o-Date.now()));c();let i=setInterval(c,1e3);return()=>clearInterval(i)},[o]),s===null)return null;let u=Ht(s);return(0,xt.jsx)("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${u}`,"data-urgent":s<r?"":void 0,"data-expired":s<=0?"":void 0,children:u})}var Ie=require("react/jsx-runtime"),jt=new Set(["expired","ended","error"]);function Ut({session:e,onNewSession:r,children:t,className:n}){let o=J(e);if(!o||!jt.has(o.name))return null;let s=t?t(o):(0,Ie.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Ie.jsxs)("div",{className:["urun-session-ended",n].filter(Boolean).join(" "),"data-phase":o.name,children:[s,r?(0,Ie.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:r,children:"New session"}):null]})}var ye=require("react"),Tt=require("@urun-sh/core");function Pt(e){let r=(0,ye.useContext)(le),[t,n]=(0,ye.useState)(null),o=e.app??r?.appId,s=e.function,a=e.intervalS??60,u=r?.baseUrl,c=r?.orgId,i=r?.jwt,f=r?.getAccessToken,d=r?.authProvider;return(0,ye.useEffect)(()=>{if(!u||!c||!o||!s)return;let m=!1,k=()=>{(0,Tt.prewake)({baseUrl:u,app:o,functionName:s,orgId:c,jwt:i,getAccessToken:f,authProvider:d}).then(y=>{m||n(y)}).catch(()=>{})};k();let C=setInterval(k,Math.max(1,a)*1e3);return()=>{m=!0,clearInterval(C)}},[o,s,a,u,c,i,f,d]),t}var ur=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,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 Er,b as Ar,c as xe}from"./chunk-WF2OBDSX.mjs";import{useEffect as Or,useMemo as Ir,useState as qr}from"react";import{Component as _r}from"react";import{jsx as Ge,jsxs as Mr}from"react/jsx-runtime";var te=class extends _r{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||Mr("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:[Ge("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Ge("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Nr}from"react";var ce=Nr(null);function j(e){return e&&e.trim()?e.trim():void 0}function F(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return j(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return j(typeof process<"u"?process.env?.[e]:void 0)}}function le(){let e=F("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||F("VERCEL_ENV")==="production"?"workos":F("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Dr(){return le()==="workos"}import{jsx as Pe}from"react/jsx-runtime";function Lr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=qr(),i=xe(),S=F("NEXT_PUBLIC_SESSION_TOKEN")??F("NEXT_PUBLIC_URUN_JWT"),l=le(),m=l==="workos"&&!n,x=n??(l==="jwt"?S:void 0)??u,C=o??F("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),b=m&&!x,T=Ir(()=>({appId:t,baseUrl:e,orgId:r,jwt:x,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,x,r,m]);return Or(()=>{if(!m||!i)return;let k=!1,h=i;async function v(){try{let R=await h.getAccessToken();k||c(R??void 0)}catch{k||c(void 0)}}v();let P=window.setInterval(()=>{v()},6e4);return()=>{k=!0,window.clearInterval(P)}},[i,m]),Pe(te,{fallback:s,children:b?Pe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Pe(ce.Provider,{value:T,children:a})})}import{useContext as Wr,useMemo as Ke,useReducer as Fr,useRef as Br}from"react";import{App as Vr}from"@urun-sh/core";function Hr(e,r){return`${e}:${JSON.stringify(r??{})}`}var we=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},Ee=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},Ae=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new we(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new Ee(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function $r(){let e=Wr(ce);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=Fr(o=>o+1,0),t=Br(new Map),n=Ke(()=>Vr(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return Ke(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Hr(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new Ae(n[s](a),r);return t.current.set(u,i),i}}}),[n])}import{useCallback as _e,useEffect as jr,useMemo as Jr,useRef as de,useState as Me}from"react";function Z(e){let r=e;if(!r||typeof r.request!="function"||typeof r.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 r}function zr(e){return e instanceof Error?e:new Error(String(e))}function Xr(e,r){let t=Jr(()=>Z(e),[e]),[n,o]=Me(void 0),[s,a]=Me(null),[u,c]=Me(!1),i=de(r);i.current=r;let S=de(0),l=de(null),m=de(!0);jr(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let x=_e(async T=>{l.current?.abort();let k=new AbortController;l.current=k;let h=++S.current,v=()=>m.current&&S.current===h;v()&&(c(!0),a(null));try{let P=await t.request(T,{...i.current,signal:k.signal});return v()&&(o(P),c(!1),i.current?.onSuccess?.(P)),P}catch(P){let R=zr(P);throw v()&&(a(R),c(!1),i.current?.onError?.(R)),R}},[t]),C=_e(T=>{x(T).catch(()=>{})},[x]),b=_e(()=>{S.current++,l.current?.abort(),l.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:x,data:n,error:s,isPending:u,reset:b}}import{useCallback as Ze,useEffect as Gr,useMemo as Kr,useRef as pe,useState as Ne}from"react";function Ye(e){return e instanceof Error?e:new Error(String(e))}var Zr=e=>typeof e=="string"?e:String(e);function Yr(e,r){let t=Kr(()=>Z(e),[e]),[n,o]=Ne(""),[s,a]=Ne(!1),[u,c]=Ne(null),i=pe(r);i.current=r;let S=pe(0),l=pe(null),m=pe(!0);Gr(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let x=Ze(()=>{S.current++,l.current?.cancel(),l.current=null,m.current&&a(!1)},[]),C=Ze(async b=>{l.current?.cancel();let T=++S.current,k=()=>m.current&&S.current===T,h=i.current,v=h?.parseChunk??Zr,P=h?.buildPayload??(y=>({prompt:y}));k()&&(o(""),c(null),a(!0));let{parseChunk:R,buildPayload:q,onFinish:O,onError:d,...U}=h??{},p="",f;try{f=t.requestStream(P(b),U),l.current=f}catch(y){let w=Ye(y);k()&&(c(w),a(!1),h?.onError?.(w));return}try{for await(let y of f){if(S.current!==T)break;p+=v(y),k()&&o(p)}k()&&(a(!1),h?.onFinish?.(p))}catch(y){let w=Ye(y);k()&&(c(w),a(!1),h?.onError?.(w))}finally{l.current===f&&(l.current=null)}},[t]);return{completion:n,complete:C,stop:x,isStreaming:s,error:u}}import{useCallback as Qe,useEffect as Qr,useMemo as et,useRef as Y,useState as me}from"react";function er(e){return e instanceof Error?e:new Error(String(e))}var rt=e=>typeof e=="string"?e:String(e),rr=0;function De(e){return rr+=1,`${e}-${rr}`}function tt(e,r){let t=et(()=>Z(e),[e]),[n,o]=me(()=>(r?.initialMessages??[]).map(v=>({id:v.id??De("msg"),role:v.role,content:v.content}))),[s,a]=me(""),[u,c]=me(!1),[i,S]=me(null),l=Y(r);l.current=r;let m=Y(n);m.current=n;let x=Y(s);x.current=s;let C=Y(0),b=Y(null),T=Y(!0);Qr(()=>(T.current=!0,()=>{T.current=!1,b.current?.cancel(),b.current=null}),[]);let k=Qe(()=>{C.current++,b.current?.cancel(),b.current=null,T.current&&c(!1)},[]),h=Qe(async v=>{let P=v===void 0,R=(P?x.current:v)??"";if(!R.trim())return;b.current?.cancel();let O=++C.current,d=()=>T.current&&C.current===O,U=l.current,p=U?.parseChunk??rt,f={id:De("msg"),role:"user",content:R},y={id:De("msg"),role:"assistant",content:""},w=[...m.current,f].map(A=>({role:A.role,content:A.content})),g=[...m.current,f,y];m.current=g,o(g),P&&a(""),S(null),c(!0);let _=U?.buildPayload??(A=>({messages:A})),{initialMessages:re,parseChunk:Ce,buildPayload:Re,onFinish:Ue,onError:Pr,...E}=U??{},M=A=>{o(I=>I.map(D=>D.id===y.id?{...D,content:A}:D))},W="",N;try{N=t.requestStream(_(w),E),b.current=N}catch(A){let I=er(A);d()&&(S(I),c(!1),U?.onError?.(I));return}try{for await(let A of N){if(C.current!==O)break;W+=p(A),d()&&M(W)}d()&&(c(!1),U?.onFinish?.({...y,content:W}))}catch(A){let I=er(A);d()&&(S(I),c(!1),U?.onError?.(I))}finally{b.current===N&&(b.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:h,stop:k,isStreaming:u,error:i}}var tr=new Map;function nt(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tr.set(e,{component:r,schema:t})}function nr(e,r){let t=tr.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}import{Fragment as st,jsx as fe}from"react/jsx-runtime";function ot({name:e,props:r,fallback:t}){let n=nr(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?fe(st,{children:t}):fe("div",{className:"urun-component-error",role:"alert",children:fe("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return fe(o,{...n.validatedProps})}import{z as ne}from"zod";import{jsx as Oe,jsxs as or}from"react/jsx-runtime";var at=ne.object({step:ne.number().min(0),total:ne.number().min(1),label:ne.string().optional(),variant:ne.enum(["default","success","error"]).default("default")});function sr(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function it(e){let{step:r,total:t,label:n,variant:o,percentage:s}=sr(e);return or("div",{className:"urun-progress-card","data-variant":o,children:[n&&Oe("div",{className:"urun-progress-label",children:n}),Oe("div",{className:"urun-progress-bar",children:Oe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),or("div",{className:"urun-progress-text",children:[r,"/",t]})]})}import{z as Ie}from"zod";import{jsx as ar,jsxs as dt}from"react/jsx-runtime";var ut=Ie.object({state:Ie.enum(["thinking","generating","idle","error"]),message:Ie.string().optional()}),ct={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ir(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??ct[r]??r;return{state:r,message:o,isActive:n}}function lt(e){let{state:r,message:t,isActive:n}=ir(e);return dt("span",{className:"urun-status-badge","data-state":r,children:[ar("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),ar("span",{className:"urun-status-message",children:t})]})}import{useRef as ur,useEffect as pt}from"react";import{z as qe}from"zod";import{jsx as cr,jsxs as gt}from"react/jsx-runtime";var mt=qe.object({text:qe.string(),streaming:qe.boolean().default(!1)});function lr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function ft(e){let{text:r,streaming:t}=lr(e),n=ur(null),o=ur(0);return pt(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),gt("div",{className:"urun-text-stream",children:[cr("span",{ref:n,className:"urun-text-content"}),t&&cr("span",{className:"urun-text-cursor"})]})}import{z as ge}from"zod";import{jsx as dr,jsxs as vt}from"react/jsx-runtime";var St=ge.object({src:ge.string().url(),alt:ge.string().optional(),caption:ge.string().optional()});function pr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function ht(e){let{src:r,alt:t,caption:n}=pr(e);return vt("figure",{className:"urun-image-frame",children:[dr("img",{className:"urun-image",src:r,alt:t}),n&&dr("figcaption",{className:"urun-image-caption",children:n})]})}import{z as B}from"zod";import{jsx as Le,jsxs as bt}from"react/jsx-runtime";var kt=B.object({metrics:B.array(B.object({label:B.string(),value:B.union([B.string(),B.number()]),unit:B.string().optional()}))});function mr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function yt(e){let{metrics:r}=mr(e);return Le("div",{className:"urun-metrics-panel",children:r.map((t,n)=>bt("div",{className:"urun-metric-card",children:[Le("div",{className:"urun-metric-label",children:t.label}),Le("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as Ct,useCallback as Q,useEffect as We,useImperativeHandle as Rt,useRef as ee}from"react";import{observePageLifecycle as Ut}from"@urun-sh/core";var Se=null;function Tt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function he(){if(Se)return Se;let e=Tt();return e?(Se=new e,Se):null}function ve(){let e=he();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Pt}from"react/jsx-runtime";var xt=1e3,fr=200;function Fe(...e){console.debug("[urun-audio]",...e)}var Be=Ct(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:S}=r,l=ee(null),m=ee(null),x=ee(null),C=ee(null),b=ee(c);b.current=c;let T=ee(i);T.current=i;let k=Q(d=>{x.current!==d&&(x.current=d,T.current?.(d))},[]),h=Q(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=l.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),v=Q(d=>{let U=l.current;if(!U)return;let p=U.play();!p||typeof p.then!="function"||p.then(()=>{U.muted||k(!0)}).catch(f=>{let y=f instanceof Error?f.name:String(f);if(y==="AbortError"){Fe(`play() aborted (${d}); retrying in ${fr}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${d}:retry`)},fr);return}if(y==="NotAllowedError"){Fe(`play() blocked pending a user gesture (${d})`),k(!1);return}Fe(`play() failed (${d})`,f)})},[k]),P=Q(d=>{let U=h();if(U){for(let p of U.getAudioTracks())p!==d&&U.removeTrack(p);d&&!U.getAudioTracks().includes(d)&&U.addTrack(d),d&&v("track-attach"),b.current?.(d)}},[h,v]),R=Q(()=>{let d=l.current;d&&(h(),d.muted=!1,v("gesture"),ve(),k(!0))},[h,v,k]);Rt(t,()=>({unlock:R,get unlocked(){return x.current===!0},get element(){return l.current}}),[R]);let q=Q(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),h()),S?.(d)},[h,S]),O=s!==void 0;return We(()=>{if(O){P(s??null);return}if(!n)return;let d=n.stream(o),U=()=>{let g=m.current;return g?g.getAudioTracks()[0]??null:null},p=g=>{if(g!==U()&&(P(g),g)){let _=()=>{U()===g&&P(null)};g.addEventListener("ended",_)}},f=d.track;f&&f.readyState==="live"&&p(f);let y=d.on("track",g=>{g&&g.readyState!=="live"||p(g)}),w=setInterval(()=>{let g=d.track;g&&g.readyState==="live"&&p(g)},xt);return()=>{y(),clearInterval(w)}},[n,o,O,s,P]),We(()=>Ut(()=>{ve(),x.current===!0&&v("foreground")}),[v]),We(()=>()=>{C.current&&clearTimeout(C.current)},[]),Pt("audio",{ref:q,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});import{forwardRef as wt,useCallback as oe,useEffect as gr,useImperativeHandle as Et,useRef as J}from"react";import{observePageLifecycle as At,sessionFailureFromMediaError as Sr}from"@urun-sh/core";import{jsx as Mt}from"react/jsx-runtime";var hr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ve(...e){console.debug("[urun-voice]",...e)}var _t=wt(function(r,t){let{session:n,stream:o="audio",constraints:s=hr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:S,onMicStream:l,onTrack:m,onUnlockChange:x}=r,C=J(null),b=J(null),T=J(!1),k=J(i);k.current=i;let h=J(S);h.current=S;let v=J(l);v.current=l;let P=oe(p=>{T.current!==p&&(T.current=p,k.current?.(p))},[]),R=oe(()=>{let p=b.current;if(p){for(let f of p.getTracks())f.stop();b.current=null,v.current?.(null)}},[]),q=oe(async()=>{R(),P(!1),await n.stream(o).detach().catch(()=>{})},[n,o,R,P]),O=oe(async()=>{C.current?.unlock();let p;try{p=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(g){let _=Sr(g,n.status);throw h.current?.(_),_}R(),b.current=p,v.current?.(p);let f=p.getAudioTracks()[0];if(!f){R();let g=Sr(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw h.current?.(g),g}n.connect?.();let y;for(let g=1;g<=u;g++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(f),P(!0);return}catch(_){y=_,Ve(`start attempt ${g}/${u} failed`,_),g<u&&await new Promise(re=>setTimeout(re,c))}R(),P(!1);let w=y instanceof Error?y:new Error(String(y??"voice start failed"));throw h.current?.(w),w},[n,o,s,a,u,c,R,P]);Et(t,()=>({start:O,stop:q,unlock:()=>C.current?.unlock(),get active(){return T.current},get micStream(){return b.current},get audio(){return C.current}}),[O,q]);let d=J(!1),U=oe(async()=>{if(!T.current||d.current)return;let p=b.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(f){Ve("foreground mic re-assert failed (will retry on next pass)",f)}return}d.current=!0;try{let f=await navigator.mediaDevices.getUserMedia({audio:s,video:!1}),y=f.getAudioTracks()[0];if(!y){for(let w of f.getTracks())w.stop();throw new Error("no microphone audio track after foreground re-acquire")}R(),b.current=f,v.current?.(f),await n.stream(o).attach(y)}catch(f){let y=f instanceof Error?f:new Error(String(f));Ve("foreground mic re-acquire failed",y),h.current?.(y)}finally{d.current=!1}},[n,o,s,R]);return gr(()=>{let p=()=>{U()};return typeof n.onRecovery=="function"?n.onRecovery(p):At(p)},[n,U]),gr(()=>R,[R]),Mt(Be,{ref:C,session:n,stream:o,onTrack:m,onUnlockChange:x})});import{sessionFailureFromMediaError as vr}from"@urun-sh/core";import{forwardRef as Nt,useCallback as V,useEffect as Dt,useImperativeHandle as Ot,useRef as L,useState as It}from"react";import{jsx as Lt,jsxs as Wt}from"react/jsx-runtime";var yr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[urun-camera]",...e)}var qt=Nt(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:S,videoClassName:l,onActiveChange:m,onError:x,onStream:C,onTrack:b,children:T}=r,k=L(null),h=L(null),v=L(null),P=L(!1),R=L(a),[q,O]=It(a),d=L(m);d.current=m;let U=L(x);U.current=x;let p=L(C);p.current=C;let f=L(b);f.current=b;let y=V(E=>{P.current!==E&&(P.current=E,d.current?.(E))},[]),w=V(E=>{let M=k.current;M&&(M.muted=!0,M.srcObject=E,E&&M.play()?.catch?.(W=>kr("preview play() failed",W)))},[]),g=V(()=>{v.current?.(),v.current=null;let E=h.current;if(E){for(let M of E.getTracks())M.stop();h.current=null,p.current?.(null),f.current?.(null)}w(null)},[w]),_=V(async E=>{let M=h.current,W=v.current,N;try{N=await navigator.mediaDevices.getUserMedia({video:{...yr,...s,facingMode:E},audio:!1})}catch(D){let $=vr(D,n.status);throw U.current?.($),$}let A=N.getVideoTracks()[0];if(!A){for(let $ of N.getTracks())$.stop();let D=vr(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw U.current?.(D),D}h.current=N,R.current=E,O(E),w(N),p.current?.(N);let I=()=>{h.current===N&&(kr("camera track ended (device removed or permission revoked)"),g(),y(!1))};A.addEventListener("ended",I),v.current=()=>A.removeEventListener("ended",I);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(A)}catch(D){A.removeEventListener("ended",I);for(let wr of N.getTracks())wr.stop();h.current===N&&(h.current=M,v.current=W,w(M),p.current?.(M));let $=D instanceof Error?D:new Error(String(D));throw U.current?.($),$}if(M&&M!==N){W?.();for(let D of M.getTracks())D.stop()}f.current?.(A),y(!0)},[n,o,s,c,w,g,y]),re=V(E=>_(E?.facingMode??R.current),[_]),Ce=V(async E=>{P.current&&R.current===E||await _(E)},[_]),Re=V(()=>_(R.current==="environment"?"user":"environment"),[_]),Ue=V(async()=>{g(),y(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,g,y]);return Ot(t,()=>({start:re,stop:Ue,flip:Re,setFacingMode:Ce,get active(){return P.current},get facingMode(){return R.current},get stream(){return h.current},get element(){return k.current}}),[re,Ue,Re,Ce]),Dt(()=>g,[g]),i?Wt("div",{className:S,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[Lt("video",{ref:k,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?q==="user":u)?{transform:"scaleX(-1)"}:{}}}),T]}):null});import{useEffect as Ft,useState as Bt}from"react";var He={level:0,speaking:!1};function Vt(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=Bt(He);return Ft(()=>{if(!e){a(He);return}let u=he();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,S;try{i=u.createMediaStreamSource(c),S=u.createAnalyser(),S.fftSize=t,i.connect(S)}catch{return}let l=new Uint8Array(S.fftSize),x=setInterval(()=>{S.getByteTimeDomainData(l);let C=0;for(let T=0;T<l.length;T++){let k=(l[T]-128)/128;C+=k*k}let b=Math.sqrt(C/l.length);a(T=>{let k=b>o;return Math.abs(T.level-b)<.005&&T.speaking===k?T:{level:b,speaking:k}})},n);return()=>{clearInterval(x),i.disconnect(),a(He)}},[e,t,n,o]),s}import{useEffect as Ht,useState as $t}from"react";function jt(e,r){let[t,n]=$t(null);return Ht(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}import{useCallback as Zt}from"react";import{useEffect as Gt,useMemo as Kt}from"react";import{createStore as Jt}from"zustand/vanilla";import{useStore as zt}from"zustand";var Xt=()=>{};function $e(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=Jt(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):Xt,c=(i=>zt(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function se(e,r){let t=Kt(()=>$e(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return Gt(()=>t.bind(),[t]),t}function Yt(e,r,t){let o=se(e,r)(t??(u=>u)),s=Zt(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}import{useEffect as Qt,useState as en}from"react";var z=200;function H(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function ae(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function je(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function Je(e,r,t={}){let n=t.cap??200,[o,s]=en([]);return Qt(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>H(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}import{jsx as ke,jsxs as ie}from"react/jsx-runtime";function rn({session:e,name:r,cap:t,className:n}){let o=Je(e,r,{cap:t});return ie("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[ie("div",{className:"urun-stream-tail-meta",children:[ke("code",{children:r}),ie("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),ke("div",{className:"urun-stream-tail-log",children:o.length===0?ie("span",{className:"urun-stream-tail-empty",children:["Waiting for ",ke("code",{children:r})," messages\u2026"]}):o.map((s,a)=>ie("div",{className:"urun-stream-tail-line",children:[ke("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ae(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as tn,useState as br}from"react";import{jsx as X,jsxs as ye}from"react/jsx-runtime";function be({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=br(""),[a,u]=br(null),c=tn(()=>{let i=je(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return ye("div",{className:"urun-doc-patch",children:[X("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),ye("div",{className:"urun-doc-patch-actions",children:[X("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?X("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function nn({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=se(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return ye("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[ye("div",{className:"urun-doc-panel-meta",children:[X("code",{children:r}),X("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),X("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?X(be,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}import{useEffect as on,useState as sn}from"react";import{jsx as ue,jsxs as Cr}from"react/jsx-runtime";function Tr(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function an({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=sn([]);return on(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>H(c,{at:Date.now(),direction:"in",text:Tr(ae(u))},t))}):void 0),[e,r,t]),Cr("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[ue(be,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>H(c,{at:Date.now(),direction:"out",text:Tr(u)},t))}}),ue("div",{className:"urun-control-sender-log",children:o.length===0?ue("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>Cr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[ue("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",ue("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}import{useEffect as un,useState as cn}from"react";import{jsx as Te,jsxs as dn}from"react/jsx-runtime";function ln({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=cn([]),u=r.join(","),c=t.join(",");return un(()=>{if(a([]),!e)return;let i=(l,m)=>a(x=>H(x,{at:Date.now(),kind:l,text:m},n)),S=[];S.push(e.onPhase(l=>i("phase",`phase \u2192 ${l.name}`)));for(let l of r){let m=e.stream(l);S.push(m.on("track",x=>i("track",`${l}: ${x?"track arrived":"track ended"}`)))}for(let l of t){let m=e.doc(l);S.push(m.on("change",()=>i("doc",`${l} changed`)))}return()=>S.forEach(l=>l())},[e,u,c,n]),Te("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Te("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((i,S)=>dn("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[Te("span",{className:"urun-event-spine-kind",children:i.kind})," ",Te("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${S}`))})}import{describeSessionPhase as yn,isWakingPhase as bn}from"@urun-sh/core";import{useEffect as pn,useState as mn}from"react";function G(e){let[r,t]=mn(e?.phase??null);return pn(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}import{describeSessionPhase as vn}from"@urun-sh/core";import{useEffect as fn,useRef as gn,useState as Sn}from"react";import{isWakingPhase as hn}from"@urun-sh/core";function ze(e){let r=G(e),t=hn(r?.name),n=gn(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=Sn(s);return fn(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}import{Fragment as kn,jsx as Rr,jsxs as Ur}from"react/jsx-runtime";function Xe({session:e,render:r,className:t}){let n=ze(e);return!n.waking||!n.phase?null:Rr("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):Ur(kn,{children:[Rr("span",{className:"urun-session-waking-label",children:vn(n.phase)})," ",Ur("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}import{jsx as K,jsxs as xr}from"react/jsx-runtime";var Tn={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function Cn({session:e,className:r}){let t=G(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:t?.runtime?.reason??null;return xr("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[K("span",{className:"urun-session-status-dot","data-phase":n}),K("span",{className:"urun-session-status-label",children:Tn[n]}),o?K("span",{className:"urun-session-status-detail",children:o}):null]})}function Rn({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=G(e);if(s?.name==="live")return K("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):K("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&bn(s.name)?K(Xe,{session:e}):s&&s.name!=="idle"?yn(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended");return xr("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?K("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}import{describeSessionPhase as ma,isWakingPhase as fa}from"@urun-sh/core";export{ot as ComponentRenderer,yr as DEFAULT_CAMERA_CONSTRAINTS,z as DEFAULT_LOG_CAP,hr as DEFAULT_VOICE_CONSTRAINTS,be as DocPatchForm,ht as ImageFrame,St as ImageFrameSchema,yt as MetricsPanel,kt as MetricsPanelSchema,it as ProgressCard,at as ProgressCardSchema,lt as StatusBadge,ut as StatusBadgeSchema,ft as TextStream,mt as TextStreamSchema,Be as UrunAudio,Er as UrunAuthProvider,qt as UrunCamera,an as UrunControlSender,nn as UrunDocPanel,te as UrunErrorBoundary,ln as UrunEventSpine,Ar as UrunJwtProvider,Lr as UrunProvider,Rn as UrunSessionGate,Cn as UrunSessionStatus,Xe as UrunSessionWaking,rn as UrunStreamTail,_t as UrunVoice,le as authMode,$e as createDocStore,ma as describeSessionPhase,ae as formatPayload,he as getUrunAudioContext,fa as isWakingPhase,je as parseJsonObject,H as pushCapped,nt as registerComponent,ve as resumeUrunAudioContext,F as urunPublicEnv,$r as useApp,tt as useChat,Yr as useCompletion,se as useDocStore,pr as useImageFrame,mr as useMetricsPanel,sr as useProgressCard,Xr as useRequest,Yt as useSessionDoc,G as useSessionPhase,jt as useSessionTrack,ze as useSessionWake,ir as useStatusBadge,Je as useStreamMessages,lr as useTextStream,Vt as useUrunAudioLevel,xe as useUrunAuth,Dr as usesWorkOSAuth};
2
+ import{a as Nr,b as Dr,c as Me}from"./chunk-WF2OBDSX.mjs";import{useEffect as Wr,useMemo as Fr,useState as Br}from"react";import{Component as Or}from"react";import{jsx as er,jsxs as Ir}from"react/jsx-runtime";var ce=class extends Or{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||Ir("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:[er("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),er("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as qr}from"react";var Q=qr(null);function z(e){return e&&e.trim()?e.trim():void 0}function H(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return z(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return z(typeof process<"u"?process.env?.[e]:void 0)}}function he(){let e=H("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||H("VERCEL_ENV")==="production"?"workos":H("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Lr(){return he()==="workos"}import{jsx as _e}from"react/jsx-runtime";function Vr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=Br(),i=Me(),f=H("NEXT_PUBLIC_SESSION_TOKEN")??H("NEXT_PUBLIC_URUN_JWT"),d=he(),m=d==="workos"&&!n,k=n??(d==="jwt"?f:void 0)??u,b=o??H("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),y=m&&!k,g=Fr(()=>({appId:t,baseUrl:e,orgId:r,jwt:k,getAccessToken:m?i?.getAccessToken:void 0,authProvider:b}),[t,i,e,b,k,r,m]);return Wr(()=>{if(!m||!i)return;let S=!1,T=i;async function h(){try{let U=await T.getAccessToken();S||c(U??void 0)}catch{S||c(void 0)}}h();let x=window.setInterval(()=>{h()},6e4);return()=>{S=!0,window.clearInterval(x)}},[i,m]),_e(ce,{fallback:s,children:y?_e("div",{role:"status","aria-live":"polite",children:"Signing in..."}):_e(Q.Provider,{value:g,children:a})})}import{useContext as $r,useMemo as rr,useReducer as Hr,useRef as jr}from"react";import{App as Jr}from"@urun-sh/core";function zr(e,r){return`${e}:${JSON.stringify(r??{})}`}var Ne=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},De=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},Oe=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new Ne(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new De(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Xr(){let e=$r(Q);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=Hr(o=>o+1,0),t=jr(new Map),n=rr(()=>Jr(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return rr(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=zr(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new Oe(n[s](a),r);return t.current.set(u,i),i}}}),[n])}import{useCallback as Ie,useEffect as Gr,useMemo as Kr,useRef as ve,useState as qe}from"react";function ee(e){let r=e;if(!r||typeof r.request!="function"||typeof r.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 r}function Zr(e){return e instanceof Error?e:new Error(String(e))}function Yr(e,r){let t=Kr(()=>ee(e),[e]),[n,o]=qe(void 0),[s,a]=qe(null),[u,c]=qe(!1),i=ve(r);i.current=r;let f=ve(0),d=ve(null),m=ve(!0);Gr(()=>(m.current=!0,()=>{m.current=!1,d.current?.abort()}),[]);let k=Ie(async g=>{d.current?.abort();let S=new AbortController;d.current=S;let T=++f.current,h=()=>m.current&&f.current===T;h()&&(c(!0),a(null));try{let x=await t.request(g,{...i.current,signal:S.signal});return h()&&(o(x),c(!1),i.current?.onSuccess?.(x)),x}catch(x){let U=Zr(x);throw h()&&(a(U),c(!1),i.current?.onError?.(U)),U}},[t]),b=Ie(g=>{k(g).catch(()=>{})},[k]),y=Ie(()=>{f.current++,d.current?.abort(),d.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:b,mutateAsync:k,data:n,error:s,isPending:u,reset:y}}import{useCallback as tr,useEffect as Qr,useMemo as et,useRef as ke,useState as Le}from"react";function nr(e){return e instanceof Error?e:new Error(String(e))}var rt=e=>typeof e=="string"?e:String(e);function tt(e,r){let t=et(()=>ee(e),[e]),[n,o]=Le(""),[s,a]=Le(!1),[u,c]=Le(null),i=ke(r);i.current=r;let f=ke(0),d=ke(null),m=ke(!0);Qr(()=>(m.current=!0,()=>{m.current=!1,d.current?.cancel(),d.current=null}),[]);let k=tr(()=>{f.current++,d.current?.cancel(),d.current=null,m.current&&a(!1)},[]),b=tr(async y=>{d.current?.cancel();let g=++f.current,S=()=>m.current&&f.current===g,T=i.current,h=T?.parseChunk??rt,x=T?.buildPayload??(P=>({prompt:P}));S()&&(o(""),c(null),a(!0));let{parseChunk:U,buildPayload:I,onFinish:A,onError:l,...C}=T??{},E="",w;try{w=t.requestStream(x(y),C),d.current=w}catch(P){let D=nr(P);S()&&(c(D),a(!1),T?.onError?.(D));return}try{for await(let P of w){if(f.current!==g)break;E+=h(P),S()&&o(E)}S()&&(a(!1),T?.onFinish?.(E))}catch(P){let D=nr(P);S()&&(c(D),a(!1),T?.onError?.(D))}finally{d.current===w&&(d.current=null)}},[t]);return{completion:n,complete:b,stop:k,isStreaming:s,error:u}}import{useCallback as or,useEffect as nt,useMemo as ot,useRef as re,useState as ye}from"react";function sr(e){return e instanceof Error?e:new Error(String(e))}var st=e=>typeof e=="string"?e:String(e),ar=0;function We(e){return ar+=1,`${e}-${ar}`}function at(e,r){let t=ot(()=>ee(e),[e]),[n,o]=ye(()=>(r?.initialMessages??[]).map(h=>({id:h.id??We("msg"),role:h.role,content:h.content}))),[s,a]=ye(""),[u,c]=ye(!1),[i,f]=ye(null),d=re(r);d.current=r;let m=re(n);m.current=n;let k=re(s);k.current=s;let b=re(0),y=re(null),g=re(!0);nt(()=>(g.current=!0,()=>{g.current=!1,y.current?.cancel(),y.current=null}),[]);let S=or(()=>{b.current++,y.current?.cancel(),y.current=null,g.current&&c(!1)},[]),T=or(async h=>{let x=h===void 0,U=(x?k.current:h)??"";if(!U.trim())return;y.current?.cancel();let A=++b.current,l=()=>g.current&&b.current===A,C=d.current,E=C?.parseChunk??st,w={id:We("msg"),role:"user",content:U},P={id:We("msg"),role:"assistant",content:""},D=[...m.current,w].map(v=>({role:v.role,content:v.content})),p=[...m.current,w,P];m.current=p,o(p),x&&a(""),f(null),c(!0);let R=C?.buildPayload??(v=>({messages:v})),{initialMessages:N,parseChunk:M,buildPayload:O,onFinish:L,onError:se,...ge}=C??{},Se=v=>{o(_=>_.map(q=>q.id===P.id?{...q,content:v}:q))},Z="",ae;try{ae=t.requestStream(R(D),ge),y.current=ae}catch(v){let _=sr(v);l()&&(f(_),c(!1),C?.onError?.(_));return}try{for await(let v of ae){if(b.current!==A)break;Z+=E(v),l()&&Se(Z)}l()&&(c(!1),C?.onFinish?.({...P,content:Z}))}catch(v){let _=sr(v);l()&&(f(_),c(!1),C?.onError?.(_))}finally{y.current===ae&&(y.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:T,stop:S,isStreaming:u,error:i}}var ir=new Map;function it(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);ir.set(e,{component:r,schema:t})}function ur(e,r){let t=ir.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}import{Fragment as ct,jsx as be}from"react/jsx-runtime";function ut({name:e,props:r,fallback:t}){let n=ur(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?be(ct,{children:t}):be("div",{className:"urun-component-error",role:"alert",children:be("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return be(o,{...n.validatedProps})}import{z as le}from"zod";import{jsx as Fe,jsxs as cr}from"react/jsx-runtime";var lt=le.object({step:le.number().min(0),total:le.number().min(1),label:le.string().optional(),variant:le.enum(["default","success","error"]).default("default")});function lr(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function dt(e){let{step:r,total:t,label:n,variant:o,percentage:s}=lr(e);return cr("div",{className:"urun-progress-card","data-variant":o,children:[n&&Fe("div",{className:"urun-progress-label",children:n}),Fe("div",{className:"urun-progress-bar",children:Fe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),cr("div",{className:"urun-progress-text",children:[r,"/",t]})]})}import{z as Be}from"zod";import{jsx as dr,jsxs as gt}from"react/jsx-runtime";var pt=Be.object({state:Be.enum(["thinking","generating","idle","error"]),message:Be.string().optional()}),mt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function pr(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??mt[r]??r;return{state:r,message:o,isActive:n}}function ft(e){let{state:r,message:t,isActive:n}=pr(e);return gt("span",{className:"urun-status-badge","data-state":r,children:[dr("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),dr("span",{className:"urun-status-message",children:t})]})}import{useRef as mr,useEffect as St}from"react";import{z as Ve}from"zod";import{jsx as fr,jsxs as kt}from"react/jsx-runtime";var ht=Ve.object({text:Ve.string(),streaming:Ve.boolean().default(!1)});function gr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function vt(e){let{text:r,streaming:t}=gr(e),n=mr(null),o=mr(0);return St(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),kt("div",{className:"urun-text-stream",children:[fr("span",{ref:n,className:"urun-text-content"}),t&&fr("span",{className:"urun-text-cursor"})]})}import{z as Ce}from"zod";import{jsx as Sr,jsxs as Ct}from"react/jsx-runtime";var yt=Ce.object({src:Ce.string().url(),alt:Ce.string().optional(),caption:Ce.string().optional()});function hr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function bt(e){let{src:r,alt:t,caption:n}=hr(e);return Ct("figure",{className:"urun-image-frame",children:[Sr("img",{className:"urun-image",src:r,alt:t}),n&&Sr("figcaption",{className:"urun-image-caption",children:n})]})}import{z as j}from"zod";import{jsx as $e,jsxs as Rt}from"react/jsx-runtime";var Tt=j.object({metrics:j.array(j.object({label:j.string(),value:j.union([j.string(),j.number()]),unit:j.string().optional()}))});function vr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function xt(e){let{metrics:r}=vr(e);return $e("div",{className:"urun-metrics-panel",children:r.map((t,n)=>Rt("div",{className:"urun-metric-card",children:[$e("div",{className:"urun-metric-label",children:t.label}),$e("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as Ut,useCallback as te,useEffect as He,useImperativeHandle as wt,useRef as ne}from"react";import{observePageLifecycle as Et}from"@urun-sh/core";var Te=null;function Pt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function xe(){if(Te)return Te;let e=Pt();return e?(Te=new e,Te):null}function Re(){let e=xe();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Mt}from"react/jsx-runtime";var At=1e3,kr=200;function je(...e){console.debug("[urun-audio]",...e)}var Je=Ut(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:f}=r,d=ne(null),m=ne(null),k=ne(null),b=ne(null),y=ne(c);y.current=c;let g=ne(i);g.current=i;let S=te(l=>{k.current!==l&&(k.current=l,g.current?.(l))},[]),T=te(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let l=d.current;return l&&l.srcObject!==m.current&&(l.srcObject=m.current),m.current},[]),h=te(l=>{let C=d.current;if(!C)return;let E=C.play();!E||typeof E.then!="function"||E.then(()=>{C.muted||S(!0)}).catch(w=>{let P=w instanceof Error?w.name:String(w);if(P==="AbortError"){je(`play() aborted (${l}); retrying in ${kr}ms`),b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{b.current=null,h(`${l}:retry`)},kr);return}if(P==="NotAllowedError"){je(`play() blocked pending a user gesture (${l})`),S(!1);return}je(`play() failed (${l})`,w)})},[S]),x=te(l=>{let C=T();if(C){for(let E of C.getAudioTracks())E!==l&&C.removeTrack(E);l&&!C.getAudioTracks().includes(l)&&C.addTrack(l),l&&h("track-attach"),y.current?.(l)}},[T,h]),U=te(()=>{let l=d.current;l&&(T(),l.muted=!1,h("gesture"),Re(),S(!0))},[T,h,S]);wt(t,()=>({unlock:U,get unlocked(){return k.current===!0},get element(){return d.current}}),[U]);let I=te(l=>{d.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),T()),f?.(l)},[T,f]),A=s!==void 0;return He(()=>{if(A){x(s??null);return}if(!n)return;let l=n.stream(o),C=()=>{let p=m.current;return p?p.getAudioTracks()[0]??null:null},E=p=>{if(p!==C()&&(x(p),p)){let R=()=>{C()===p&&x(null)};p.addEventListener("ended",R)}},w=l.track;w&&w.readyState==="live"&&E(w);let P=l.on("track",p=>{p&&p.readyState!=="live"||E(p)}),D=setInterval(()=>{let p=l.track;p&&p.readyState==="live"&&E(p)},At);return()=>{P(),clearInterval(D)}},[n,o,A,s,x]),He(()=>Et(()=>{Re(),k.current===!0&&h("foreground")}),[h]),He(()=>()=>{b.current&&clearTimeout(b.current)},[]),Mt("audio",{ref:I,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});import{forwardRef as _t,useCallback as oe,useEffect as yr,useImperativeHandle as Nt,useRef as B}from"react";import{observePageLifecycle as Dt,sessionFailureFromMediaError as Ot,sharedCaptureController as It}from"@urun-sh/core";import{jsx as Lt}from"react/jsx-runtime";var br={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Pe(...e){console.debug("[urun-voice]",...e)}var qt=_t(function(r,t){let{session:n,stream:o="audio",constraints:s=br,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:f,onMicStream:d,onTrack:m,onUnlockChange:k,capture:b}=r,y=B(null),g=B(null),S=B(null),T=B([]),h=B(!1),x=B(i);x.current=i;let U=B(f);U.current=f;let I=B(d);I.current=d;let A=oe(p=>{h.current!==p&&(h.current=p,x.current?.(p))},[]),l=oe(()=>{for(let p of T.current)p();T.current=[],S.current?.release(),S.current=null,g.current&&(g.current=null,I.current?.(null))},[]),C=oe(async()=>{let p=S.current;if(p){let O=await p.update(s);return g.current=p.stream,I.current?.(p.stream),O}let N=await(b??It()).claim("audio",s);S.current=N,T.current=[N.onTrack((O,L)=>{g.current=L,I.current?.(L),h.current&&n.stream(o).attach(O).catch(se=>Pe("mic re-attach after one-capture re-acquire failed",se))}),N.onLost(O=>{S.current=null,T.current=[],g.current=null,I.current?.(null),A(!1),U.current?.(O)})],g.current=N.stream,I.current?.(N.stream);let M=N.track;if(!M)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return M},[b,s,n,o,A]),E=oe(async()=>{l(),A(!1),await n.stream(o).detach().catch(()=>{})},[n,o,l,A]),w=oe(async()=>{y.current?.unlock();let p;try{p=await C()}catch(M){l();let O=Ot(M,n.status);throw U.current?.(O),O}n.connect?.();let R;for(let M=1;M<=u;M++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(p),A(!0);return}catch(O){R=O,Pe(`start attempt ${M}/${u} failed`,O),M<u&&await new Promise(L=>setTimeout(L,c))}l(),A(!1);let N=R instanceof Error?R:new Error(String(R??"voice start failed"));throw U.current?.(N),N},[n,o,a,u,c,C,l,A]);Nt(t,()=>({start:w,stop:E,unlock:()=>y.current?.unlock(),get active(){return h.current},get micStream(){return g.current},get audio(){return y.current}}),[w,E]);let P=B(!1),D=oe(async()=>{if(!h.current||P.current)return;let p=g.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(R){Pe("foreground mic re-assert failed (will retry on next pass)",R)}return}P.current=!0;try{let R=await C();await n.stream(o).attach(R)}catch(R){let N=R instanceof Error?R:new Error(String(R));Pe("foreground mic re-acquire failed",N),U.current?.(N)}finally{P.current=!1}},[n,o,C]);return yr(()=>{let p=()=>{D()};return typeof n.onRecovery=="function"?n.onRecovery(p):Dt(p)},[n,D]),yr(()=>l,[l]),Lt(Je,{ref:y,session:n,stream:o,onTrack:m,onUnlockChange:k})});import{sessionFailureFromMediaError as Wt,sharedCaptureController as Ft}from"@urun-sh/core";import{forwardRef as Bt,useCallback as V,useEffect as Vt,useImperativeHandle as $t,useRef as W,useState as Ht}from"react";import{jsx as Jt,jsxs as zt}from"react/jsx-runtime";var Cr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ze(...e){console.debug("[urun-camera]",...e)}var jt=Bt(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:f,videoClassName:d,onActiveChange:m,onError:k,onStream:b,onTrack:y,children:g,capture:S}=r,T=W(null),h=W(null),x=W(null),U=W([]),I=W(null),A=W(!1),l=W(a),[C,E]=Ht(a),w=W(m);w.current=m;let P=W(k);P.current=k;let D=W(b);D.current=b;let p=W(y);p.current=y;let R=V(v=>{A.current!==v&&(A.current=v,w.current?.(v))},[]),N=V(v=>{let _=T.current;_&&(_.muted=!0,_.srcObject=v,v&&_.play()?.catch?.(q=>ze("preview play() failed",q)))},[]),M=V(()=>{I.current?.(),I.current=null;for(let v of U.current)v();U.current=[],x.current?.release(),x.current=null,h.current&&(h.current=null,D.current?.(null),p.current?.(null)),N(null)},[N]),O=V((v,_)=>{I.current?.(),h.current=_,N(_),D.current?.(_);let q=()=>{h.current===_&&(ze("camera track ended (device removed or permission revoked)"),M(),R(!1))};v.addEventListener("ended",q),I.current=()=>v.removeEventListener("ended",q)},[N,M,R]),L=V(async v=>{let _={...Cr,...s,facingMode:v},q;try{let $=x.current;if($)q=await $.update(_);else{let ie=await(S??Ft()).claim("video",_);if(x.current=ie,U.current=[ie.onTrack((ue,Mr)=>{O(ue,Mr),A.current&&n.stream(o).attachVideo(ue).then(()=>p.current?.(ue)).catch(_r=>ze("camera re-publish after one-capture re-acquire failed",_r))}),ie.onLost(ue=>{x.current=null,U.current=[],M(),R(!1),P.current?.(ue)})],!ie.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});q=ie.track}}catch($){let Y=Wt($,n.status);throw P.current?.(Y),Y}l.current=v,E(v),O(q,x.current?.stream??new MediaStream([q]));try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(q)}catch($){M(),R(!1);let Y=$ instanceof Error?$:new Error(String($));throw P.current?.(Y),Y}p.current?.(q),R(!0)},[n,o,s,c,S,O,M,R]),se=V(v=>L(v?.facingMode??l.current),[L]),ge=V(async v=>{A.current&&l.current===v||await L(v)},[L]),Se=V(()=>L(l.current==="environment"?"user":"environment"),[L]),Z=V(async()=>{M(),R(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,M,R]);return $t(t,()=>({start:se,stop:Z,flip:Se,setFacingMode:ge,get active(){return A.current},get facingMode(){return l.current},get stream(){return h.current},get element(){return T.current}}),[se,Z,Se,ge]),Vt(()=>M,[M]),i?zt("div",{className:f,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":C,children:[Jt("video",{ref:T,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?C==="user":u)?{transform:"scaleX(-1)"}:{}}}),g]}):null});import{useEffect as Xt,useState as Gt}from"react";var Xe={level:0,speaking:!1};function Kt(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=Gt(Xe);return Xt(()=>{if(!e){a(Xe);return}let u=xe();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,f;try{i=u.createMediaStreamSource(c),f=u.createAnalyser(),f.fftSize=t,i.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),k=setInterval(()=>{f.getByteTimeDomainData(d);let b=0;for(let g=0;g<d.length;g++){let S=(d[g]-128)/128;b+=S*S}let y=Math.sqrt(b/d.length);a(g=>{let S=y>o;return Math.abs(g.level-y)<.005&&g.speaking===S?g:{level:y,speaking:S}})},n);return()=>{clearInterval(k),i.disconnect(),a(Xe)}},[e,t,n,o]),s}import{useEffect as Zt,useState as Yt}from"react";function Qt(e,r){let[t,n]=Yt(null);return Zt(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}import{useCallback as sn}from"react";import{useEffect as nn,useMemo as on}from"react";import{createStore as en}from"zustand/vanilla";import{useStore as rn}from"zustand";var tn=()=>{};function Ge(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=en(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):tn,c=(i=>rn(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function de(e,r){let t=on(()=>Ge(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return nn(()=>t.bind(),[t]),t}function an(e,r,t){let o=de(e,r)(t??(u=>u)),s=sn(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}import{useEffect as un,useState as cn}from"react";var X=200;function J(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function pe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ke(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function Ze(e,r,t={}){let n=t.cap??200,[o,s]=cn([]);return un(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>J(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}import{jsx as Ue,jsxs as me}from"react/jsx-runtime";function ln({session:e,name:r,cap:t,className:n}){let o=Ze(e,r,{cap:t});return me("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[me("div",{className:"urun-stream-tail-meta",children:[Ue("code",{children:r}),me("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Ue("div",{className:"urun-stream-tail-log",children:o.length===0?me("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ue("code",{children:r})," messages\u2026"]}):o.map((s,a)=>me("div",{className:"urun-stream-tail-line",children:[Ue("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pe(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as dn,useState as Tr}from"react";import{jsx as G,jsxs as we}from"react/jsx-runtime";function Ee({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=Tr(""),[a,u]=Tr(null),c=dn(()=>{let i=Ke(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return we("div",{className:"urun-doc-patch",children:[G("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),we("div",{className:"urun-doc-patch-actions",children:[G("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?G("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function pn({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=de(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return we("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[we("div",{className:"urun-doc-panel-meta",children:[G("code",{children:r}),G("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),G("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?G(Ee,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}import{useEffect as mn,useState as fn}from"react";import{jsx as fe,jsxs as Rr}from"react/jsx-runtime";function xr(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function gn({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=fn([]);return mn(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>J(c,{at:Date.now(),direction:"in",text:xr(pe(u))},t))}):void 0),[e,r,t]),Rr("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[fe(Ee,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>J(c,{at:Date.now(),direction:"out",text:xr(u)},t))}}),fe("div",{className:"urun-control-sender-log",children:o.length===0?fe("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>Rr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[fe("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",fe("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}import{useEffect as Sn,useState as hn}from"react";import{jsx as Ae,jsxs as kn}from"react/jsx-runtime";function vn({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=hn([]),u=r.join(","),c=t.join(",");return Sn(()=>{if(a([]),!e)return;let i=(d,m)=>a(k=>J(k,{at:Date.now(),kind:d,text:m},n)),f=[];f.push(e.onPhase(d=>i("phase",`phase \u2192 ${d.name}`)));for(let d of r){let m=e.stream(d);f.push(m.on("track",k=>i("track",`${d}: ${k?"track arrived":"track ended"}`)))}for(let d of t){let m=e.doc(d);f.push(m.on("change",()=>i("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,u,c,n]),Ae("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Ae("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((i,f)=>kn("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[Ae("span",{className:"urun-event-spine-kind",children:i.kind})," ",Ae("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${f}`))})}import{describeSessionPhase as wn,isWakingPhase as En}from"@urun-sh/core";import{useEffect as yn,useState as bn}from"react";function F(e){let[r,t]=bn(e?.phase??null);return yn(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}import{describeSessionPhase as Pn}from"@urun-sh/core";import{useEffect as Cn,useRef as Tn,useState as xn}from"react";import{isWakingPhase as Rn}from"@urun-sh/core";function Ye(e){let r=F(e),t=Rn(r?.name),n=Tn(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=xn(s);return Cn(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}import{Fragment as Un,jsx as Pr,jsxs as Ur}from"react/jsx-runtime";function Qe({session:e,render:r,className:t}){let n=Ye(e);return!n.waking||!n.phase?null:Pr("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):Ur(Un,{children:[Pr("span",{className:"urun-session-waking-label",children:Pn(n.phase)})," ",Ur("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}import{jsx as K,jsxs as wr}from"react/jsx-runtime";var An={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Mn({session:e,className:r}){let t=F(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return wr("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[K("span",{className:"urun-session-status-dot","data-phase":n}),K("span",{className:"urun-session-status-label",children:An[n]}),o?K("span",{className:"urun-session-status-detail",children:o}):null]})}function _n({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=F(e);if(s?.name==="live")return K("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):K("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&En(s.name)?K(Qe,{session:e}):s&&s.name!=="idle"?wn(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return wr("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?K("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}import{useEffect as Nn,useState as Dn}from"react";import{jsx as qn}from"react/jsx-runtime";function Er(e){return F(e)?.endsAt??null}function On(e){let r=Math.max(0,Math.floor(e/1e3)),t=Math.floor(r/60),n=r%60;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}`}function In({session:e,urgentMs:r=6e4,className:t}){let o=Er(e)?.getTime()??null,[s,a]=Dn(()=>o===null?null:Math.max(0,o-Date.now()));if(Nn(()=>{if(o===null){a(null);return}let c=()=>a(Math.max(0,o-Date.now()));c();let i=setInterval(c,1e3);return()=>clearInterval(i)},[o]),s===null)return null;let u=On(s);return qn("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${u}`,"data-urgent":s<r?"":void 0,"data-expired":s<=0?"":void 0,children:u})}import{jsx as Ar,jsxs as Fn}from"react/jsx-runtime";var Ln=new Set(["expired","ended","error"]);function Wn({session:e,onNewSession:r,children:t,className:n}){let o=F(e);if(!o||!Ln.has(o.name))return null;let s=t?t(o):Ar("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return Fn("div",{className:["urun-session-ended",n].filter(Boolean).join(" "),"data-phase":o.name,children:[s,r?Ar("button",{type:"button",className:"urun-session-ended-new",onClick:r,children:"New session"}):null]})}import{useContext as Bn,useEffect as Vn,useState as $n}from"react";import{prewake as Hn}from"@urun-sh/core";function jn(e){let r=Bn(Q),[t,n]=$n(null),o=e.app??r?.appId,s=e.function,a=e.intervalS??60,u=r?.baseUrl,c=r?.orgId,i=r?.jwt,f=r?.getAccessToken,d=r?.authProvider;return Vn(()=>{if(!u||!c||!o||!s)return;let m=!1,k=()=>{Hn({baseUrl:u,app:o,functionName:s,orgId:c,jwt:i,getAccessToken:f,authProvider:d}).then(y=>{m||n(y)}).catch(()=>{})};k();let b=setInterval(k,Math.max(1,a)*1e3);return()=>{m=!0,clearInterval(b)}},[o,s,a,u,c,i,f,d]),t}import{describeSessionPhase as Xa,isWakingPhase as Ga}from"@urun-sh/core";export{ut as ComponentRenderer,Cr as DEFAULT_CAMERA_CONSTRAINTS,X as DEFAULT_LOG_CAP,br as DEFAULT_VOICE_CONSTRAINTS,Ee as DocPatchForm,bt as ImageFrame,yt as ImageFrameSchema,xt as MetricsPanel,Tt as MetricsPanelSchema,dt as ProgressCard,lt as ProgressCardSchema,ft as StatusBadge,pt as StatusBadgeSchema,vt as TextStream,ht as TextStreamSchema,Je as UrunAudio,Nr as UrunAuthProvider,jt as UrunCamera,gn as UrunControlSender,pn as UrunDocPanel,ce as UrunErrorBoundary,vn as UrunEventSpine,Dr as UrunJwtProvider,Vr as UrunProvider,In as UrunSessionClock,Wn as UrunSessionEnded,_n as UrunSessionGate,Mn as UrunSessionStatus,Qe as UrunSessionWaking,ln as UrunStreamTail,qt as UrunVoice,he as authMode,Ge as createDocStore,Xa as describeSessionPhase,pe as formatPayload,xe as getUrunAudioContext,Ga as isWakingPhase,Ke as parseJsonObject,J as pushCapped,it as registerComponent,Re as resumeUrunAudioContext,H as urunPublicEnv,Xr as useApp,at as useChat,tt as useCompletion,de as useDocStore,hr as useImageFrame,vr as useMetricsPanel,lr as useProgressCard,Yr as useRequest,an as useSessionDoc,Er as useSessionEndsAt,F as useSessionPhase,Qt as useSessionTrack,Ye as useSessionWake,pr as useStatusBadge,Ze as useStreamMessages,gr as useTextStream,Kt as useUrunAudioLevel,Me as useUrunAuth,jn as useUrunPrewake,Lr as usesWorkOSAuth};
package/dist/styles.css CHANGED
@@ -395,11 +395,51 @@
395
395
  .urun-session-status-dot[data-phase='error'] {
396
396
  background: var(--urun-wb-danger, #e5484d);
397
397
  }
398
+ .urun-session-status-dot[data-phase='expired'] {
399
+ background: var(--urun-wb-warn, #ffb224);
400
+ }
398
401
 
399
402
  .urun-session-status-detail {
400
403
  color: var(--urun-wb-muted, #8a8a8a);
401
404
  }
402
405
 
406
+ /* Session length: countdown clock (UrunSessionClock) + terminal surface
407
+ * (UrunSessionEnded). The clock renders nothing without a deadline; state
408
+ * rides data- attributes (data-urgent below the urgent threshold,
409
+ * data-expired at zero) so apps restyle it with plain CSS. */
410
+ .urun-session-clock {
411
+ display: inline-flex;
412
+ align-items: center;
413
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
414
+ font-size: 12px;
415
+ font-variant-numeric: tabular-nums;
416
+ color: var(--urun-wb-muted, #8a8a8a);
417
+ }
418
+ .urun-session-clock[data-urgent] {
419
+ color: var(--urun-wb-danger, #e5484d);
420
+ }
421
+
422
+ .urun-session-ended {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 10px;
426
+ font-size: 13px;
427
+ }
428
+ .urun-session-ended-new {
429
+ appearance: none;
430
+ border: 1px solid var(--urun-wb-border, rgba(128, 128, 128, 0.4));
431
+ border-radius: 6px;
432
+ background: var(--urun-wb-accent, #24db49);
433
+ color: #000;
434
+ font-size: 12px;
435
+ font-weight: 600;
436
+ padding: 4px 10px;
437
+ cursor: pointer;
438
+ }
439
+ .urun-session-ended-new:hover {
440
+ filter: brightness(1.1);
441
+ }
442
+
403
443
  /* Scale-to-zero "waking (Ns)" building block (UrunSessionWaking) */
404
444
  .urun-session-waking {
405
445
  display: inline-flex;
package/dist/video.css CHANGED
@@ -1 +1 @@
1
- :root{--urun-bg: #ffffff;--urun-text: #1a1a2e;--urun-border: #e2e8f0;--urun-radius: 8px;--urun-font: system-ui, -apple-system, sans-serif;--urun-progress-bg: #e2e8f0;--urun-progress-fill: #3b82f6;--urun-progress-success: #22c55e;--urun-progress-error: #ef4444;--urun-progress-height: 8px;--urun-status-thinking: #f59e0b;--urun-status-generating: #3b82f6;--urun-status-idle: #94a3b8;--urun-status-error: #ef4444;--urun-status-indicator-size: 8px;--urun-cursor-color: #3b82f6;--urun-cursor-width: 2px;--urun-metric-bg: #f8fafc;--urun-metric-label-color: #64748b;--urun-metric-value-color: #1a1a2e}.urun-progress-card{font-family:var(--urun-font);color:var(--urun-text);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px 16px;background:var(--urun-bg)}.urun-progress-label{font-size:.875rem;font-weight:500;margin-bottom:8px}.urun-progress-bar{height:var(--urun-progress-height);background:var(--urun-progress-bg);border-radius:calc(var(--urun-progress-height) / 2);overflow:hidden}.urun-progress-fill{height:100%;background:var(--urun-progress-fill);border-radius:inherit;transition:width .3s ease}.urun-progress-card[data-variant=success] .urun-progress-fill{background:var(--urun-progress-success)}.urun-progress-card[data-variant=error] .urun-progress-fill{background:var(--urun-progress-error)}.urun-progress-text{font-size:.75rem;color:var(--urun-metric-label-color);margin-top:4px;text-align:right}.urun-status-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-text)}.urun-status-indicator{display:inline-block;width:var(--urun-status-indicator-size);height:var(--urun-status-indicator-size);border-radius:50%;background:var(--urun-status-idle);flex-shrink:0}.urun-status-badge[data-state=thinking] .urun-status-indicator{background:var(--urun-status-thinking)}.urun-status-badge[data-state=generating] .urun-status-indicator{background:var(--urun-status-generating)}.urun-status-badge[data-state=error] .urun-status-indicator{background:var(--urun-status-error)}.urun-status-pulse{animation:urun-pulse 1.5s ease-in-out infinite}.urun-text-stream{font-family:var(--urun-font);color:var(--urun-text);white-space:pre-wrap;word-break:break-word}.urun-text-cursor{display:inline-block;width:var(--urun-cursor-width);height:1em;background:var(--urun-cursor-color);vertical-align:text-bottom;animation:urun-blink 1s step-end infinite}.urun-image-frame{margin:0;border:1px solid var(--urun-border);border-radius:var(--urun-radius);overflow:hidden;background:var(--urun-bg)}.urun-image{display:block;width:100%;height:auto}.urun-image-caption{padding:8px 12px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-metric-label-color);text-align:center}.urun-metrics-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;font-family:var(--urun-font)}.urun-metric-card{background:var(--urun-metric-bg);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px;text-align:center}.urun-metric-label{font-size:.75rem;color:var(--urun-metric-label-color);margin-bottom:4px}.urun-metric-value{font-size:1.25rem;font-weight:600;color:var(--urun-metric-value-color)}.urun-component-error{font-family:var(--urun-font);padding:8px 12px;border:1px solid var(--urun-status-error);border-radius:var(--urun-radius);background:#fef2f2;color:var(--urun-status-error);font-size:.875rem}@keyframes urun-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes urun-blink{0%,to{opacity:1}50%{opacity:0}}[data-urun-video],[data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}[data-urun-video] .vjs-tech{object-fit:contain}.urun-video-live.vjs-has-started .vjs-poster,.urun-video-live.vjs-has-started .vjs-loading-spinner,.urun-video-live.vjs-has-started .vjs-big-play-button{display:none!important}.urun-video-live .vjs-poster{background-color:transparent}.urun-stream-tail,.urun-doc-panel,.urun-control-sender,.urun-event-spine{display:flex;flex-direction:column;gap:6px;font-size:12px}.urun-stream-tail-meta,.urun-doc-panel-meta{display:flex;align-items:center;gap:8px;color:var(--urun-wb-muted, #8a8a8a)}.urun-stream-tail-log,.urun-control-sender-log{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow:auto;padding:6px;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-stream-tail-time,.urun-control-sender-time,.urun-event-spine-time{color:var(--urun-wb-muted, #8a8a8a)}.urun-doc-panel-snapshot{margin:0;padding:8px;max-height:220px;overflow:auto;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-doc-patch,.urun-control-sender{display:flex;flex-direction:column;gap:6px}.urun-doc-patch-input{width:100%;resize:vertical;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-input-bg, transparent);color:inherit;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.urun-doc-patch-actions{display:flex;align-items:center;gap:8px}.urun-doc-patch-button,.urun-mic-button{cursor:pointer;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-accent, #24db49);color:var(--urun-wb-accent-fg, #04120a);padding:4px 12px;font-size:12px;font-weight:600}.urun-doc-patch-button:disabled{cursor:default;opacity:.5}.urun-doc-patch-error,.urun-mic-error{color:var(--urun-wb-danger, #e5484d)}.urun-event-spine{max-height:260px;overflow:auto}.urun-event-spine-line,.urun-control-sender-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-event-spine-kind,.urun-control-sender-dir{display:inline-block;min-width:3.5em;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-status{display:inline-flex;align-items:center;gap:6px;font-size:12px}.urun-session-status-dot{width:8px;height:8px;border-radius:50%;background:var(--urun-wb-muted, #8a8a8a)}.urun-session-status-dot[data-phase=live]{background:var(--urun-wb-accent, #24db49)}.urun-session-status-dot[data-phase=connecting],.urun-session-status-dot[data-phase=provisioning],.urun-session-status-dot[data-phase=queued]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-dot[data-phase=error]{background:var(--urun-wb-danger, #e5484d)}.urun-session-status-detail{color:var(--urun-wb-muted, #8a8a8a)}.urun-session-waking{display:inline-flex;align-items:baseline;gap:6px;font-size:12px}.urun-session-waking-elapsed{color:var(--urun-wb-muted, #8a8a8a);font-variant-numeric:tabular-nums}
1
+ :root{--urun-bg: #ffffff;--urun-text: #1a1a2e;--urun-border: #e2e8f0;--urun-radius: 8px;--urun-font: system-ui, -apple-system, sans-serif;--urun-progress-bg: #e2e8f0;--urun-progress-fill: #3b82f6;--urun-progress-success: #22c55e;--urun-progress-error: #ef4444;--urun-progress-height: 8px;--urun-status-thinking: #f59e0b;--urun-status-generating: #3b82f6;--urun-status-idle: #94a3b8;--urun-status-error: #ef4444;--urun-status-indicator-size: 8px;--urun-cursor-color: #3b82f6;--urun-cursor-width: 2px;--urun-metric-bg: #f8fafc;--urun-metric-label-color: #64748b;--urun-metric-value-color: #1a1a2e}.urun-progress-card{font-family:var(--urun-font);color:var(--urun-text);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px 16px;background:var(--urun-bg)}.urun-progress-label{font-size:.875rem;font-weight:500;margin-bottom:8px}.urun-progress-bar{height:var(--urun-progress-height);background:var(--urun-progress-bg);border-radius:calc(var(--urun-progress-height) / 2);overflow:hidden}.urun-progress-fill{height:100%;background:var(--urun-progress-fill);border-radius:inherit;transition:width .3s ease}.urun-progress-card[data-variant=success] .urun-progress-fill{background:var(--urun-progress-success)}.urun-progress-card[data-variant=error] .urun-progress-fill{background:var(--urun-progress-error)}.urun-progress-text{font-size:.75rem;color:var(--urun-metric-label-color);margin-top:4px;text-align:right}.urun-status-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-text)}.urun-status-indicator{display:inline-block;width:var(--urun-status-indicator-size);height:var(--urun-status-indicator-size);border-radius:50%;background:var(--urun-status-idle);flex-shrink:0}.urun-status-badge[data-state=thinking] .urun-status-indicator{background:var(--urun-status-thinking)}.urun-status-badge[data-state=generating] .urun-status-indicator{background:var(--urun-status-generating)}.urun-status-badge[data-state=error] .urun-status-indicator{background:var(--urun-status-error)}.urun-status-pulse{animation:urun-pulse 1.5s ease-in-out infinite}.urun-text-stream{font-family:var(--urun-font);color:var(--urun-text);white-space:pre-wrap;word-break:break-word}.urun-text-cursor{display:inline-block;width:var(--urun-cursor-width);height:1em;background:var(--urun-cursor-color);vertical-align:text-bottom;animation:urun-blink 1s step-end infinite}.urun-image-frame{margin:0;border:1px solid var(--urun-border);border-radius:var(--urun-radius);overflow:hidden;background:var(--urun-bg)}.urun-image{display:block;width:100%;height:auto}.urun-image-caption{padding:8px 12px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-metric-label-color);text-align:center}.urun-metrics-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;font-family:var(--urun-font)}.urun-metric-card{background:var(--urun-metric-bg);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px;text-align:center}.urun-metric-label{font-size:.75rem;color:var(--urun-metric-label-color);margin-bottom:4px}.urun-metric-value{font-size:1.25rem;font-weight:600;color:var(--urun-metric-value-color)}.urun-component-error{font-family:var(--urun-font);padding:8px 12px;border:1px solid var(--urun-status-error);border-radius:var(--urun-radius);background:#fef2f2;color:var(--urun-status-error);font-size:.875rem}@keyframes urun-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes urun-blink{0%,to{opacity:1}50%{opacity:0}}[data-urun-video],[data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}[data-urun-video] .vjs-tech{object-fit:contain}.urun-video-live.vjs-has-started .vjs-poster,.urun-video-live.vjs-has-started .vjs-loading-spinner,.urun-video-live.vjs-has-started .vjs-big-play-button{display:none!important}.urun-video-live .vjs-poster{background-color:transparent}.urun-stream-tail,.urun-doc-panel,.urun-control-sender,.urun-event-spine{display:flex;flex-direction:column;gap:6px;font-size:12px}.urun-stream-tail-meta,.urun-doc-panel-meta{display:flex;align-items:center;gap:8px;color:var(--urun-wb-muted, #8a8a8a)}.urun-stream-tail-log,.urun-control-sender-log{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow:auto;padding:6px;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-stream-tail-time,.urun-control-sender-time,.urun-event-spine-time{color:var(--urun-wb-muted, #8a8a8a)}.urun-doc-panel-snapshot{margin:0;padding:8px;max-height:220px;overflow:auto;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-doc-patch,.urun-control-sender{display:flex;flex-direction:column;gap:6px}.urun-doc-patch-input{width:100%;resize:vertical;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-input-bg, transparent);color:inherit;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.urun-doc-patch-actions{display:flex;align-items:center;gap:8px}.urun-doc-patch-button,.urun-mic-button{cursor:pointer;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-accent, #24db49);color:var(--urun-wb-accent-fg, #04120a);padding:4px 12px;font-size:12px;font-weight:600}.urun-doc-patch-button:disabled{cursor:default;opacity:.5}.urun-doc-patch-error,.urun-mic-error{color:var(--urun-wb-danger, #e5484d)}.urun-event-spine{max-height:260px;overflow:auto}.urun-event-spine-line,.urun-control-sender-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-event-spine-kind,.urun-control-sender-dir{display:inline-block;min-width:3.5em;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-status{display:inline-flex;align-items:center;gap:6px;font-size:12px}.urun-session-status-dot{width:8px;height:8px;border-radius:50%;background:var(--urun-wb-muted, #8a8a8a)}.urun-session-status-dot[data-phase=live]{background:var(--urun-wb-accent, #24db49)}.urun-session-status-dot[data-phase=connecting],.urun-session-status-dot[data-phase=provisioning],.urun-session-status-dot[data-phase=queued]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-dot[data-phase=error]{background:var(--urun-wb-danger, #e5484d)}.urun-session-status-dot[data-phase=expired]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-detail{color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock{display:inline-flex;align-items:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-variant-numeric:tabular-nums;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock[data-urgent]{color:var(--urun-wb-danger, #e5484d)}.urun-session-ended{display:flex;align-items:center;gap:10px;font-size:13px}.urun-session-ended-new{appearance:none;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));border-radius:6px;background:var(--urun-wb-accent, #24db49);color:#000;font-size:12px;font-weight:600;padding:4px 10px;cursor:pointer}.urun-session-ended-new:hover{filter:brightness(1.1)}.urun-session-waking{display:inline-flex;align-items:baseline;gap:6px;font-size:12px}.urun-session-waking-elapsed{color:var(--urun-wb-muted, #8a8a8a);font-variant-numeric:tabular-nums}
package/dist/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- "use strict";var q=Object.create;var E=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},M=(t,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of G(r))!J.call(t,s)&&s!==n&&E(t,s,{get:()=>r[s],enumerable:!(i=W(r,s))||i.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?q(Y(t)):{},M(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>M(E({},"__esModule",{value:!0}),t);var se={};K(se,{UrunVideo:()=>H});module.exports=X(se);var o=require("react"),O=Q(require("video.js")),me=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core"),$=require("@urun-sh/core/internal");var ee=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let s=r.getState()._transport;if(!s)return;let m=s.getTrackByName?.bind(s),v=m?.(t);v&&v.readyState!=="ended"&&i(v);let j=s.on("track",h=>{let w=m?.(t);w&&w.id!==h.id||(i(h),h.addEventListener("ended",()=>{i(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var re=`
2
+ "use strict";var q=Object.create;var E=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},V=(t,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of G(r))!J.call(t,s)&&s!==n&&E(t,s,{get:()=>r[s],enumerable:!(i=W(r,s))||i.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?q(Y(t)):{},V(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>V(E({},"__esModule",{value:!0}),t);var se={};K(se,{UrunVideo:()=>H});module.exports=X(se);var o=require("react"),O=Q(require("video.js")),ge=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core"),$=require("@urun-sh/core/internal");var ee=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let s=r.getState()._transport;if(!s)return;let g=s.getTrackByName?.bind(s),f=g?.(t);f&&f.readyState!=="ended"&&i(f);let j=s.on("track",h=>{let w=g?.(t);w&&w.id!==h.id||(i(h),h.addEventListener("ended",()=>{i(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var re=`
3
3
  [data-urun-video]{width:100%;height:100%}
4
4
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
5
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -7,4 +7,4 @@
7
7
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
8
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
9
  .urun-video-live .vjs-poster{background-color:transparent}
10
- `,U="urun-video-critical-css";function te(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=re,document.head.appendChild(t)}var ne=["playToggle","volumePanel","fullscreenToggle"],oe=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:i,stream:s,src:m,type:v="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:L,onPlayerReady:z,children:_}=r,P=typeof m=="string"&&m.length>0,c=!P,y=(0,o.useRef)(null),f=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),L?.(e)},[n,L]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let g=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;te(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?ne:oe}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},u=()=>{c&&g()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),f.current=a,z?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),z?.(null),f.current&&(f.current.dispose(),f.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=f.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:m,type:v}),S&&g()},[P,m,v,S,g]),(0,o.useEffect)(()=>{if(!c)return;let e=f.current;if(!e)return;let a=i??null,d=s??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,g();let u=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),g()},V=()=>{p.srcObject=null,x(!1)};return u&&(u.addEventListener("unmute",C),u.addEventListener("ended",V),u.muted||C()),()=>{u&&(u.removeEventListener("unmute",C),u.removeEventListener("ended",V))}},[c,i,s,g]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:g,"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,l.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,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),ae=(0,o.forwardRef)(function({name:r,...n},i){let s=R(r);return(0,l.jsx)(A,{ref:i,...n,track:s})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(ae,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
10
+ `,U="urun-video-critical-css";function te(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=re,document.head.appendChild(t)}var ne=["playToggle","volumePanel","fullscreenToggle"],oe=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:i,stream:s,src:g,type:f="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:z,onPlayerReady:L,children:_}=r,P=typeof g=="string"&&g.length>0,c=!P,y=(0,o.useRef)(null),v=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),z?.(e)},[n,z]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let m=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;te(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?ne:oe}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},u=()=>{c&&m()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),v.current=a,L?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),L?.(null),v.current&&(v.current.dispose(),v.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=v.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:g,type:f}),S&&m()},[P,g,f,S,m]),(0,o.useEffect)(()=>{if(!c)return;let e=v.current;if(!e)return;let a=i??null,d=s??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,m();let u=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),m()},M=()=>{p.srcObject=null,x(!1)};return u&&(u.addEventListener("unmute",C),u.addEventListener("ended",M),u.muted||C()),()=>{u&&(u.removeEventListener("unmute",C),u.removeEventListener("ended",M))}},[c,i,s,m]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:m,"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,l.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,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),ae=(0,o.forwardRef)(function({name:r,...n},i){let s=R(r);return(0,l.jsx)(A,{ref:i,...n,track:s})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(ae,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
package/dist/video.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- import{forwardRef as j,useCallback as M,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as q,useEffect as W}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as se}from"react";import{observePageLifecycle as ue}from"@urun-sh/core";import{TransportSession as le}from"@urun-sh/core/internal";import{jsx as pe}from"react/jsx-runtime";var z=B(null);function V(o){let r=F(z);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=q(null);return W(()=>{let u=r.getState()._transport;if(!u)return;let c=u.getTrackByName?.bind(u),g=c?.(o);g&&g.readyState!=="ended"&&i(g);let w=u.on("track",f=>{let y=c?.(o);y&&y.id!==f.id||(i(f),f.addEventListener("ended",()=>{i(null)}))});return()=>{w()}},[o,r]),n}import{jsx as m,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
2
+ import{forwardRef as j,useCallback as V,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as q,useEffect as W}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as se}from"react";import{observePageLifecycle as ue}from"@urun-sh/core";import{TransportSession as le}from"@urun-sh/core/internal";import{jsx as pe}from"react/jsx-runtime";var L=B(null);function M(o){let r=F(L);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=q(null);return W(()=>{let u=r.getState()._transport;if(!u)return;let c=u.getTrackByName?.bind(u),m=c?.(o);m&&m.readyState!=="ended"&&i(m);let w=u.on("track",v=>{let y=c?.(o);y&&y.id!==v.id||(i(v),v.addEventListener("ended",()=>{i(null)}))});return()=>{w()}},[o,r]),n}import{jsx as g,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
3
3
  [data-urun-video]{width:100%;height:100%}
4
4
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
5
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -7,4 +7,4 @@ import{forwardRef as j,useCallback as M,useEffect as E,useImperativeHandle as G,
7
7
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
8
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
9
  .urun-video-live .vjs-poster{background-color:transparent}
10
- `,I="urun-video-critical-css";function Q(){if(typeof document>"u"||document.getElementById(I))return;let o=document.createElement("style");o.id=I,o.textContent=K,document.head.appendChild(o)}var X=["playToggle","volumePanel","fullscreenToggle"],Z=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],O=j(function(r,n){let{track:i,stream:u,src:c,type:g="video/mp4",className:w,videoClassName:f,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),v=N(null),[D,h]=Y(!1),_=M(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=M(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(s=>{(s instanceof Error?s.name:String(s))!=="AbortError"&&h(!0)})},[k]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;Q(),k&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=J(e,{controls:A,autoplay:x,muted:k,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?X:Z}});d&&t.addClass("urun-video-live");let s=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),s()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),v.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),v.current&&(v.current.dispose(),v.current=null)}},[d]),E(()=>{if(!S)return;let e=v.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:g}),x&&p()},[S,c,g,x,p]),E(()=>{if(!d)return;let e=v.current;if(!e)return;let t=i??null,s=u??null;!s&&t&&(s=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!s){l.srcObject=null,h(!1);return}l.srcObject=s,p();let a=s.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},L=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",L),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",L))}},[d,i,u,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[m("video",{ref:_,className:["video-js","vjs-default-skin",f].filter(Boolean).join(" "),playsInline:!0}),D&&m("button",{type:"button",onClick:p,"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:U("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:[m("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:m("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},i){let u=V(r);return m(O,{ref:i,...n,track:u})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?m($,{ref:n,...r,name:r.name}):m(O,{ref:n,...r})});export{ee as UrunVideo};
10
+ `,I="urun-video-critical-css";function Q(){if(typeof document>"u"||document.getElementById(I))return;let o=document.createElement("style");o.id=I,o.textContent=K,document.head.appendChild(o)}var X=["playToggle","volumePanel","fullscreenToggle"],Z=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],O=j(function(r,n){let{track:i,stream:u,src:c,type:m="video/mp4",className:w,videoClassName:v,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),f=N(null),[D,h]=Y(!1),_=V(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=V(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(s=>{(s instanceof Error?s.name:String(s))!=="AbortError"&&h(!0)})},[k]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;Q(),k&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=J(e,{controls:A,autoplay:x,muted:k,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?X:Z}});d&&t.addClass("urun-video-live");let s=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),s()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),f.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),f.current&&(f.current.dispose(),f.current=null)}},[d]),E(()=>{if(!S)return;let e=f.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:m}),x&&p()},[S,c,m,x,p]),E(()=>{if(!d)return;let e=f.current;if(!e)return;let t=i??null,s=u??null;!s&&t&&(s=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!s){l.srcObject=null,h(!1);return}l.srcObject=s,p();let a=s.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},z=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",z),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",z))}},[d,i,u,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[g("video",{ref:_,className:["video-js","vjs-default-skin",v].filter(Boolean).join(" "),playsInline:!0}),D&&g("button",{type:"button",onClick:p,"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:U("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:[g("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:g("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},i){let u=M(r);return g(O,{ref:i,...n,track:u})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?g($,{ref:n,...r,name:r.name}):g(O,{ref:n,...r})});export{ee as UrunVideo};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
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.8",
56
+ "@urun-sh/core": "^0.2.9",
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",