@urun-sh/react 0.2.26 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ npm install @urun-sh/react @urun-sh/core
12
12
 
13
13
  ```tsx
14
14
  import '@urun-sh/react/styles.css'
15
- import { UrunProvider, useApp, SessionScope, Camera, Video } from '@urun-sh/react'
15
+ import { UrunProvider, useApp, Session, Camera, Video } from '@urun-sh/react'
16
16
  import { UrunWorkOSProvider } from '@urun-sh/react/workos'
17
17
 
18
18
  function Restyle() {
@@ -20,13 +20,13 @@ function Restyle() {
20
20
  const session = app.generate({ prompt: 'A sunset' })
21
21
 
22
22
  return (
23
- <SessionScope session={session}>
23
+ <Session session={session}>
24
24
  <Camera stream="cam" front /> {/* publish the webcam → the runtime's ctx.stream("cam") */}
25
25
  <Video stream="video" /> {/* render the runtime's video output */}
26
26
  <button onClick={() => session.doc('control').set({ desired: { prompt: { text: 'A forest' } } })}>
27
27
  Restyle
28
28
  </button>
29
- </SessionScope>
29
+ </Session>
30
30
  )
31
31
  }
32
32
 
@@ -75,7 +75,7 @@ For other auth providers, use `UrunAuthProvider` with a `getAccessToken` functio
75
75
  ### Prebaked media components
76
76
 
77
77
  The declarative send/show surface, keyed on the runtime's stream names. Bind one session for
78
- a whole subtree with `<SessionScope session={session}>` (every component also takes an
78
+ a whole subtree with `<Session session={session}>` (every component also takes an
79
79
  explicit `session` prop). They own capture, the persistent `srcObject`, iOS attributes, the
80
80
  autoplay unlock, and front/back switching — hand-rolled `getUserMedia` / `.track` →
81
81
  `srcObject` effects in app code are the anti-pattern.
package/dist/index.d.mts CHANGED
@@ -1,18 +1,27 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { RefObject, ReactNode, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
3
+ import { ReactNode, RefObject, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
4
4
  import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
5
  export { ActivationEvent, ActivationState, 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
 
9
9
  interface UrunProviderProps {
10
- baseUrl: string;
11
- orgId: string;
10
+
11
+ baseUrl?: string;
12
+
13
+ orgId?: string;
14
+
15
+ app?: string;
16
+
12
17
  appId?: string;
13
18
  jwt?: string;
14
19
  authProvider?: string;
15
20
 
21
+ tokenEndpoint?: string;
22
+
23
+ errorFallback?: ReactNode | ((error: Error) => ReactNode);
24
+
16
25
  eventsUrl?: string;
17
26
 
18
27
  sessionKey?: string;
@@ -31,7 +40,7 @@ interface UrunProviderProps {
31
40
  fallback?: ReactNode | ((error: Error) => ReactNode);
32
41
  children: ReactNode;
33
42
  }
34
- declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, eventsUrl, sessionKey, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
43
+ declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
35
44
 
36
45
  interface UrunErrorBoundaryProps {
37
46
  fallback?: ReactNode | ((error: Error) => ReactNode);
@@ -69,6 +78,14 @@ declare function urunPublicEnv(name: string): string | undefined;
69
78
  declare function authMode(): UrunAuthMode;
70
79
  declare function usesWorkOSAuth(): boolean;
71
80
 
81
+ declare const OPERATOR_TOKEN_STORAGE_KEY = "urun.operator_token";
82
+
83
+ declare const OPERATOR_CHORD_LABEL = "\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";
84
+
85
+ declare function readOperatorToken(): string | null;
86
+
87
+ declare function useOperatorOverride(onTrigger: (token: string) => void): void;
88
+
72
89
  type Unsubscribe = () => void;
73
90
  type ReactSessionDocument<T = Record<string, unknown>> = Omit<SessionDocument, 'get' | 'set' | 'on'> & {
74
91
  get(): T;
@@ -406,13 +423,15 @@ interface ScopedSession {
406
423
  onRecovery?(hook: () => void): () => void;
407
424
  }
408
425
 
409
- interface SessionScopeProps {
426
+ interface SessionProps {
410
427
 
411
428
  session: ScopedSession | null;
412
429
  children: ReactNode;
413
430
  }
414
431
 
415
- declare function SessionScope({ session, children }: SessionScopeProps): react_jsx_runtime.JSX.Element;
432
+ declare function Session({ session, children }: SessionProps): react_jsx_runtime.JSX.Element;
433
+
434
+ declare function useSession(): ScopedSession;
416
435
 
417
436
  interface VideoStreamSource {
418
437
 
@@ -1064,4 +1083,4 @@ interface UrunActivationOverlayProps {
1064
1083
 
1065
1084
  declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
1066
1085
 
1067
- export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, 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, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, type SessionIdleState, type SessionRequestOptions, SessionScope, type SessionScopeProps, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, 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, UrunIdleWarning, type UrunIdleWarningProps, 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 UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
1086
+ export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, 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, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, OPERATOR_CHORD_LABEL, OPERATOR_TOKEN_STORAGE_KEY, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, 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, UrunIdleWarning, type UrunIdleWarningProps, 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 UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, readOperatorToken, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
package/dist/index.d.ts CHANGED
@@ -1,18 +1,27 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { RefObject, ReactNode, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
3
+ import { ReactNode, RefObject, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
4
4
  import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
5
  export { ActivationEvent, ActivationState, 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
 
9
9
  interface UrunProviderProps {
10
- baseUrl: string;
11
- orgId: string;
10
+
11
+ baseUrl?: string;
12
+
13
+ orgId?: string;
14
+
15
+ app?: string;
16
+
12
17
  appId?: string;
13
18
  jwt?: string;
14
19
  authProvider?: string;
15
20
 
21
+ tokenEndpoint?: string;
22
+
23
+ errorFallback?: ReactNode | ((error: Error) => ReactNode);
24
+
16
25
  eventsUrl?: string;
17
26
 
18
27
  sessionKey?: string;
@@ -31,7 +40,7 @@ interface UrunProviderProps {
31
40
  fallback?: ReactNode | ((error: Error) => ReactNode);
32
41
  children: ReactNode;
33
42
  }
34
- declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, eventsUrl, sessionKey, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
43
+ declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
35
44
 
36
45
  interface UrunErrorBoundaryProps {
37
46
  fallback?: ReactNode | ((error: Error) => ReactNode);
@@ -69,6 +78,14 @@ declare function urunPublicEnv(name: string): string | undefined;
69
78
  declare function authMode(): UrunAuthMode;
70
79
  declare function usesWorkOSAuth(): boolean;
71
80
 
81
+ declare const OPERATOR_TOKEN_STORAGE_KEY = "urun.operator_token";
82
+
83
+ declare const OPERATOR_CHORD_LABEL = "\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";
84
+
85
+ declare function readOperatorToken(): string | null;
86
+
87
+ declare function useOperatorOverride(onTrigger: (token: string) => void): void;
88
+
72
89
  type Unsubscribe = () => void;
73
90
  type ReactSessionDocument<T = Record<string, unknown>> = Omit<SessionDocument, 'get' | 'set' | 'on'> & {
74
91
  get(): T;
@@ -406,13 +423,15 @@ interface ScopedSession {
406
423
  onRecovery?(hook: () => void): () => void;
407
424
  }
408
425
 
409
- interface SessionScopeProps {
426
+ interface SessionProps {
410
427
 
411
428
  session: ScopedSession | null;
412
429
  children: ReactNode;
413
430
  }
414
431
 
415
- declare function SessionScope({ session, children }: SessionScopeProps): react_jsx_runtime.JSX.Element;
432
+ declare function Session({ session, children }: SessionProps): react_jsx_runtime.JSX.Element;
433
+
434
+ declare function useSession(): ScopedSession;
416
435
 
417
436
  interface VideoStreamSource {
418
437
 
@@ -1064,4 +1083,4 @@ interface UrunActivationOverlayProps {
1064
1083
 
1065
1084
  declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
1066
1085
 
1067
- export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, 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, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, type SessionIdleState, type SessionRequestOptions, SessionScope, type SessionScopeProps, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, 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, UrunIdleWarning, type UrunIdleWarningProps, 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 UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
1086
+ export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, 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, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, OPERATOR_CHORD_LABEL, OPERATOR_TOKEN_STORAGE_KEY, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, 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, UrunIdleWarning, type UrunIdleWarningProps, 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 UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, readOperatorToken, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, 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 Wt=Object.defineProperty;var wn=Object.getOwnPropertyDescriptor;var An=Object.getOwnPropertyNames;var Un=Object.prototype.hasOwnProperty;var Mn=(t,e)=>{for(var r in e)Wt(t,r,{get:e[r],enumerable:!0})},_n=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of An(e))!Un.call(t,n)&&n!==r&&Wt(t,n,{get:()=>e[n],enumerable:!(o=wn(e,n))||o.enumerable});return t};var Nn=t=>_n(Wt({},"__esModule",{value:!0}),t);var ro={};Mn(ro,{Audio:()=>et,Camera:()=>or,ComponentRenderer:()=>Mr,DEFAULT_CAMERA_CONSTRAINTS:()=>nr,DEFAULT_LOG_CAP:()=>ge,DEFAULT_VOICE_CONSTRAINTS:()=>er,DocPatchForm:()=>nt,Image:()=>Kr,ImageFrame:()=>qr,ImageFrameSchema:()=>Vr,MetricsPanel:()=>Wr,MetricsPanelSchema:()=>Fr,Mic:()=>en,ProgressCard:()=>Nr,ProgressCardSchema:()=>_r,SessionScope:()=>Br,StatusBadge:()=>Lr,StatusBadgeSchema:()=>Ir,TextStream:()=>Or,TextStreamSchema:()=>Dr,UrunActivationOverlay:()=>It,UrunAudio:()=>Gr,UrunAuthProvider:()=>Ht,UrunCamera:()=>tn,UrunControlSender:()=>dn,UrunDocPanel:()=>un,UrunErrorBoundary:()=>we,UrunEventSpine:()=>pn,UrunIdleWarning:()=>kn,UrunJwtProvider:()=>gr,UrunProvider:()=>vr,UrunSessionClock:()=>hn,UrunSessionEnded:()=>yn,UrunSessionGate:()=>gn,UrunSessionStatus:()=>Sn,UrunSessionWaking:()=>Mt,UrunStreamTail:()=>cn,UrunVoice:()=>Zr,Video:()=>ft,Voice:()=>tt,authMode:()=>Ke,createDocStore:()=>Ct,describeSessionPhase:()=>Ot.describeSessionPhase,formatPayload:()=>qe,getUrunAudioContext:()=>Ze,isWakingPhase:()=>Ot.isWakingPhase,parseJsonObject:()=>xt,pushCapped:()=>de,registerComponent:()=>Ar,resumeUrunAudioContext:()=>Qe,urunPublicEnv:()=>ce,useActivation:()=>_t,useApp:()=>kr,useChat:()=>Rr,useCompletion:()=>Pr,useDocStore:()=>Ve,useImageFrame:()=>Yt,useInputPresence:()=>Er,useMetricsPanel:()=>Zt,useProgressCard:()=>zt,useRequest:()=>br,useSessionDoc:()=>an,useSessionEndsAt:()=>sr,useSessionIdle:()=>ar,useSessionPhase:()=>ee,useSessionTrack:()=>rn,useSessionWake:()=>Ut,useStatusBadge:()=>Xt,useStreamMessages:()=>Rt,useTextStream:()=>Gt,useUrunAudioLevel:()=>yt,useUrunAuth:()=>ut,useUrunPrewake:()=>Cn,usesWorkOSAuth:()=>fr});module.exports=Nn(ro);var Me=require("react");var pr=require("react"),je=require("react/jsx-runtime"),we=class extends pr.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,je.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,je.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,je.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var mr=require("react"),Ae=(0,mr.createContext)(null);function ke(t){return t&&t.trim()?t.trim():void 0}function ce(t){switch(t){case"NEXT_PUBLIC_AUTH_MODE":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ke(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ke(typeof process<"u"?process.env?.[t]:void 0)}}function Ke(){let t=ce("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return t==="jwt"||t==="customer-jwt"||t==="test-jwt"?"jwt":t==="workos"||ce("VERCEL_ENV")==="production"?"workos":ce("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function fr(){return Ke()==="workos"}var Ue=require("react"),hr=require("react/jsx-runtime"),Sr=(0,Ue.createContext)(null);function Ht({getAccessToken:t,children:e}){let r=(0,Ue.useMemo)(()=>({getAccessToken:t}),[t]);return(0,hr.jsx)(Sr.Provider,{value:r,children:e})}var gr=Ht;function ut(){return(0,Ue.useContext)(Sr)}var lt=require("react/jsx-runtime");function vr({baseUrl:t,orgId:e,appId:r,jwt:o,authProvider:n,eventsUrl:s,sessionKey:a,fallback:i,children:c}){if(typeof e!="string"||e.trim().length===0)throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider.");let[u,f]=(0,Me.useState)(),l=ut(),v=ce("NEXT_PUBLIC_SESSION_TOKEN")??ce("NEXT_PUBLIC_URUN_JWT"),C=Ke(),k=C==="workos"&&!o,y=o??(C==="jwt"?v:void 0)??u,b=n??ce("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=k&&!y,R=(0,Me.useMemo)(()=>({appId:r,baseUrl:t,orgId:e,jwt:y,getAccessToken:k?l?.getAccessToken:void 0,authProvider:b,eventsUrl:s,sessionKey:a}),[r,l,t,b,y,s,e,a,k]);return(0,Me.useEffect)(()=>{if(!k||!l)return;let P=!1,E=l;async function g(){try{let D=await E.getAccessToken();P||f(D??void 0)}catch{P||f(void 0)}}g();let w=window.setInterval(()=>{g()},6e4);return()=>{P=!0,window.clearInterval(w)}},[l,k]),(0,lt.jsx)(we,{fallback:i,children:S?(0,lt.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,lt.jsx)(Ae.Provider,{value:R,children:c})})}var Z=require("react"),yr=require("@urun-sh/core");function In(t,e){return`${t}:${JSON.stringify(e??{})}`}function Ln(t,e,r){return JSON.stringify({appId:t.appId,baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,authProvider:t.authProvider,sessionKey:t.sessionKey,fnName:e,args:r??{}})}var _e=new Map;var Bt=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,o=>r(o))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,a=>{s(a),o()})}}dispose(){this._unsubscribeChange()}},$t=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},jt=class{constructor(e,r,o){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(e){let r=!1,o=!1,n=i=>{fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let c=i.error,u=c?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.httpStatus}})}else i.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}onDiagnostic(e){return this._session.onDiagnostic(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new Bt(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new $t(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}async end(){let e=await this._session.end();return this._disposeHandle(),e}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function kr(){let t=(0,Z.useContext)(Ae);if(!t)throw new Error("useApp must be used within <UrunProvider>");if(!t.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,Z.useReducer)(s=>s+1,0),r=(0,Z.useRef)(new Map),o=(0,Z.useRef)(new Map),n=(0,Z.useMemo)(()=>(0,yr.App)(t.appId,{baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,getAccessToken:t.getAccessToken,authProvider:t.authProvider,sessionKey:t.sessionKey}),[t.appId,t.baseUrl,t.orgId,t.jwt,t.getAccessToken,t.authProvider,t.sessionKey]);return(0,Z.useEffect)(()=>()=>{for(let[s,a]of o.current){let i=_e.get(s);i===a&&(i.handle.removeNotifier(e),i.refCount=Math.max(0,i.refCount-1),i.refCount===0&&(i.disposeTimer=setTimeout(()=>{let c=_e.get(s);!c||c.refCount!==0||(_e.delete(s),c.handle.disconnect())},0)))}o.current.clear(),r.current.clear()},[]),(0,Z.useMemo)(()=>new Proxy({},{get(s,a){if(typeof a=="string")return i=>{let c=In(a,i),u=r.current.get(c);if(u&&!u.disposed)return u;let f=Ln(t,a,i),l=_e.get(f);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),_e.delete(f),o.current.get(f)===l&&o.current.delete(f),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new jt(n[a](i),e,t.eventsUrl),refCount:0,disposeTimer:null},_e.set(f,l)),o.current.get(f)!==l&&(o.current.set(f,l),l.handle.addNotifier(e),l.refCount+=1),r.current.set(c,l.handle),l.handle}}}),[t,n])}var W=require("react");function Ne(t){let e=t;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function Dn(t){return t instanceof Error?t:new Error(String(t))}function br(t,e){let r=(0,W.useMemo)(()=>Ne(t),[t]),[o,n]=(0,W.useState)(void 0),[s,a]=(0,W.useState)(null),[i,c]=(0,W.useState)(!1),u=(0,W.useRef)(e);u.current=e;let f=(0,W.useRef)(0),l=(0,W.useRef)(null),v=(0,W.useRef)(!0);(0,W.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=(0,W.useCallback)(async b=>{l.current?.abort();let S=new AbortController;l.current=S;let R=++f.current,P=()=>v.current&&f.current===R;P()&&(c(!0),a(null));try{let E=await r.request(b,{...u.current,signal:S.signal});return P()&&(n(E),c(!1),u.current?.onSuccess?.(E)),E}catch(E){let g=Dn(E);throw P()&&(a(g),c(!1),u.current?.onError?.(g)),g}},[r]),k=(0,W.useCallback)(b=>{C(b).catch(()=>{})},[C]),y=(0,W.useCallback)(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),a(null),c(!1)},[]);return{mutate:k,mutateAsync:C,data:o,error:s,isPending:i,reset:y}}var B=require("react");function Cr(t){return t instanceof Error?t:new Error(String(t))}var On=t=>typeof t=="string"?t:String(t);function Pr(t,e){let r=(0,B.useMemo)(()=>Ne(t),[t]),[o,n]=(0,B.useState)(""),[s,a]=(0,B.useState)(!1),[i,c]=(0,B.useState)(null),u=(0,B.useRef)(e);u.current=e;let f=(0,B.useRef)(0),l=(0,B.useRef)(null),v=(0,B.useRef)(!0);(0,B.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=(0,B.useCallback)(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&a(!1)},[]),k=(0,B.useCallback)(async y=>{l.current?.cancel();let b=++f.current,S=()=>v.current&&f.current===b,R=u.current,P=R?.parseChunk??On,E=R?.buildPayload??(m=>({prompt:m}));S()&&(n(""),c(null),a(!0));let{parseChunk:g,buildPayload:w,onFinish:D,onError:U,...M}=R??{},d="",p;try{p=r.requestStream(E(y),M),l.current=p}catch(m){let x=Cr(m);S()&&(c(x),a(!1),R?.onError?.(x));return}try{for await(let m of p){if(f.current!==b)break;d+=P(m),S()&&n(d)}S()&&(a(!1),R?.onFinish?.(d))}catch(m){let x=Cr(m);S()&&(c(x),a(!1),R?.onError?.(x))}finally{l.current===p&&(l.current=null)}},[r]);return{completion:o,complete:k,stop:C,isStreaming:s,error:i}}var F=require("react");function xr(t){return t instanceof Error?t:new Error(String(t))}var Vn=t=>typeof t=="string"?t:String(t),Tr=0;function Kt(t){return Tr+=1,`${t}-${Tr}`}function Rr(t,e){let r=(0,F.useMemo)(()=>Ne(t),[t]),[o,n]=(0,F.useState)(()=>(e?.initialMessages??[]).map(P=>({id:P.id??Kt("msg"),role:P.role,content:P.content}))),[s,a]=(0,F.useState)(""),[i,c]=(0,F.useState)(!1),[u,f]=(0,F.useState)(null),l=(0,F.useRef)(e);l.current=e;let v=(0,F.useRef)(o);v.current=o;let C=(0,F.useRef)(s);C.current=s;let k=(0,F.useRef)(0),y=(0,F.useRef)(null),b=(0,F.useRef)(!0);(0,F.useEffect)(()=>(b.current=!0,()=>{b.current=!1,y.current?.cancel(),y.current=null}),[]);let S=(0,F.useCallback)(()=>{k.current++,y.current?.cancel(),y.current=null,b.current&&c(!1)},[]),R=(0,F.useCallback)(async P=>{let E=P===void 0,g=(E?C.current:P)??"";if(!g.trim())return;y.current?.cancel();let D=++k.current,U=()=>b.current&&k.current===D,M=l.current,d=M?.parseChunk??Vn,p={id:Kt("msg"),role:"user",content:g},m={id:Kt("msg"),role:"assistant",content:""},x=[...v.current,p].map(K=>({role:K.role,content:K.content})),L=[...v.current,p,m];v.current=L,n(L),E&&a(""),f(null),c(!0);let z=M?.buildPayload??(K=>({messages:K})),{initialMessages:A,parseChunk:h,buildPayload:q,onFinish:$,onError:X,...j}=M??{},me=K=>{n(ie=>ie.map(Te=>Te.id===m.id?{...Te,content:K}:Te))},fe="",se;try{se=r.requestStream(z(x),j),y.current=se}catch(K){let ie=xr(K);U()&&(f(ie),c(!1),M?.onError?.(ie));return}try{for await(let K of se){if(k.current!==D)break;fe+=d(K),U()&&me(fe)}U()&&(c(!1),M?.onFinish?.({...m,content:fe}))}catch(K){let ie=xr(K);U()&&(f(ie),c(!1),M?.onError?.(ie))}finally{y.current===se&&(y.current=null)}},[r]);return{messages:o,input:s,setInput:a,sendMessage:R,stop:S,isStreaming:i,error:u}}var V=require("react"),Ie=require("@urun-sh/core"),Jt=[];function Er(t,e={}){let{field:r=Ie.INPUT_PRESENCE_FIELD,hz:o=Ie.INPUT_PRESENCE_DEFAULT_HZ}=e,n=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=t?.presence??null,a=(0,V.useMemo)(()=>s?(0,Ie.createInputPresencePublisher)({awareness:{setLocalStateField:(g,w)=>s.setField(g,w)},field:r,hz:o}):null,[s,r,o]),i=(0,V.useRef)(null);i.current=a;let[c,u]=(0,V.useState)(!1),[f,l]=(0,V.useState)(Jt),v=(0,V.useRef)(!1);(0,V.useEffect)(()=>{if(a)return()=>a.dispose()},[a]);let C=(0,V.useCallback)(()=>{let g=i.current;l(g?g.heldKeys():Jt)},[]),k=(0,V.useCallback)(()=>{i.current?.clear(),l(Jt)},[]);(0,V.useEffect)(()=>{if(!n)return;let g=()=>!!n.pointerLockElement,w=()=>{if(g()){v.current=!1,u(!0);return}v.current||(u(!1),k())},D=m=>{g()&&(i.current?.keyDown(m.key),C())},U=m=>{i.current?.keyUp(m.key),C()},M=m=>{g()&&i.current?.movePointer(m.movementX,m.movementY)},d=m=>{g()&&i.current?.setButtons(m.buttons)},p=()=>{k()};return n.addEventListener("pointerlockchange",w),n.addEventListener("keydown",D),n.addEventListener("keyup",U),n.addEventListener("mousemove",M),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",p),()=>{n.removeEventListener("pointerlockchange",w),n.removeEventListener("keydown",D),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",M),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",p)}},[n,k,C]);let y=(0,V.useCallback)(g=>{g.requestPointerLock?.()},[]),b=(0,V.useCallback)(()=>{v.current=!0,u(!0)},[]),S=(0,V.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),k()},[n,k]),R=(0,V.useCallback)(g=>{i.current?.keyDown(g),C()},[C]),P=(0,V.useCallback)(g=>{i.current?.keyUp(g),C()},[C]),E=(0,V.useCallback)((g,w)=>{i.current?.movePointer(g,w)},[]);return{engage:y,engageTouch:b,release:S,engaged:c,heldKeys:f,pressKey:R,releaseKey:P,movePointer:E}}var wr=new Map;function Ar(t,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${t}"): schema must be a valid Zod schema`);wr.set(t,{component:e,schema:r})}function Ur(t,e){let r=wr.get(t);if(!r)return{error:`Unknown component: "${t}"`};let o=r.schema.safeParse(e);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${t}": ${o.error.message}`}}var be=require("react/jsx-runtime");function Mr({name:t,props:e,fallback:r}){let o=Ur(t,e);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,be.jsx)(be.Fragment,{children:r}):(0,be.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,be.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,be.jsx)(n,{...o.validatedProps})}var Le=require("zod"),Ce=require("react/jsx-runtime"),_r=Le.z.object({step:Le.z.number().min(0),total:Le.z.number().min(1),label:Le.z.string().optional(),variant:Le.z.enum(["default","success","error"]).default("default")});function zt(t){let{step:e,total:r,label:o,variant:n="default"}=t,s=Math.min(e/r*100,100),a=e>=r;return{step:e,total:r,label:o,variant:n,percentage:s,isComplete:a}}function Nr(t){let{step:e,total:r,label:o,variant:n,percentage:s}=zt(t);return(0,Ce.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Ce.jsx)("div",{className:"urun-progress-label",children:o}),(0,Ce.jsx)("div",{className:"urun-progress-bar",children:(0,Ce.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Ce.jsxs)("div",{className:"urun-progress-text",children:[e,"/",r]})]})}var dt=require("zod"),Je=require("react/jsx-runtime"),Ir=dt.z.object({state:dt.z.enum(["thinking","generating","idle","error"]),message:dt.z.string().optional()}),qn={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Xt(t){let{state:e,message:r}=t,o=e==="thinking"||e==="generating",n=r??qn[e]??e;return{state:e,message:n,isActive:o}}function Lr(t){let{state:e,message:r,isActive:o}=Xt(t);return(0,Je.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,Je.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Je.jsx)("span",{className:"urun-status-message",children:r})]})}var ze=require("react"),pt=require("zod"),Xe=require("react/jsx-runtime"),Dr=pt.z.object({text:pt.z.string(),streaming:pt.z.boolean().default(!1)});function Gt(t){let{text:e,streaming:r=!1}=t,o=e.length===0;return{text:e,streaming:r,isEmpty:o}}function Or(t){let{text:e,streaming:r}=Gt(t),o=(0,ze.useRef)(null),n=(0,ze.useRef)(0);return(0,ze.useEffect)(()=>{let s=o.current;s&&e.length!==n.current&&(s.textContent=e,n.current=e.length)},[e]),(0,Xe.jsxs)("div",{className:"urun-text-stream",children:[(0,Xe.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Xe.jsx)("span",{className:"urun-text-cursor"})]})}var Ge=require("zod"),Ye=require("react/jsx-runtime"),Vr=Ge.z.object({src:Ge.z.string().url(),alt:Ge.z.string().optional(),caption:Ge.z.string().optional()});function Yt(t){let{src:e,alt:r,caption:o}=t;return{src:e,alt:r??"",caption:o}}function qr(t){let{src:e,alt:r,caption:o}=Yt(t);return(0,Ye.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ye.jsx)("img",{className:"urun-image",src:e,alt:r}),o&&(0,Ye.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var ue=require("zod"),De=require("react/jsx-runtime"),Fr=ue.z.object({metrics:ue.z.array(ue.z.object({label:ue.z.string(),value:ue.z.union([ue.z.string(),ue.z.number()]),unit:ue.z.string().optional()}))});function Zt(t){return{metrics:t.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Wr(t){let{metrics:e}=Zt(t);return(0,De.jsx)("div",{className:"urun-metrics-panel",children:e.map((r,o)=>(0,De.jsxs)("div",{className:"urun-metric-card",children:[(0,De.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,De.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var mt=require("react"),$r=require("react/jsx-runtime"),Hr=(0,mt.createContext)(null);function Br({session:t,children:e}){return(0,$r.jsx)(Hr.Provider,{value:t,children:e})}function oe(){return(0,mt.useContext)(Hr)}var H=require("react");var St=require("react/jsx-runtime"),Fn=1e3;function Wn(...t){console.debug("[video]",...t)}var ft=(0,H.forwardRef)(function(e,r){let{session:o,stream:n="video",track:s,muted:a=!0,mirror:i=!1,objectFit:c="contain",className:u,style:f,videoClassName:l,placeholder:v,children:C,onTrack:k}=e,y=oe(),b=o??y,S=(0,H.useRef)(null),R=(0,H.useRef)(null),[P,E]=(0,H.useState)(!1),g=(0,H.useRef)(k);g.current=k;let w=(0,H.useCallback)(()=>{if(typeof MediaStream>"u")return null;R.current||(R.current=new MediaStream);let p=S.current;return p&&p.srcObject!==R.current&&(p.srcObject=R.current),R.current},[]),D=(0,H.useCallback)(p=>{let m=S.current;if(!m)return;let x=m.play();!x||typeof x.catch!="function"||x.catch(L=>Wn(`play() failed (${p})`,L))},[]),U=(0,H.useCallback)(p=>{let m=w();if(m){for(let x of m.getVideoTracks())x!==p&&m.removeTrack(x);if(p&&!m.getVideoTracks().includes(p)){m.addTrack(p);let x=S.current;x&&(x.srcObject=m)}p&&D("track-attach"),E(p!==null),g.current?.(p)}},[w,D]),M=(0,H.useCallback)(p=>{S.current=p,p&&(a&&(p.muted=!0,p.defaultMuted=!0,p.setAttribute("muted","")),p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),w())},[w,a]);(0,H.useImperativeHandle)(r,()=>({get element(){return S.current},get live(){return R.current?R.current.getVideoTracks().length>0:!1}}),[]);let d=s!==void 0;return(0,H.useEffect)(()=>{if(d){U(s??null);return}if(!b)return;let p=b.stream(n),m=()=>{let h=R.current;return h?h.getVideoTracks()[0]??null:null},x=h=>{if(h!==m()&&(U(h),h)){let q=()=>{m()===h&&U(null)};h.addEventListener("ended",q)}},L=p.track;L&&L.readyState==="live"&&x(L);let z=p.on("track",h=>{h&&h.readyState!=="live"||x(h)}),A=setInterval(()=>{let h=p.track;h&&h.readyState==="live"&&x(h)},Fn);return()=>{z(),clearInterval(A)}},[b,n,d,s,U]),(0,St.jsxs)("div",{className:u,style:{position:"relative",width:"100%",height:"100%",...f},"data-urun-video":"","data-urun-video-live":P?"true":"false",children:[(0,St.jsx)("video",{ref:M,className:l,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...i?{transform:"scaleX(-1)"}:{}}}),P?null:v,C]})});var jr=require("react");var Jr=require("react/jsx-runtime"),Kr=(0,jr.forwardRef)(function(e,r){let{stream:o="image",...n}=e;return(0,Jr.jsx)(ft,{ref:r,stream:o,...n})});var I=require("react"),Xr=require("@urun-sh/core");var gt=null;function Hn(){if(typeof window>"u")return null;let t=window;return t.AudioContext??t.webkitAudioContext??null}function Ze(){if(gt)return gt;let t=Hn();return t?(gt=new t,gt):null}function Qe(){let t=Ze();t&&t.state==="suspended"&&t.resume().catch(()=>{})}var Yr=require("react/jsx-runtime"),Bn=1e3,zr=200;function Qt(...t){console.debug("[audio]",...t)}var et=(0,I.forwardRef)(function(e,r){let{session:o,stream:n="audio",track:s,controls:a=!1,className:i,onTrack:c,onUnlockChange:u,onAudioElement:f}=e,l=oe(),v=o??l,C=(0,I.useRef)(null),k=(0,I.useRef)(null),y=(0,I.useRef)(null),b=(0,I.useRef)(null),S=(0,I.useRef)(c);S.current=c;let R=(0,I.useRef)(u);R.current=u;let P=(0,I.useCallback)(d=>{y.current!==d&&(y.current=d,R.current?.(d))},[]),E=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let d=C.current;return d&&d.srcObject!==k.current&&(d.srcObject=k.current),k.current},[]),g=(0,I.useCallback)(d=>{let p=C.current;if(!p)return;let m=p.play();!m||typeof m.then!="function"||m.then(()=>{p.muted||P(!0)}).catch(x=>{let L=x instanceof Error?x.name:String(x);if(L==="AbortError"){Qt(`play() aborted (${d}); retrying in ${zr}ms`),b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{b.current=null,g(`${d}:retry`)},zr);return}if(L==="NotAllowedError"){Qt(`play() blocked pending a user gesture (${d})`),P(!1);return}Qt(`play() failed (${d})`,x)})},[P]),w=(0,I.useCallback)(d=>{let p=E();if(p){for(let m of p.getAudioTracks())m!==d&&p.removeTrack(m);d&&!p.getAudioTracks().includes(d)&&p.addTrack(d),d&&g("track-attach"),S.current?.(d)}},[E,g]),D=(0,I.useCallback)(()=>{let d=C.current;d&&(E(),d.muted=!1,g("gesture"),Qe(),P(!0))},[E,g,P]);(0,I.useImperativeHandle)(r,()=>({unlock:D,get unlocked(){return y.current===!0},get element(){return C.current}}),[D]);let U=(0,I.useCallback)(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),E()),f?.(d)},[E,f]),M=s!==void 0;return(0,I.useEffect)(()=>{if(M){w(s??null);return}if(!v)return;let d=v.stream(n),p=()=>{let A=k.current;return A?A.getAudioTracks()[0]??null:null},m=A=>{if(A!==p()&&(w(A),A)){let h=()=>{p()===A&&w(null)};A.addEventListener("ended",h)}},x=d.track;x&&x.readyState==="live"&&m(x);let L=d.on("track",A=>{A&&A.readyState!=="live"||m(A)}),z=setInterval(()=>{let A=d.track;A&&A.readyState==="live"&&m(A)},Bn);return()=>{L(),clearInterval(z)}},[v,n,M,s,w]),(0,I.useEffect)(()=>(0,Xr.observePageLifecycle)(()=>{Qe(),y.current===!0&&g("foreground")}),[g]),(0,I.useEffect)(()=>()=>{b.current&&clearTimeout(b.current)},[]),(0,Yr.jsx)("audio",{ref:U,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})}),Gr=et;var N=require("react"),Oe=require("@urun-sh/core");var Qr=require("react/jsx-runtime"),er={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ht(...t){console.debug("[voice]",...t)}var tt=(0,N.forwardRef)(function(e,r){let{session:o,stream:n="audio",playback:s=!0,constraints:a=er,connectTimeoutMs:i,attempts:c=3,retryDelayMs:u=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:C,onUnlockChange:k,capture:y}=e,b=oe(),S=o??b,R=(0,N.useRef)(null),P=(0,N.useRef)(null),E=(0,N.useRef)(null),g=(0,N.useRef)([]),w=(0,N.useRef)(!1),D=(0,N.useRef)(f);D.current=f;let U=(0,N.useRef)(l);U.current=l;let M=(0,N.useRef)(v);M.current=v;let d=(0,N.useCallback)(h=>{w.current!==h&&(w.current=h,D.current?.(h))},[]),p=(0,N.useCallback)(()=>{for(let h of g.current)h();g.current=[],E.current?.release(),E.current=null,P.current&&(P.current=null,M.current?.(null))},[]),m=(0,N.useCallback)(async()=>{let h=E.current;if(h){let j=await h.update(a);return P.current=h.stream,M.current?.(h.stream),j}let $=await(y??(0,Oe.sharedCaptureController)()).claim("audio",a);E.current=$,g.current=[$.onTrack((j,me)=>{P.current=me,M.current?.(me),w.current&&S?.stream(n).attach(j).catch(fe=>ht("mic re-attach after one-capture re-acquire failed",fe))}),$.onLost(j=>{E.current=null,g.current=[],P.current=null,M.current?.(null),d(!1),U.current?.(j)})],P.current=$.stream,M.current?.($.stream);let X=$.track;if(!X)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return X},[y,a,S,n,d]),x=(0,N.useCallback)(async()=>{p(),d(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,p,d]),L=(0,N.useCallback)(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <SessionScope>");R.current?.unlock();let h;try{h=await m()}catch(X){p();let j=(0,Oe.sessionFailureFromMediaError)(X,S.status);throw U.current?.(j),j}S.connect?.();let q;for(let X=1;X<=c;X++)try{await S.whenLive(i!==void 0?{timeout:i}:void 0),await S.stream(n).attach(h),d(!0);return}catch(j){q=j,ht(`start attempt ${X}/${c} failed`,j),X<c&&await new Promise(me=>setTimeout(me,u))}p(),d(!1);let $=q instanceof Error?q:new Error(String(q??"voice start failed"));throw U.current?.($),$},[S,n,i,c,u,m,p,d]);(0,N.useImperativeHandle)(r,()=>({start:L,stop:x,unlock:()=>R.current?.unlock(),get active(){return w.current},get micStream(){return P.current},get audio(){return R.current}}),[L,x]);let z=(0,N.useRef)(!1),A=(0,N.useCallback)(async()=>{if(!S||!w.current||z.current)return;let h=P.current?.getAudioTracks()[0]??null;if(h&&h.readyState==="live"){try{await S.stream(n).attach(h)}catch(q){ht("foreground mic re-assert failed (will retry on next pass)",q)}return}z.current=!0;try{let q=await m();await S.stream(n).attach(q)}catch(q){let $=q instanceof Error?q:new Error(String(q));ht("foreground mic re-acquire failed",$),U.current?.($)}finally{z.current=!1}},[S,n,m]);return(0,N.useEffect)(()=>{let h=()=>{A()};return S&&typeof S.onRecovery=="function"?S.onRecovery(h):(0,Oe.observePageLifecycle)(h)},[S,A]),(0,N.useEffect)(()=>p,[p]),s?(0,Qr.jsx)(et,{ref:R,session:S,stream:n,onTrack:C,onUnlockChange:k}):null}),Zr=tt;var re=require("react");var vt=require("react");var tr={level:0,speaking:!1};function yt(t,e={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=e,[s,a]=(0,vt.useState)(tr);return(0,vt.useEffect)(()=>{if(!t){a(tr);return}let i=Ze();if(!i||typeof MediaStream>"u")return;let c;t instanceof MediaStream?c=t:(c=new MediaStream,c.addTrack(t));let u,f;try{u=i.createMediaStreamSource(c),f=i.createAnalyser(),f.fftSize=r,u.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),C=setInterval(()=>{f.getByteTimeDomainData(l);let k=0;for(let b=0;b<l.length;b++){let S=(l[b]-128)/128;k+=S*S}let y=Math.sqrt(k/l.length);a(b=>{let S=y>n;return Math.abs(b.level-y)<.005&&b.speaking===S?b:{level:y,speaking:S}})},o);return()=>{clearInterval(C),u.disconnect(),a(tr)}},[t,r,o,n]),s}var le=require("react/jsx-runtime"),$n={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},jn={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},en=(0,re.forwardRef)(function(e,r){let{session:o,stream:n="audio",constraints:s,autoStart:a=!0,visible:i=!1,className:c,onActiveChange:u,onError:f,onMicStream:l,capture:v}=e,C=oe(),k=o??C,y=(0,re.useRef)(null),[b,S]=(0,re.useState)(null),R=(0,re.useRef)(l);R.current=l;let{level:P,speaking:E}=yt(i?b:null);return(0,re.useImperativeHandle)(r,()=>({start:()=>{let g=y.current;return g?g.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>y.current?.stop()??Promise.resolve(),get active(){return y.current?.active??!1},get micStream(){return y.current?.micStream??null}}),[]),(0,re.useEffect)(()=>{!a||!k||y.current?.start().catch(()=>{})},[a,k]),(0,le.jsxs)(le.Fragment,{children:[(0,le.jsx)(tt,{ref:y,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:u,onError:f,onMicStream:g=>{S(g),R.current?.(g)}}),i?(0,le.jsx)("span",{className:c,style:$n,"data-urun-mic":"","data-urun-mic-active":b?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(P*100)/100,children:(0,le.jsx)("span",{style:jn,children:(0,le.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(P*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var kt=require("@urun-sh/core"),T=require("react");var Q=require("react/jsx-runtime"),nr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function rr(...t){console.debug("[camera]",...t)}function Kn(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Jn(){let t=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof t?.enumerateDevices!="function")return null;try{return(await t.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var or=(0,T.forwardRef)(function(e,r){let{session:o,stream:n="video",constraints:s,front:a=!1,back:i=!1,facingMode:c,autoStart:u=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:k,onActiveChange:y,onError:b,onStream:S,onTrack:R,children:P,capture:E,flipControl:g="auto",flipControlClassName:w,onDevices:D}=e;if(a&&i)throw new Error("<Camera> takes `front` OR `back`, not both");let U=a?"user":i?"environment":c??"environment",M=oe(),d=o??M,p=(0,T.useRef)(null),m=(0,T.useRef)(null),x=(0,T.useRef)(null),L=(0,T.useRef)([]),z=(0,T.useRef)(null),A=(0,T.useRef)(!1),h=(0,T.useRef)(U),[q,$]=(0,T.useState)(U),[X,j]=(0,T.useState)(!1),[me,fe]=(0,T.useState)(null),[se,K]=(0,T.useState)(!1),[ie]=(0,T.useState)(Kn),Te=(0,T.useRef)(y);Te.current=y;let st=(0,T.useRef)(b);st.current=b;let Vt=(0,T.useRef)(S);Vt.current=S;let it=(0,T.useRef)(R);it.current=R;let cr=(0,T.useRef)(D);cr.current=D;let Se=(0,T.useCallback)(_=>{A.current!==_&&(A.current=_,j(_),Te.current?.(_))},[]);(0,T.useEffect)(()=>{if(!X){fe(null);return}let _=!1,O=()=>{Jn().then(Y=>{_||(fe(Y),Y&&cr.current?.(Y))})};O();let J=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof J?.addEventListener=="function"?(J.addEventListener("devicechange",O),()=>{_=!0,J.removeEventListener?.("devicechange",O)}):()=>{_=!0}},[X]);let at=(0,T.useCallback)(_=>{let O=p.current;O&&(O.muted=!0,O.defaultMuted=!0,O.setAttribute("muted",""),O.setAttribute("playsinline",""),O.setAttribute("webkit-playsinline",""),O.srcObject=_,_&&O.play()?.catch?.(J=>rr("preview play() failed",J)))},[]),ae=(0,T.useCallback)(()=>{z.current?.(),z.current=null;for(let _ of L.current)_();L.current=[],x.current?.release(),x.current=null,m.current&&(m.current=null,Vt.current?.(null),it.current?.(null)),at(null)},[at]),qt=(0,T.useCallback)((_,O)=>{z.current?.(),m.current=O,at(O),Vt.current?.(O);let J=()=>{m.current===O&&(rr("camera track ended (device removed or permission revoked)"),ae(),Se(!1))};_.addEventListener("ended",J),z.current=()=>_.removeEventListener("ended",J)},[at,ae,Se]),Re=(0,T.useCallback)(async _=>{if(!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <SessionScope>");let O={...nr,...s,facingMode:_},J;try{let Y=x.current;if(Y)J=await Y.update(O);else{let Be=await(E??(0,kt.sharedCaptureController)()).claim("video",O);if(x.current=Be,L.current=[Be.onTrack(($e,Rn)=>{qt($e,Rn),A.current&&d.stream(n).attachVideo($e).then(()=>it.current?.($e)).catch(En=>rr("camera re-publish after one-capture re-acquire failed",En))}),Be.onLost($e=>{x.current=null,L.current=[],ae(),Se(!1),st.current?.($e)})],!Be.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});J=Be.track}}catch(Y){let Ee=(0,kt.sessionFailureFromMediaError)(Y,d.status);throw st.current?.(Ee),Ee}h.current=_,$(_),qt(J,x.current?.stream??new MediaStream([J]));try{d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(J)}catch(Y){ae(),Se(!1);let Ee=Y instanceof Error?Y:new Error(String(Y));throw st.current?.(Ee),Ee}it.current?.(J),Se(!0)},[d,n,s,l,E,qt,ae,Se]),ur=(0,T.useCallback)(_=>Re(_?.facingMode??h.current),[Re]),ct=(0,T.useCallback)(async _=>{A.current&&h.current===_||await Re(_)},[Re]),Ft=(0,T.useCallback)(()=>Re(h.current==="environment"?"user":"environment"),[Re]),lr=(0,T.useCallback)(async()=>{ae(),Se(!1),await d?.stream(n).detachVideo().catch(()=>{})},[d,n,ae,Se]);(0,T.useImperativeHandle)(r,()=>({start:ur,stop:lr,flip:Ft,setFacingMode:ct,get active(){return A.current},get facingMode(){return h.current},get stream(){return m.current},get element(){return p.current}}),[ur,lr,Ft,ct]);let dr=(0,T.useRef)(ct);if(dr.current=ct,(0,T.useEffect)(()=>{!u||!d||dr.current(U).catch(()=>{})},[u,d,U]),(0,T.useEffect)(()=>ae,[ae]),!v)return null;let Pn=f==="auto"?q==="user":f,xn=X&&(g===!0||g==="auto"&&ie&&(me?.length??0)>1),Tn=()=>{se||(K(!0),Ft().catch(()=>{}).finally(()=>K(!1)))};return(0,Q.jsxs)("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[(0,Q.jsx)("video",{ref:p,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Pn?{transform:"scaleX(-1)"}:{}}}),xn?(0,Q.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Tn,disabled:se,className:w,style:w?{opacity:se?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:se?.6:1},children:(0,Q.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,Q.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,Q.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,Q.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,Q.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,Q.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,P]})}),tn=(0,T.forwardRef)(function({preview:e=!0,...r},o){return(0,Q.jsx)(or,{ref:o,...r,visible:e,autoStart:!1})});var bt=require("react");function rn(t,e){let[r,o]=(0,bt.useState)(null);return(0,bt.useEffect)(()=>{if(!t||!e){o(null);return}let n=t.stream(e);return o(n.track),n.on("track",o)},[t,e]),r}var sn=require("react");var Pt=require("react");var nn=require("zustand/vanilla"),on=require("zustand"),zn=()=>{};function Ct(t,e={}){let r=u=>{t?.set(u)},o=()=>t?t.get()??{}:{},n=(0,nn.createStore)(()=>({doc:o(),synced:t?t.synced:!1,set:r})),s=null,a=()=>{if(s){for(let u of s)u();s=null}},i=()=>t?(s||(n.setState({doc:o(),synced:t.synced}),s=[t.on("change",u=>n.setState({doc:u})),t.onSynced(()=>n.setState({synced:!0}))]),a):zn,c=(u=>(0,on.useStore)(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:i,unbind:a}),e.bind!==!1&&i(),c}function Ve(t,e){let r=(0,Pt.useMemo)(()=>Ct(t&&e?t.doc(e):null,{bind:!1}),[t,e]);return(0,Pt.useEffect)(()=>r.bind(),[r]),r}function an(t,e,r){let n=Ve(t,e)(r??(i=>i)),s=(0,sn.useCallback)(i=>{t&&e&&t.doc(e).set(i)},[t,e]);if(r)return n;let a=n;return{snapshot:t&&e?a.doc:null,synced:a.synced,set:s}}var Tt=require("react");var ge=200;function de(t,e,r=200){let o=[...t,e];return o.length>r?o.slice(o.length-r):o}function qe(t){if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}function xt(t){let e=t.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Rt(t,e,r={}){let o=r.cap??200,[n,s]=(0,Tt.useState)([]);return(0,Tt.useEffect)(()=>{if(s([]),!t||!e)return;let a=!0,i=t.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await i.next();if(!a||c.done)break;s(u=>de(u,{at:Date.now(),payload:c.value},o))}})(),()=>{a=!1,i.return?.()}},[t,e,o]),n}var ne=require("react/jsx-runtime");function cn({session:t,name:e,cap:r,className:o}){let n=Rt(t,e,{cap:r});return(0,ne.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ne.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ne.jsx)("code",{children:e}),(0,ne.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ne.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ne.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ne.jsx)("code",{children:e})," messages\u2026"]}):n.map((s,a)=>(0,ne.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ne.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",qe(s.payload)]},`${s.at}-${a}`))})]})}var rt=require("react");var G=require("react/jsx-runtime");function nt({placeholder:t,buttonLabel:e,disabled:r,onApply:o}){let[n,s]=(0,rt.useState)(""),[a,i]=(0,rt.useState)(null),c=(0,rt.useCallback)(()=>{let u=xt(n);if(!u.ok){i(u.error);return}i(null),o(u.value,n.trim()),s("")},[n,o]);return(0,G.jsxs)("div",{className:"urun-doc-patch",children:[(0,G.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:t,rows:3}),(0,G.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,G.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:e}),a?(0,G.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function un({session:t,docKey:e,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ve(t,e),a=s(u=>u.doc),i=s(u=>u.synced),c=s(u=>u.set);return(0,G.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,G.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,G.jsx)("code",{children:e}),(0,G.jsx)("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),(0,G.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),r?(0,G.jsx)(nt,{placeholder:o,buttonLabel:"Apply patch",disabled:!t,onApply:u=>c(u)}):null]})}var Et=require("react");var pe=require("react/jsx-runtime");function ln(t,e=600){return t.length>e?`${t.slice(0,e)}\u2026`:t}function dn({session:t,docKey:e="control",cap:r=200,className:o}){let[n,s]=(0,Et.useState)([]);return(0,Et.useEffect)(()=>(s([]),t?t.doc(e).on("change",i=>{s(c=>de(c,{at:Date.now(),direction:"in",text:ln(qe(i))},r))}):void 0),[t,e,r]),(0,pe.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,pe.jsx)(nt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!t,onApply:(a,i)=>{t?.doc(e).set(a),s(c=>de(c,{at:Date.now(),direction:"out",text:ln(i)},r))}}),(0,pe.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,pe.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((a,i)=>(0,pe.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,pe.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,pe.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}var wt=require("react");var Pe=require("react/jsx-runtime");function pn({session:t,trackNames:e=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,a]=(0,wt.useState)([]),i=e.join(","),c=r.join(",");return(0,wt.useEffect)(()=>{if(a([]),!t)return;let u=(l,v)=>a(C=>de(C,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(t.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of e){let v=t.stream(l);f.push(v.on("track",C=>u("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=t.doc(l);f.push(v.on("change",()=>u("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[t,i,c,o]),(0,Pe.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Pe.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((u,f)=>(0,Pe.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,Pe.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,Pe.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${f}`))})}var Lt=require("@urun-sh/core");var At=require("react");function ee(t){let[e,r]=(0,At.useState)(t?.phase??null);return(0,At.useEffect)(()=>{if(!t){r(null);return}return t.onPhase(r)},[t]),e}var fn=require("@urun-sh/core");var Fe=require("react"),mn=require("@urun-sh/core");function Ut(t){let e=ee(t),r=(0,mn.isWakingPhase)(e?.name),o=(0,Fe.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?e?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[a,i]=(0,Fe.useState)(s);return(0,Fe.useEffect)(()=>{if(n===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[n]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:n,seconds:r?a:0}}var he=require("react/jsx-runtime");function Mt({session:t,render:e,className:r}){let o=Ut(t);return!o.waking||!o.phase?null:(0,he.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:e?e(o):(0,he.jsxs)(he.Fragment,{children:[(0,he.jsx)("span",{className:"urun-session-waking-label",children:(0,fn.describeSessionPhase)(o.phase)})," ",(0,he.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Nt=require("react");var ve=require("react"),Xn={event:null,elapsedMs:0};function _t(t,e){let[r,o]=(0,ve.useState)(null),n=(0,ve.useRef)(0);(0,ve.useEffect)(()=>{if(o(null),!!t?.onActivation)return t.onActivation(i=>{e!==void 0&&i.stream!==e||(n.current=Date.now(),o(i))})},[t,e]);let[s,a]=(0,ve.useState)(0);return(0,ve.useEffect)(()=>{if(!r){a(0);return}if(r.state==="first-media"){a(r.elapsedMs);return}let i=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-i);a(c());let u=setInterval(()=>a(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:Xn}var We=require("react/jsx-runtime"),Gn={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Yn(t){let[e,r]=(0,Nt.useState)(!1);return(0,Nt.useEffect)(()=>{if(r(!1),!t)return;let o=t;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[t]),e}function It({session:t,stream:e,videoElement:r,render:o,className:n}){let s=_t(t,e),a=Yn(r),i=s.event;if(!i||i.state==="first-media"||a)return null;let c=i.state;return(0,We.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):(0,We.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,We.jsx)("span",{className:"urun-activation-overlay-copy",children:i.hint??Gn[c]})," ",(0,We.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var te=require("react/jsx-runtime"),Zn={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Sn({session:t,className:e}){let r=ee(t),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,te.jsxs)("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":o,children:[(0,te.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,te.jsx)("span",{className:"urun-session-status-label",children:Zn[o]}),n?(0,te.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function gn({session:t,children:e,fallback:r,onStartOver:o,className:n}){let s=ee(t);if(s?.name==="live")return(0,te.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[e,(0,te.jsx)(It,{session:t})]});let a=r?r(s):(0,te.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Lt.isWakingPhase)(s.name)?(0,te.jsx)(Mt,{session:t}):s&&s.name!=="idle"?(0,Lt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),i=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,te.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[a,i?(0,te.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Dt=require("react");var vn=require("react/jsx-runtime");function sr(t){return ee(t)?.endsAt??null}function Qn(t){let e=Math.max(0,Math.floor(t/1e3)),r=Math.floor(e/60),o=e%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function hn({session:t,urgentMs:e=6e4,className:r}){let n=sr(t)?.getTime()??null,[s,a]=(0,Dt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Dt.useEffect)(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let i=Qn(s);return(0,vn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:i})}var ot=require("react/jsx-runtime"),eo=new Set(["expired","ended","error"]);function yn({session:t,onNewSession:e,children:r,className:o}){let n=ee(t);if(!n||!eo.has(n.name))return null;let s=r?r(n):(0,ot.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,ot.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,e?(0,ot.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}var ye=require("react"),xe=require("react/jsx-runtime");function ir(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function ar(t){let e=(0,ye.useMemo)(()=>t?t.doc("control"):null,[t]),[r,o]=(0,ye.useState)(()=>e?ir(e.get("idle")):null);return(0,ye.useEffect)(()=>{if(!e){o(null);return}return o(ir(e.get("idle"))),e.on("change",()=>o(ir(e.get("idle"))))},[e]),r}function to(t){let e=Math.max(0,Math.floor(t));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function kn({session:t,onStillHere:e,className:r}){let o=ar(t),n=o?.deadlineEpochS??null,[s,a]=(0,ye.useState)(null);if((0,ye.useEffect)(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!t)return null;let i=()=>{t.touch?.(),e?.()};return(0,xe.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,xe.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,xe.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,xe.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${to(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,xe.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}var He=require("react"),bn=require("@urun-sh/core");function Cn(t){let e=(0,He.useContext)(Ae),[r,o]=(0,He.useState)(null),n=t.app??e?.appId,s=t.function,a=t.intervalS??60,i=e?.baseUrl,c=e?.orgId,u=e?.jwt,f=e?.getAccessToken,l=e?.authProvider;return(0,He.useEffect)(()=>{if(!i||!c||!n||!s)return;let v=!1,C=()=>{(0,bn.prewake)({baseUrl:i,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:f,authProvider:l}).then(y=>{v||o(y)}).catch(()=>{})};C();let k=setInterval(C,Math.max(1,a)*1e3);return()=>{v=!0,clearInterval(k)}},[n,s,a,i,c,u,f,l]),r}var Ot=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,ProgressCard,ProgressCardSchema,SessionScope,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var Bt=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var Vn=Object.getOwnPropertyNames;var qn=Object.prototype.hasOwnProperty;var Fn=(e,t)=>{for(var r in t)Bt(e,r,{get:t[r],enumerable:!0})},Hn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Vn(t))!qn.call(e,n)&&n!==r&&Bt(e,n,{get:()=>t[n],enumerable:!(o=Dn(t,n))||o.enumerable});return e};var Wn=e=>Hn(Bt({},"__esModule",{value:!0}),e);var So={};Fn(So,{Audio:()=>rt,Camera:()=>ur,ComponentRenderer:()=>Fr,DEFAULT_CAMERA_CONSTRAINTS:()=>ar,DEFAULT_LOG_CAP:()=>ve,DEFAULT_VOICE_CONSTRAINTS:()=>or,DocPatchForm:()=>st,Image:()=>tn,ImageFrame:()=>zr,ImageFrameSchema:()=>Jr,MetricsPanel:()=>Gr,MetricsPanelSchema:()=>Xr,Mic:()=>ln,OPERATOR_CHORD_LABEL:()=>Tr,OPERATOR_TOKEN_STORAGE_KEY:()=>Cr,ProgressCard:()=>Wr,ProgressCardSchema:()=>Hr,Session:()=>Yr,StatusBadge:()=>$r,StatusBadgeSchema:()=>Br,TextStream:()=>jr,TextStreamSchema:()=>Kr,UrunActivationOverlay:()=>Lt,UrunAudio:()=>sn,UrunAuthProvider:()=>$t,UrunCamera:()=>dn,UrunControlSender:()=>kn,UrunDocPanel:()=>vn,UrunErrorBoundary:()=>Me,UrunEventSpine:()=>bn,UrunIdleWarning:()=>An,UrunJwtProvider:()=>kr,UrunProvider:()=>wr,UrunSessionClock:()=>En,UrunSessionEnded:()=>Rn,UrunSessionGate:()=>Tn,UrunSessionStatus:()=>xn,UrunSessionWaking:()=>Nt,UrunStreamTail:()=>hn,UrunVoice:()=>un,Video:()=>St,Voice:()=>nt,authMode:()=>Je,createDocStore:()=>xt,describeSessionPhase:()=>qt.describeSessionPhase,formatPayload:()=>Fe,getUrunAudioContext:()=>et,isWakingPhase:()=>qt.isWakingPhase,parseJsonObject:()=>Et,pushCapped:()=>fe,readOperatorToken:()=>Kt,registerComponent:()=>Vr,resumeUrunAudioContext:()=>tt,urunPublicEnv:()=>de,useActivation:()=>It,useApp:()=>Ar,useChat:()=>Or,useCompletion:()=>_r,useDocStore:()=>qe,useImageFrame:()=>er,useInputPresence:()=>Lr,useMetricsPanel:()=>tr,useOperatorOverride:()=>mt,useProgressCard:()=>Yt,useRequest:()=>Ur,useSession:()=>Zr,useSessionDoc:()=>Sn,useSessionEndsAt:()=>cr,useSessionIdle:()=>dr,useSessionPhase:()=>oe,useSessionTrack:()=>pn,useSessionWake:()=>_t,useStatusBadge:()=>Zt,useStreamMessages:()=>Rt,useTextStream:()=>Qt,useUrunAudioLevel:()=>bt,useUrunAuth:()=>dt,useUrunPrewake:()=>Mn,usesWorkOSAuth:()=>vr});module.exports=Wn(So);var ue=require("react");var Sr=require("react"),je=require("react/jsx-runtime"),Me=class extends Sr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,je.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,je.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,je.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var hr=require("react"),_e=(0,hr.createContext)(null);function Pe(e){return e&&e.trim()?e.trim():void 0}function de(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Pe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Pe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Pe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Pe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Pe(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return Pe(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Pe(typeof process<"u"?process.env?.[e]:void 0)}}function Je(){let e=de("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||de("VERCEL_ENV")==="production"?"workos":de("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function vr(){return Je()==="workos"}var Ne=require("react"),br=require("react/jsx-runtime"),yr=(0,Ne.createContext)(null);function $t({getAccessToken:e,children:t}){let r=(0,Ne.useMemo)(()=>({getAccessToken:e}),[e]);return(0,br.jsx)(yr.Provider,{value:r,children:t})}var kr=$t;function dt(){return(0,Ne.useContext)(yr)}var pt=require("react"),Cr="urun.operator_token",xr=null,Pr="op",Tr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Er(){return typeof window<"u"}function Kt(){return xr}function Bn(){if(!Er())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Pr);if(!r)return null;xr=r,t.delete(Pr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function $n(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function mt(e){let t=(0,pt.useRef)(e);t.current=e,(0,pt.useEffect)(()=>{if(!Er())return;Bn();let r=o=>{if(!$n(o))return;let n=Kt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var he=require("react/jsx-runtime"),Kn="/api/urun-token";function jn(e,t){return typeof e=="function"?e(t):e!==void 0?e:(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:"Sign-in failed"}),(0,he.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function wr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:a,sessionKey:i,tokenEndpoint:c,fallback:u,errorFallback:g,children:p}){let d=n===void 0&&t===void 0;if(!d&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!d&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let k=r??o;if(d&&(typeof k!="string"||k.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);let[x,b]=(0,ue.useState)(),[y,S]=(0,ue.useState)(),[E,C]=(0,ue.useState)(null),[w,h]=(0,ue.useState)(null);mt(K=>h({jwt:K}));let R=dt(),D=de("NEXT_PUBLIC_SESSION_TOKEN")??de("NEXT_PUBLIC_URUN_JWT"),M=Je(),U=w!==null,l=M==="workos"&&!n&&!U&&!d,m=n??(M==="jwt"?D:void 0)??x??y?.token,f=U?w.jwt:m,P=s??de("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=l&&!f,J=t??y?.orgId,A=e??y?.gatewayUrl,v=d&&y===void 0,L=d&&y!==void 0&&!A?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,$=E??L,G=(0,ue.useMemo)(()=>({appId:k,baseUrl:A??"",orgId:J??"",jwt:f,getAccessToken:l?R?.getAccessToken:void 0,authProvider:P,eventsUrl:a,sessionKey:i,priority:U?"preempt":void 0}),[k,R,A,P,f,a,J,i,l,U]),V=c??Kn;return(0,ue.useEffect)(()=>{if(!d)return;let K=new AbortController;return C(null),(async()=>{try{let j=await fetch(V,{method:"POST",signal:K.signal});if(!j.ok)throw new Error(`[urun] token endpoint ${V} answered ${j.status}`);let W=await j.json(),q=typeof W.token=="string"?W.token:"",Q=typeof W.orgId=="string"?W.orgId:"";if(!q||!Q)throw new Error(`[urun] token endpoint ${V} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);S({token:q,orgId:Q,gatewayUrl:typeof W.gatewayUrl=="string"?W.gatewayUrl:void 0})}catch(j){if(K.signal.aborted)return;C(j instanceof Error?j:new Error(String(j)))}})(),()=>K.abort()},[d,V]),(0,ue.useEffect)(()=>{if(!l||!R)return;let K=!1,j=R;async function W(){try{let Q=await j.getAccessToken();K||b(Q??void 0)}catch{K||b(void 0)}}W();let q=window.setInterval(()=>{W()},6e4);return()=>{K=!0,window.clearInterval(q)}},[R,l]),(0,he.jsx)(Me,{fallback:u,children:$?jn(g,$):I||v?(0,he.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,he.jsx)(_e.Provider,{value:G,children:p})})}var ee=require("react"),Rr=require("@urun-sh/core");function Jn(e,t){return`${e}:${JSON.stringify(t??{})}`}function zn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Ce=new Map;var jt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,a=>{s(a),o()})}}dispose(){this._unsubscribeChange()}},Jt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},zt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=i=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let c=i.error,u=c?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.httpStatus}})}else i.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new jt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Jt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Ar(){let e=(0,ee.useContext)(_e);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,ee.useReducer)(a=>a+1,0),r=(0,ee.useRef)(new Map),o=(0,ee.useRef)(new Map),n=(0,ee.useRef)(null),s=(0,ee.useMemo)(()=>(0,Rr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.priority]);return(0,ee.useEffect)(()=>{let a=n.current;if(a){n.current=null;for(let[i,c]of a){let u=Ce.get(i);u===c&&o.current.get(i)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let i=new Map;for(let[c,u]of o.current){let g=Ce.get(c);g===u&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),i.set(c,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let p=Ce.get(c);!p||p.refCount!==0||(Ce.delete(c),p.handle.disconnect())},0)))}n.current=i}},[]),(0,ee.useMemo)(()=>new Proxy({},{get(a,i){if(typeof i=="string")return c=>{let u=Jn(i,c),g=r.current.get(u);if(g&&!g.disposed)return g;let p=zn(e,i,c),d=Ce.get(p);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),Ce.delete(p),o.current.get(p)===d&&o.current.delete(p),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new zt(s[i](c),t,e.eventsUrl),refCount:0,disposeTimer:null},Ce.set(p,d)),o.current.get(p)!==d&&(o.current.set(p,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(u,d.handle),d.handle}}}),[e,s])}var z=require("react");function Ie(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function Xn(e){return e instanceof Error?e:new Error(String(e))}function Ur(e,t){let r=(0,z.useMemo)(()=>Ie(e),[e]),[o,n]=(0,z.useState)(void 0),[s,a]=(0,z.useState)(null),[i,c]=(0,z.useState)(!1),u=(0,z.useRef)(t);u.current=t;let g=(0,z.useRef)(0),p=(0,z.useRef)(null),d=(0,z.useRef)(!0);(0,z.useEffect)(()=>(d.current=!0,()=>{d.current=!1,p.current?.abort()}),[]);let k=(0,z.useCallback)(async y=>{p.current?.abort();let S=new AbortController;p.current=S;let E=++g.current,C=()=>d.current&&g.current===E;C()&&(c(!0),a(null));try{let w=await r.request(y,{...u.current,signal:S.signal});return C()&&(n(w),c(!1),u.current?.onSuccess?.(w)),w}catch(w){let h=Xn(w);throw C()&&(a(h),c(!1),u.current?.onError?.(h)),h}},[r]),x=(0,z.useCallback)(y=>{k(y).catch(()=>{})},[k]),b=(0,z.useCallback)(()=>{g.current++,p.current?.abort(),p.current=null,n(void 0),a(null),c(!1)},[]);return{mutate:x,mutateAsync:k,data:o,error:s,isPending:i,reset:b}}var Y=require("react");function Mr(e){return e instanceof Error?e:new Error(String(e))}var Gn=e=>typeof e=="string"?e:String(e);function _r(e,t){let r=(0,Y.useMemo)(()=>Ie(e),[e]),[o,n]=(0,Y.useState)(""),[s,a]=(0,Y.useState)(!1),[i,c]=(0,Y.useState)(null),u=(0,Y.useRef)(t);u.current=t;let g=(0,Y.useRef)(0),p=(0,Y.useRef)(null),d=(0,Y.useRef)(!0);(0,Y.useEffect)(()=>(d.current=!0,()=>{d.current=!1,p.current?.cancel(),p.current=null}),[]);let k=(0,Y.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,d.current&&a(!1)},[]),x=(0,Y.useCallback)(async b=>{p.current?.cancel();let y=++g.current,S=()=>d.current&&g.current===y,E=u.current,C=E?.parseChunk??Gn,w=E?.buildPayload??(f=>({prompt:f}));S()&&(n(""),c(null),a(!0));let{parseChunk:h,buildPayload:R,onFinish:D,onError:M,...U}=E??{},l="",m;try{m=r.requestStream(w(b),U),p.current=m}catch(f){let P=Mr(f);S()&&(c(P),a(!1),E?.onError?.(P));return}try{for await(let f of m){if(g.current!==y)break;l+=C(f),S()&&n(l)}S()&&(a(!1),E?.onFinish?.(l))}catch(f){let P=Mr(f);S()&&(c(P),a(!1),E?.onError?.(P))}finally{p.current===m&&(p.current=null)}},[r]);return{completion:o,complete:x,stop:k,isStreaming:s,error:i}}var B=require("react");function Nr(e){return e instanceof Error?e:new Error(String(e))}var Yn=e=>typeof e=="string"?e:String(e),Ir=0;function Xt(e){return Ir+=1,`${e}-${Ir}`}function Or(e,t){let r=(0,B.useMemo)(()=>Ie(e),[e]),[o,n]=(0,B.useState)(()=>(t?.initialMessages??[]).map(C=>({id:C.id??Xt("msg"),role:C.role,content:C.content}))),[s,a]=(0,B.useState)(""),[i,c]=(0,B.useState)(!1),[u,g]=(0,B.useState)(null),p=(0,B.useRef)(t);p.current=t;let d=(0,B.useRef)(o);d.current=o;let k=(0,B.useRef)(s);k.current=s;let x=(0,B.useRef)(0),b=(0,B.useRef)(null),y=(0,B.useRef)(!0);(0,B.useEffect)(()=>(y.current=!0,()=>{y.current=!1,b.current?.cancel(),b.current=null}),[]);let S=(0,B.useCallback)(()=>{x.current++,b.current?.cancel(),b.current=null,y.current&&c(!1)},[]),E=(0,B.useCallback)(async C=>{let w=C===void 0,h=(w?k.current:C)??"";if(!h.trim())return;b.current?.cancel();let D=++x.current,M=()=>y.current&&x.current===D,U=p.current,l=U?.parseChunk??Yn,m={id:Xt("msg"),role:"user",content:h},f={id:Xt("msg"),role:"assistant",content:""},P=[...d.current,m].map(q=>({role:q.role,content:q.content})),I=[...d.current,m,f];d.current=I,n(I),w&&a(""),g(null),c(!0);let J=U?.buildPayload??(q=>({messages:q})),{initialMessages:A,parseChunk:v,buildPayload:L,onFinish:$,onError:G,...V}=U??{},K=q=>{n(Q=>Q.map(Re=>Re.id===f.id?{...Re,content:q}:Re))},j="",W;try{W=r.requestStream(J(P),V),b.current=W}catch(q){let Q=Nr(q);M()&&(g(Q),c(!1),U?.onError?.(Q));return}try{for await(let q of W){if(x.current!==D)break;j+=l(q),M()&&K(j)}M()&&(c(!1),U?.onFinish?.({...f,content:j}))}catch(q){let Q=Nr(q);M()&&(g(Q),c(!1),U?.onError?.(Q))}finally{b.current===W&&(b.current=null)}},[r]);return{messages:o,input:s,setInput:a,sendMessage:E,stop:S,isStreaming:i,error:u}}var H=require("react"),Oe=require("@urun-sh/core"),Gt=[];function Lr(e,t={}){let{field:r=Oe.INPUT_PRESENCE_FIELD,hz:o=Oe.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,a=(0,H.useMemo)(()=>s?(0,Oe.createInputPresencePublisher)({awareness:{setLocalStateField:(h,R)=>s.setField(h,R)},field:r,hz:o}):null,[s,r,o]),i=(0,H.useRef)(null);i.current=a;let[c,u]=(0,H.useState)(!1),[g,p]=(0,H.useState)(Gt),d=(0,H.useRef)(!1);(0,H.useEffect)(()=>{if(a)return()=>a.dispose()},[a]);let k=(0,H.useCallback)(()=>{let h=i.current;p(h?h.heldKeys():Gt)},[]),x=(0,H.useCallback)(()=>{i.current?.clear(),p(Gt)},[]);(0,H.useEffect)(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,R=()=>{if(h()){d.current=!1,u(!0);return}d.current||(u(!1),x())},D=f=>{h()&&(i.current?.keyDown(f.key),k())},M=f=>{i.current?.keyUp(f.key),k()},U=f=>{h()&&i.current?.movePointer(f.movementX,f.movementY)},l=f=>{h()&&i.current?.setButtons(f.buttons)},m=()=>{x()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",D),n.addEventListener("keyup",M),n.addEventListener("mousemove",U),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",m),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",D),n.removeEventListener("keyup",M),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",m)}},[n,x,k]);let b=(0,H.useCallback)(h=>{h.requestPointerLock?.()},[]),y=(0,H.useCallback)(()=>{d.current=!0,u(!0)},[]),S=(0,H.useCallback)(()=>{d.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),x()},[n,x]),E=(0,H.useCallback)(h=>{i.current?.keyDown(h),k()},[k]),C=(0,H.useCallback)(h=>{i.current?.keyUp(h),k()},[k]),w=(0,H.useCallback)((h,R)=>{i.current?.movePointer(h,R)},[]);return{engage:b,engageTouch:y,release:S,engaged:c,heldKeys:g,pressKey:E,releaseKey:C,movePointer:w}}var Dr=new Map;function Vr(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Dr.set(e,{component:t,schema:r})}function qr(e,t){let r=Dr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var xe=require("react/jsx-runtime");function Fr({name:e,props:t,fallback:r}){let o=qr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,xe.jsx)(xe.Fragment,{children:r}):(0,xe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,xe.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,xe.jsx)(n,{...o.validatedProps})}var Le=require("zod"),Te=require("react/jsx-runtime"),Hr=Le.z.object({step:Le.z.number().min(0),total:Le.z.number().min(1),label:Le.z.string().optional(),variant:Le.z.enum(["default","success","error"]).default("default")});function Yt(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),a=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:a}}function Wr(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Yt(e);return(0,Te.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Te.jsx)("div",{className:"urun-progress-label",children:o}),(0,Te.jsx)("div",{className:"urun-progress-bar",children:(0,Te.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Te.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var ft=require("zod"),ze=require("react/jsx-runtime"),Br=ft.z.object({state:ft.z.enum(["thinking","generating","idle","error"]),message:ft.z.string().optional()}),Zn={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Zt(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Zn[t]??t;return{state:t,message:n,isActive:o}}function $r(e){let{state:t,message:r,isActive:o}=Zt(e);return(0,ze.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,ze.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,ze.jsx)("span",{className:"urun-status-message",children:r})]})}var Xe=require("react"),gt=require("zod"),Ge=require("react/jsx-runtime"),Kr=gt.z.object({text:gt.z.string(),streaming:gt.z.boolean().default(!1)});function Qt(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function jr(e){let{text:t,streaming:r}=Qt(e),o=(0,Xe.useRef)(null),n=(0,Xe.useRef)(0);return(0,Xe.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Ge.jsxs)("div",{className:"urun-text-stream",children:[(0,Ge.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Ge.jsx)("span",{className:"urun-text-cursor"})]})}var Ye=require("zod"),Ze=require("react/jsx-runtime"),Jr=Ye.z.object({src:Ye.z.string().url(),alt:Ye.z.string().optional(),caption:Ye.z.string().optional()});function er(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function zr(e){let{src:t,alt:r,caption:o}=er(e);return(0,Ze.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ze.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Ze.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var pe=require("zod"),De=require("react/jsx-runtime"),Xr=pe.z.object({metrics:pe.z.array(pe.z.object({label:pe.z.string(),value:pe.z.union([pe.z.string(),pe.z.number()]),unit:pe.z.string().optional()}))});function tr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Gr(e){let{metrics:t}=tr(e);return(0,De.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,De.jsxs)("div",{className:"urun-metric-card",children:[(0,De.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,De.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var Qe=require("react"),Qr=require("react/jsx-runtime"),rr=(0,Qe.createContext)(null);function Yr({session:e,children:t}){return(0,Qr.jsx)(rr.Provider,{value:e,children:t})}function ce(){return(0,Qe.useContext)(rr)}function Zr(){let e=(0,Qe.useContext)(rr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var X=require("react");var ht=require("react/jsx-runtime"),Qn=1e3;function eo(...e){console.debug("[video]",...e)}var St=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="video",track:s,muted:a=!0,mirror:i=!1,objectFit:c="contain",className:u,style:g,videoClassName:p,placeholder:d,children:k,onTrack:x}=t,b=ce(),y=o??b,S=(0,X.useRef)(null),E=(0,X.useRef)(null),[C,w]=(0,X.useState)(!1),h=(0,X.useRef)(x);h.current=x;let R=(0,X.useCallback)(()=>{if(typeof MediaStream>"u")return null;E.current||(E.current=new MediaStream);let m=S.current;return m&&m.srcObject!==E.current&&(m.srcObject=E.current),E.current},[]),D=(0,X.useCallback)(m=>{let f=S.current;if(!f)return;let P=f.play();!P||typeof P.catch!="function"||P.catch(I=>eo(`play() failed (${m})`,I))},[]),M=(0,X.useCallback)(m=>{let f=R();if(f){for(let P of f.getVideoTracks())P!==m&&f.removeTrack(P);if(m&&!f.getVideoTracks().includes(m)){f.addTrack(m);let P=S.current;P&&(P.srcObject=f)}m&&D("track-attach"),w(m!==null),h.current?.(m)}},[R,D]),U=(0,X.useCallback)(m=>{S.current=m,m&&(a&&(m.muted=!0,m.defaultMuted=!0,m.setAttribute("muted","")),m.setAttribute("playsinline",""),m.setAttribute("webkit-playsinline",""),R())},[R,a]);(0,X.useImperativeHandle)(r,()=>({get element(){return S.current},get live(){return E.current?E.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return(0,X.useEffect)(()=>{if(l){M(s??null);return}if(!y)return;let m=y.stream(n),f=()=>{let v=E.current;return v?v.getVideoTracks()[0]??null:null},P=v=>{if(v!==f()&&(M(v),v)){let L=()=>{f()===v&&M(null)};v.addEventListener("ended",L)}},I=m.track;I&&I.readyState==="live"&&P(I);let J=m.on("track",v=>{v&&v.readyState!=="live"||P(v)}),A=setInterval(()=>{let v=m.track;v&&v.readyState==="live"&&P(v)},Qn);return()=>{J(),clearInterval(A)}},[y,n,l,s,M]),(0,ht.jsxs)("div",{className:u,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":C?"true":"false",children:[(0,ht.jsx)("video",{ref:U,className:p,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...i?{transform:"scaleX(-1)"}:{}}}),C?null:d,k]})});var en=require("react");var rn=require("react/jsx-runtime"),tn=(0,en.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,rn.jsx)(St,{ref:r,stream:o,...n})});var O=require("react"),on=require("@urun-sh/core");var vt=null;function to(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function et(){if(vt)return vt;let e=to();return e?(vt=new e,vt):null}function tt(){let e=et();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var an=require("react/jsx-runtime"),ro=1e3,nn=200;function nr(...e){console.debug("[audio]",...e)}var rt=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:a=!1,className:i,onTrack:c,onUnlockChange:u,onAudioElement:g}=t,p=ce(),d=o??p,k=(0,O.useRef)(null),x=(0,O.useRef)(null),b=(0,O.useRef)(null),y=(0,O.useRef)(null),S=(0,O.useRef)(c);S.current=c;let E=(0,O.useRef)(u);E.current=u;let C=(0,O.useCallback)(l=>{b.current!==l&&(b.current=l,E.current?.(l))},[]),w=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;x.current||(x.current=new MediaStream);let l=k.current;return l&&l.srcObject!==x.current&&(l.srcObject=x.current),x.current},[]),h=(0,O.useCallback)(l=>{let m=k.current;if(!m)return;let f=m.play();!f||typeof f.then!="function"||f.then(()=>{m.muted||C(!0)}).catch(P=>{let I=P instanceof Error?P.name:String(P);if(I==="AbortError"){nr(`play() aborted (${l}); retrying in ${nn}ms`),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{y.current=null,h(`${l}:retry`)},nn);return}if(I==="NotAllowedError"){nr(`play() blocked pending a user gesture (${l})`),C(!1);return}nr(`play() failed (${l})`,P)})},[C]),R=(0,O.useCallback)(l=>{let m=w();if(m){for(let f of m.getAudioTracks())f!==l&&m.removeTrack(f);l&&!m.getAudioTracks().includes(l)&&m.addTrack(l),l&&h("track-attach"),S.current?.(l)}},[w,h]),D=(0,O.useCallback)(()=>{let l=k.current;l&&(w(),l.muted=!1,h("gesture"),tt(),C(!0))},[w,h,C]);(0,O.useImperativeHandle)(r,()=>({unlock:D,get unlocked(){return b.current===!0},get element(){return k.current}}),[D]);let M=(0,O.useCallback)(l=>{k.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),w()),g?.(l)},[w,g]),U=s!==void 0;return(0,O.useEffect)(()=>{if(U){R(s??null);return}if(!d)return;let l=d.stream(n),m=()=>{let A=x.current;return A?A.getAudioTracks()[0]??null:null},f=A=>{if(A!==m()&&(R(A),A)){let v=()=>{m()===A&&R(null)};A.addEventListener("ended",v)}},P=l.track;P&&P.readyState==="live"&&f(P);let I=l.on("track",A=>{A&&A.readyState!=="live"||f(A)}),J=setInterval(()=>{let A=l.track;A&&A.readyState==="live"&&f(A)},ro);return()=>{I(),clearInterval(J)}},[d,n,U,s,R]),(0,O.useEffect)(()=>(0,on.observePageLifecycle)(()=>{tt(),b.current===!0&&h("foreground")}),[h]),(0,O.useEffect)(()=>()=>{y.current&&clearTimeout(y.current)},[]),(0,an.jsx)("audio",{ref:M,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})}),sn=rt;var N=require("react"),Ve=require("@urun-sh/core");var cn=require("react/jsx-runtime"),or={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function yt(...e){console.debug("[voice]",...e)}var nt=(0,N.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:a=or,connectTimeoutMs:i,attempts:c=3,retryDelayMs:u=1500,onActiveChange:g,onError:p,onMicStream:d,onTrack:k,onUnlockChange:x,capture:b}=t,y=ce(),S=o??y,E=(0,N.useRef)(null),C=(0,N.useRef)(null),w=(0,N.useRef)(null),h=(0,N.useRef)([]),R=(0,N.useRef)(!1),D=(0,N.useRef)(g);D.current=g;let M=(0,N.useRef)(p);M.current=p;let U=(0,N.useRef)(d);U.current=d;let l=(0,N.useCallback)(v=>{R.current!==v&&(R.current=v,D.current?.(v))},[]),m=(0,N.useCallback)(()=>{for(let v of h.current)v();h.current=[],w.current?.release(),w.current=null,C.current&&(C.current=null,U.current?.(null))},[]),f=(0,N.useCallback)(async()=>{let v=w.current;if(v){let V=await v.update(a);return C.current=v.stream,U.current?.(v.stream),V}let $=await(b??(0,Ve.sharedCaptureController)()).claim("audio",a);w.current=$,h.current=[$.onTrack((V,K)=>{C.current=K,U.current?.(K),R.current&&S?.stream(n).attach(V).catch(j=>yt("mic re-attach after one-capture re-acquire failed",j))}),$.onLost(V=>{w.current=null,h.current=[],C.current=null,U.current?.(null),l(!1),M.current?.(V)})],C.current=$.stream,U.current?.($.stream);let G=$.track;if(!G)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return G},[b,a,S,n,l]),P=(0,N.useCallback)(async()=>{m(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,m,l]),I=(0,N.useCallback)(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let v;try{v=await f()}catch(G){m();let V=(0,Ve.sessionFailureFromMediaError)(G,S.status);throw M.current?.(V),V}S.connect?.();let L;for(let G=1;G<=c;G++)try{await S.whenLive(i!==void 0?{timeout:i}:void 0),await S.stream(n).attach(v),l(!0);return}catch(V){L=V,yt(`start attempt ${G}/${c} failed`,V),G<c&&await new Promise(K=>setTimeout(K,u))}m(),l(!1);let $=L instanceof Error?L:new Error(String(L??"voice start failed"));throw M.current?.($),$},[S,n,i,c,u,f,m,l]);(0,N.useImperativeHandle)(r,()=>({start:I,stop:P,unlock:()=>E.current?.unlock(),get active(){return R.current},get micStream(){return C.current},get audio(){return E.current}}),[I,P]);let J=(0,N.useRef)(!1),A=(0,N.useCallback)(async()=>{if(!S||!R.current||J.current)return;let v=C.current?.getAudioTracks()[0]??null;if(v&&v.readyState==="live"){try{await S.stream(n).attach(v)}catch(L){yt("foreground mic re-assert failed (will retry on next pass)",L)}return}J.current=!0;try{let L=await f();await S.stream(n).attach(L)}catch(L){let $=L instanceof Error?L:new Error(String(L));yt("foreground mic re-acquire failed",$),M.current?.($)}finally{J.current=!1}},[S,n,f]);return(0,N.useEffect)(()=>{let v=()=>{A()};return S&&typeof S.onRecovery=="function"?S.onRecovery(v):(0,Ve.observePageLifecycle)(v)},[S,A]),(0,N.useEffect)(()=>m,[m]),s?(0,cn.jsx)(rt,{ref:E,session:S,stream:n,onTrack:k,onUnlockChange:x}):null}),un=nt;var ie=require("react");var kt=require("react");var sr={level:0,speaking:!1};function bt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,a]=(0,kt.useState)(sr);return(0,kt.useEffect)(()=>{if(!e){a(sr);return}let i=et();if(!i||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,g;try{u=i.createMediaStreamSource(c),g=i.createAnalyser(),g.fftSize=r,u.connect(g)}catch{return}let p=new Uint8Array(g.fftSize),k=setInterval(()=>{g.getByteTimeDomainData(p);let x=0;for(let y=0;y<p.length;y++){let S=(p[y]-128)/128;x+=S*S}let b=Math.sqrt(x/p.length);a(y=>{let S=b>n;return Math.abs(y.level-b)<.005&&y.speaking===S?y:{level:b,speaking:S}})},o);return()=>{clearInterval(k),u.disconnect(),a(sr)}},[e,r,o,n]),s}var me=require("react/jsx-runtime"),no={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},oo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ln=(0,ie.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:a=!0,visible:i=!1,className:c,onActiveChange:u,onError:g,onMicStream:p,capture:d}=t,k=ce(),x=o??k,b=(0,ie.useRef)(null),[y,S]=(0,ie.useState)(null),E=(0,ie.useRef)(p);E.current=p;let{level:C,speaking:w}=bt(i?y:null);return(0,ie.useImperativeHandle)(r,()=>({start:()=>{let h=b.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>b.current?.stop()??Promise.resolve(),get active(){return b.current?.active??!1},get micStream(){return b.current?.micStream??null}}),[]),(0,ie.useEffect)(()=>{!a||!x||b.current?.start().catch(()=>{})},[a,x]),(0,me.jsxs)(me.Fragment,{children:[(0,me.jsx)(nt,{ref:b,session:x,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...d!==void 0?{capture:d}:{},onActiveChange:u,onError:g,onMicStream:h=>{S(h),E.current?.(h)}}),i?(0,me.jsx)("span",{className:c,style:no,"data-urun-mic":"","data-urun-mic-active":y?"true":"false","data-urun-mic-speaking":w?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(C*100)/100,children:(0,me.jsx)("span",{style:oo,children:(0,me.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var Pt=require("@urun-sh/core"),T=require("react");var ne=require("react/jsx-runtime"),ar={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ir(...e){console.debug("[camera]",...e)}function so(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function io(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var ur=(0,T.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:a=!1,back:i=!1,facingMode:c,autoStart:u=!0,mirror:g="auto",connectTimeoutMs:p,visible:d=!1,className:k,videoClassName:x,onActiveChange:b,onError:y,onStream:S,onTrack:E,children:C,capture:w,flipControl:h="auto",flipControlClassName:R,onDevices:D}=t;if(a&&i)throw new Error("<Camera> takes `front` OR `back`, not both");let M=a?"user":i?"environment":c??"environment",U=ce(),l=o??U,m=(0,T.useRef)(null),f=(0,T.useRef)(null),P=(0,T.useRef)(null),I=(0,T.useRef)([]),J=(0,T.useRef)(null),A=(0,T.useRef)(!1),v=(0,T.useRef)(M),[L,$]=(0,T.useState)(M),[G,V]=(0,T.useState)(!1),[K,j]=(0,T.useState)(null),[W,q]=(0,T.useState)(!1),[Q]=(0,T.useState)(so),Re=(0,T.useRef)(b);Re.current=b;let at=(0,T.useRef)(y);at.current=y;let Ft=(0,T.useRef)(S);Ft.current=S;let ut=(0,T.useRef)(E);ut.current=E;let pr=(0,T.useRef)(D);pr.current=D;let Se=(0,T.useCallback)(_=>{A.current!==_&&(A.current=_,V(_),Re.current?.(_))},[]);(0,T.useEffect)(()=>{if(!G){j(null);return}let _=!1,F=()=>{io().then(re=>{_||(j(re),re&&pr.current?.(re))})};F();let Z=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Z?.addEventListener=="function"?(Z.addEventListener("devicechange",F),()=>{_=!0,Z.removeEventListener?.("devicechange",F)}):()=>{_=!0}},[G]);let ct=(0,T.useCallback)(_=>{let F=m.current;F&&(F.muted=!0,F.defaultMuted=!0,F.setAttribute("muted",""),F.setAttribute("playsinline",""),F.setAttribute("webkit-playsinline",""),F.srcObject=_,_&&F.play()?.catch?.(Z=>ir("preview play() failed",Z)))},[]),le=(0,T.useCallback)(()=>{J.current?.(),J.current=null;for(let _ of I.current)_();I.current=[],P.current?.release(),P.current=null,f.current&&(f.current=null,Ft.current?.(null),ut.current?.(null)),ct(null)},[ct]),Ht=(0,T.useCallback)((_,F)=>{J.current?.(),f.current=F,ct(F),Ft.current?.(F);let Z=()=>{f.current===F&&(ir("camera track ended (device removed or permission revoked)"),le(),Se(!1))};_.addEventListener("ended",Z),J.current=()=>_.removeEventListener("ended",Z)},[ct,le,Se]),Ae=(0,T.useCallback)(async _=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let F={...ar,...s,facingMode:_},Z;try{let re=P.current;if(re)Z=await re.update(F);else{let $e=await(w??(0,Pt.sharedCaptureController)()).claim("video",F);if(P.current=$e,I.current=[$e.onTrack((Ke,On)=>{Ht(Ke,On),A.current&&l.stream(n).attachVideo(Ke).then(()=>ut.current?.(Ke)).catch(Ln=>ir("camera re-publish after one-capture re-acquire failed",Ln))}),$e.onLost(Ke=>{P.current=null,I.current=[],le(),Se(!1),at.current?.(Ke)})],!$e.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Z=$e.track}}catch(re){let Ue=(0,Pt.sessionFailureFromMediaError)(re,l.status);throw at.current?.(Ue),Ue}v.current=_,$(_),Ht(Z,P.current?.stream??new MediaStream([Z]));try{l.connect?.(),await l.whenLive(p!==void 0?{timeout:p}:void 0),await l.stream(n).attachVideo(Z)}catch(re){le(),Se(!1);let Ue=re instanceof Error?re:new Error(String(re));throw at.current?.(Ue),Ue}ut.current?.(Z),Se(!0)},[l,n,s,p,w,Ht,le,Se]),mr=(0,T.useCallback)(_=>Ae(_?.facingMode??v.current),[Ae]),lt=(0,T.useCallback)(async _=>{A.current&&v.current===_||await Ae(_)},[Ae]),Wt=(0,T.useCallback)(()=>Ae(v.current==="environment"?"user":"environment"),[Ae]),fr=(0,T.useCallback)(async()=>{le(),Se(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,le,Se]);(0,T.useImperativeHandle)(r,()=>({start:mr,stop:fr,flip:Wt,setFacingMode:lt,get active(){return A.current},get facingMode(){return v.current},get stream(){return f.current},get element(){return m.current}}),[mr,fr,Wt,lt]);let gr=(0,T.useRef)(lt);if(gr.current=lt,(0,T.useEffect)(()=>{!u||!l||gr.current(M).catch(()=>{})},[u,l,M]),(0,T.useEffect)(()=>le,[le]),!d)return null;let _n=g==="auto"?L==="user":g,Nn=G&&(h===!0||h==="auto"&&Q&&(K?.length??0)>1),In=()=>{W||(q(!0),Wt().catch(()=>{}).finally(()=>q(!1)))};return(0,ne.jsxs)("div",{className:k,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":L,children:[(0,ne.jsx)("video",{ref:m,className:x,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",..._n?{transform:"scaleX(-1)"}:{}}}),Nn?(0,ne.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:In,disabled:W,className:R,style:R?{opacity:W?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:W?.6:1},children:(0,ne.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,ne.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ne.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ne.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ne.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ne.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),dn=(0,T.forwardRef)(function({preview:t=!0,...r},o){return(0,ne.jsx)(ur,{ref:o,...r,visible:t,autoStart:!1})});var Ct=require("react");function pn(e,t){let[r,o]=(0,Ct.useState)(null);return(0,Ct.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var gn=require("react");var Tt=require("react");var mn=require("zustand/vanilla"),fn=require("zustand"),ao=()=>{};function xt(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=(0,mn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,a=()=>{if(s){for(let u of s)u();s=null}},i=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),a):ao,c=(u=>(0,fn.useStore)(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:i,unbind:a}),t.bind!==!1&&i(),c}function qe(e,t){let r=(0,Tt.useMemo)(()=>xt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Tt.useEffect)(()=>r.bind(),[r]),r}function Sn(e,t,r){let n=qe(e,t)(r??(i=>i)),s=(0,gn.useCallback)(i=>{e&&t&&e.doc(t).set(i)},[e,t]);if(r)return n;let a=n;return{snapshot:e&&t?a.doc:null,synced:a.synced,set:s}}var wt=require("react");var ve=200;function fe(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Fe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Et(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Rt(e,t,r={}){let o=r.cap??200,[n,s]=(0,wt.useState)([]);return(0,wt.useEffect)(()=>{if(s([]),!e||!t)return;let a=!0,i=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await i.next();if(!a||c.done)break;s(u=>fe(u,{at:Date.now(),payload:c.value},o))}})(),()=>{a=!1,i.return?.()}},[e,t,o]),n}var ae=require("react/jsx-runtime");function hn({session:e,name:t,cap:r,className:o}){let n=Rt(e,t,{cap:r});return(0,ae.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ae.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ae.jsx)("code",{children:t}),(0,ae.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ae.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ae.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ae.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,a)=>(0,ae.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ae.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Fe(s.payload)]},`${s.at}-${a}`))})]})}var ot=require("react");var te=require("react/jsx-runtime");function st({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,ot.useState)(""),[a,i]=(0,ot.useState)(null),c=(0,ot.useCallback)(()=>{let u=Et(n);if(!u.ok){i(u.error);return}i(null),o(u.value,n.trim()),s("")},[n,o]);return(0,te.jsxs)("div",{className:"urun-doc-patch",children:[(0,te.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),(0,te.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,te.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),a?(0,te.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function vn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=qe(e,t),a=s(u=>u.doc),i=s(u=>u.synced),c=s(u=>u.set);return(0,te.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,te.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,te.jsx)("code",{children:t}),(0,te.jsx)("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),(0,te.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),r?(0,te.jsx)(st,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}var At=require("react");var ge=require("react/jsx-runtime");function yn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function kn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,At.useState)([]);return(0,At.useEffect)(()=>(s([]),e?e.doc(t).on("change",i=>{s(c=>fe(c,{at:Date.now(),direction:"in",text:yn(Fe(i))},r))}):void 0),[e,t,r]),(0,ge.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,ge.jsx)(st,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(a,i)=>{e?.doc(t).set(a),s(c=>fe(c,{at:Date.now(),direction:"out",text:yn(i)},r))}}),(0,ge.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,ge.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((a,i)=>(0,ge.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,ge.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,ge.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}var Ut=require("react");var Ee=require("react/jsx-runtime");function bn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,a]=(0,Ut.useState)([]),i=t.join(","),c=r.join(",");return(0,Ut.useEffect)(()=>{if(a([]),!e)return;let u=(p,d)=>a(k=>fe(k,{at:Date.now(),kind:p,text:d},o)),g=[];g.push(e.onPhase(p=>u("phase",`phase \u2192 ${p.name}`)));for(let p of t){let d=e.stream(p);g.push(d.on("track",k=>u("track",`${p}: ${k?"track arrived":"track ended"}`)))}for(let p of r){let d=e.doc(p);g.push(d.on("change",()=>u("doc",`${p} changed`)))}return()=>g.forEach(p=>p())},[e,i,c,o]),(0,Ee.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Ee.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((u,g)=>(0,Ee.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,Ee.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,Ee.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${g}`))})}var Dt=require("@urun-sh/core");var Mt=require("react");function oe(e){let[t,r]=(0,Mt.useState)(e?.phase??null);return(0,Mt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Cn=require("@urun-sh/core");var He=require("react"),Pn=require("@urun-sh/core");function _t(e){let t=oe(e),r=(0,Pn.isWakingPhase)(t?.name),o=(0,He.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[a,i]=(0,He.useState)(s);return(0,He.useEffect)(()=>{if(n===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?a:0}}var ye=require("react/jsx-runtime");function Nt({session:e,render:t,className:r}){let o=_t(e);return!o.waking||!o.phase?null:(0,ye.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,ye.jsxs)(ye.Fragment,{children:[(0,ye.jsx)("span",{className:"urun-session-waking-label",children:(0,Cn.describeSessionPhase)(o.phase)})," ",(0,ye.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Ot=require("react");var ke=require("react"),uo={event:null,elapsedMs:0};function It(e,t){let[r,o]=(0,ke.useState)(null),n=(0,ke.useRef)(0);(0,ke.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(i=>{t!==void 0&&i.stream!==t||(n.current=Date.now(),o(i))})},[e,t]);let[s,a]=(0,ke.useState)(0);return(0,ke.useEffect)(()=>{if(!r){a(0);return}if(r.state==="first-media"){a(r.elapsedMs);return}let i=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-i);a(c());let u=setInterval(()=>a(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:uo}var We=require("react/jsx-runtime"),co={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function lo(e){let[t,r]=(0,Ot.useState)(!1);return(0,Ot.useEffect)(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Lt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=It(e,t),a=lo(r),i=s.event;if(!i||i.state==="first-media"||a)return null;let c=i.state;return(0,We.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):(0,We.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,We.jsx)("span",{className:"urun-activation-overlay-copy",children:i.hint??co[c]})," ",(0,We.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var se=require("react/jsx-runtime"),po={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function xn({session:e,className:t}){let r=oe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,se.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,se.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,se.jsx)("span",{className:"urun-session-status-label",children:po[o]}),n?(0,se.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Tn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=oe(e);if(s?.name==="live")return(0,se.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,se.jsx)(Lt,{session:e})]});let a=r?r(s):(0,se.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Dt.isWakingPhase)(s.name)?(0,se.jsx)(Nt,{session:e}):s&&s.name!=="idle"?(0,Dt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),i=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,se.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[a,i?(0,se.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Vt=require("react");var wn=require("react/jsx-runtime");function cr(e){return oe(e)?.endsAt??null}function mo(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function En({session:e,urgentMs:t=6e4,className:r}){let n=cr(e)?.getTime()??null,[s,a]=(0,Vt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Vt.useEffect)(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let i=mo(s);return(0,wn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:i})}var it=require("react/jsx-runtime"),fo=new Set(["expired","ended","error"]);function Rn({session:e,onNewSession:t,children:r,className:o}){let n=oe(e);if(!n||!fo.has(n.name))return null;let s=r?r(n):(0,it.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,it.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,it.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var be=require("react"),we=require("react/jsx-runtime");function lr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function dr(e){let t=(0,be.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,be.useState)(()=>t?lr(t.get("idle")):null);return(0,be.useEffect)(()=>{if(!t){o(null);return}return o(lr(t.get("idle"))),t.on("change",()=>o(lr(t.get("idle"))))},[t]),r}function go(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function An({session:e,onStillHere:t,className:r}){let o=dr(e),n=o?.deadlineEpochS??null,[s,a]=(0,be.useState)(null);if((0,be.useEffect)(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let i=()=>{e.touch?.(),t?.()};return(0,we.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,we.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,we.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,we.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${go(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,we.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}var Be=require("react"),Un=require("@urun-sh/core");function Mn(e){let t=(0,Be.useContext)(_e),[r,o]=(0,Be.useState)(null),n=e.app??t?.appId,s=e.function,a=e.intervalS??60,i=t?.baseUrl,c=t?.orgId,u=t?.jwt,g=t?.getAccessToken,p=t?.authProvider;return(0,Be.useEffect)(()=>{if(!i||!c||!n||!s)return;let d=!1,k=()=>{(0,Un.prewake)({baseUrl:i,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:g,authProvider:p}).then(b=>{d||o(b)}).catch(()=>{})};k();let x=setInterval(k,Math.max(1,a)*1e3);return()=>{d=!0,clearInterval(x)}},[n,s,a,i,c,u,g,p]),r}var qt=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as _r,b as Nr,c as et}from"./chunk-WF2OBDSX.mjs";import{useEffect as Vr,useMemo as qr,useState as Fr}from"react";import{Component as Ir}from"react";import{jsx as Lt,jsxs as Lr}from"react/jsx-runtime";var be=class extends Ir{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Lr("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:[Lt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Lt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Dr}from"react";var pe=Dr(null);function se(t){return t&&t.trim()?t.trim():void 0}function ee(t){switch(t){case"NEXT_PUBLIC_AUTH_MODE":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return se(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return se(typeof process<"u"?process.env?.[t]:void 0)}}function _e(){let t=ee("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return t==="jwt"||t==="customer-jwt"||t==="test-jwt"?"jwt":t==="workos"||ee("VERCEL_ENV")==="production"?"workos":ee("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Or(){return _e()==="workos"}import{jsx as tt}from"react/jsx-runtime";function Wr({baseUrl:t,orgId:e,appId:r,jwt:o,authProvider:n,eventsUrl:s,sessionKey:a,fallback:i,children:c}){if(typeof e!="string"||e.trim().length===0)throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider.");let[u,f]=Fr(),l=et(),v=ee("NEXT_PUBLIC_SESSION_TOKEN")??ee("NEXT_PUBLIC_URUN_JWT"),C=_e(),k=C==="workos"&&!o,y=o??(C==="jwt"?v:void 0)??u,b=n??ee("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=k&&!y,T=qr(()=>({appId:r,baseUrl:t,orgId:e,jwt:y,getAccessToken:k?l?.getAccessToken:void 0,authProvider:b,eventsUrl:s,sessionKey:a}),[r,l,t,b,y,s,e,a,k]);return Vr(()=>{if(!k||!l)return;let P=!1,R=l;async function g(){try{let N=await R.getAccessToken();P||f(N??void 0)}catch{P||f(void 0)}}g();let E=window.setInterval(()=>{g()},6e4);return()=>{P=!0,window.clearInterval(E)}},[l,k]),tt(be,{fallback:i,children:S?tt("div",{role:"status","aria-live":"polite",children:"Signing in..."}):tt(pe.Provider,{value:T,children:c})})}import{useContext as Hr,useEffect as Br,useMemo as Dt,useReducer as $r,useRef as Ot}from"react";import{App as jr}from"@urun-sh/core";function Kr(t,e){return`${t}:${JSON.stringify(e??{})}`}function Jr(t,e,r){return JSON.stringify({appId:t.appId,baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,authProvider:t.authProvider,sessionKey:t.sessionKey,fnName:e,args:r??{}})}var me=new Map;var rt=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,o=>r(o))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,a=>{s(a),o()})}}dispose(){this._unsubscribeChange()}},nt=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},ot=class{constructor(e,r,o){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(e){let r=!1,o=!1,n=i=>{fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let c=i.error,u=c?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.httpStatus}})}else i.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}onDiagnostic(e){return this._session.onDiagnostic(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new rt(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new nt(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}async end(){let e=await this._session.end();return this._disposeHandle(),e}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function zr(){let t=Hr(pe);if(!t)throw new Error("useApp must be used within <UrunProvider>");if(!t.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=$r(s=>s+1,0),r=Ot(new Map),o=Ot(new Map),n=Dt(()=>jr(t.appId,{baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,getAccessToken:t.getAccessToken,authProvider:t.authProvider,sessionKey:t.sessionKey}),[t.appId,t.baseUrl,t.orgId,t.jwt,t.getAccessToken,t.authProvider,t.sessionKey]);return Br(()=>()=>{for(let[s,a]of o.current){let i=me.get(s);i===a&&(i.handle.removeNotifier(e),i.refCount=Math.max(0,i.refCount-1),i.refCount===0&&(i.disposeTimer=setTimeout(()=>{let c=me.get(s);!c||c.refCount!==0||(me.delete(s),c.handle.disconnect())},0)))}o.current.clear(),r.current.clear()},[]),Dt(()=>new Proxy({},{get(s,a){if(typeof a=="string")return i=>{let c=Kr(a,i),u=r.current.get(c);if(u&&!u.disposed)return u;let f=Jr(t,a,i),l=me.get(f);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),me.delete(f),o.current.get(f)===l&&o.current.delete(f),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new ot(n[a](i),e,t.eventsUrl),refCount:0,disposeTimer:null},me.set(f,l)),o.current.get(f)!==l&&(o.current.set(f,l),l.handle.addNotifier(e),l.refCount+=1),r.current.set(c,l.handle),l.handle}}}),[t,n])}import{useCallback as st,useEffect as Xr,useMemo as Gr,useRef as Ne,useState as it}from"react";function fe(t){let e=t;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function Yr(t){return t instanceof Error?t:new Error(String(t))}function Zr(t,e){let r=Gr(()=>fe(t),[t]),[o,n]=it(void 0),[s,a]=it(null),[i,c]=it(!1),u=Ne(e);u.current=e;let f=Ne(0),l=Ne(null),v=Ne(!0);Xr(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=st(async b=>{l.current?.abort();let S=new AbortController;l.current=S;let T=++f.current,P=()=>v.current&&f.current===T;P()&&(c(!0),a(null));try{let R=await r.request(b,{...u.current,signal:S.signal});return P()&&(n(R),c(!1),u.current?.onSuccess?.(R)),R}catch(R){let g=Yr(R);throw P()&&(a(g),c(!1),u.current?.onError?.(g)),g}},[r]),k=st(b=>{C(b).catch(()=>{})},[C]),y=st(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),a(null),c(!1)},[]);return{mutate:k,mutateAsync:C,data:o,error:s,isPending:i,reset:y}}import{useCallback as Vt,useEffect as Qr,useMemo as en,useRef as Ie,useState as at}from"react";function qt(t){return t instanceof Error?t:new Error(String(t))}var tn=t=>typeof t=="string"?t:String(t);function rn(t,e){let r=en(()=>fe(t),[t]),[o,n]=at(""),[s,a]=at(!1),[i,c]=at(null),u=Ie(e);u.current=e;let f=Ie(0),l=Ie(null),v=Ie(!0);Qr(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=Vt(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&a(!1)},[]),k=Vt(async y=>{l.current?.cancel();let b=++f.current,S=()=>v.current&&f.current===b,T=u.current,P=T?.parseChunk??tn,R=T?.buildPayload??(m=>({prompt:m}));S()&&(n(""),c(null),a(!0));let{parseChunk:g,buildPayload:E,onFinish:N,onError:A,...U}=T??{},d="",p;try{p=r.requestStream(R(y),U),l.current=p}catch(m){let x=qt(m);S()&&(c(x),a(!1),T?.onError?.(x));return}try{for await(let m of p){if(f.current!==b)break;d+=P(m),S()&&n(d)}S()&&(a(!1),T?.onFinish?.(d))}catch(m){let x=qt(m);S()&&(c(x),a(!1),T?.onError?.(x))}finally{l.current===p&&(l.current=null)}},[r]);return{completion:o,complete:k,stop:C,isStreaming:s,error:i}}import{useCallback as Ft,useEffect as nn,useMemo as on,useRef as Se,useState as Le}from"react";function Wt(t){return t instanceof Error?t:new Error(String(t))}var sn=t=>typeof t=="string"?t:String(t),Ht=0;function ct(t){return Ht+=1,`${t}-${Ht}`}function an(t,e){let r=on(()=>fe(t),[t]),[o,n]=Le(()=>(e?.initialMessages??[]).map(P=>({id:P.id??ct("msg"),role:P.role,content:P.content}))),[s,a]=Le(""),[i,c]=Le(!1),[u,f]=Le(null),l=Se(e);l.current=e;let v=Se(o);v.current=o;let C=Se(s);C.current=s;let k=Se(0),y=Se(null),b=Se(!0);nn(()=>(b.current=!0,()=>{b.current=!1,y.current?.cancel(),y.current=null}),[]);let S=Ft(()=>{k.current++,y.current?.cancel(),y.current=null,b.current&&c(!1)},[]),T=Ft(async P=>{let R=P===void 0,g=(R?C.current:P)??"";if(!g.trim())return;y.current?.cancel();let N=++k.current,A=()=>b.current&&k.current===N,U=l.current,d=U?.parseChunk??sn,p={id:ct("msg"),role:"user",content:g},m={id:ct("msg"),role:"assistant",content:""},x=[...v.current,p].map(V=>({role:V.role,content:V.content})),_=[...v.current,p,m];v.current=_,n(_),R&&a(""),f(null),c(!0);let F=U?.buildPayload??(V=>({messages:V})),{initialMessages:w,parseChunk:h,buildPayload:L,onFinish:D,onError:W,...O}=U??{},Y=V=>{n(J=>J.map(ue=>ue.id===m.id?{...ue,content:V}:ue))},Z="",K;try{K=r.requestStream(F(x),O),y.current=K}catch(V){let J=Wt(V);A()&&(f(J),c(!1),U?.onError?.(J));return}try{for await(let V of K){if(k.current!==N)break;Z+=d(V),A()&&Y(Z)}A()&&(c(!1),U?.onFinish?.({...m,content:Z}))}catch(V){let J=Wt(V);A()&&(f(J),c(!1),U?.onError?.(J))}finally{y.current===K&&(y.current=null)}},[r]);return{messages:o,input:s,setInput:a,sendMessage:T,stop:S,isStreaming:i,error:u}}import{useCallback as te,useEffect as Bt,useMemo as cn,useRef as $t,useState as jt}from"react";import{createInputPresencePublisher as un,INPUT_PRESENCE_DEFAULT_HZ as ln,INPUT_PRESENCE_FIELD as dn}from"@urun-sh/core";var ut=[];function pn(t,e={}){let{field:r=dn,hz:o=ln}=e,n=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=t?.presence??null,a=cn(()=>s?un({awareness:{setLocalStateField:(g,E)=>s.setField(g,E)},field:r,hz:o}):null,[s,r,o]),i=$t(null);i.current=a;let[c,u]=jt(!1),[f,l]=jt(ut),v=$t(!1);Bt(()=>{if(a)return()=>a.dispose()},[a]);let C=te(()=>{let g=i.current;l(g?g.heldKeys():ut)},[]),k=te(()=>{i.current?.clear(),l(ut)},[]);Bt(()=>{if(!n)return;let g=()=>!!n.pointerLockElement,E=()=>{if(g()){v.current=!1,u(!0);return}v.current||(u(!1),k())},N=m=>{g()&&(i.current?.keyDown(m.key),C())},A=m=>{i.current?.keyUp(m.key),C()},U=m=>{g()&&i.current?.movePointer(m.movementX,m.movementY)},d=m=>{g()&&i.current?.setButtons(m.buttons)},p=()=>{k()};return n.addEventListener("pointerlockchange",E),n.addEventListener("keydown",N),n.addEventListener("keyup",A),n.addEventListener("mousemove",U),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",p),()=>{n.removeEventListener("pointerlockchange",E),n.removeEventListener("keydown",N),n.removeEventListener("keyup",A),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",p)}},[n,k,C]);let y=te(g=>{g.requestPointerLock?.()},[]),b=te(()=>{v.current=!0,u(!0)},[]),S=te(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),k()},[n,k]),T=te(g=>{i.current?.keyDown(g),C()},[C]),P=te(g=>{i.current?.keyUp(g),C()},[C]),R=te((g,E)=>{i.current?.movePointer(g,E)},[]);return{engage:y,engageTouch:b,release:S,engaged:c,heldKeys:f,pressKey:T,releaseKey:P,movePointer:R}}var Kt=new Map;function mn(t,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${t}"): schema must be a valid Zod schema`);Kt.set(t,{component:e,schema:r})}function Jt(t,e){let r=Kt.get(t);if(!r)return{error:`Unknown component: "${t}"`};let o=r.schema.safeParse(e);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${t}": ${o.error.message}`}}import{Fragment as Sn,jsx as De}from"react/jsx-runtime";function fn({name:t,props:e,fallback:r}){let o=Jt(t,e);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?De(Sn,{children:r}):De("div",{className:"urun-component-error",role:"alert",children:De("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return De(n,{...o.validatedProps})}import{z as Ce}from"zod";import{jsx as lt,jsxs as zt}from"react/jsx-runtime";var gn=Ce.object({step:Ce.number().min(0),total:Ce.number().min(1),label:Ce.string().optional(),variant:Ce.enum(["default","success","error"]).default("default")});function Xt(t){let{step:e,total:r,label:o,variant:n="default"}=t,s=Math.min(e/r*100,100),a=e>=r;return{step:e,total:r,label:o,variant:n,percentage:s,isComplete:a}}function hn(t){let{step:e,total:r,label:o,variant:n,percentage:s}=Xt(t);return zt("div",{className:"urun-progress-card","data-variant":n,children:[o&&lt("div",{className:"urun-progress-label",children:o}),lt("div",{className:"urun-progress-bar",children:lt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),zt("div",{className:"urun-progress-text",children:[e,"/",r]})]})}import{z as dt}from"zod";import{jsx as Gt,jsxs as bn}from"react/jsx-runtime";var vn=dt.object({state:dt.enum(["thinking","generating","idle","error"]),message:dt.string().optional()}),yn={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Yt(t){let{state:e,message:r}=t,o=e==="thinking"||e==="generating",n=r??yn[e]??e;return{state:e,message:n,isActive:o}}function kn(t){let{state:e,message:r,isActive:o}=Yt(t);return bn("span",{className:"urun-status-badge","data-state":e,children:[Gt("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Gt("span",{className:"urun-status-message",children:r})]})}import{useRef as Zt,useEffect as Cn}from"react";import{z as pt}from"zod";import{jsx as Qt,jsxs as Tn}from"react/jsx-runtime";var Pn=pt.object({text:pt.string(),streaming:pt.boolean().default(!1)});function er(t){let{text:e,streaming:r=!1}=t,o=e.length===0;return{text:e,streaming:r,isEmpty:o}}function xn(t){let{text:e,streaming:r}=er(t),o=Zt(null),n=Zt(0);return Cn(()=>{let s=o.current;s&&e.length!==n.current&&(s.textContent=e,n.current=e.length)},[e]),Tn("div",{className:"urun-text-stream",children:[Qt("span",{ref:o,className:"urun-text-content"}),r&&Qt("span",{className:"urun-text-cursor"})]})}import{z as Oe}from"zod";import{jsx as tr,jsxs as wn}from"react/jsx-runtime";var Rn=Oe.object({src:Oe.string().url(),alt:Oe.string().optional(),caption:Oe.string().optional()});function rr(t){let{src:e,alt:r,caption:o}=t;return{src:e,alt:r??"",caption:o}}function En(t){let{src:e,alt:r,caption:o}=rr(t);return wn("figure",{className:"urun-image-frame",children:[tr("img",{className:"urun-image",src:e,alt:r}),o&&tr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as re}from"zod";import{jsx as mt,jsxs as Mn}from"react/jsx-runtime";var An=re.object({metrics:re.array(re.object({label:re.string(),value:re.union([re.string(),re.number()]),unit:re.string().optional()}))});function nr(t){return{metrics:t.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Un(t){let{metrics:e}=nr(t);return mt("div",{className:"urun-metrics-panel",children:e.map((r,o)=>Mn("div",{className:"urun-metric-card",children:[mt("div",{className:"urun-metric-label",children:r.label}),mt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{createContext as _n,useContext as Nn}from"react";import{jsx as Ln}from"react/jsx-runtime";var or=_n(null);function In({session:t,children:e}){return Ln(or.Provider,{value:t,children:e})}function j(){return Nn(or)}import{forwardRef as Dn,useCallback as Ve,useEffect as On,useImperativeHandle as Vn,useRef as ft,useState as qn}from"react";import{jsx as Hn,jsxs as Bn}from"react/jsx-runtime";var Fn=1e3;function Wn(...t){console.debug("[video]",...t)}var St=Dn(function(e,r){let{session:o,stream:n="video",track:s,muted:a=!0,mirror:i=!1,objectFit:c="contain",className:u,style:f,videoClassName:l,placeholder:v,children:C,onTrack:k}=e,y=j(),b=o??y,S=ft(null),T=ft(null),[P,R]=qn(!1),g=ft(k);g.current=k;let E=Ve(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let p=S.current;return p&&p.srcObject!==T.current&&(p.srcObject=T.current),T.current},[]),N=Ve(p=>{let m=S.current;if(!m)return;let x=m.play();!x||typeof x.catch!="function"||x.catch(_=>Wn(`play() failed (${p})`,_))},[]),A=Ve(p=>{let m=E();if(m){for(let x of m.getVideoTracks())x!==p&&m.removeTrack(x);if(p&&!m.getVideoTracks().includes(p)){m.addTrack(p);let x=S.current;x&&(x.srcObject=m)}p&&N("track-attach"),R(p!==null),g.current?.(p)}},[E,N]),U=Ve(p=>{S.current=p,p&&(a&&(p.muted=!0,p.defaultMuted=!0,p.setAttribute("muted","")),p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),E())},[E,a]);Vn(r,()=>({get element(){return S.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1}}),[]);let d=s!==void 0;return On(()=>{if(d){A(s??null);return}if(!b)return;let p=b.stream(n),m=()=>{let h=T.current;return h?h.getVideoTracks()[0]??null:null},x=h=>{if(h!==m()&&(A(h),h)){let L=()=>{m()===h&&A(null)};h.addEventListener("ended",L)}},_=p.track;_&&_.readyState==="live"&&x(_);let F=p.on("track",h=>{h&&h.readyState!=="live"||x(h)}),w=setInterval(()=>{let h=p.track;h&&h.readyState==="live"&&x(h)},Fn);return()=>{F(),clearInterval(w)}},[b,n,d,s,A]),Bn("div",{className:u,style:{position:"relative",width:"100%",height:"100%",...f},"data-urun-video":"","data-urun-video-live":P?"true":"false",children:[Hn("video",{ref:U,className:l,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...i?{transform:"scaleX(-1)"}:{}}}),P?null:v,C]})});import{forwardRef as $n}from"react";import{jsx as Kn}from"react/jsx-runtime";var jn=$n(function(e,r){let{stream:o="image",...n}=e;return Kn(St,{ref:r,stream:o,...n})});import{forwardRef as zn,useCallback as ge,useEffect as gt,useImperativeHandle as Xn,useRef as he}from"react";import{observePageLifecycle as Gn}from"@urun-sh/core";var qe=null;function Jn(){if(typeof window>"u")return null;let t=window;return t.AudioContext??t.webkitAudioContext??null}function Fe(){if(qe)return qe;let t=Jn();return t?(qe=new t,qe):null}function We(){let t=Fe();t&&t.state==="suspended"&&t.resume().catch(()=>{})}import{jsx as Qn}from"react/jsx-runtime";var Yn=1e3,sr=200;function ht(...t){console.debug("[audio]",...t)}var He=zn(function(e,r){let{session:o,stream:n="audio",track:s,controls:a=!1,className:i,onTrack:c,onUnlockChange:u,onAudioElement:f}=e,l=j(),v=o??l,C=he(null),k=he(null),y=he(null),b=he(null),S=he(c);S.current=c;let T=he(u);T.current=u;let P=ge(d=>{y.current!==d&&(y.current=d,T.current?.(d))},[]),R=ge(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let d=C.current;return d&&d.srcObject!==k.current&&(d.srcObject=k.current),k.current},[]),g=ge(d=>{let p=C.current;if(!p)return;let m=p.play();!m||typeof m.then!="function"||m.then(()=>{p.muted||P(!0)}).catch(x=>{let _=x instanceof Error?x.name:String(x);if(_==="AbortError"){ht(`play() aborted (${d}); retrying in ${sr}ms`),b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{b.current=null,g(`${d}:retry`)},sr);return}if(_==="NotAllowedError"){ht(`play() blocked pending a user gesture (${d})`),P(!1);return}ht(`play() failed (${d})`,x)})},[P]),E=ge(d=>{let p=R();if(p){for(let m of p.getAudioTracks())m!==d&&p.removeTrack(m);d&&!p.getAudioTracks().includes(d)&&p.addTrack(d),d&&g("track-attach"),S.current?.(d)}},[R,g]),N=ge(()=>{let d=C.current;d&&(R(),d.muted=!1,g("gesture"),We(),P(!0))},[R,g,P]);Xn(r,()=>({unlock:N,get unlocked(){return y.current===!0},get element(){return C.current}}),[N]);let A=ge(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),R()),f?.(d)},[R,f]),U=s!==void 0;return gt(()=>{if(U){E(s??null);return}if(!v)return;let d=v.stream(n),p=()=>{let w=k.current;return w?w.getAudioTracks()[0]??null:null},m=w=>{if(w!==p()&&(E(w),w)){let h=()=>{p()===w&&E(null)};w.addEventListener("ended",h)}},x=d.track;x&&x.readyState==="live"&&m(x);let _=d.on("track",w=>{w&&w.readyState!=="live"||m(w)}),F=setInterval(()=>{let w=d.track;w&&w.readyState==="live"&&m(w)},Yn);return()=>{_(),clearInterval(F)}},[v,n,U,s,E]),gt(()=>Gn(()=>{We(),y.current===!0&&g("foreground")}),[g]),gt(()=>()=>{b.current&&clearTimeout(b.current)},[]),Qn("audio",{ref:A,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})}),Zn=He;import{forwardRef as eo,useCallback as ve,useEffect as ir,useImperativeHandle as to,useRef as X}from"react";import{observePageLifecycle as ro,sessionFailureFromMediaError as no,sharedCaptureController as oo}from"@urun-sh/core";import{jsx as io}from"react/jsx-runtime";var ar={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Be(...t){console.debug("[voice]",...t)}var $e=eo(function(e,r){let{session:o,stream:n="audio",playback:s=!0,constraints:a=ar,connectTimeoutMs:i,attempts:c=3,retryDelayMs:u=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:C,onUnlockChange:k,capture:y}=e,b=j(),S=o??b,T=X(null),P=X(null),R=X(null),g=X([]),E=X(!1),N=X(f);N.current=f;let A=X(l);A.current=l;let U=X(v);U.current=v;let d=ve(h=>{E.current!==h&&(E.current=h,N.current?.(h))},[]),p=ve(()=>{for(let h of g.current)h();g.current=[],R.current?.release(),R.current=null,P.current&&(P.current=null,U.current?.(null))},[]),m=ve(async()=>{let h=R.current;if(h){let O=await h.update(a);return P.current=h.stream,U.current?.(h.stream),O}let D=await(y??oo()).claim("audio",a);R.current=D,g.current=[D.onTrack((O,Y)=>{P.current=Y,U.current?.(Y),E.current&&S?.stream(n).attach(O).catch(Z=>Be("mic re-attach after one-capture re-acquire failed",Z))}),D.onLost(O=>{R.current=null,g.current=[],P.current=null,U.current?.(null),d(!1),A.current?.(O)})],P.current=D.stream,U.current?.(D.stream);let W=D.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[y,a,S,n,d]),x=ve(async()=>{p(),d(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,p,d]),_=ve(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <SessionScope>");T.current?.unlock();let h;try{h=await m()}catch(W){p();let O=no(W,S.status);throw A.current?.(O),O}S.connect?.();let L;for(let W=1;W<=c;W++)try{await S.whenLive(i!==void 0?{timeout:i}:void 0),await S.stream(n).attach(h),d(!0);return}catch(O){L=O,Be(`start attempt ${W}/${c} failed`,O),W<c&&await new Promise(Y=>setTimeout(Y,u))}p(),d(!1);let D=L instanceof Error?L:new Error(String(L??"voice start failed"));throw A.current?.(D),D},[S,n,i,c,u,m,p,d]);to(r,()=>({start:_,stop:x,unlock:()=>T.current?.unlock(),get active(){return E.current},get micStream(){return P.current},get audio(){return T.current}}),[_,x]);let F=X(!1),w=ve(async()=>{if(!S||!E.current||F.current)return;let h=P.current?.getAudioTracks()[0]??null;if(h&&h.readyState==="live"){try{await S.stream(n).attach(h)}catch(L){Be("foreground mic re-assert failed (will retry on next pass)",L)}return}F.current=!0;try{let L=await m();await S.stream(n).attach(L)}catch(L){let D=L instanceof Error?L:new Error(String(L));Be("foreground mic re-acquire failed",D),A.current?.(D)}finally{F.current=!1}},[S,n,m]);return ir(()=>{let h=()=>{w()};return S&&typeof S.onRecovery=="function"?S.onRecovery(h):ro(h)},[S,w]),ir(()=>p,[p]),s?io(He,{ref:T,session:S,stream:n,onTrack:C,onUnlockChange:k}):null}),so=$e;import{forwardRef as uo,useEffect as lo,useImperativeHandle as po,useRef as cr,useState as mo}from"react";import{useEffect as ao,useState as co}from"react";var vt={level:0,speaking:!1};function yt(t,e={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=e,[s,a]=co(vt);return ao(()=>{if(!t){a(vt);return}let i=Fe();if(!i||typeof MediaStream>"u")return;let c;t instanceof MediaStream?c=t:(c=new MediaStream,c.addTrack(t));let u,f;try{u=i.createMediaStreamSource(c),f=i.createAnalyser(),f.fftSize=r,u.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),C=setInterval(()=>{f.getByteTimeDomainData(l);let k=0;for(let b=0;b<l.length;b++){let S=(l[b]-128)/128;k+=S*S}let y=Math.sqrt(k/l.length);a(b=>{let S=y>n;return Math.abs(b.level-y)<.005&&b.speaking===S?b:{level:y,speaking:S}})},o);return()=>{clearInterval(C),u.disconnect(),a(vt)}},[t,r,o,n]),s}import{Fragment as ho,jsx as je,jsxs as vo}from"react/jsx-runtime";var fo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},So={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},go=uo(function(e,r){let{session:o,stream:n="audio",constraints:s,autoStart:a=!0,visible:i=!1,className:c,onActiveChange:u,onError:f,onMicStream:l,capture:v}=e,C=j(),k=o??C,y=cr(null),[b,S]=mo(null),T=cr(l);T.current=l;let{level:P,speaking:R}=yt(i?b:null);return po(r,()=>({start:()=>{let g=y.current;return g?g.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>y.current?.stop()??Promise.resolve(),get active(){return y.current?.active??!1},get micStream(){return y.current?.micStream??null}}),[]),lo(()=>{!a||!k||y.current?.start().catch(()=>{})},[a,k]),vo(ho,{children:[je($e,{ref:y,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:u,onError:f,onMicStream:g=>{S(g),T.current?.(g)}}),i?je("span",{className:c,style:fo,"data-urun-mic":"","data-urun-mic-active":b?"true":"false","data-urun-mic-speaking":R?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(P*100)/100,children:je("span",{style:So,children:je("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(P*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{sessionFailureFromMediaError as yo,sharedCaptureController as ko}from"@urun-sh/core";import{forwardRef as lr,useCallback as G,useEffect as kt,useImperativeHandle as bo,useRef as H,useState as Pe}from"react";import{jsx as ne,jsxs as ur}from"react/jsx-runtime";var dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function bt(...t){console.debug("[camera]",...t)}function Co(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Po(){let t=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof t?.enumerateDevices!="function")return null;try{return(await t.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var pr=lr(function(e,r){let{session:o,stream:n="video",constraints:s,front:a=!1,back:i=!1,facingMode:c,autoStart:u=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:k,onActiveChange:y,onError:b,onStream:S,onTrack:T,children:P,capture:R,flipControl:g="auto",flipControlClassName:E,onDevices:N}=e;if(a&&i)throw new Error("<Camera> takes `front` OR `back`, not both");let A=a?"user":i?"environment":c??"environment",U=j(),d=o??U,p=H(null),m=H(null),x=H(null),_=H([]),F=H(null),w=H(!1),h=H(A),[L,D]=Pe(A),[W,O]=Pe(!1),[Y,Z]=Pe(null),[K,V]=Pe(!1),[J]=Pe(Co),ue=H(y);ue.current=y;let we=H(b);we.current=b;let Ye=H(S);Ye.current=S;let Ae=H(T);Ae.current=T;let Mt=H(N);Mt.current=N;let Q=G(M=>{w.current!==M&&(w.current=M,O(M),ue.current?.(M))},[]);kt(()=>{if(!W){Z(null);return}let M=!1,I=()=>{Po().then(B=>{M||(Z(B),B&&Mt.current?.(B))})};I();let q=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof q?.addEventListener=="function"?(q.addEventListener("devicechange",I),()=>{M=!0,q.removeEventListener?.("devicechange",I)}):()=>{M=!0}},[W]);let Ue=G(M=>{let I=p.current;I&&(I.muted=!0,I.defaultMuted=!0,I.setAttribute("muted",""),I.setAttribute("playsinline",""),I.setAttribute("webkit-playsinline",""),I.srcObject=M,M&&I.play()?.catch?.(q=>bt("preview play() failed",q)))},[]),z=G(()=>{F.current?.(),F.current=null;for(let M of _.current)M();_.current=[],x.current?.release(),x.current=null,m.current&&(m.current=null,Ye.current?.(null),Ae.current?.(null)),Ue(null)},[Ue]),Ze=G((M,I)=>{F.current?.(),m.current=I,Ue(I),Ye.current?.(I);let q=()=>{m.current===I&&(bt("camera track ended (device removed or permission revoked)"),z(),Q(!1))};M.addEventListener("ended",q),F.current=()=>M.removeEventListener("ended",q)},[Ue,z,Q]),le=G(async M=>{if(!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <SessionScope>");let I={...dr,...s,facingMode:M},q;try{let B=x.current;if(B)q=await B.update(I);else{let ye=await(R??ko()).claim("video",I);if(x.current=ye,_.current=[ye.onTrack((ke,Ur)=>{Ze(ke,Ur),w.current&&d.stream(n).attachVideo(ke).then(()=>Ae.current?.(ke)).catch(Mr=>bt("camera re-publish after one-capture re-acquire failed",Mr))}),ye.onLost(ke=>{x.current=null,_.current=[],z(),Q(!1),we.current?.(ke)})],!ye.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});q=ye.track}}catch(B){let de=yo(B,d.status);throw we.current?.(de),de}h.current=M,D(M),Ze(q,x.current?.stream??new MediaStream([q]));try{d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(q)}catch(B){z(),Q(!1);let de=B instanceof Error?B:new Error(String(B));throw we.current?.(de),de}Ae.current?.(q),Q(!0)},[d,n,s,l,R,Ze,z,Q]),_t=G(M=>le(M?.facingMode??h.current),[le]),Me=G(async M=>{w.current&&h.current===M||await le(M)},[le]),Qe=G(()=>le(h.current==="environment"?"user":"environment"),[le]),Nt=G(async()=>{z(),Q(!1),await d?.stream(n).detachVideo().catch(()=>{})},[d,n,z,Q]);bo(r,()=>({start:_t,stop:Nt,flip:Qe,setFacingMode:Me,get active(){return w.current},get facingMode(){return h.current},get stream(){return m.current},get element(){return p.current}}),[_t,Nt,Qe,Me]);let It=H(Me);if(It.current=Me,kt(()=>{!u||!d||It.current(A).catch(()=>{})},[u,d,A]),kt(()=>z,[z]),!v)return null;let Er=f==="auto"?L==="user":f,wr=W&&(g===!0||g==="auto"&&J&&(Y?.length??0)>1),Ar=()=>{K||(V(!0),Qe().catch(()=>{}).finally(()=>V(!1)))};return ur("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":L,children:[ne("video",{ref:p,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Er?{transform:"scaleX(-1)"}:{}}}),wr?ne("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Ar,disabled:K,className:E,style:E?{opacity:K?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:K?.6:1},children:ur("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[ne("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ne("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ne("path",{d:"M14.5 10.5v1.6h-1.6"}),ne("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ne("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,P]})}),xo=lr(function({preview:e=!0,...r},o){return ne(pr,{ref:o,...r,visible:e,autoStart:!1})});import{useEffect as To,useState as Ro}from"react";function Eo(t,e){let[r,o]=Ro(null);return To(()=>{if(!t||!e){o(null);return}let n=t.stream(e);return o(n.track),n.on("track",o)},[t,e]),r}import{useCallback as No}from"react";import{useEffect as Mo,useMemo as _o}from"react";import{createStore as wo}from"zustand/vanilla";import{useStore as Ao}from"zustand";var Uo=()=>{};function Ct(t,e={}){let r=u=>{t?.set(u)},o=()=>t?t.get()??{}:{},n=wo(()=>({doc:o(),synced:t?t.synced:!1,set:r})),s=null,a=()=>{if(s){for(let u of s)u();s=null}},i=()=>t?(s||(n.setState({doc:o(),synced:t.synced}),s=[t.on("change",u=>n.setState({doc:u})),t.onSynced(()=>n.setState({synced:!0}))]),a):Uo,c=(u=>Ao(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:i,unbind:a}),e.bind!==!1&&i(),c}function xe(t,e){let r=_o(()=>Ct(t&&e?t.doc(e):null,{bind:!1}),[t,e]);return Mo(()=>r.bind(),[r]),r}function Io(t,e,r){let n=xe(t,e)(r??(i=>i)),s=No(i=>{t&&e&&t.doc(e).set(i)},[t,e]);if(r)return n;let a=n;return{snapshot:t&&e?a.doc:null,synced:a.synced,set:s}}import{useEffect as Lo,useState as Do}from"react";var ie=200;function oe(t,e,r=200){let o=[...t,e];return o.length>r?o.slice(o.length-r):o}function Te(t){if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}function Pt(t){let e=t.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function xt(t,e,r={}){let o=r.cap??200,[n,s]=Do([]);return Lo(()=>{if(s([]),!t||!e)return;let a=!0,i=t.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await i.next();if(!a||c.done)break;s(u=>oe(u,{at:Date.now(),payload:c.value},o))}})(),()=>{a=!1,i.return?.()}},[t,e,o]),n}import{jsx as Ke,jsxs as Re}from"react/jsx-runtime";function Oo({session:t,name:e,cap:r,className:o}){let n=xt(t,e,{cap:r});return Re("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Re("div",{className:"urun-stream-tail-meta",children:[Ke("code",{children:e}),Re("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),Ke("div",{className:"urun-stream-tail-log",children:n.length===0?Re("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ke("code",{children:e})," messages\u2026"]}):n.map((s,a)=>Re("div",{className:"urun-stream-tail-line",children:[Ke("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Te(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as Vo,useState as mr}from"react";import{jsx as ae,jsxs as Je}from"react/jsx-runtime";function ze({placeholder:t,buttonLabel:e,disabled:r,onApply:o}){let[n,s]=mr(""),[a,i]=mr(null),c=Vo(()=>{let u=Pt(n);if(!u.ok){i(u.error);return}i(null),o(u.value,n.trim()),s("")},[n,o]);return Je("div",{className:"urun-doc-patch",children:[ae("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:t,rows:3}),Je("div",{className:"urun-doc-patch-actions",children:[ae("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:e}),a?ae("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function qo({session:t,docKey:e,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=xe(t,e),a=s(u=>u.doc),i=s(u=>u.synced),c=s(u=>u.set);return Je("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[Je("div",{className:"urun-doc-panel-meta",children:[ae("code",{children:e}),ae("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),ae("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),r?ae(ze,{placeholder:o,buttonLabel:"Apply patch",disabled:!t,onApply:u=>c(u)}):null]})}import{useEffect as Fo,useState as Wo}from"react";import{jsx as Ee,jsxs as Sr}from"react/jsx-runtime";function fr(t,e=600){return t.length>e?`${t.slice(0,e)}\u2026`:t}function Ho({session:t,docKey:e="control",cap:r=200,className:o}){let[n,s]=Wo([]);return Fo(()=>(s([]),t?t.doc(e).on("change",i=>{s(c=>oe(c,{at:Date.now(),direction:"in",text:fr(Te(i))},r))}):void 0),[t,e,r]),Sr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Ee(ze,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!t,onApply:(a,i)=>{t?.doc(e).set(a),s(c=>oe(c,{at:Date.now(),direction:"out",text:fr(i)},r))}}),Ee("div",{className:"urun-control-sender-log",children:n.length===0?Ee("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((a,i)=>Sr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[Ee("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",Ee("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}import{useEffect as Bo,useState as $o}from"react";import{jsx as Xe,jsxs as Ko}from"react/jsx-runtime";function jo({session:t,trackNames:e=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,a]=$o([]),i=e.join(","),c=r.join(",");return Bo(()=>{if(a([]),!t)return;let u=(l,v)=>a(C=>oe(C,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(t.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of e){let v=t.stream(l);f.push(v.on("track",C=>u("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=t.doc(l);f.push(v.on("change",()=>u("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[t,i,c,o]),Xe("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?Xe("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,f)=>Ko("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[Xe("span",{className:"urun-event-spine-kind",children:u.kind})," ",Xe("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${f}`))})}import{describeSessionPhase as as,isWakingPhase as cs}from"@urun-sh/core";import{useEffect as Jo,useState as zo}from"react";function $(t){let[e,r]=zo(t?.phase??null);return Jo(()=>{if(!t){r(null);return}return t.onPhase(r)},[t]),e}import{describeSessionPhase as Qo}from"@urun-sh/core";import{useEffect as Xo,useRef as Go,useState as Yo}from"react";import{isWakingPhase as Zo}from"@urun-sh/core";function Tt(t){let e=$(t),r=Zo(e?.name),o=Go(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?e?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[a,i]=Yo(s);return Xo(()=>{if(n===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[n]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:n,seconds:r?a:0}}import{Fragment as es,jsx as gr,jsxs as hr}from"react/jsx-runtime";function Rt({session:t,render:e,className:r}){let o=Tt(t);return!o.waking||!o.phase?null:gr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:e?e(o):hr(es,{children:[gr("span",{className:"urun-session-waking-label",children:Qo(o.phase)})," ",hr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as ns,useState as os}from"react";import{useEffect as vr,useRef as ts,useState as yr}from"react";var rs={event:null,elapsedMs:0};function Et(t,e){let[r,o]=yr(null),n=ts(0);vr(()=>{if(o(null),!!t?.onActivation)return t.onActivation(i=>{e!==void 0&&i.stream!==e||(n.current=Date.now(),o(i))})},[t,e]);let[s,a]=yr(0);return vr(()=>{if(!r){a(0);return}if(r.state==="first-media"){a(r.elapsedMs);return}let i=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-i);a(c());let u=setInterval(()=>a(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:rs}import{jsx as kr,jsxs as br}from"react/jsx-runtime";var ss={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function is(t){let[e,r]=os(!1);return ns(()=>{if(r(!1),!t)return;let o=t;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[t]),e}function wt({session:t,stream:e,videoElement:r,render:o,className:n}){let s=Et(t,e),a=is(r),i=s.event;if(!i||i.state==="first-media"||a)return null;let c=i.state;return kr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):br("div",{className:"urun-activation-overlay-card",children:[kr("span",{className:"urun-activation-overlay-copy",children:i.hint??ss[c]})," ",br("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as ce,jsxs as At}from"react/jsx-runtime";var us={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function ls({session:t,className:e}){let r=$(t),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return At("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":o,children:[ce("span",{className:"urun-session-status-dot","data-phase":o}),ce("span",{className:"urun-session-status-label",children:us[o]}),n?ce("span",{className:"urun-session-status-detail",children:n}):null]})}function ds({session:t,children:e,fallback:r,onStartOver:o,className:n}){let s=$(t);if(s?.name==="live")return At("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[e,ce(wt,{session:t})]});let a=r?r(s):ce("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&cs(s.name)?ce(Rt,{session:t}):s&&s.name!=="idle"?as(s):"Waiting for a live session\u2026"}),i=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return At("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[a,i?ce("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ps,useState as ms}from"react";import{jsx as gs}from"react/jsx-runtime";function Cr(t){return $(t)?.endsAt??null}function fs(t){let e=Math.max(0,Math.floor(t/1e3)),r=Math.floor(e/60),o=e%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function Ss({session:t,urgentMs:e=6e4,className:r}){let n=Cr(t)?.getTime()??null,[s,a]=ms(()=>n===null?null:Math.max(0,n-Date.now()));if(ps(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let i=fs(s);return gs("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:i})}import{jsx as Pr,jsxs as ys}from"react/jsx-runtime";var hs=new Set(["expired","ended","error"]);function vs({session:t,onNewSession:e,children:r,className:o}){let n=$(t);if(!n||!hs.has(n.name))return null;let s=r?r(n):Pr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return ys("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,e?Pr("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}import{useEffect as xr,useMemo as ks,useState as Tr}from"react";import{jsx as Ge,jsxs as Ps}from"react/jsx-runtime";function Ut(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function Rr(t){let e=ks(()=>t?t.doc("control"):null,[t]),[r,o]=Tr(()=>e?Ut(e.get("idle")):null);return xr(()=>{if(!e){o(null);return}return o(Ut(e.get("idle"))),e.on("change",()=>o(Ut(e.get("idle"))))},[e]),r}function bs(t){let e=Math.max(0,Math.floor(t));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function Cs({session:t,onStillHere:e,className:r}){let o=Rr(t),n=o?.deadlineEpochS??null,[s,a]=Tr(null);if(xr(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!t)return null;let i=()=>{t.touch?.(),e?.()};return Ge("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Ps("div",{className:"urun-idle-warning-card",children:[Ge("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Ge("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${bs(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Ge("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}import{useContext as xs,useEffect as Ts,useState as Rs}from"react";import{prewake as Es}from"@urun-sh/core";function ws(t){let e=xs(pe),[r,o]=Rs(null),n=t.app??e?.appId,s=t.function,a=t.intervalS??60,i=e?.baseUrl,c=e?.orgId,u=e?.jwt,f=e?.getAccessToken,l=e?.authProvider;return Ts(()=>{if(!i||!c||!n||!s)return;let v=!1,C=()=>{Es({baseUrl:i,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:f,authProvider:l}).then(y=>{v||o(y)}).catch(()=>{})};C();let k=setInterval(C,Math.max(1,a)*1e3);return()=>{v=!0,clearInterval(k)}},[n,s,a,i,c,u,f,l]),r}import{describeSessionPhase as ku,isWakingPhase as bu}from"@urun-sh/core";export{He as Audio,pr as Camera,fn as ComponentRenderer,dr as DEFAULT_CAMERA_CONSTRAINTS,ie as DEFAULT_LOG_CAP,ar as DEFAULT_VOICE_CONSTRAINTS,ze as DocPatchForm,jn as Image,En as ImageFrame,Rn as ImageFrameSchema,Un as MetricsPanel,An as MetricsPanelSchema,go as Mic,hn as ProgressCard,gn as ProgressCardSchema,In as SessionScope,kn as StatusBadge,vn as StatusBadgeSchema,xn as TextStream,Pn as TextStreamSchema,wt as UrunActivationOverlay,Zn as UrunAudio,_r as UrunAuthProvider,xo as UrunCamera,Ho as UrunControlSender,qo as UrunDocPanel,be as UrunErrorBoundary,jo as UrunEventSpine,Cs as UrunIdleWarning,Nr as UrunJwtProvider,Wr as UrunProvider,Ss as UrunSessionClock,vs as UrunSessionEnded,ds as UrunSessionGate,ls as UrunSessionStatus,Rt as UrunSessionWaking,Oo as UrunStreamTail,so as UrunVoice,St as Video,$e as Voice,_e as authMode,Ct as createDocStore,ku as describeSessionPhase,Te as formatPayload,Fe as getUrunAudioContext,bu as isWakingPhase,Pt as parseJsonObject,oe as pushCapped,mn as registerComponent,We as resumeUrunAudioContext,ee as urunPublicEnv,Et as useActivation,zr as useApp,an as useChat,rn as useCompletion,xe as useDocStore,rr as useImageFrame,pn as useInputPresence,nr as useMetricsPanel,Xt as useProgressCard,Zr as useRequest,Io as useSessionDoc,Cr as useSessionEndsAt,Rr as useSessionIdle,$ as useSessionPhase,Eo as useSessionTrack,Tt as useSessionWake,Yt as useStatusBadge,xt as useStreamMessages,er as useTextStream,yt as useUrunAudioLevel,et as useUrunAuth,ws as useUrunPrewake,Or as usesWorkOSAuth};
2
+ import{a as Fr,b as Hr,c as rt}from"./chunk-WF2OBDSX.mjs";import{useEffect as $t,useMemo as Zr,useState as Ie}from"react";import{Component as Wr}from"react";import{jsx as qt,jsxs as Br}from"react/jsx-runtime";var be=class extends Wr{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||Br("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:[qt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),qt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as $r}from"react";var me=$r(null);function se(e){return e&&e.trim()?e.trim():void 0}function ee(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return se(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return se(typeof process<"u"?process.env?.[e]:void 0)}}function Ne(){let e=ee("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ee("VERCEL_ENV")==="production"?"workos":ee("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function jr(){return Ne()==="workos"}import{useEffect as Kr,useRef as Jr}from"react";var zr="urun.operator_token",Ht=null,Ft="op",Xr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Wt(){return typeof window<"u"}function Bt(){return Ht}function Gr(){if(!Wt())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Ft);if(!r)return null;Ht=r,t.delete(Ft);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Yr(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function nt(e){let t=Jr(e);t.current=e,Kr(()=>{if(!Wt())return;Gr();let r=o=>{if(!Yr(o))return;let n=Bt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{jsx as Pe,jsxs as rn}from"react/jsx-runtime";var Qr="/api/urun-token";function en(e,t){return typeof e=="function"?e(t):e!==void 0?e:rn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Pe("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Pe("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function tn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:a,sessionKey:i,tokenEndpoint:c,fallback:u,errorFallback:g,children:p}){let d=n===void 0&&t===void 0;if(!d&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!d&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let k=r??o;if(d&&(typeof k!="string"||k.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);let[x,b]=Ie(),[y,S]=Ie(),[T,C]=Ie(null),[E,h]=Ie(null);nt(F=>h({jwt:F}));let w=rt(),I=ee("NEXT_PUBLIC_SESSION_TOKEN")??ee("NEXT_PUBLIC_URUN_JWT"),U=Ne(),A=E!==null,l=U==="workos"&&!n&&!A&&!d,m=n??(U==="jwt"?I:void 0)??x??y?.token,f=A?E.jwt:m,P=s??ee("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),_=l&&!f,W=t??y?.orgId,R=e??y?.gatewayUrl,v=d&&y===void 0,N=d&&y!==void 0&&!R?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,q=T??N,B=Zr(()=>({appId:k,baseUrl:R??"",orgId:W??"",jwt:f,getAccessToken:l?w?.getAccessToken:void 0,authProvider:P,eventsUrl:a,sessionKey:i,priority:A?"preempt":void 0}),[k,w,R,P,f,a,W,i,l,A]),L=c??Qr;return $t(()=>{if(!d)return;let F=new AbortController;return C(null),(async()=>{try{let H=await fetch(L,{method:"POST",signal:F.signal});if(!H.ok)throw new Error(`[urun] token endpoint ${L} answered ${H.status}`);let V=await H.json(),O=typeof V.token=="string"?V.token:"",j=typeof V.orgId=="string"?V.orgId:"";if(!O||!j)throw new Error(`[urun] token endpoint ${L} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);S({token:O,orgId:j,gatewayUrl:typeof V.gatewayUrl=="string"?V.gatewayUrl:void 0})}catch(H){if(F.signal.aborted)return;C(H instanceof Error?H:new Error(String(H)))}})(),()=>F.abort()},[d,L]),$t(()=>{if(!l||!w)return;let F=!1,H=w;async function V(){try{let j=await H.getAccessToken();F||b(j??void 0)}catch{F||b(void 0)}}V();let O=window.setInterval(()=>{V()},6e4);return()=>{F=!0,window.clearInterval(O)}},[w,l]),Pe(be,{fallback:u,children:q?en(g,q):_||v?Pe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Pe(me.Provider,{value:B,children:p})})}import{useContext as nn,useEffect as on,useMemo as jt,useReducer as sn,useRef as ot}from"react";import{App as an}from"@urun-sh/core";function un(e,t){return`${e}:${JSON.stringify(t??{})}`}function cn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var ie=new Map;var st=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,a=>{s(a),o()})}}dispose(){this._unsubscribeChange()}},it=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},at=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=i=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let c=i.error,u=c?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.httpStatus}})}else i.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new st(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new it(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function ln(){let e=nn(me);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=sn(a=>a+1,0),r=ot(new Map),o=ot(new Map),n=ot(null),s=jt(()=>an(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.priority]);return on(()=>{let a=n.current;if(a){n.current=null;for(let[i,c]of a){let u=ie.get(i);u===c&&o.current.get(i)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let i=new Map;for(let[c,u]of o.current){let g=ie.get(c);g===u&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),i.set(c,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let p=ie.get(c);!p||p.refCount!==0||(ie.delete(c),p.handle.disconnect())},0)))}n.current=i}},[]),jt(()=>new Proxy({},{get(a,i){if(typeof i=="string")return c=>{let u=un(i,c),g=r.current.get(u);if(g&&!g.disposed)return g;let p=cn(e,i,c),d=ie.get(p);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),ie.delete(p),o.current.get(p)===d&&o.current.delete(p),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new at(s[i](c),t,e.eventsUrl),refCount:0,disposeTimer:null},ie.set(p,d)),o.current.get(p)!==d&&(o.current.set(p,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(u,d.handle),d.handle}}}),[e,s])}import{useCallback as ut,useEffect as dn,useMemo as pn,useRef as Le,useState as ct}from"react";function fe(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function mn(e){return e instanceof Error?e:new Error(String(e))}function fn(e,t){let r=pn(()=>fe(e),[e]),[o,n]=ct(void 0),[s,a]=ct(null),[i,c]=ct(!1),u=Le(t);u.current=t;let g=Le(0),p=Le(null),d=Le(!0);dn(()=>(d.current=!0,()=>{d.current=!1,p.current?.abort()}),[]);let k=ut(async y=>{p.current?.abort();let S=new AbortController;p.current=S;let T=++g.current,C=()=>d.current&&g.current===T;C()&&(c(!0),a(null));try{let E=await r.request(y,{...u.current,signal:S.signal});return C()&&(n(E),c(!1),u.current?.onSuccess?.(E)),E}catch(E){let h=mn(E);throw C()&&(a(h),c(!1),u.current?.onError?.(h)),h}},[r]),x=ut(y=>{k(y).catch(()=>{})},[k]),b=ut(()=>{g.current++,p.current?.abort(),p.current=null,n(void 0),a(null),c(!1)},[]);return{mutate:x,mutateAsync:k,data:o,error:s,isPending:i,reset:b}}import{useCallback as Kt,useEffect as gn,useMemo as Sn,useRef as Oe,useState as lt}from"react";function Jt(e){return e instanceof Error?e:new Error(String(e))}var hn=e=>typeof e=="string"?e:String(e);function vn(e,t){let r=Sn(()=>fe(e),[e]),[o,n]=lt(""),[s,a]=lt(!1),[i,c]=lt(null),u=Oe(t);u.current=t;let g=Oe(0),p=Oe(null),d=Oe(!0);gn(()=>(d.current=!0,()=>{d.current=!1,p.current?.cancel(),p.current=null}),[]);let k=Kt(()=>{g.current++,p.current?.cancel(),p.current=null,d.current&&a(!1)},[]),x=Kt(async b=>{p.current?.cancel();let y=++g.current,S=()=>d.current&&g.current===y,T=u.current,C=T?.parseChunk??hn,E=T?.buildPayload??(f=>({prompt:f}));S()&&(n(""),c(null),a(!0));let{parseChunk:h,buildPayload:w,onFinish:I,onError:U,...A}=T??{},l="",m;try{m=r.requestStream(E(b),A),p.current=m}catch(f){let P=Jt(f);S()&&(c(P),a(!1),T?.onError?.(P));return}try{for await(let f of m){if(g.current!==y)break;l+=C(f),S()&&n(l)}S()&&(a(!1),T?.onFinish?.(l))}catch(f){let P=Jt(f);S()&&(c(P),a(!1),T?.onError?.(P))}finally{p.current===m&&(p.current=null)}},[r]);return{completion:o,complete:x,stop:k,isStreaming:s,error:i}}import{useCallback as zt,useEffect as yn,useMemo as kn,useRef as ge,useState as De}from"react";function Xt(e){return e instanceof Error?e:new Error(String(e))}var bn=e=>typeof e=="string"?e:String(e),Gt=0;function dt(e){return Gt+=1,`${e}-${Gt}`}function Pn(e,t){let r=kn(()=>fe(e),[e]),[o,n]=De(()=>(t?.initialMessages??[]).map(C=>({id:C.id??dt("msg"),role:C.role,content:C.content}))),[s,a]=De(""),[i,c]=De(!1),[u,g]=De(null),p=ge(t);p.current=t;let d=ge(o);d.current=o;let k=ge(s);k.current=s;let x=ge(0),b=ge(null),y=ge(!0);yn(()=>(y.current=!0,()=>{y.current=!1,b.current?.cancel(),b.current=null}),[]);let S=zt(()=>{x.current++,b.current?.cancel(),b.current=null,y.current&&c(!1)},[]),T=zt(async C=>{let E=C===void 0,h=(E?k.current:C)??"";if(!h.trim())return;b.current?.cancel();let I=++x.current,U=()=>y.current&&x.current===I,A=p.current,l=A?.parseChunk??bn,m={id:dt("msg"),role:"user",content:h},f={id:dt("msg"),role:"assistant",content:""},P=[...d.current,m].map(O=>({role:O.role,content:O.content})),_=[...d.current,m,f];d.current=_,n(_),E&&a(""),g(null),c(!0);let W=A?.buildPayload??(O=>({messages:O})),{initialMessages:R,parseChunk:v,buildPayload:N,onFinish:q,onError:B,...L}=A??{},F=O=>{n(j=>j.map(le=>le.id===f.id?{...le,content:O}:le))},H="",V;try{V=r.requestStream(W(P),L),b.current=V}catch(O){let j=Xt(O);U()&&(g(j),c(!1),A?.onError?.(j));return}try{for await(let O of V){if(x.current!==I)break;H+=l(O),U()&&F(H)}U()&&(c(!1),A?.onFinish?.({...f,content:H}))}catch(O){let j=Xt(O);U()&&(g(j),c(!1),A?.onError?.(j))}finally{b.current===V&&(b.current=null)}},[r]);return{messages:o,input:s,setInput:a,sendMessage:T,stop:S,isStreaming:i,error:u}}import{useCallback as te,useEffect as Yt,useMemo as Cn,useRef as Zt,useState as Qt}from"react";import{createInputPresencePublisher as xn,INPUT_PRESENCE_DEFAULT_HZ as Tn,INPUT_PRESENCE_FIELD as En}from"@urun-sh/core";var pt=[];function wn(e,t={}){let{field:r=En,hz:o=Tn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,a=Cn(()=>s?xn({awareness:{setLocalStateField:(h,w)=>s.setField(h,w)},field:r,hz:o}):null,[s,r,o]),i=Zt(null);i.current=a;let[c,u]=Qt(!1),[g,p]=Qt(pt),d=Zt(!1);Yt(()=>{if(a)return()=>a.dispose()},[a]);let k=te(()=>{let h=i.current;p(h?h.heldKeys():pt)},[]),x=te(()=>{i.current?.clear(),p(pt)},[]);Yt(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,w=()=>{if(h()){d.current=!1,u(!0);return}d.current||(u(!1),x())},I=f=>{h()&&(i.current?.keyDown(f.key),k())},U=f=>{i.current?.keyUp(f.key),k()},A=f=>{h()&&i.current?.movePointer(f.movementX,f.movementY)},l=f=>{h()&&i.current?.setButtons(f.buttons)},m=()=>{x()};return n.addEventListener("pointerlockchange",w),n.addEventListener("keydown",I),n.addEventListener("keyup",U),n.addEventListener("mousemove",A),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",m),()=>{n.removeEventListener("pointerlockchange",w),n.removeEventListener("keydown",I),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",m)}},[n,x,k]);let b=te(h=>{h.requestPointerLock?.()},[]),y=te(()=>{d.current=!0,u(!0)},[]),S=te(()=>{d.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),x()},[n,x]),T=te(h=>{i.current?.keyDown(h),k()},[k]),C=te(h=>{i.current?.keyUp(h),k()},[k]),E=te((h,w)=>{i.current?.movePointer(h,w)},[]);return{engage:b,engageTouch:y,release:S,engaged:c,heldKeys:g,pressKey:T,releaseKey:C,movePointer:E}}var er=new Map;function Rn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);er.set(e,{component:t,schema:r})}function tr(e,t){let r=er.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as Un,jsx as Ve}from"react/jsx-runtime";function An({name:e,props:t,fallback:r}){let o=tr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?Ve(Un,{children:r}):Ve("div",{className:"urun-component-error",role:"alert",children:Ve("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return Ve(n,{...o.validatedProps})}import{z as Ce}from"zod";import{jsx as mt,jsxs as rr}from"react/jsx-runtime";var Mn=Ce.object({step:Ce.number().min(0),total:Ce.number().min(1),label:Ce.string().optional(),variant:Ce.enum(["default","success","error"]).default("default")});function nr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),a=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:a}}function _n(e){let{step:t,total:r,label:o,variant:n,percentage:s}=nr(e);return rr("div",{className:"urun-progress-card","data-variant":n,children:[o&&mt("div",{className:"urun-progress-label",children:o}),mt("div",{className:"urun-progress-bar",children:mt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),rr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as ft}from"zod";import{jsx as or,jsxs as On}from"react/jsx-runtime";var Nn=ft.object({state:ft.enum(["thinking","generating","idle","error"]),message:ft.string().optional()}),In={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function sr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??In[t]??t;return{state:t,message:n,isActive:o}}function Ln(e){let{state:t,message:r,isActive:o}=sr(e);return On("span",{className:"urun-status-badge","data-state":t,children:[or("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),or("span",{className:"urun-status-message",children:r})]})}import{useRef as ir,useEffect as Dn}from"react";import{z as gt}from"zod";import{jsx as ar,jsxs as Fn}from"react/jsx-runtime";var Vn=gt.object({text:gt.string(),streaming:gt.boolean().default(!1)});function ur(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function qn(e){let{text:t,streaming:r}=ur(e),o=ir(null),n=ir(0);return Dn(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Fn("div",{className:"urun-text-stream",children:[ar("span",{ref:o,className:"urun-text-content"}),r&&ar("span",{className:"urun-text-cursor"})]})}import{z as qe}from"zod";import{jsx as cr,jsxs as Bn}from"react/jsx-runtime";var Hn=qe.object({src:qe.string().url(),alt:qe.string().optional(),caption:qe.string().optional()});function lr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Wn(e){let{src:t,alt:r,caption:o}=lr(e);return Bn("figure",{className:"urun-image-frame",children:[cr("img",{className:"urun-image",src:t,alt:r}),o&&cr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as re}from"zod";import{jsx as St,jsxs as Kn}from"react/jsx-runtime";var $n=re.object({metrics:re.array(re.object({label:re.string(),value:re.union([re.string(),re.number()]),unit:re.string().optional()}))});function dr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function jn(e){let{metrics:t}=dr(e);return St("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Kn("div",{className:"urun-metric-card",children:[St("div",{className:"urun-metric-label",children:r.label}),St("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{createContext as Jn,useContext as pr}from"react";import{jsx as Gn}from"react/jsx-runtime";var ht=Jn(null);function zn({session:e,children:t}){return Gn(ht.Provider,{value:e,children:t})}function X(){return pr(ht)}function Xn(){let e=pr(ht);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{forwardRef as Yn,useCallback as Fe,useEffect as Zn,useImperativeHandle as Qn,useRef as vt,useState as eo}from"react";import{jsx as no,jsxs as oo}from"react/jsx-runtime";var to=1e3;function ro(...e){console.debug("[video]",...e)}var yt=Yn(function(t,r){let{session:o,stream:n="video",track:s,muted:a=!0,mirror:i=!1,objectFit:c="contain",className:u,style:g,videoClassName:p,placeholder:d,children:k,onTrack:x}=t,b=X(),y=o??b,S=vt(null),T=vt(null),[C,E]=eo(!1),h=vt(x);h.current=x;let w=Fe(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let m=S.current;return m&&m.srcObject!==T.current&&(m.srcObject=T.current),T.current},[]),I=Fe(m=>{let f=S.current;if(!f)return;let P=f.play();!P||typeof P.catch!="function"||P.catch(_=>ro(`play() failed (${m})`,_))},[]),U=Fe(m=>{let f=w();if(f){for(let P of f.getVideoTracks())P!==m&&f.removeTrack(P);if(m&&!f.getVideoTracks().includes(m)){f.addTrack(m);let P=S.current;P&&(P.srcObject=f)}m&&I("track-attach"),E(m!==null),h.current?.(m)}},[w,I]),A=Fe(m=>{S.current=m,m&&(a&&(m.muted=!0,m.defaultMuted=!0,m.setAttribute("muted","")),m.setAttribute("playsinline",""),m.setAttribute("webkit-playsinline",""),w())},[w,a]);Qn(r,()=>({get element(){return S.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return Zn(()=>{if(l){U(s??null);return}if(!y)return;let m=y.stream(n),f=()=>{let v=T.current;return v?v.getVideoTracks()[0]??null:null},P=v=>{if(v!==f()&&(U(v),v)){let N=()=>{f()===v&&U(null)};v.addEventListener("ended",N)}},_=m.track;_&&_.readyState==="live"&&P(_);let W=m.on("track",v=>{v&&v.readyState!=="live"||P(v)}),R=setInterval(()=>{let v=m.track;v&&v.readyState==="live"&&P(v)},to);return()=>{W(),clearInterval(R)}},[y,n,l,s,U]),oo("div",{className:u,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":C?"true":"false",children:[no("video",{ref:A,className:p,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...i?{transform:"scaleX(-1)"}:{}}}),C?null:d,k]})});import{forwardRef as so}from"react";import{jsx as ao}from"react/jsx-runtime";var io=so(function(t,r){let{stream:o="image",...n}=t;return ao(yt,{ref:r,stream:o,...n})});import{forwardRef as co,useCallback as Se,useEffect as kt,useImperativeHandle as lo,useRef as he}from"react";import{observePageLifecycle as po}from"@urun-sh/core";var He=null;function uo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function We(){if(He)return He;let e=uo();return e?(He=new e,He):null}function Be(){let e=We();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as go}from"react/jsx-runtime";var mo=1e3,mr=200;function bt(...e){console.debug("[audio]",...e)}var $e=co(function(t,r){let{session:o,stream:n="audio",track:s,controls:a=!1,className:i,onTrack:c,onUnlockChange:u,onAudioElement:g}=t,p=X(),d=o??p,k=he(null),x=he(null),b=he(null),y=he(null),S=he(c);S.current=c;let T=he(u);T.current=u;let C=Se(l=>{b.current!==l&&(b.current=l,T.current?.(l))},[]),E=Se(()=>{if(typeof MediaStream>"u")return null;x.current||(x.current=new MediaStream);let l=k.current;return l&&l.srcObject!==x.current&&(l.srcObject=x.current),x.current},[]),h=Se(l=>{let m=k.current;if(!m)return;let f=m.play();!f||typeof f.then!="function"||f.then(()=>{m.muted||C(!0)}).catch(P=>{let _=P instanceof Error?P.name:String(P);if(_==="AbortError"){bt(`play() aborted (${l}); retrying in ${mr}ms`),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{y.current=null,h(`${l}:retry`)},mr);return}if(_==="NotAllowedError"){bt(`play() blocked pending a user gesture (${l})`),C(!1);return}bt(`play() failed (${l})`,P)})},[C]),w=Se(l=>{let m=E();if(m){for(let f of m.getAudioTracks())f!==l&&m.removeTrack(f);l&&!m.getAudioTracks().includes(l)&&m.addTrack(l),l&&h("track-attach"),S.current?.(l)}},[E,h]),I=Se(()=>{let l=k.current;l&&(E(),l.muted=!1,h("gesture"),Be(),C(!0))},[E,h,C]);lo(r,()=>({unlock:I,get unlocked(){return b.current===!0},get element(){return k.current}}),[I]);let U=Se(l=>{k.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),E()),g?.(l)},[E,g]),A=s!==void 0;return kt(()=>{if(A){w(s??null);return}if(!d)return;let l=d.stream(n),m=()=>{let R=x.current;return R?R.getAudioTracks()[0]??null:null},f=R=>{if(R!==m()&&(w(R),R)){let v=()=>{m()===R&&w(null)};R.addEventListener("ended",v)}},P=l.track;P&&P.readyState==="live"&&f(P);let _=l.on("track",R=>{R&&R.readyState!=="live"||f(R)}),W=setInterval(()=>{let R=l.track;R&&R.readyState==="live"&&f(R)},mo);return()=>{_(),clearInterval(W)}},[d,n,A,s,w]),kt(()=>po(()=>{Be(),b.current===!0&&h("foreground")}),[h]),kt(()=>()=>{y.current&&clearTimeout(y.current)},[]),go("audio",{ref:U,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})}),fo=$e;import{forwardRef as So,useCallback as ve,useEffect as fr,useImperativeHandle as ho,useRef as Y}from"react";import{observePageLifecycle as vo,sessionFailureFromMediaError as yo,sharedCaptureController as ko}from"@urun-sh/core";import{jsx as Po}from"react/jsx-runtime";var gr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function je(...e){console.debug("[voice]",...e)}var Ke=So(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:a=gr,connectTimeoutMs:i,attempts:c=3,retryDelayMs:u=1500,onActiveChange:g,onError:p,onMicStream:d,onTrack:k,onUnlockChange:x,capture:b}=t,y=X(),S=o??y,T=Y(null),C=Y(null),E=Y(null),h=Y([]),w=Y(!1),I=Y(g);I.current=g;let U=Y(p);U.current=p;let A=Y(d);A.current=d;let l=ve(v=>{w.current!==v&&(w.current=v,I.current?.(v))},[]),m=ve(()=>{for(let v of h.current)v();h.current=[],E.current?.release(),E.current=null,C.current&&(C.current=null,A.current?.(null))},[]),f=ve(async()=>{let v=E.current;if(v){let L=await v.update(a);return C.current=v.stream,A.current?.(v.stream),L}let q=await(b??ko()).claim("audio",a);E.current=q,h.current=[q.onTrack((L,F)=>{C.current=F,A.current?.(F),w.current&&S?.stream(n).attach(L).catch(H=>je("mic re-attach after one-capture re-acquire failed",H))}),q.onLost(L=>{E.current=null,h.current=[],C.current=null,A.current?.(null),l(!1),U.current?.(L)})],C.current=q.stream,A.current?.(q.stream);let B=q.track;if(!B)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return B},[b,a,S,n,l]),P=ve(async()=>{m(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,m,l]),_=ve(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");T.current?.unlock();let v;try{v=await f()}catch(B){m();let L=yo(B,S.status);throw U.current?.(L),L}S.connect?.();let N;for(let B=1;B<=c;B++)try{await S.whenLive(i!==void 0?{timeout:i}:void 0),await S.stream(n).attach(v),l(!0);return}catch(L){N=L,je(`start attempt ${B}/${c} failed`,L),B<c&&await new Promise(F=>setTimeout(F,u))}m(),l(!1);let q=N instanceof Error?N:new Error(String(N??"voice start failed"));throw U.current?.(q),q},[S,n,i,c,u,f,m,l]);ho(r,()=>({start:_,stop:P,unlock:()=>T.current?.unlock(),get active(){return w.current},get micStream(){return C.current},get audio(){return T.current}}),[_,P]);let W=Y(!1),R=ve(async()=>{if(!S||!w.current||W.current)return;let v=C.current?.getAudioTracks()[0]??null;if(v&&v.readyState==="live"){try{await S.stream(n).attach(v)}catch(N){je("foreground mic re-assert failed (will retry on next pass)",N)}return}W.current=!0;try{let N=await f();await S.stream(n).attach(N)}catch(N){let q=N instanceof Error?N:new Error(String(N));je("foreground mic re-acquire failed",q),U.current?.(q)}finally{W.current=!1}},[S,n,f]);return fr(()=>{let v=()=>{R()};return S&&typeof S.onRecovery=="function"?S.onRecovery(v):vo(v)},[S,R]),fr(()=>m,[m]),s?Po($e,{ref:T,session:S,stream:n,onTrack:k,onUnlockChange:x}):null}),bo=Ke;import{forwardRef as To,useEffect as Eo,useImperativeHandle as wo,useRef as Sr,useState as Ro}from"react";import{useEffect as Co,useState as xo}from"react";var Pt={level:0,speaking:!1};function Ct(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,a]=xo(Pt);return Co(()=>{if(!e){a(Pt);return}let i=We();if(!i||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,g;try{u=i.createMediaStreamSource(c),g=i.createAnalyser(),g.fftSize=r,u.connect(g)}catch{return}let p=new Uint8Array(g.fftSize),k=setInterval(()=>{g.getByteTimeDomainData(p);let x=0;for(let y=0;y<p.length;y++){let S=(p[y]-128)/128;x+=S*S}let b=Math.sqrt(x/p.length);a(y=>{let S=b>n;return Math.abs(y.level-b)<.005&&y.speaking===S?y:{level:b,speaking:S}})},o);return()=>{clearInterval(k),u.disconnect(),a(Pt)}},[e,r,o,n]),s}import{Fragment as _o,jsx as Je,jsxs as No}from"react/jsx-runtime";var Ao={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Uo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Mo=To(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:a=!0,visible:i=!1,className:c,onActiveChange:u,onError:g,onMicStream:p,capture:d}=t,k=X(),x=o??k,b=Sr(null),[y,S]=Ro(null),T=Sr(p);T.current=p;let{level:C,speaking:E}=Ct(i?y:null);return wo(r,()=>({start:()=>{let h=b.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>b.current?.stop()??Promise.resolve(),get active(){return b.current?.active??!1},get micStream(){return b.current?.micStream??null}}),[]),Eo(()=>{!a||!x||b.current?.start().catch(()=>{})},[a,x]),No(_o,{children:[Je(Ke,{ref:b,session:x,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...d!==void 0?{capture:d}:{},onActiveChange:u,onError:g,onMicStream:h=>{S(h),T.current?.(h)}}),i?Je("span",{className:c,style:Ao,"data-urun-mic":"","data-urun-mic-active":y?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(C*100)/100,children:Je("span",{style:Uo,children:Je("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{sessionFailureFromMediaError as Io,sharedCaptureController as Lo}from"@urun-sh/core";import{forwardRef as vr,useCallback as Z,useEffect as xt,useImperativeHandle as Oo,useRef as K,useState as xe}from"react";import{jsx as ne,jsxs as hr}from"react/jsx-runtime";var yr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Tt(...e){console.debug("[camera]",...e)}function Do(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Vo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var kr=vr(function(t,r){let{session:o,stream:n="video",constraints:s,front:a=!1,back:i=!1,facingMode:c,autoStart:u=!0,mirror:g="auto",connectTimeoutMs:p,visible:d=!1,className:k,videoClassName:x,onActiveChange:b,onError:y,onStream:S,onTrack:T,children:C,capture:E,flipControl:h="auto",flipControlClassName:w,onDevices:I}=t;if(a&&i)throw new Error("<Camera> takes `front` OR `back`, not both");let U=a?"user":i?"environment":c??"environment",A=X(),l=o??A,m=K(null),f=K(null),P=K(null),_=K([]),W=K(null),R=K(!1),v=K(U),[N,q]=xe(U),[B,L]=xe(!1),[F,H]=xe(null),[V,O]=xe(!1),[j]=xe(Do),le=K(b);le.current=b;let Ae=K(y);Ae.current=y;let Qe=K(S);Qe.current=S;let Ue=K(T);Ue.current=T;let Lt=K(I);Lt.current=I;let Q=Z(M=>{R.current!==M&&(R.current=M,L(M),le.current?.(M))},[]);xt(()=>{if(!B){H(null);return}let M=!1,D=()=>{Vo().then(J=>{M||(H(J),J&&Lt.current?.(J))})};D();let $=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof $?.addEventListener=="function"?($.addEventListener("devicechange",D),()=>{M=!0,$.removeEventListener?.("devicechange",D)}):()=>{M=!0}},[B]);let Me=Z(M=>{let D=m.current;D&&(D.muted=!0,D.defaultMuted=!0,D.setAttribute("muted",""),D.setAttribute("playsinline",""),D.setAttribute("webkit-playsinline",""),D.srcObject=M,M&&D.play()?.catch?.($=>Tt("preview play() failed",$)))},[]),G=Z(()=>{W.current?.(),W.current=null;for(let M of _.current)M();_.current=[],P.current?.release(),P.current=null,f.current&&(f.current=null,Qe.current?.(null),Ue.current?.(null)),Me(null)},[Me]),et=Z((M,D)=>{W.current?.(),f.current=D,Me(D),Qe.current?.(D);let $=()=>{f.current===D&&(Tt("camera track ended (device removed or permission revoked)"),G(),Q(!1))};M.addEventListener("ended",$),W.current=()=>M.removeEventListener("ended",$)},[Me,G,Q]),de=Z(async M=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let D={...yr,...s,facingMode:M},$;try{let J=P.current;if(J)$=await J.update(D);else{let ye=await(E??Lo()).claim("video",D);if(P.current=ye,_.current=[ye.onTrack((ke,Vr)=>{et(ke,Vr),R.current&&l.stream(n).attachVideo(ke).then(()=>Ue.current?.(ke)).catch(qr=>Tt("camera re-publish after one-capture re-acquire failed",qr))}),ye.onLost(ke=>{P.current=null,_.current=[],G(),Q(!1),Ae.current?.(ke)})],!ye.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=ye.track}}catch(J){let pe=Io(J,l.status);throw Ae.current?.(pe),pe}v.current=M,q(M),et($,P.current?.stream??new MediaStream([$]));try{l.connect?.(),await l.whenLive(p!==void 0?{timeout:p}:void 0),await l.stream(n).attachVideo($)}catch(J){G(),Q(!1);let pe=J instanceof Error?J:new Error(String(J));throw Ae.current?.(pe),pe}Ue.current?.($),Q(!0)},[l,n,s,p,E,et,G,Q]),Ot=Z(M=>de(M?.facingMode??v.current),[de]),_e=Z(async M=>{R.current&&v.current===M||await de(M)},[de]),tt=Z(()=>de(v.current==="environment"?"user":"environment"),[de]),Dt=Z(async()=>{G(),Q(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,G,Q]);Oo(r,()=>({start:Ot,stop:Dt,flip:tt,setFacingMode:_e,get active(){return R.current},get facingMode(){return v.current},get stream(){return f.current},get element(){return m.current}}),[Ot,Dt,tt,_e]);let Vt=K(_e);if(Vt.current=_e,xt(()=>{!u||!l||Vt.current(U).catch(()=>{})},[u,l,U]),xt(()=>G,[G]),!d)return null;let Lr=g==="auto"?N==="user":g,Or=B&&(h===!0||h==="auto"&&j&&(F?.length??0)>1),Dr=()=>{V||(O(!0),tt().catch(()=>{}).finally(()=>O(!1)))};return hr("div",{className:k,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":N,children:[ne("video",{ref:m,className:x,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Lr?{transform:"scaleX(-1)"}:{}}}),Or?ne("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Dr,disabled:V,className:w,style:w?{opacity:V?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:V?.6:1},children:hr("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[ne("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ne("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ne("path",{d:"M14.5 10.5v1.6h-1.6"}),ne("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ne("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),qo=vr(function({preview:t=!0,...r},o){return ne(kr,{ref:o,...r,visible:t,autoStart:!1})});import{useEffect as Fo,useState as Ho}from"react";function Wo(e,t){let[r,o]=Ho(null);return Fo(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as zo}from"react";import{useEffect as Ko,useMemo as Jo}from"react";import{createStore as Bo}from"zustand/vanilla";import{useStore as $o}from"zustand";var jo=()=>{};function Et(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=Bo(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,a=()=>{if(s){for(let u of s)u();s=null}},i=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),a):jo,c=(u=>$o(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:i,unbind:a}),t.bind!==!1&&i(),c}function Te(e,t){let r=Jo(()=>Et(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Ko(()=>r.bind(),[r]),r}function Xo(e,t,r){let n=Te(e,t)(r??(i=>i)),s=zo(i=>{e&&t&&e.doc(t).set(i)},[e,t]);if(r)return n;let a=n;return{snapshot:e&&t?a.doc:null,synced:a.synced,set:s}}import{useEffect as Go,useState as Yo}from"react";var ae=200;function oe(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Ee(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function wt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Rt(e,t,r={}){let o=r.cap??200,[n,s]=Yo([]);return Go(()=>{if(s([]),!e||!t)return;let a=!0,i=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await i.next();if(!a||c.done)break;s(u=>oe(u,{at:Date.now(),payload:c.value},o))}})(),()=>{a=!1,i.return?.()}},[e,t,o]),n}import{jsx as ze,jsxs as we}from"react/jsx-runtime";function Zo({session:e,name:t,cap:r,className:o}){let n=Rt(e,t,{cap:r});return we("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[we("div",{className:"urun-stream-tail-meta",children:[ze("code",{children:t}),we("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),ze("div",{className:"urun-stream-tail-log",children:n.length===0?we("span",{className:"urun-stream-tail-empty",children:["Waiting for ",ze("code",{children:t})," messages\u2026"]}):n.map((s,a)=>we("div",{className:"urun-stream-tail-line",children:[ze("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Ee(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as Qo,useState as br}from"react";import{jsx as ue,jsxs as Xe}from"react/jsx-runtime";function Ge({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=br(""),[a,i]=br(null),c=Qo(()=>{let u=wt(n);if(!u.ok){i(u.error);return}i(null),o(u.value,n.trim()),s("")},[n,o]);return Xe("div",{className:"urun-doc-patch",children:[ue("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),Xe("div",{className:"urun-doc-patch-actions",children:[ue("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),a?ue("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function es({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Te(e,t),a=s(u=>u.doc),i=s(u=>u.synced),c=s(u=>u.set);return Xe("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[Xe("div",{className:"urun-doc-panel-meta",children:[ue("code",{children:t}),ue("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),ue("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),r?ue(Ge,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}import{useEffect as ts,useState as rs}from"react";import{jsx as Re,jsxs as Cr}from"react/jsx-runtime";function Pr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function ns({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=rs([]);return ts(()=>(s([]),e?e.doc(t).on("change",i=>{s(c=>oe(c,{at:Date.now(),direction:"in",text:Pr(Ee(i))},r))}):void 0),[e,t,r]),Cr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Re(Ge,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(a,i)=>{e?.doc(t).set(a),s(c=>oe(c,{at:Date.now(),direction:"out",text:Pr(i)},r))}}),Re("div",{className:"urun-control-sender-log",children:n.length===0?Re("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((a,i)=>Cr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[Re("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",Re("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}import{useEffect as os,useState as ss}from"react";import{jsx as Ye,jsxs as as}from"react/jsx-runtime";function is({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,a]=ss([]),i=t.join(","),c=r.join(",");return os(()=>{if(a([]),!e)return;let u=(p,d)=>a(k=>oe(k,{at:Date.now(),kind:p,text:d},o)),g=[];g.push(e.onPhase(p=>u("phase",`phase \u2192 ${p.name}`)));for(let p of t){let d=e.stream(p);g.push(d.on("track",k=>u("track",`${p}: ${k?"track arrived":"track ended"}`)))}for(let p of r){let d=e.doc(p);g.push(d.on("change",()=>u("doc",`${p} changed`)))}return()=>g.forEach(p=>p())},[e,i,c,o]),Ye("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?Ye("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,g)=>as("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[Ye("span",{className:"urun-event-spine-kind",children:u.kind})," ",Ye("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${g}`))})}import{describeSessionPhase as Ps,isWakingPhase as Cs}from"@urun-sh/core";import{useEffect as us,useState as cs}from"react";function z(e){let[t,r]=cs(e?.phase??null);return us(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as fs}from"@urun-sh/core";import{useEffect as ls,useRef as ds,useState as ps}from"react";import{isWakingPhase as ms}from"@urun-sh/core";function At(e){let t=z(e),r=ms(t?.name),o=ds(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[a,i]=ps(s);return ls(()=>{if(n===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?a:0}}import{Fragment as gs,jsx as xr,jsxs as Tr}from"react/jsx-runtime";function Ut({session:e,render:t,className:r}){let o=At(e);return!o.waking||!o.phase?null:xr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Tr(gs,{children:[xr("span",{className:"urun-session-waking-label",children:fs(o.phase)})," ",Tr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as vs,useState as ys}from"react";import{useEffect as Er,useRef as Ss,useState as wr}from"react";var hs={event:null,elapsedMs:0};function Mt(e,t){let[r,o]=wr(null),n=Ss(0);Er(()=>{if(o(null),!!e?.onActivation)return e.onActivation(i=>{t!==void 0&&i.stream!==t||(n.current=Date.now(),o(i))})},[e,t]);let[s,a]=wr(0);return Er(()=>{if(!r){a(0);return}if(r.state==="first-media"){a(r.elapsedMs);return}let i=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-i);a(c());let u=setInterval(()=>a(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:hs}import{jsx as Rr,jsxs as Ar}from"react/jsx-runtime";var ks={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function bs(e){let[t,r]=ys(!1);return vs(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function _t({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Mt(e,t),a=bs(r),i=s.event;if(!i||i.state==="first-media"||a)return null;let c=i.state;return Rr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):Ar("div",{className:"urun-activation-overlay-card",children:[Rr("span",{className:"urun-activation-overlay-copy",children:i.hint??ks[c]})," ",Ar("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as ce,jsxs as Nt}from"react/jsx-runtime";var xs={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ts({session:e,className:t}){let r=z(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return Nt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[ce("span",{className:"urun-session-status-dot","data-phase":o}),ce("span",{className:"urun-session-status-label",children:xs[o]}),n?ce("span",{className:"urun-session-status-detail",children:n}):null]})}function Es({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=z(e);if(s?.name==="live")return Nt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,ce(_t,{session:e})]});let a=r?r(s):ce("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Cs(s.name)?ce(Ut,{session:e}):s&&s.name!=="idle"?Ps(s):"Waiting for a live session\u2026"}),i=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Nt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[a,i?ce("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ws,useState as Rs}from"react";import{jsx as Ms}from"react/jsx-runtime";function Ur(e){return z(e)?.endsAt??null}function As(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function Us({session:e,urgentMs:t=6e4,className:r}){let n=Ur(e)?.getTime()??null,[s,a]=Rs(()=>n===null?null:Math.max(0,n-Date.now()));if(ws(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let i=As(s);return Ms("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:i})}import{jsx as Mr,jsxs as Is}from"react/jsx-runtime";var _s=new Set(["expired","ended","error"]);function Ns({session:e,onNewSession:t,children:r,className:o}){let n=z(e);if(!n||!_s.has(n.name))return null;let s=r?r(n):Mr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return Is("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Mr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as _r,useMemo as Ls,useState as Nr}from"react";import{jsx as Ze,jsxs as Vs}from"react/jsx-runtime";function It(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Ir(e){let t=Ls(()=>e?e.doc("control"):null,[e]),[r,o]=Nr(()=>t?It(t.get("idle")):null);return _r(()=>{if(!t){o(null);return}return o(It(t.get("idle"))),t.on("change",()=>o(It(t.get("idle"))))},[t]),r}function Os(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Ds({session:e,onStillHere:t,className:r}){let o=Ir(e),n=o?.deadlineEpochS??null,[s,a]=Nr(null);if(_r(()=>{if(n===null){a(null);return}let c=()=>a(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let i=()=>{e.touch?.(),t?.()};return Ze("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Vs("div",{className:"urun-idle-warning-card",children:[Ze("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Ze("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Os(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Ze("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}import{useContext as qs,useEffect as Fs,useState as Hs}from"react";import{prewake as Ws}from"@urun-sh/core";function Bs(e){let t=qs(me),[r,o]=Hs(null),n=e.app??t?.appId,s=e.function,a=e.intervalS??60,i=t?.baseUrl,c=t?.orgId,u=t?.jwt,g=t?.getAccessToken,p=t?.authProvider;return Fs(()=>{if(!i||!c||!n||!s)return;let d=!1,k=()=>{Ws({baseUrl:i,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:g,authProvider:p}).then(b=>{d||o(b)}).catch(()=>{})};k();let x=setInterval(k,Math.max(1,a)*1e3);return()=>{d=!0,clearInterval(x)}},[n,s,a,i,c,u,g,p]),r}import{describeSessionPhase as qc,isWakingPhase as Fc}from"@urun-sh/core";export{$e as Audio,kr as Camera,An as ComponentRenderer,yr as DEFAULT_CAMERA_CONSTRAINTS,ae as DEFAULT_LOG_CAP,gr as DEFAULT_VOICE_CONSTRAINTS,Ge as DocPatchForm,io as Image,Wn as ImageFrame,Hn as ImageFrameSchema,jn as MetricsPanel,$n as MetricsPanelSchema,Mo as Mic,Xr as OPERATOR_CHORD_LABEL,zr as OPERATOR_TOKEN_STORAGE_KEY,_n as ProgressCard,Mn as ProgressCardSchema,zn as Session,Ln as StatusBadge,Nn as StatusBadgeSchema,qn as TextStream,Vn as TextStreamSchema,_t as UrunActivationOverlay,fo as UrunAudio,Fr as UrunAuthProvider,qo as UrunCamera,ns as UrunControlSender,es as UrunDocPanel,be as UrunErrorBoundary,is as UrunEventSpine,Ds as UrunIdleWarning,Hr as UrunJwtProvider,tn as UrunProvider,Us as UrunSessionClock,Ns as UrunSessionEnded,Es as UrunSessionGate,Ts as UrunSessionStatus,Ut as UrunSessionWaking,Zo as UrunStreamTail,bo as UrunVoice,yt as Video,Ke as Voice,Ne as authMode,Et as createDocStore,qc as describeSessionPhase,Ee as formatPayload,We as getUrunAudioContext,Fc as isWakingPhase,wt as parseJsonObject,oe as pushCapped,Bt as readOperatorToken,Rn as registerComponent,Be as resumeUrunAudioContext,ee as urunPublicEnv,Mt as useActivation,ln as useApp,Pn as useChat,vn as useCompletion,Te as useDocStore,lr as useImageFrame,wn as useInputPresence,dr as useMetricsPanel,nt as useOperatorOverride,nr as useProgressCard,fn as useRequest,Xn as useSession,Xo as useSessionDoc,Ur as useSessionEndsAt,Ir as useSessionIdle,z as useSessionPhase,Wo as useSessionTrack,At as useSessionWake,sr as useStatusBadge,Rt as useStreamMessages,ur as useTextStream,Ct as useUrunAudioLevel,rt as useUrunAuth,Bs as useUrunPrewake,jr as usesWorkOSAuth};
package/dist/video.d.mts CHANGED
@@ -8,8 +8,6 @@ interface VideoPlayerProps {
8
8
 
9
9
  stream?: MediaStream | null;
10
10
 
11
- name?: string;
12
-
13
11
  src?: string;
14
12
 
15
13
  type?: string;
package/dist/video.d.ts CHANGED
@@ -8,8 +8,6 @@ interface VideoPlayerProps {
8
8
 
9
9
  stream?: MediaStream | null;
10
10
 
11
- name?: string;
12
-
13
11
  src?: string;
14
12
 
15
13
  type?: string;
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 G=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var Q=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},R=(t,r,n,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Y(r))!K.call(t,i)&&i!==n&&E(t,i,{get:()=>r[i],enumerable:!(s=G(r,i))||s.enumerable});return t};var X=(t,r,n)=>(n=t!=null?q(J(t)):{},R(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),Z=t=>R(E({},"__esModule",{value:!0}),t);var se={};Q(se,{UrunVideo:()=>H,VideoPlayer:()=>z});module.exports=Z(se);var o=require("react"),A=X(require("video.js")),me=require("video.js/dist/video-js.css");var b=require("react");var w=require("react"),$=require("@urun-sh/core"),ee=require("@urun-sh/core/internal");var re=require("react/jsx-runtime"),N=(0,w.createContext)(null);function I(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,s]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let i=r.getState()._transport;if(!i)return;let g=i.getTrackByName?.bind(i),v=g?.(t);v&&v.readyState!=="ended"&&s(v);let T=i.on("track",h=>{let k=g?.(t);k&&k.id!==h.id||(s(h),h.addEventListener("ended",()=>{s(null)}))});return()=>{T()}},[t,r]),n}var l=require("react/jsx-runtime");function O(t){t.posterImage?.hide?.()}var te=`
2
+ "use strict";var B=Object.create;var x=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var q=(r,a)=>{for(var n in a)x(r,n,{get:a[n],enumerable:!0})},T=(r,a,n,v)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of _(a))!W.call(r,d)&&d!==n&&x(r,d,{get:()=>a[d],enumerable:!(v=D(a,d))||v.enumerable});return r};var G=(r,a,n)=>(n=r!=null?B(F(r)):{},T(a||!r||!r.__esModule?x(n,"default",{value:r,enumerable:!0}):n,r)),Y=r=>T(x({},"__esModule",{value:!0}),r);var $={};q($,{UrunVideo:()=>M,VideoPlayer:()=>j});module.exports=Y($);var t=require("react"),L=G(require("video.js")),te=require("video.js/dist/video-js.css");var s=require("react/jsx-runtime");function V(r){r.posterImage?.hide?.()}var J=`
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 ne(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=te,document.head.appendChild(t)}var oe=["playToggle","volumePanel","fullscreenToggle"],ae=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],D=(0,o.forwardRef)(function(r,n){let{track:s,stream:i,src:g,type:v="video/mp4",className:T,videoClassName:h,poster:k,controls:_=!0,autoPlay:S=!0,muted:P=!0,onVideoElement:V,onPlayerReady:L,children:B}=r,j=typeof g=="string"&&g.length>0,c=!j,y=(0,o.useRef)(null),f=(0,o.useRef)(null),[F,x]=(0,o.useState)(!1),W=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),V?.(e)},[n,V]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let m=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;P&&(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)})},[P]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;ne(),P&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,A.default)(e,{controls:_,autoplay:S,muted:P,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:k,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?oe:ae}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),O(a),d()},u=()=>{c&&m()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),f.current=a,L?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),L?.(null),f.current&&(f.current.dispose(),f.current=null)}},[c]),(0,o.useEffect)(()=>{if(!j)return;let e=f.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:g,type:v}),S&&m()},[j,g,v,S,m]),(0,o.useEffect)(()=>{if(!c)return;let e=f.current;if(!e)return;let a=s??null,d=i??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),O(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,s,i,m]),(0,l.jsxs)("div",{className:T,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:W,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),F&&(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"]})}),B]})}),ie=(0,o.forwardRef)(function({name:r,...n},s){let i=I(r);return(0,l.jsx)(D,{ref:s,...n,track:i})}),z=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(ie,{ref:n,...r,name:r.name}):(0,l.jsx)(D,{ref:n,...r})}),H=z;0&&(module.exports={UrunVideo,VideoPlayer});
10
+ `,C="urun-video-critical-css";function K(){if(typeof document>"u"||document.getElementById(C))return;let r=document.createElement("style");r.id=C,r.textContent=J,document.head.appendChild(r)}var Q=["playToggle","volumePanel","fullscreenToggle"],X=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Z=(0,t.forwardRef)(function(a,n){let{track:v,stream:d,src:b,type:z="video/mp4",className:R,videoClassName:I,poster:N,controls:O=!0,autoPlay:h=!0,muted:y=!0,onVideoElement:S,onPlayerReady:P,children:U}=a,w=typeof b=="string"&&b.length>0,l=!w,m=(0,t.useRef)(null),g=(0,t.useRef)(null),[A,f]=(0,t.useState)(!1),H=(0,t.useCallback)(e=>{m.current=e,typeof n=="function"?n(e):n&&(n.current=e),S?.(e)},[n,S]);(0,t.useImperativeHandle)(n,()=>m.current,[]);let p=(0,t.useCallback)(()=>{let e=m.current;if(!e||!e.srcObject&&!e.src)return;y&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let o=e.play();o&&typeof o.then=="function"&&o.then(()=>f(!1)).catch(u=>{(u instanceof Error?u.name:String(u))!=="AbortError"&&f(!0)})},[y]);return(0,t.useEffect)(()=>{if(typeof document>"u")return;let e=m.current;if(!e)return;K(),y&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=h,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let o=(0,L.default)(e,{controls:O,autoplay:h,muted:y,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:N,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:l?Q:X}});l&&o.addClass("urun-video-live");let u=()=>f(!1),c=()=>{o.hasStarted(!0),V(o),u()},i=()=>{l&&p()};return e.addEventListener("playing",c),e.addEventListener("loadedmetadata",i),l&&e.addEventListener("pause",i),g.current=o,P?.(o),()=>{e.removeEventListener("playing",c),e.removeEventListener("loadedmetadata",i),e.removeEventListener("pause",i),P?.(null),g.current&&(g.current.dispose(),g.current=null)}},[l]),(0,t.useEffect)(()=>{if(!w)return;let e=g.current;if(!e)return;let o=e.tech?.(!0)?.el?.();o&&(o.srcObject=null),e.src({src:b,type:z}),h&&p()},[w,b,z,h,p]),(0,t.useEffect)(()=>{if(!l)return;let e=g.current;if(!e)return;let o=v??null,u=d??null;!u&&o&&(u=new MediaStream([o]));let c=e.tech?.(!0)?.el?.()??m.current;if(!c)return;if(!u){c.srcObject=null,f(!1);return}c.srcObject=u,p();let i=u.getVideoTracks()[0]??o??null,k=()=>{e.hasStarted(!0),V(e),p()},E=()=>{c.srcObject=null,f(!1)};return i&&(i.addEventListener("unmute",k),i.addEventListener("ended",E),i.muted||k()),()=>{i&&(i.removeEventListener("unmute",k),i.removeEventListener("ended",E))}},[l,v,d,p]),(0,s.jsxs)("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":l?"live":"vod",children:[(0,s.jsx)("video",{ref:H,className:["video-js","vjs-default-skin",I].filter(Boolean).join(" "),playsInline:!0}),A&&(0,s.jsx)("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:(0,s.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,s.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,s.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),U]})}),j=(0,t.forwardRef)(function(a,n){return(0,s.jsx)(Z,{ref:n,...a})}),M=j;0&&(module.exports={UrunVideo,VideoPlayer});
package/dist/video.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- import{forwardRef as T,useCallback as M,useEffect as E,useImperativeHandle as Y,useRef as R,useState as J}from"react";import K from"video.js";import"video.js/dist/video-js.css";import{useContext as W,useState as q,useEffect as G}from"react";import{createContext as F,useState as ae,useEffect as ie,useRef as se}from"react";import{observePageLifecycle as de}from"@urun-sh/core";import{TransportSession as ce}from"@urun-sh/core/internal";import{jsx as ge}from"react/jsx-runtime";var V=F(null);function L(o){let r=W(V);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,s]=q(null);return G(()=>{let u=r.getState()._transport;if(!u)return;let c=u.getTrackByName?.bind(u),m=c?.(o);m&&m.readyState!=="ended"&&s(m);let k=u.on("track",f=>{let y=c?.(o);y&&y.id!==f.id||(s(f),f.addEventListener("ended",()=>{s(null)}))});return()=>{k()}},[o,r]),n}import{jsx as g,jsxs as O}from"react/jsx-runtime";function N(o){o.posterImage?.hide?.()}var Q=`
2
+ import{forwardRef as L,useCallback as P,useEffect as y,useImperativeHandle as B,useRef as E,useState as D}from"react";import _ from"video.js";import"video.js/dist/video-js.css";import{jsx as p,jsxs as C}from"react/jsx-runtime";function T(u){u.posterImage?.hide?.()}var F=`
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 T,useCallback as M,useEffect as E,useImperativeHandle as Y,
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 X(){if(typeof document>"u"||document.getElementById(I))return;let o=document.createElement("style");o.id=I,o.textContent=Q,document.head.appendChild(o)}var Z=["playToggle","volumePanel","fullscreenToggle"],$=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],U=T(function(r,n){let{track:s,stream:u,src:c,type:m="video/mp4",className:k,videoClassName:f,poster:y,controls:D=!0,autoPlay:x=!0,muted:w=!0,onVideoElement:j,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=R(null),v=R(null),[_,h]=J(!1),B=M(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),j?.(e)},[n,j]);Y(n,()=>b.current,[]);let p=M(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;w&&(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(i=>{(i instanceof Error?i.name:String(i))!=="AbortError"&&h(!0)})},[w]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;X(),w&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=K(e,{controls:D,autoplay:x,muted:w,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?Z:$}});d&&t.addClass("urun-video-live");let i=()=>h(!1),l=()=>{t.hasStarted(!0),N(t),i()},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:m}),x&&p()},[S,c,m,x,p]),E(()=>{if(!d)return;let e=v.current;if(!e)return;let t=s??null,i=u??null;!i&&t&&(i=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!i){l.srcObject=null,h(!1);return}l.srcObject=i,p();let a=i.getVideoTracks()[0]??t??null,P=()=>{e.hasStarted(!0),N(e),p()},z=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",P),a.addEventListener("ended",z),a.muted||P()),()=>{a&&(a.removeEventListener("unmute",P),a.removeEventListener("ended",z))}},[d,s,u,p]),O("div",{className:k,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[g("video",{ref:B,className:["video-js","vjs-default-skin",f].filter(Boolean).join(" "),playsInline:!0}),_&&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:O("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]})}),ee=T(function({name:r,...n},s){let u=L(r);return g(U,{ref:s,...n,track:u})}),A=T(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?g(ee,{ref:n,...r,name:r.name}):g(U,{ref:n,...r})}),re=A;export{re as UrunVideo,A as VideoPlayer};
10
+ `,V="urun-video-critical-css";function W(){if(typeof document>"u"||document.getElementById(V))return;let u=document.createElement("style");u.id=V,u.textContent=F,document.head.appendChild(u)}var q=["playToggle","volumePanel","fullscreenToggle"],G=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Y=L(function(g,a){let{track:x,stream:w,src:v,type:k="video/mp4",className:R,videoClassName:I,poster:N,controls:O=!0,autoPlay:m=!0,muted:f=!0,onVideoElement:j,onPlayerReady:z,children:U}=g,b=typeof v=="string"&&v.length>0,o=!b,l=E(null),d=E(null),[A,c]=D(!1),H=P(e=>{l.current=e,typeof a=="function"?a(e):a&&(a.current=e),j?.(e)},[a,j]);B(a,()=>l.current,[]);let s=P(()=>{let e=l.current;if(!e||!e.srcObject&&!e.src)return;f&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let r=e.play();r&&typeof r.then=="function"&&r.then(()=>c(!1)).catch(t=>{(t instanceof Error?t.name:String(t))!=="AbortError"&&c(!0)})},[f]);return y(()=>{if(typeof document>"u")return;let e=l.current;if(!e)return;W(),f&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=m,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let r=_(e,{controls:O,autoplay:m,muted:f,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:N,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:o?q:G}});o&&r.addClass("urun-video-live");let t=()=>c(!1),i=()=>{r.hasStarted(!0),T(r),t()},n=()=>{o&&s()};return e.addEventListener("playing",i),e.addEventListener("loadedmetadata",n),o&&e.addEventListener("pause",n),d.current=r,z?.(r),()=>{e.removeEventListener("playing",i),e.removeEventListener("loadedmetadata",n),e.removeEventListener("pause",n),z?.(null),d.current&&(d.current.dispose(),d.current=null)}},[o]),y(()=>{if(!b)return;let e=d.current;if(!e)return;let r=e.tech?.(!0)?.el?.();r&&(r.srcObject=null),e.src({src:v,type:k}),m&&s()},[b,v,k,m,s]),y(()=>{if(!o)return;let e=d.current;if(!e)return;let r=x??null,t=w??null;!t&&r&&(t=new MediaStream([r]));let i=e.tech?.(!0)?.el?.()??l.current;if(!i)return;if(!t){i.srcObject=null,c(!1);return}i.srcObject=t,s();let n=t.getVideoTracks()[0]??r??null,h=()=>{e.hasStarted(!0),T(e),s()},S=()=>{i.srcObject=null,c(!1)};return n&&(n.addEventListener("unmute",h),n.addEventListener("ended",S),n.muted||h()),()=>{n&&(n.removeEventListener("unmute",h),n.removeEventListener("ended",S))}},[o,x,w,s]),C("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":o?"live":"vod",children:[p("video",{ref:H,className:["video-js","vjs-default-skin",I].filter(Boolean).join(" "),playsInline:!0}),A&&p("button",{type:"button",onClick:s,"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:C("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:[p("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:p("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),U]})}),M=L(function(g,a){return p(Y,{ref:a,...g})}),J=M;export{J as UrunVideo,M as VideoPlayer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.26",
3
+ "version": "0.2.28",
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.26",
56
+ "@urun-sh/core": "^0.2.28",
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",