@urun-sh/react 0.2.56 → 0.2.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +16 -4
- package/dist/index.d.ts +16 -4
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ReactNode, RefObject, Component, ErrorInfo, CSSProperties, ComponentType } from 'react';
|
|
4
|
-
import { AudioPlayoutOptions, SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
|
-
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
4
|
+
import { AudioPlayoutOptions, VideoPlayoutOptions, SessionStatsOptions, SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, SessionStatsSample, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
|
+
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, AudioPlayoutOptions, InboundStatsSample, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStatsOptions, SessionStatsSample, SessionStream, VideoPlayoutOptions, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
6
6
|
import { ZodSchema, z } from 'zod';
|
|
7
7
|
import { StoreApi } from 'zustand/vanilla';
|
|
8
8
|
|
|
@@ -30,6 +30,10 @@ interface UrunProviderProps {
|
|
|
30
30
|
|
|
31
31
|
audioPlayout?: AudioPlayoutOptions;
|
|
32
32
|
|
|
33
|
+
videoPlayout?: VideoPlayoutOptions;
|
|
34
|
+
|
|
35
|
+
sessionStats?: SessionStatsOptions;
|
|
36
|
+
|
|
33
37
|
confirmOnLeave?: boolean;
|
|
34
38
|
|
|
35
39
|
sessionId?: string;
|
|
@@ -46,7 +50,7 @@ interface UrunProviderProps {
|
|
|
46
50
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
47
51
|
children: ReactNode;
|
|
48
52
|
}
|
|
49
|
-
declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, releaseOnLeave, audioPlayout, confirmOnLeave, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, releaseOnLeave, audioPlayout: audioPlayoutProp, videoPlayout: videoPlayoutProp, sessionStats: sessionStatsProp, confirmOnLeave, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
50
54
|
|
|
51
55
|
interface UrunErrorBoundaryProps {
|
|
52
56
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
@@ -111,6 +115,8 @@ interface ReactSession extends Omit<SessionInterface, 'doc' | 'stream'> {
|
|
|
111
115
|
readonly status: SessionStatus;
|
|
112
116
|
|
|
113
117
|
onDiagnostic(handler: (diagnostic: SessionDiagnostic) => void): Unsubscribe;
|
|
118
|
+
|
|
119
|
+
onStats(handler: (sample: SessionStatsSample) => void): Unsubscribe;
|
|
114
120
|
}
|
|
115
121
|
type ReactApp = Record<string, (args?: Record<string, unknown>) => ReactSession>;
|
|
116
122
|
|
|
@@ -1175,6 +1181,12 @@ interface ActivationProgress {
|
|
|
1175
1181
|
|
|
1176
1182
|
declare function useActivation(session: WorkbenchSession | null, streamName?: string): ActivationProgress;
|
|
1177
1183
|
|
|
1184
|
+
interface SessionStatsSource {
|
|
1185
|
+
onStats?(handler: (sample: SessionStatsSample) => void): () => void;
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
declare function useSessionStats(session: SessionStatsSource | null): SessionStatsSample | null;
|
|
1189
|
+
|
|
1178
1190
|
interface UrunActivationOverlayProps {
|
|
1179
1191
|
session: WorkbenchSession | null;
|
|
1180
1192
|
|
|
@@ -1188,4 +1200,4 @@ interface UrunActivationOverlayProps {
|
|
|
1188
1200
|
|
|
1189
1201
|
declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
|
|
1190
1202
|
|
|
1191
|
-
export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type CapturePhotoOptions, 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, type FrameMarker, 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 ReferenceImageCameraSource, type RegisteredComponent, ReprojectedVideo, type ReprojectedVideoHandle, type ReprojectedVideoProps, type ReprojectedVideoWarpOptions, 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 UseReferenceImageOptions, type UseReferenceImageResult, 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, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useReferenceImage, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
|
|
1203
|
+
export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type CapturePhotoOptions, 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, type FrameMarker, 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 ReferenceImageCameraSource, type RegisteredComponent, ReprojectedVideo, type ReprojectedVideoHandle, type ReprojectedVideoProps, type ReprojectedVideoWarpOptions, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionStatsSource, 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 UseReferenceImageOptions, type UseReferenceImageResult, 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, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useReferenceImage, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionStats, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ReactNode, RefObject, Component, ErrorInfo, CSSProperties, ComponentType } from 'react';
|
|
4
|
-
import { AudioPlayoutOptions, SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
|
-
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
4
|
+
import { AudioPlayoutOptions, VideoPlayoutOptions, SessionStatsOptions, SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, SessionStatsSample, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
|
+
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, AudioPlayoutOptions, InboundStatsSample, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStatsOptions, SessionStatsSample, SessionStream, VideoPlayoutOptions, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
6
6
|
import { ZodSchema, z } from 'zod';
|
|
7
7
|
import { StoreApi } from 'zustand/vanilla';
|
|
8
8
|
|
|
@@ -30,6 +30,10 @@ interface UrunProviderProps {
|
|
|
30
30
|
|
|
31
31
|
audioPlayout?: AudioPlayoutOptions;
|
|
32
32
|
|
|
33
|
+
videoPlayout?: VideoPlayoutOptions;
|
|
34
|
+
|
|
35
|
+
sessionStats?: SessionStatsOptions;
|
|
36
|
+
|
|
33
37
|
confirmOnLeave?: boolean;
|
|
34
38
|
|
|
35
39
|
sessionId?: string;
|
|
@@ -46,7 +50,7 @@ interface UrunProviderProps {
|
|
|
46
50
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
47
51
|
children: ReactNode;
|
|
48
52
|
}
|
|
49
|
-
declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, releaseOnLeave, audioPlayout, confirmOnLeave, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
53
|
+
declare function UrunProvider({ baseUrl, orgId, app, appId, jwt, authProvider, eventsUrl, sessionKey, tokenEndpoint, releaseOnLeave, audioPlayout: audioPlayoutProp, videoPlayout: videoPlayoutProp, sessionStats: sessionStatsProp, confirmOnLeave, fallback, errorFallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
50
54
|
|
|
51
55
|
interface UrunErrorBoundaryProps {
|
|
52
56
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
@@ -111,6 +115,8 @@ interface ReactSession extends Omit<SessionInterface, 'doc' | 'stream'> {
|
|
|
111
115
|
readonly status: SessionStatus;
|
|
112
116
|
|
|
113
117
|
onDiagnostic(handler: (diagnostic: SessionDiagnostic) => void): Unsubscribe;
|
|
118
|
+
|
|
119
|
+
onStats(handler: (sample: SessionStatsSample) => void): Unsubscribe;
|
|
114
120
|
}
|
|
115
121
|
type ReactApp = Record<string, (args?: Record<string, unknown>) => ReactSession>;
|
|
116
122
|
|
|
@@ -1175,6 +1181,12 @@ interface ActivationProgress {
|
|
|
1175
1181
|
|
|
1176
1182
|
declare function useActivation(session: WorkbenchSession | null, streamName?: string): ActivationProgress;
|
|
1177
1183
|
|
|
1184
|
+
interface SessionStatsSource {
|
|
1185
|
+
onStats?(handler: (sample: SessionStatsSample) => void): () => void;
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
declare function useSessionStats(session: SessionStatsSource | null): SessionStatsSample | null;
|
|
1189
|
+
|
|
1178
1190
|
interface UrunActivationOverlayProps {
|
|
1179
1191
|
session: WorkbenchSession | null;
|
|
1180
1192
|
|
|
@@ -1188,4 +1200,4 @@ interface UrunActivationOverlayProps {
|
|
|
1188
1200
|
|
|
1189
1201
|
declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
|
|
1190
1202
|
|
|
1191
|
-
export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type CapturePhotoOptions, 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, type FrameMarker, 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 ReferenceImageCameraSource, type RegisteredComponent, ReprojectedVideo, type ReprojectedVideoHandle, type ReprojectedVideoProps, type ReprojectedVideoWarpOptions, 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 UseReferenceImageOptions, type UseReferenceImageResult, 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, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useReferenceImage, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
|
|
1203
|
+
export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type CapturePhotoOptions, 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, type FrameMarker, 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 ReferenceImageCameraSource, type RegisteredComponent, ReprojectedVideo, type ReprojectedVideoHandle, type ReprojectedVideoProps, type ReprojectedVideoWarpOptions, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionStatsSource, 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 UseReferenceImageOptions, type UseReferenceImageResult, 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, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useReferenceImage, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionStats, 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 sr=Object.defineProperty;var ro=Object.getOwnPropertyDescriptor;var no=Object.getOwnPropertyNames;var oo=Object.prototype.hasOwnProperty;var so=(e,t)=>{for(var r in t)sr(e,r,{get:t[r],enumerable:!0})},io=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of no(t))!oo.call(e,n)&&n!==r&&sr(e,n,{get:()=>t[n],enumerable:!(o=ro(t,n))||o.enumerable});return e};var ao=e=>io(sr({},"__esModule",{value:!0}),e);var Do={};so(Do,{Audio:()=>wt,Camera:()=>Cr,ComponentRenderer:()=>dn,DEFAULT_CAMERA_CONSTRAINTS:()=>Rr,DEFAULT_LOG_CAP:()=>Fe,DEFAULT_VOICE_CONSTRAINTS:()=>yr,DocPatchForm:()=>At,Image:()=>Cn,ImageFrame:()=>yn,ImageFrameSchema:()=>vn,MetricsPanel:()=>bn,MetricsPanelSchema:()=>kn,Mic:()=>Mn,OPERATOR_CHORD_LABEL:()=>Or,OPERATOR_TOKEN_STORAGE_KEY:()=>Ir,ProgressCard:()=>mn,ProgressCardSchema:()=>pn,ReprojectedVideo:()=>an,Session:()=>Yr,StatusBadge:()=>gn,StatusBadgeSchema:()=>fn,TextStream:()=>Sn,TextStreamSchema:()=>hn,UrunActivationOverlay:()=>tr,UrunAudio:()=>wn,UrunAuthProvider:()=>St,UrunCamera:()=>_n,UrunControlSender:()=>Wn,UrunDocPanel:()=>qn,UrunErrorBoundary:()=>Ze,UrunEventSpine:()=>Bn,UrunIdleWarning:()=>Yn,UrunJwtProvider:()=>Mr,UrunProvider:()=>Hr,UrunSessionClock:()=>zn,UrunSessionEnded:()=>Gn,UrunSessionGate:()=>Xn,UrunSessionStatus:()=>$n,UrunSessionWaking:()=>Zt,UrunStreamTail:()=>Fn,UrunVoice:()=>Un,Video:()=>Ke,Voice:()=>xt,authMode:()=>ht,createDocStore:()=>Bt,describeSessionPhase:()=>or.describeSessionPhase,formatPayload:()=>ct,getUrunAudioContext:()=>vt,isWakingPhase:()=>or.isWakingPhase,parseJsonObject:()=>Kt,pushCapped:()=>Oe,readOperatorToken:()=>ir,registerComponent:()=>cn,resumeUrunAudioContext:()=>je,urunPublicEnv:()=>Ce,useActivation:()=>Qt,useApp:()=>Br,useChat:()=>Jr,useCompletion:()=>$r,useConfirmOnLeave:()=>Lt,useDocStore:()=>ut,useImageFrame:()=>hr,useInputPresence:()=>Gr,useMetricsPanel:()=>Sr,useOperatorOverride:()=>It,useProgressCard:()=>mr,useReferenceImage:()=>Nn,useRequest:()=>jr,useSession:()=>Zr,useSessionDoc:()=>Vn,useSessionEndsAt:()=>Pr,useSessionIdle:()=>Tr,useSessionPhase:()=>ke,useSessionTrack:()=>In,useSessionWake:()=>Yt,useStatusBadge:()=>fr,useStreamMessages:()=>Xt,useTextStream:()=>gr,useUrunAudioLevel:()=>Ht,useUrunAuth:()=>_t,useUrunPrewake:()=>Qn,usesWorkOSAuth:()=>Ur});module.exports=ao(Do);var de=require("react");var wr=require("react"),gt=require("react/jsx-runtime"),Ze=class extends wr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,gt.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,gt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,gt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var xr=require("react"),Qe=(0,xr.createContext)(null);function _e(e){return e&&e.trim()?e.trim():void 0}function Ce(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return _e(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return _e(typeof process<"u"?process.env?.[e]:void 0)}}function ht(){let e=Ce("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Ce("VERCEL_ENV")==="production"?"workos":Ce("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ur(){return ht()==="workos"}var et=require("react"),_r=require("react/jsx-runtime"),Ar=(0,et.createContext)(null);function St({getAccessToken:e,children:t}){let r=(0,et.useMemo)(()=>({getAccessToken:e}),[e]);return(0,_r.jsx)(Ar.Provider,{value:r,children:t})}var Mr=St;function _t(){return(0,et.useContext)(Ar)}var Nt=require("react"),Ir="urun.operator_token",Lr=null,Nr="op",Or="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Dr(){return typeof window<"u"}function ir(){return Lr}function uo(){if(!Dr())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Nr);if(!r)return null;Lr=r,t.delete(Nr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function co(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function It(e){let t=(0,Nt.useRef)(e);t.current=e,(0,Nt.useEffect)(()=>{if(!Dr())return;uo();let r=o=>{if(!co(o))return;let n=ir();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Vr=require("react");function Lt(e=!0){(0,Vr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var Ne=require("react/jsx-runtime"),lo="/api/urun-token",po=1e4;function mo(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Fr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function qr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function fo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Ne.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Ne.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ne.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Hr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:f,confirmOnLeave:d=!1,fallback:y,errorFallback:b,children:k}){let l=n===void 0&&t===void 0;if(!l&&(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(!l&&(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 g=r??o;if(l&&(typeof g!="string"||g.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Lt(d);let[m,P]=(0,de.useState)(),[R,w]=(0,de.useState)(null),h=(0,de.useRef)(void 0),C=(0,de.useRef)(null),[T,x]=(0,de.useState)(null);It(ee=>x({jwt:ee}));let U=_t(),p=Ce("NEXT_PUBLIC_SESSION_TOKEN")??Ce("NEXT_PUBLIC_URUN_JWT"),E=ht(),v=T!==null,_=E==="workos"&&!n&&!v&&!l,B=n??(E==="jwt"?p:void 0)??m?.token,q=v?T.jwt:B,O=s??Ce("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),L=_&&!q&&!U?.getAccessToken,H=t??m?.orgId,K=e??m?.gatewayUrl,re=l&&m===void 0,$=l&&m!==void 0&&!K?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,oe=L?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,ie=R??$??oe,z=qr("NEXT_PUBLIC_URUN_TOKEN_URL",Ce("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??lo,W=qr("NEXT_PUBLIC_URUN_EVENTS_URL",Ce("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,G=(0,de.useCallback)(async ee=>{if(!ee?.forceRefresh){let Z=h.current;if(!Z)return Z;let ce=mo(Z);if(ce===null||ce-Date.now()>po)return Z}return(await(C.current??(C.current=(async()=>{try{let Z=await Fr(z);return h.current=Z.token,P(Z),Z}finally{C.current=null}})()))).token},[z]),Te=(0,de.useCallback)(async()=>q,[q]),me=typeof q=="string"&&q.trim().length>0,ae=_?U?.getAccessToken:l&&!v?G:me?Te:void 0,Ve=(0,de.useMemo)(()=>({appId:g,baseUrl:K??"",orgId:H??"",jwt:q,getAccessToken:_?U?.getAccessToken:l&&!v?G:void 0,authProvider:O,eventsUrl:W,sessionKey:a,releaseOnLeave:c,audioPlayout:f,priority:v?"preempt":void 0}),[g,U,K,O,q,W,H,a,c,f,_,v,l,G]);return(0,de.useEffect)(()=>{if(!l)return;let ee=new AbortController;return w(null),(async()=>{try{let ue=await Fr(z,ee.signal);h.current=ue.token,P(ue)}catch(ue){if(ee.signal.aborted)return;w(ue instanceof Error?ue:new Error(String(ue)))}})(),()=>ee.abort()},[l,z]),(0,Ne.jsx)(Ze,{fallback:y,children:ie?fo(b,ie):re?(0,Ne.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ne.jsx)(Qe.Provider,{value:Ve,children:ae?(0,Ne.jsx)(St,{getAccessToken:ae,children:k}):k})})}var fe=require("react"),Wr=require("@urun-sh/core");function go(e,t){return`${e}:${JSON.stringify(t??{})}`}function ho(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Be=new Map;var ar=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ur=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()}},cr=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ar(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ur(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Br(){let e=(0,fe.useContext)(Qe);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,fe.useReducer)(i=>i+1,0),r=(0,fe.useRef)(new Map),o=(0,fe.useRef)(new Map),n=(0,fe.useRef)(null),s=(0,fe.useMemo)(()=>(0,Wr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority,audioPlayout:e.audioPlayout}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout]);return(0,fe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Be.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=Be.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let d=Be.get(u);!d||d.refCount!==0||(Be.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),(0,fe.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=d=>{let y=go(u,d),b=r.current.get(y);if(b&&!b.disposed)return b;let k=ho(e,u,d),l=Be.get(k);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),Be.delete(k),o.current.get(k)===l&&o.current.delete(k),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new cr(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},Be.set(k,l)),o.current.get(k)!==l&&(o.current.set(k,l),l.handle.addNotifier(t),l.refCount+=1),r.current.set(y,l.handle),l.handle};return i.set(u,f),f}})},[e,s])}var ne=require("react");function tt(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 So(e){return e instanceof Error?e:new Error(String(e))}function jr(e,t){let r=(0,ne.useMemo)(()=>tt(e),[e]),[o,n]=(0,ne.useState)(void 0),[s,i]=(0,ne.useState)(null),[a,u]=(0,ne.useState)(!1),c=(0,ne.useRef)(t);c.current=t;let f=(0,ne.useRef)(0),d=(0,ne.useRef)(null),y=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(y.current=!0,()=>{y.current=!1,d.current?.abort()}),[]);let b=(0,ne.useCallback)(async g=>{d.current?.abort();let m=new AbortController;d.current=m;let P=++f.current,R=()=>y.current&&f.current===P;R()&&(u(!0),i(null));try{let w=await r.request(g,{...c.current,signal:m.signal});return R()&&(n(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let h=So(w);throw R()&&(i(h),u(!1),c.current?.onError?.(h)),h}},[r]),k=(0,ne.useCallback)(g=>{b(g).catch(()=>{})},[b]),l=(0,ne.useCallback)(()=>{f.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:k,mutateAsync:b,data:o,error:s,isPending:a,reset:l}}var se=require("react");function Kr(e){return e instanceof Error?e:new Error(String(e))}var vo=e=>typeof e=="string"?e:String(e);function $r(e,t){let r=(0,se.useMemo)(()=>tt(e),[e]),[o,n]=(0,se.useState)(""),[s,i]=(0,se.useState)(!1),[a,u]=(0,se.useState)(null),c=(0,se.useRef)(t);c.current=t;let f=(0,se.useRef)(0),d=(0,se.useRef)(null),y=(0,se.useRef)(!0);(0,se.useEffect)(()=>(y.current=!0,()=>{y.current=!1,d.current?.cancel(),d.current=null}),[]);let b=(0,se.useCallback)(()=>{f.current++,d.current?.cancel(),d.current=null,y.current&&i(!1)},[]),k=(0,se.useCallback)(async l=>{d.current?.cancel();let g=++f.current,m=()=>y.current&&f.current===g,P=c.current,R=P?.parseChunk??vo,w=P?.buildPayload??(v=>({prompt:v}));m()&&(n(""),u(null),i(!0));let{parseChunk:h,buildPayload:C,onFinish:T,onError:x,...U}=P??{},p="",E;try{E=r.requestStream(w(l),U),d.current=E}catch(v){let _=Kr(v);m()&&(u(_),i(!1),P?.onError?.(_));return}try{for await(let v of E){if(f.current!==g)break;p+=R(v),m()&&n(p)}m()&&(i(!1),P?.onFinish?.(p))}catch(v){let _=Kr(v);m()&&(u(_),i(!1),P?.onError?.(_))}finally{d.current===E&&(d.current=null)}},[r]);return{completion:o,complete:k,stop:b,isStreaming:s,error:a}}var Q=require("react");function Xr(e){return e instanceof Error?e:new Error(String(e))}var yo=e=>typeof e=="string"?e:String(e),zr=0;function lr(e){return zr+=1,`${e}-${zr}`}function Jr(e,t){let r=(0,Q.useMemo)(()=>tt(e),[e]),[o,n]=(0,Q.useState)(()=>(t?.initialMessages??[]).map(R=>({id:R.id??lr("msg"),role:R.role,content:R.content}))),[s,i]=(0,Q.useState)(""),[a,u]=(0,Q.useState)(!1),[c,f]=(0,Q.useState)(null),d=(0,Q.useRef)(t);d.current=t;let y=(0,Q.useRef)(o);y.current=o;let b=(0,Q.useRef)(s);b.current=s;let k=(0,Q.useRef)(0),l=(0,Q.useRef)(null),g=(0,Q.useRef)(!0);(0,Q.useEffect)(()=>(g.current=!0,()=>{g.current=!1,l.current?.cancel(),l.current=null}),[]);let m=(0,Q.useCallback)(()=>{k.current++,l.current?.cancel(),l.current=null,g.current&&u(!1)},[]),P=(0,Q.useCallback)(async R=>{let w=R===void 0,h=(w?b.current:R)??"";if(!h.trim())return;l.current?.cancel();let T=++k.current,x=()=>g.current&&k.current===T,U=d.current,p=U?.parseChunk??yo,E={id:lr("msg"),role:"user",content:h},v={id:lr("msg"),role:"assistant",content:""},_=[...y.current,E].map(W=>({role:W.role,content:W.content})),B=[...y.current,E,v];y.current=B,n(B),w&&i(""),f(null),u(!0);let q=U?.buildPayload??(W=>({messages:W})),{initialMessages:O,parseChunk:L,buildPayload:H,onFinish:K,onError:re,...$}=U??{},oe=W=>{n(G=>G.map(Te=>Te.id===v.id?{...Te,content:W}:Te))},ie="",z;try{z=r.requestStream(q(_),$),l.current=z}catch(W){let G=Xr(W);x()&&(f(G),u(!1),U?.onError?.(G));return}try{for await(let W of z){if(k.current!==T)break;ie+=p(W),x()&&oe(ie)}x()&&(u(!1),U?.onFinish?.({...v,content:ie}))}catch(W){let G=Xr(W);x()&&(f(G),u(!1),U?.onError?.(G))}finally{l.current===z&&(l.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:m,isStreaming:a,error:c}}var Y=require("react"),rt=require("@urun-sh/core"),dr=[];function Gr(e,t={}){let{field:r=rt.INPUT_PRESENCE_FIELD,hz:o=rt.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,Y.useMemo)(()=>s?(0,rt.createInputPresencePublisher)({awareness:{setLocalStateField:(h,C)=>s.setField(h,C)},field:r,hz:o}):null,[s,r,o]),a=(0,Y.useRef)(null);a.current=i;let[u,c]=(0,Y.useState)(!1),[f,d]=(0,Y.useState)(dr),y=(0,Y.useRef)(!1);(0,Y.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let b=(0,Y.useCallback)(()=>{let h=a.current;d(h?h.heldKeys():dr)},[]),k=(0,Y.useCallback)(()=>{a.current?.clear(),d(dr)},[]);(0,Y.useEffect)(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,C=()=>{if(h()){y.current=!1,c(!0);return}y.current||(c(!1),k())},T=v=>{h()&&(a.current?.keyDown(v.key),b())},x=v=>{a.current?.keyUp(v.key),b()},U=v=>{h()&&a.current?.movePointer(v.movementX,v.movementY)},p=v=>{h()&&a.current?.setButtons(v.buttons)},E=()=>{k()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",T),n.addEventListener("keyup",x),n.addEventListener("mousemove",U),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",T),n.removeEventListener("keyup",x),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",E)}},[n,k,b]);let l=(0,Y.useCallback)(h=>{h.requestPointerLock?.()},[]),g=(0,Y.useCallback)(()=>{y.current=!0,c(!0)},[]),m=(0,Y.useCallback)(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),k()},[n,k]),P=(0,Y.useCallback)(h=>{a.current?.keyDown(h),b()},[b]),R=(0,Y.useCallback)(h=>{a.current?.keyUp(h),b()},[b]),w=(0,Y.useCallback)((h,C)=>{a.current?.movePointer(h,C)},[]);return{engage:l,engageTouch:g,release:m,engaged:u,heldKeys:f,pressKey:P,releaseKey:R,movePointer:w}}var pe=require("react"),sn=require("@urun-sh/core");var I=require("react"),on=require("@urun-sh/core");var Ot=null;function ko(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function vt(){if(Ot)return Ot;let e=ko();return e?(Ot=new e,Ot):null}function je(){let e=vt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var yt=require("react"),Qr=require("react/jsx-runtime"),pr=(0,yt.createContext)(null);function Yr({session:e,children:t}){return(0,Qr.jsx)(pr.Provider,{value:e,children:t})}function we(){return(0,yt.useContext)(pr)}function Zr(){let e=(0,yt.useContext)(pr);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 kt=require("react/jsx-runtime");function bo(e,t){return e-t>>>0<2147483648}var en=1e3;function tn(...e){console.debug("[video]",...e)}function rn(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function nn(e,t,r){return r?[r,t]:[e,t]}var Ke=(0,I.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:d,videoClassName:y,placeholder:b,poster:k,children:l,onTrack:g,onFirstFrame:m,frameMarker:P,onFrameMarkerReached:R,onFrameMarkerUnsupported:w,onUnlockChange:h}=t,C=we(),T=o??C,x=(0,I.useRef)(null),U=(0,I.useRef)(null),[p,E]=(0,I.useState)(!1),[v,_]=(0,I.useState)(!1),B=(0,I.useRef)(!1),q=(0,I.useRef)(null),O=(0,I.useRef)(g);O.current=g;let L=(0,I.useRef)(h);L.current=h;let H=(0,I.useRef)(m);H.current=m;let K=(0,I.useRef)(R);K.current=R;let re=(0,I.useRef)(w);re.current=w;let $=(0,I.useRef)(P??null);$.current=P??null;let oe=(0,I.useCallback)(S=>{q.current!==S&&(q.current=S,L.current?.(S))},[]),ie=(0,I.useRef)(null),z=(0,I.useRef)(null),W=(0,I.useCallback)((S,D=!1)=>{if(!D&&S===ie.current||(ie.current=S,z.current?.(),z.current=null,B.current=!1,_(!1),!S))return;let N=x.current;if(!N)return;let J=$.current,he=J?.rtpTimestamp??null,xe=!1,M=()=>{xe||(xe=!0,re.current?.())};J&&he==null&&M();let Ue=J!=null&&he!=null,Ge=Me=>{z.current?.(),z.current=null,B.current=!0,_(!0),H.current?.(),Me&&K.current?.()};if(typeof N.requestVideoFrameCallback=="function"){let Me=!1,V=0,F=(Se,ve)=>{if(!Me){if(Ue){let Re=ve?.rtpTimestamp;if(typeof Re!="number"){M(),Ge(!1);return}if(!bo(Re,he)){V=N.requestVideoFrameCallback(F);return}Ge(!0);return}Ge(!1)}};V=N.requestVideoFrameCallback(F),z.current=()=>{Me=!0,N.cancelVideoFrameCallback?.(V)};return}Ue&&M();let Ae=()=>{let Me=N.getVideoPlaybackQuality?.();(Me?Me.totalVideoFrames>0:N.readyState>=2&&N.videoWidth>0)&&Ge(!1)};N.addEventListener("loadeddata",Ae),N.addEventListener("timeupdate",Ae),N.addEventListener("playing",Ae),z.current=()=>{N.removeEventListener("loadeddata",Ae),N.removeEventListener("timeupdate",Ae),N.removeEventListener("playing",Ae)},Ae()},[]);(0,I.useEffect)(()=>()=>{z.current?.(),z.current=null},[]);let G=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,Te=(0,I.useRef)(G);(0,I.useEffect)(()=>{if(Te.current===G||(Te.current=G,G==null))return;let S=ie.current;S&&W(S,!0)},[G,W]);let me=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;U.current||(U.current=new MediaStream);let S=x.current;return S&&S.srcObject!==U.current&&(S.srcObject=U.current),U.current},[]),ae=(0,I.useCallback)(S=>{let D=x.current;if(!D)return;let N=D.play();!N||typeof N.then!="function"||N.then(()=>{D.muted||oe(!0)}).catch(J=>{if((J instanceof Error?J.name:String(J))==="NotAllowedError"&&!D.muted){tn(`play() blocked pending a user gesture (${S})`),oe(!1);return}tn(`play() failed (${S})`,J)})},[oe]),Ve=(0,I.useCallback)(()=>{let S=x.current;S&&(me(),!S.muted&&(ae("gesture"),je(),oe(!0)))},[me,ae,oe]),ee=(0,I.useCallback)(S=>{let D=me();if(D){for(let N of D.getVideoTracks())N!==S&&D.removeTrack(N);if(S&&!D.getVideoTracks().includes(S)){D.addTrack(S);let N=x.current;N&&(N.srcObject=D)}S&&ae("track-attach"),E(S!==null),W(S),O.current?.(S)}},[me,ae,W]),ue=(0,I.useCallback)(S=>{let D=me();if(D){for(let N of D.getAudioTracks())N!==S&&D.removeTrack(N);S&&!D.getAudioTracks().includes(S)&&D.addTrack(S),S&&ae("audio-attach")}},[me,ae]),Z=(0,I.useCallback)(S=>{x.current=S,S&&(a?(S.muted=!0,S.defaultMuted=!0,S.setAttribute("muted",""),q.current=null):(S.muted=!1,S.defaultMuted=!1,S.removeAttribute("muted")),S.setAttribute("playsinline",""),S.setAttribute("webkit-playsinline",""),me())},[me,a]);(0,I.useImperativeHandle)(r,()=>({get element(){return x.current},get live(){return U.current?U.current.getVideoTracks().length>0:!1},get framed(){return B.current},unlock:Ve,get unlocked(){return q.current===!0}}),[Ve]);let ce=(0,on.derivedLegRole)(n)!==void 0;(0,I.useEffect)(()=>{ce&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ce,n]);let le=i!==void 0;return(0,I.useEffect)(()=>{if(le){ee(i??null);return}if(ce){ee(null);return}if(!T)return;let S=rn(T,nn(n,"video")),D=()=>{let M=U.current;return M?M.getVideoTracks()[0]??null:null},N=M=>{if(M!==D()&&(ee(M),M)){let Ue=()=>{D()===M&&ee(null)};M.addEventListener("ended",Ue)}},J=S.track;J&&J.readyState==="live"&&N(J);let he=S.on("track",M=>{M&&M.readyState!=="live"||N(M)}),xe=setInterval(()=>{let M=S.track;M&&M.readyState==="live"&&N(M)},en);return()=>{he(),clearInterval(xe)}},[T,n,ce,le,i,ee]),(0,I.useEffect)(()=>{if(le||!T||s===!1||ce)return;let S=rn(T,nn(n,"audio",s)),D=()=>{let M=U.current;return M?M.getAudioTracks()[0]??null:null},N=M=>{if(M!==D()&&(ue(M),M)){let Ue=()=>{D()===M&&ue(null)};M.addEventListener("ended",Ue)}},J=S.track;J&&J.readyState==="live"&&N(J);let he=S.on("track",M=>{M&&M.readyState!=="live"||N(M)}),xe=setInterval(()=>{let M=S.track;M&&M.readyState==="live"&&N(M)},en);return()=>{he(),clearInterval(xe)}},[T,n,ce,s,le,ue]),(0,kt.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...d},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":v?"true":"false",children:[(0,kt.jsx)("video",{ref:Z,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,k===void 0?null:(0,kt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":v||void 0,style:{position:"absolute",inset:0,...v?{opacity:0,pointerEvents:"none"}:null},children:k}),l]})});var bt=require("react/jsx-runtime"),Ro={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},an=(0,pe.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},d=c!==void 0?c:typeof document<"u"?document:null,y=(0,pe.useRef)(null),b=(0,pe.useRef)(null),k=(0,pe.useRef)(0),l=(0,pe.useRef)(f);l.current=f;let g=(0,pe.useMemo)(()=>(0,sn.createCameraWarp)(l.current),[]);return(0,pe.useImperativeHandle)(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:g,get lastDrawTs(){return k.current}}),[g]),(0,pe.useEffect)(()=>{if(!i)return;let m=0,P=0,R=null,w=C=>{typeof C.requestVideoFrameCallback=="function"&&(R=C,P=C.requestVideoFrameCallback(function T(){g.frameArrived(),P=C.requestVideoFrameCallback(T)}))},h=C=>{m=requestAnimationFrame(h);let T=b.current,x=y.current?.element??null;if(!T||!x||(x!==R&&(R&&P&&R.cancelVideoFrameCallback?.(P),w(x)),x.readyState<2))return;g.tick(C);let U=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(T.clientWidth*U)),E=Math.max(1,Math.round(T.clientHeight*U));(T.width!==p||T.height!==E)&&(T.width=p,T.height=E);let v=T.getContext("2d");if(!v)return;let _=g.transform(),B=x.videoWidth||p,q=x.videoHeight||E,L=Math.max(p/B,E/q)*(1+a)*_.scale;v.setTransform(L,0,0,L,p/2+_.translateX*p,E/2+_.translateY*E),v.drawImage(x,-B/2,-q/2),k.current=C};return m=requestAnimationFrame(h),()=>{cancelAnimationFrame(m),R&&P&&R.cancelVideoFrameCallback?.(P)}},[i,a,g]),(0,pe.useEffect)(()=>{if(!i||!u||!d)return;let m=()=>!!d.pointerLockElement,P=T=>{m()&&g.keyDown(T.key)},R=T=>g.keyUp(T.key),w=T=>{m()&&g.pointerDelta(T.movementX,T.movementY)},h=()=>{m()||g.clearKeys()},C=()=>g.clearKeys();return d.addEventListener("keydown",P),d.addEventListener("keyup",R),d.addEventListener("mousemove",w),d.addEventListener("pointerlockchange",h),d.defaultView?.addEventListener("blur",C),()=>{d.removeEventListener("keydown",P),d.removeEventListener("keyup",R),d.removeEventListener("mousemove",w),d.removeEventListener("pointerlockchange",h),d.defaultView?.removeEventListener("blur",C)}},[i,u,d,g]),i?(0,bt.jsxs)(Ke,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,bt.jsx)("canvas",{ref:b,style:Ro,"data-urun-warp":""}),n]}):(0,bt.jsx)(Ke,{ref:y,...s,children:n})});var un=new Map;function cn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);un.set(e,{component:t,schema:r})}function ln(e,t){let r=un.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 $e=require("react/jsx-runtime");function dn({name:e,props:t,fallback:r}){let o=ln(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,$e.jsx)($e.Fragment,{children:r}):(0,$e.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,$e.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,$e.jsx)(n,{...o.validatedProps})}var nt=require("zod"),Xe=require("react/jsx-runtime"),pn=nt.z.object({step:nt.z.number().min(0),total:nt.z.number().min(1),label:nt.z.string().optional(),variant:nt.z.enum(["default","success","error"]).default("default")});function mr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function mn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=mr(e);return(0,Xe.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Xe.jsx)("div",{className:"urun-progress-label",children:o}),(0,Xe.jsx)("div",{className:"urun-progress-bar",children:(0,Xe.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Xe.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Dt=require("zod"),Rt=require("react/jsx-runtime"),fn=Dt.z.object({state:Dt.z.enum(["thinking","generating","idle","error"]),message:Dt.z.string().optional()}),Co={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function fr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Co[t]??t;return{state:t,message:n,isActive:o}}function gn(e){let{state:t,message:r,isActive:o}=fr(e);return(0,Rt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,Rt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Rt.jsx)("span",{className:"urun-status-message",children:r})]})}var Ct=require("react"),Vt=require("zod"),Pt=require("react/jsx-runtime"),hn=Vt.z.object({text:Vt.z.string(),streaming:Vt.z.boolean().default(!1)});function gr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Sn(e){let{text:t,streaming:r}=gr(e),o=(0,Ct.useRef)(null),n=(0,Ct.useRef)(0);return(0,Ct.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Pt.jsxs)("div",{className:"urun-text-stream",children:[(0,Pt.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Pt.jsx)("span",{className:"urun-text-cursor"})]})}var Et=require("zod"),Tt=require("react/jsx-runtime"),vn=Et.z.object({src:Et.z.string().url(),alt:Et.z.string().optional(),caption:Et.z.string().optional()});function hr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function yn(e){let{src:t,alt:r,caption:o}=hr(e);return(0,Tt.jsxs)("figure",{className:"urun-image-frame",children:[(0,Tt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Tt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ie=require("zod"),ot=require("react/jsx-runtime"),kn=Ie.z.object({metrics:Ie.z.array(Ie.z.object({label:Ie.z.string(),value:Ie.z.union([Ie.z.string(),Ie.z.number()]),unit:Ie.z.string().optional()}))});function Sr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function bn(e){let{metrics:t}=Sr(e);return(0,ot.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,ot.jsxs)("div",{className:"urun-metric-card",children:[(0,ot.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ot.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var Rn=require("react");var Pn=require("react/jsx-runtime"),Cn=(0,Rn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Pn.jsx)(Ke,{ref:r,stream:o,...n})});var X=require("react"),Tn=require("@urun-sh/core");var xn=require("react/jsx-runtime"),Po=1e3,En=200;function vr(...e){console.debug("[audio]",...e)}var wt=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,d=we(),y=o??d,b=(0,X.useRef)(null),k=(0,X.useRef)(null),l=(0,X.useRef)(null),g=(0,X.useRef)(null),m=(0,X.useRef)(u);m.current=u;let P=(0,X.useRef)(c);P.current=c;let R=(0,X.useCallback)(p=>{l.current!==p&&(l.current=p,P.current?.(p))},[]),w=(0,X.useCallback)(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let p=b.current;return p&&p.srcObject!==k.current&&(p.srcObject=k.current),k.current},[]),h=(0,X.useCallback)(p=>{let E=b.current;if(!E)return;let v=E.play();!v||typeof v.then!="function"||v.then(()=>{E.muted||R(!0)}).catch(_=>{let B=_ instanceof Error?_.name:String(_);if(B==="AbortError"){vr(`play() aborted (${p}); retrying in ${En}ms`),g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{g.current=null,h(`${p}:retry`)},En);return}if(B==="NotAllowedError"){vr(`play() blocked pending a user gesture (${p})`),R(!1);return}vr(`play() failed (${p})`,_)})},[R]),C=(0,X.useCallback)(p=>{let E=w();if(E){for(let v of E.getAudioTracks())v!==p&&E.removeTrack(v);p&&!E.getAudioTracks().includes(p)&&E.addTrack(p),p&&h("track-attach"),m.current?.(p)}},[w,h]),T=(0,X.useCallback)(()=>{let p=b.current;p&&(w(),p.muted=!1,h("gesture"),je(),R(!0))},[w,h,R]);(0,X.useImperativeHandle)(r,()=>({unlock:T,get unlocked(){return l.current===!0},get element(){return b.current}}),[T]);let x=(0,X.useCallback)(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),w()),f?.(p)},[w,f]),U=s!==void 0;return(0,X.useEffect)(()=>{if(U){C(s??null);return}if(!y)return;let p=y.stream(n),E=()=>{let O=k.current;return O?O.getAudioTracks()[0]??null:null},v=O=>{if(O!==E()&&(C(O),O)){let L=()=>{E()===O&&C(null)};O.addEventListener("ended",L)}},_=p.track;_&&_.readyState==="live"&&v(_);let B=p.on("track",O=>{O&&O.readyState!=="live"||v(O)}),q=setInterval(()=>{let O=p.track;O&&O.readyState==="live"&&v(O)},Po);return()=>{B(),clearInterval(q)}},[y,n,U,s,C]),(0,X.useEffect)(()=>(0,Tn.observePageLifecycle)(()=>{je(),l.current===!0&&h("foreground")}),[h]),(0,X.useEffect)(()=>()=>{g.current&&clearTimeout(g.current)},[]),(0,xn.jsx)("audio",{ref:x,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),wn=wt;var j=require("react"),st=require("@urun-sh/core");var An=require("react/jsx-runtime"),yr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ft(...e){console.debug("[voice]",...e)}var xt=(0,j.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=yr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:d,onMicStream:y,onTrack:b,onUnlockChange:k,capture:l}=t,g=we(),m=o??g,P=(0,j.useRef)(null),R=(0,j.useRef)(null),w=(0,j.useRef)(null),h=(0,j.useRef)([]),C=(0,j.useRef)(!1),T=(0,j.useRef)(f);T.current=f;let x=(0,j.useRef)(d);x.current=d;let U=(0,j.useRef)(y);U.current=y;let p=(0,j.useCallback)(L=>{C.current!==L&&(C.current=L,T.current?.(L))},[]),E=(0,j.useCallback)(()=>{for(let L of h.current)L();h.current=[],w.current?.release(),w.current=null,R.current&&(R.current=null,U.current?.(null))},[]),v=(0,j.useCallback)(async()=>{let L=w.current;if(L){let $=await L.update(i);return R.current=L.stream,U.current?.(L.stream),$}let K=await(l??(0,st.sharedCaptureController)()).claim("audio",i);w.current=K,h.current=[K.onTrack(($,oe)=>{R.current=oe,U.current?.(oe),C.current&&m?.stream(n).attach($).catch(ie=>Ft("mic re-attach after one-capture re-acquire failed",ie))}),K.onLost($=>{w.current=null,h.current=[],R.current=null,U.current?.(null),p(!1),x.current?.($)})],R.current=K.stream,U.current?.(K.stream);let re=K.track;if(!re)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return re},[l,i,m,n,p]),_=(0,j.useCallback)(async()=>{E(),p(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,E,p]),B=(0,j.useCallback)(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let L;try{L=await v()}catch(re){E();let $=(0,st.sessionFailureFromMediaError)(re,m.status);throw x.current?.($),$}m.connect?.();let H;for(let re=1;re<=u;re++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(L),p(!0);return}catch($){H=$,Ft(`start attempt ${re}/${u} failed`,$),re<u&&await new Promise(oe=>setTimeout(oe,c))}E(),p(!1);let K=H instanceof Error?H:new Error(String(H??"voice start failed"));throw x.current?.(K),K},[m,n,a,u,c,v,E,p]);(0,j.useImperativeHandle)(r,()=>({start:B,stop:_,unlock:()=>P.current?.unlock(),get active(){return C.current},get micStream(){return R.current},get audio(){return P.current}}),[B,_]);let q=(0,j.useRef)(!1),O=(0,j.useCallback)(async()=>{if(!m||!C.current||q.current)return;let L=R.current?.getAudioTracks()[0]??null;if(L&&L.readyState==="live"){try{await m.stream(n).attach(L)}catch(H){Ft("foreground mic re-assert failed (will retry on next pass)",H)}return}q.current=!0;try{let H=await v();await m.stream(n).attach(H)}catch(H){let K=H instanceof Error?H:new Error(String(H));Ft("foreground mic re-acquire failed",K),x.current?.(K)}finally{q.current=!1}},[m,n,v]);return(0,j.useEffect)(()=>{let L=()=>{O()};return m&&typeof m.onRecovery=="function"?m.onRecovery(L):(0,st.observePageLifecycle)(L)},[m,O]),(0,j.useEffect)(()=>E,[E]),s?(0,An.jsx)(wt,{ref:P,session:m,stream:n,onTrack:b,onUnlockChange:k}):null}),Un=xt;var Pe=require("react");var qt=require("react");var kr={level:0,speaking:!1};function Ht(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,qt.useState)(kr);return(0,qt.useEffect)(()=>{if(!e){i(kr);return}let a=vt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),b=setInterval(()=>{f.getByteTimeDomainData(d);let k=0;for(let g=0;g<d.length;g++){let m=(d[g]-128)/128;k+=m*m}let l=Math.sqrt(k/d.length);i(g=>{let m=l>n;return Math.abs(g.level-l)<.005&&g.speaking===m?g:{level:l,speaking:m}})},o);return()=>{clearInterval(b),c.disconnect(),i(kr)}},[e,r,o,n]),s}var Le=require("react/jsx-runtime"),Eo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},To={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Mn=(0,Pe.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:d,capture:y}=t,b=we(),k=o??b,l=(0,Pe.useRef)(null),[g,m]=(0,Pe.useState)(null),P=(0,Pe.useRef)(d);P.current=d;let{level:R,speaking:w}=Ht(a?g:null);return(0,Pe.useImperativeHandle)(r,()=>({start:()=>{let h=l.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>l.current?.stop()??Promise.resolve(),get active(){return l.current?.active??!1},get micStream(){return l.current?.micStream??null}}),[]),(0,Pe.useEffect)(()=>{!i||!k||l.current?.start().catch(()=>{})},[i,k]),(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)(xt,{ref:l,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:f,onMicStream:h=>{m(h),P.current?.(h)}}),a?(0,Le.jsx)("span",{className:u,style:Eo,"data-urun-mic":"","data-urun-mic-active":g?"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(R*100)/100,children:(0,Le.jsx)("span",{style:To,children:(0,Le.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(R*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var it=require("@urun-sh/core"),A=require("react");var ye=require("react/jsx-runtime"),Rr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function br(...e){console.debug("[camera]",...e)}function wo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function xo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Cr=(0,A.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:d,visible:y=!1,className:b,videoClassName:k,onActiveChange:l,onError:g,onStream:m,onTrack:P,children:R,capture:w,flipControl:h="auto",flipControlClassName:C,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let x=i?"user":a?"environment":u??"environment",U=we(),p=o??U,E=(0,A.useRef)(null),v=(0,A.useRef)(null),_=(0,A.useRef)(null),B=(0,A.useRef)([]),q=(0,A.useRef)(null),O=(0,A.useRef)(!1),L=(0,A.useRef)(!1),H=(0,A.useRef)(x),[K,re]=(0,A.useState)(x),[$,oe]=(0,A.useState)(!1),[ie,z]=(0,A.useState)(null),[W,G]=(0,A.useState)(!1),[Te]=(0,A.useState)(wo),me=(0,A.useRef)(l);me.current=l;let ae=(0,A.useRef)(g);ae.current=g;let Ve=(0,A.useRef)(m);Ve.current=m;let ee=(0,A.useRef)(P);ee.current=P;let ue=(0,A.useRef)(T);ue.current=T;let Z=(0,A.useCallback)(V=>{O.current!==V&&(O.current=V,oe(V),me.current?.(V))},[]);(0,A.useEffect)(()=>{if(!$){z(null);return}let V=!1,F=()=>{xo().then(ve=>{V||(z(ve),ve&&ue.current?.(ve))})};F();let Se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Se?.addEventListener=="function"?(Se.addEventListener("devicechange",F),()=>{V=!0,Se.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[$]);let ce=(0,A.useCallback)(V=>{let F=E.current;F&&(F.muted=!0,F.defaultMuted=!0,F.setAttribute("muted",""),F.setAttribute("playsinline",""),F.setAttribute("webkit-playsinline",""),F.srcObject=V,V&&F.play()?.catch?.(Se=>br("preview play() failed",Se)))},[]),le=(0,A.useCallback)(()=>{L.current=!1,q.current?.(),q.current=null;for(let V of B.current)V();B.current=[],_.current?.release(),_.current=null,v.current&&(v.current=null,Ve.current?.(null),ee.current?.(null)),ce(null)},[ce]),S=(0,A.useCallback)((V,F)=>{q.current?.(),v.current=F,ce(F),Ve.current?.(F);let Se=()=>{v.current===F&&(br("camera track ended (device removed or permission revoked)"),le(),Z(!1))};V.addEventListener("ended",Se),q.current=()=>V.removeEventListener("ended",Se)},[ce,le,Z]),D=(0,A.useCallback)(async V=>{let F=n!==!1;if(F&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let Se={...Rr,...s,facingMode:V},ve;try{let Re=_.current;if(Re)ve=await Re.update(Se);else{let mt=await(w??(0,it.sharedCaptureController)()).claim("video",Se);if(_.current=mt,B.current=[mt.onTrack((ft,eo)=>{S(ft,eo),O.current&&(!F||!p||p.stream(n).attachVideo(ft).then(()=>ee.current?.(ft)).catch(to=>br("camera re-publish after one-capture re-acquire failed",to)))}),mt.onLost(ft=>{_.current=null,B.current=[],le(),Z(!1),ae.current?.(ft)})],!mt.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ve=mt.track}}catch(Re){let Ye=(0,it.sessionFailureFromMediaError)(Re,p?.status);throw ae.current?.(Ye),Ye}H.current=V,re(V),S(ve,_.current?.stream??new MediaStream([ve]));try{F&&p&&(p.connect?.(),await p.whenLive(d!==void 0?{timeout:d}:void 0),await p.stream(n).attachVideo(ve)),L.current=F?n:!1}catch(Re){le(),Z(!1);let Ye=Re instanceof Error?Re:new Error(String(Re));throw ae.current?.(Ye),Ye}ee.current?.(ve),Z(!0)},[p,n,s,d,w,S,le,Z]),N=(0,A.useCallback)(V=>D(V?.facingMode??H.current),[D]),J=(0,A.useCallback)(async V=>{let F=L.current===n;O.current&&H.current===V&&F||await D(V)},[D,n]),he=(0,A.useCallback)(()=>D(H.current==="environment"?"user":"environment"),[D]),xe=(0,A.useCallback)(async()=>{le(),Z(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,le,Z]),M=(0,A.useCallback)(async V=>{let F=E.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,it.captureStillFromVideo)(F,V)},[]);(0,A.useImperativeHandle)(r,()=>({start:N,stop:xe,flip:he,setFacingMode:J,capturePhoto:M,get active(){return O.current},get facingMode(){return H.current},get stream(){return v.current},get element(){return E.current}}),[N,xe,he,J,M]);let Ue=(0,A.useRef)(J);if(Ue.current=J,(0,A.useEffect)(()=>{c&&(n!==!1&&!p||Ue.current(x).catch(()=>{}))},[c,p,x,n]),(0,A.useEffect)(()=>le,[le]),!y)return null;let Ge=f==="auto"?K==="user":f,Ae=$&&(h===!0||h==="auto"&&Te&&(ie?.length??0)>1),Me=()=>{W||(G(!0),he().catch(()=>{}).finally(()=>G(!1)))};return(0,ye.jsxs)("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":K,children:[(0,ye.jsx)("video",{ref:E,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ge?{transform:"scaleX(-1)"}:{}}}),Ae?(0,ye.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Me,disabled:W,className:C,style:C?{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,ye.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,ye.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ye.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ye.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ye.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ye.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,R]})}),_n=(0,A.forwardRef)(function({preview:t=!0,...r},o){return(0,ye.jsx)(Cr,{ref:o,...r,visible:t,autoStart:!1})});var at=require("@urun-sh/core"),te=require("react");function Nn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,te.useState)(null),[a,u]=(0,te.useState)(null),[c,f]=(0,te.useState)(!1),[d,y]=(0,te.useState)(null),[b]=(0,te.useState)(at.cameraCaptureAvailable),k=(0,te.useRef)(n);k.current=n;let l=(0,te.useRef)(null),g=(0,te.useRef)(0),m=(0,te.useCallback)(C=>{l.current&&URL.revokeObjectURL(l.current),l.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,u(l.current),i(C),k.current?.(C)},[]);(0,te.useEffect)(()=>()=>{g.current++,l.current&&URL.revokeObjectURL(l.current),l.current=null},[]);let P=(0,te.useCallback)(async C=>{let T=++g.current;f(!0),y(null);try{let x=await C();if(g.current!==T)return;m(x)}catch(x){if(g.current!==T)return;y((0,at.referenceImageErrorMessage)(x))}finally{g.current===T&&f(!1)}},[m]),R=(0,te.useCallback)(C=>P(()=>(0,at.normalizeReferenceImage)(C,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),w=(0,te.useCallback)(C=>P(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),h=(0,te.useCallback)(()=>{g.current++,y(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:R,capture:w,clear:h,busy:c,error:d,cameraAvailable:b}}var Wt=require("react");function In(e,t){let[r,o]=(0,Wt.useState)(null);return(0,Wt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Dn=require("react");var jt=require("react");var Ln=require("zustand/vanilla"),On=require("zustand"),Uo=()=>{};function Bt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Ln.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Uo,u=(c=>(0,On.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function ut(e,t){let r=(0,jt.useMemo)(()=>Bt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,jt.useEffect)(()=>r.bind(),[r]),r}function Vn(e,t,r){let n=ut(e,t)(r??(a=>a)),s=(0,Dn.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var $t=require("react");var Fe=200;function Oe(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ct(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Kt(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 Xt(e,t,r={}){let o=r.cap??200,[n,s]=(0,$t.useState)([]);return(0,$t.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Oe(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Ee=require("react/jsx-runtime");function Fn({session:e,name:t,cap:r,className:o}){let n=Xt(e,t,{cap:r});return(0,Ee.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Ee.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Ee.jsx)("code",{children:t}),(0,Ee.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Ee.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Ee.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Ee.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Ee.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Ee.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ct(s.payload)]},`${s.at}-${i}`))})]})}var Ut=require("react");var ge=require("react/jsx-runtime");function At({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Ut.useState)(""),[i,a]=(0,Ut.useState)(null),u=(0,Ut.useCallback)(()=>{let c=Kt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,ge.jsxs)("div",{className:"urun-doc-patch",children:[(0,ge.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,ge.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,ge.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,ge.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function qn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=ut(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,ge.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,ge.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,ge.jsx)("code",{children:t}),(0,ge.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,ge.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,ge.jsx)(At,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var zt=require("react");var De=require("react/jsx-runtime");function Hn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Wn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,zt.useState)([]);return(0,zt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Oe(u,{at:Date.now(),direction:"in",text:Hn(ct(a))},r))}):void 0),[e,t,r]),(0,De.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,De.jsx)(At,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Oe(u,{at:Date.now(),direction:"out",text:Hn(a)},r))}}),(0,De.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,De.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,De.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,De.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,De.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Jt=require("react");var ze=require("react/jsx-runtime");function Bn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Jt.useState)([]),a=t.join(","),u=r.join(",");return(0,Jt.useEffect)(()=>{if(i([]),!e)return;let c=(d,y)=>i(b=>Oe(b,{at:Date.now(),kind:d,text:y},o)),f=[];f.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let y=e.stream(d);f.push(y.on("track",b=>c("track",`${d}: ${b?"track arrived":"track ended"}`)))}for(let d of r){let y=e.doc(d);f.push(y.on("change",()=>c("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,a,u,o]),(0,ze.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,ze.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>(0,ze.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,ze.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,ze.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}var rr=require("@urun-sh/core");var Gt=require("react");function ke(e){let[t,r]=(0,Gt.useState)(e?.phase??null);return(0,Gt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Kn=require("@urun-sh/core");var lt=require("react"),jn=require("@urun-sh/core");function Yt(e){let t=ke(e),r=(0,jn.isWakingPhase)(t?.name),o=(0,lt.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,lt.useState)(s);return(0,lt.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var qe=require("react/jsx-runtime");function Zt({session:e,render:t,className:r}){let o=Yt(e);return!o.waking||!o.phase?null:(0,qe.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,qe.jsxs)(qe.Fragment,{children:[(0,qe.jsx)("span",{className:"urun-session-waking-label",children:(0,Kn.describeSessionPhase)(o.phase)})," ",(0,qe.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var er=require("react");var He=require("react"),Ao={event:null,elapsedMs:0};function Qt(e,t){let[r,o]=(0,He.useState)(null),n=(0,He.useRef)(0);(0,He.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,He.useState)(0);return(0,He.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ao}var dt=require("react/jsx-runtime"),Mo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function _o(e){let[t,r]=(0,er.useState)(!1);return(0,er.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 tr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Qt(e,t),i=_o(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,dt.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,dt.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,dt.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Mo[u]})," ",(0,dt.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var be=require("react/jsx-runtime"),No={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function $n({session:e,className:t}){let r=ke(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,be.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,be.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,be.jsx)("span",{className:"urun-session-status-label",children:No[o]}),n?(0,be.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Xn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ke(e);if(s?.name==="live")return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,be.jsx)(tr,{session:e})]});let i=r?r(s):(0,be.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,rr.isWakingPhase)(s.name)?(0,be.jsx)(Zt,{session:e}):s&&s.name!=="idle"?(0,rr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,be.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var nr=require("react");var Jn=require("react/jsx-runtime");function Pr(e){return ke(e)?.endsAt??null}function Io(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function zn({session:e,urgentMs:t=6e4,className:r}){let n=Pr(e)?.getTime()??null,[s,i]=(0,nr.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,nr.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Io(s);return(0,Jn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Mt=require("react/jsx-runtime"),Lo=new Set(["expired","ended","error"]);function Gn({session:e,onNewSession:t,children:r,className:o}){let n=ke(e);if(!n||!Lo.has(n.name))return null;let s=r?r(n):(0,Mt.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,Mt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Mt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var We=require("react"),Je=require("react/jsx-runtime");function Er(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Tr(e){let t=(0,We.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,We.useState)(()=>t?Er(t.get("idle")):null);return(0,We.useEffect)(()=>{if(!t){o(null);return}return o(Er(t.get("idle"))),t.on("change",()=>o(Er(t.get("idle"))))},[t]),r}function Oo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Yn({session:e,onStillHere:t,className:r}){let o=Tr(e),n=o?.deadlineEpochS??null,[s,i]=(0,We.useState)(null);if((0,We.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Je.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,Je.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Je.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Je.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Oo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Je.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var pt=require("react"),Zn=require("@urun-sh/core");function Qn(e){let t=(0,pt.useContext)(Qe),[r,o]=(0,pt.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,d=t?.authProvider;return(0,pt.useEffect)(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{(0,Zn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:d}).then(l=>{y||o(l)}).catch(()=>{})};b();let k=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(k)}},[n,s,i,a,u,c,f,d]),r}var or=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var ir=Object.defineProperty;var so=Object.getOwnPropertyDescriptor;var io=Object.getOwnPropertyNames;var ao=Object.prototype.hasOwnProperty;var uo=(e,t)=>{for(var r in t)ir(e,r,{get:t[r],enumerable:!0})},co=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of io(t))!ao.call(e,n)&&n!==r&&ir(e,n,{get:()=>t[n],enumerable:!(o=so(t,n))||o.enumerable});return e};var lo=e=>co(ir({},"__esModule",{value:!0}),e);var qo={};uo(qo,{Audio:()=>xt,Camera:()=>Er,ComponentRenderer:()=>mn,DEFAULT_CAMERA_CONSTRAINTS:()=>Cr,DEFAULT_LOG_CAP:()=>Fe,DEFAULT_VOICE_CONSTRAINTS:()=>br,DocPatchForm:()=>At,Image:()=>En,ImageFrame:()=>bn,ImageFrameSchema:()=>kn,MetricsPanel:()=>Rn,MetricsPanelSchema:()=>Pn,Mic:()=>Nn,OPERATOR_CHORD_LABEL:()=>Dr,OPERATOR_TOKEN_STORAGE_KEY:()=>Or,ProgressCard:()=>gn,ProgressCardSchema:()=>fn,ReprojectedVideo:()=>cn,Session:()=>Qr,StatusBadge:()=>hn,StatusBadgeSchema:()=>Sn,TextStream:()=>yn,TextStreamSchema:()=>vn,UrunActivationOverlay:()=>tr,UrunAudio:()=>Un,UrunAuthProvider:()=>ht,UrunCamera:()=>In,UrunControlSender:()=>jn,UrunDocPanel:()=>Wn,UrunErrorBoundary:()=>Ze,UrunEventSpine:()=>Kn,UrunIdleWarning:()=>Qn,UrunJwtProvider:()=>Nr,UrunProvider:()=>Br,UrunSessionClock:()=>Gn,UrunSessionEnded:()=>Zn,UrunSessionGate:()=>zn,UrunSessionStatus:()=>Jn,UrunSessionWaking:()=>Zt,UrunStreamTail:()=>Hn,UrunVoice:()=>Mn,Video:()=>Ke,Voice:()=>wt,authMode:()=>St,createDocStore:()=>Bt,describeSessionPhase:()=>sr.describeSessionPhase,formatPayload:()=>ct,getUrunAudioContext:()=>vt,isWakingPhase:()=>sr.isWakingPhase,parseJsonObject:()=>Kt,pushCapped:()=>Oe,readOperatorToken:()=>ar,registerComponent:()=>dn,resumeUrunAudioContext:()=>je,urunPublicEnv:()=>Re,useActivation:()=>Qt,useApp:()=>Kr,useChat:()=>Yr,useCompletion:()=>Jr,useConfirmOnLeave:()=>Lt,useDocStore:()=>ut,useImageFrame:()=>vr,useInputPresence:()=>Zr,useMetricsPanel:()=>yr,useOperatorOverride:()=>It,useProgressCard:()=>gr,useReferenceImage:()=>Ln,useRequest:()=>$r,useSession:()=>en,useSessionDoc:()=>qn,useSessionEndsAt:()=>Tr,useSessionIdle:()=>wr,useSessionPhase:()=>ye,useSessionStats:()=>ro,useSessionTrack:()=>On,useSessionWake:()=>Yt,useStatusBadge:()=>Sr,useStreamMessages:()=>Xt,useTextStream:()=>hr,useUrunAudioLevel:()=>Ht,useUrunAuth:()=>_t,useUrunPrewake:()=>to,usesWorkOSAuth:()=>Mr});module.exports=lo(qo);var ie=require("react");var Ur=require("react"),gt=require("react/jsx-runtime"),Ze=class extends Ur.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,gt.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,gt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,gt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Ar=require("react"),Qe=(0,Ar.createContext)(null);function _e(e){return e&&e.trim()?e.trim():void 0}function Re(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return _e(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return _e(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return _e(typeof process<"u"?process.env?.[e]:void 0)}}function St(){let e=Re("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Re("VERCEL_ENV")==="production"?"workos":Re("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Mr(){return St()==="workos"}var et=require("react"),Ir=require("react/jsx-runtime"),_r=(0,et.createContext)(null);function ht({getAccessToken:e,children:t}){let r=(0,et.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Ir.jsx)(_r.Provider,{value:r,children:t})}var Nr=ht;function _t(){return(0,et.useContext)(_r)}var Nt=require("react"),Or="urun.operator_token",Vr=null,Lr="op",Dr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Fr(){return typeof window<"u"}function ar(){return Vr}function po(){if(!Fr())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(Lr);if(!r)return null;Vr=r,t.delete(Lr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function mo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function It(e){let t=(0,Nt.useRef)(e);t.current=e,(0,Nt.useEffect)(()=>{if(!Fr())return;po();let r=o=>{if(!mo(o))return;let n=ar();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var qr=require("react");function Lt(e=!0){(0,qr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var Ne=require("react/jsx-runtime"),fo="/api/urun-token",go=1e4;function So(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Hr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function Wr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function ur(e){let t=e===void 0?void 0:JSON.stringify(e);return(0,ie.useMemo)(()=>e,[t])}function ho(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Ne.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Ne.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ne.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Br({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:v,confirmOnLeave:R=!1,fallback:k,errorFallback:m,children:S}){let p=n===void 0&&t===void 0;if(!p&&(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(!p&&(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 b=r??o;if(p&&(typeof b!="string"||b.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Lt(R);let[y,U]=(0,ie.useState)(),[h,C]=(0,ie.useState)(null),T=(0,ie.useRef)(void 0),w=(0,ie.useRef)(null),[I,d]=(0,ie.useState)(null);It(f=>d({jwt:f}));let E=_t(),P=Re("NEXT_PUBLIC_SESSION_TOKEN")??Re("NEXT_PUBLIC_URUN_JWT"),L=St(),q=I!==null,W=L==="workos"&&!n&&!q&&!p,V=n??(L==="jwt"?P:void 0)??y?.token,A=q?I.jwt:V,H=s??Re("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),J=W&&!A&&!E?.getAccessToken,Z=t??y?.orgId,j=e??y?.gatewayUrl,re=p&&y===void 0,ce=p&&y!==void 0&&!j?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,Q=J?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,B=h??ce??Q,z=Wr("NEXT_PUBLIC_URUN_TOKEN_URL",Re("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??fo,be=Wr("NEXT_PUBLIC_URUN_EVENTS_URL",Re("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,se=(0,ie.useCallback)(async f=>{if(!f?.forceRefresh){let x=T.current;if(!x)return x;let K=So(x);if(K===null||K-Date.now()>go)return x}return(await(w.current??(w.current=(async()=>{try{let x=await Hr(z);return T.current=x.token,U(x),x}finally{w.current=null}})()))).token},[z]),le=(0,ie.useCallback)(async()=>A,[A]),De=typeof A=="string"&&A.trim().length>0,de=W?E?.getAccessToken:p&&!q?se:De?le:void 0,xe=ur(g),pe=ur(l),ae=ur(v),ne=(0,ie.useMemo)(()=>({appId:b,baseUrl:j??"",orgId:Z??"",jwt:A,getAccessToken:W?E?.getAccessToken:p&&!q?se:void 0,authProvider:H,eventsUrl:be,sessionKey:a,releaseOnLeave:c,audioPlayout:xe,videoPlayout:pe,sessionStats:ae,priority:q?"preempt":void 0}),[b,E,j,H,A,be,Z,a,c,xe,pe,ae,W,q,p,se]);return(0,ie.useEffect)(()=>{if(!p)return;let f=new AbortController;return C(null),(async()=>{try{let _=await Hr(z,f.signal);T.current=_.token,U(_)}catch(_){if(f.signal.aborted)return;C(_ instanceof Error?_:new Error(String(_)))}})(),()=>f.abort()},[p,z]),(0,Ne.jsx)(Ze,{fallback:k,children:B?ho(m,B):re?(0,Ne.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ne.jsx)(Qe.Provider,{value:ne,children:de?(0,Ne.jsx)(ht,{getAccessToken:de,children:S}):S})})}var me=require("react"),jr=require("@urun-sh/core");function vo(e,t){return`${e}:${JSON.stringify(t??{})}`}function yo(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Be=new Map;var cr=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},lr=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()}},dr=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new cr(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new lr(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 Kr(){let e=(0,me.useContext)(Qe);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,me.useReducer)(i=>i+1,0),r=(0,me.useRef)(new Map),o=(0,me.useRef)(new Map),n=(0,me.useRef)(null),s=(0,me.useMemo)(()=>(0,jr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return(0,me.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Be.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Be.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=Be.get(u);!l||l.refCount!==0||(Be.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,me.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=vo(u,l),R=r.current.get(v);if(R&&!R.disposed)return R;let k=yo(e,u,l),m=Be.get(k);return m?.handle.disposed&&(m.disposeTimer&&clearTimeout(m.disposeTimer),Be.delete(k),o.current.get(k)===m&&o.current.delete(k),m=void 0),m?m.disposeTimer&&(clearTimeout(m.disposeTimer),m.disposeTimer=null):(m={handle:new dr(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Be.set(k,m)),o.current.get(k)!==m&&(o.current.set(k,m),m.handle.addNotifier(t),m.refCount+=1),r.current.set(v,m.handle),m.handle};return i.set(u,g),g}})},[e,s])}var te=require("react");function tt(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 ko(e){return e instanceof Error?e:new Error(String(e))}function $r(e,t){let r=(0,te.useMemo)(()=>tt(e),[e]),[o,n]=(0,te.useState)(void 0),[s,i]=(0,te.useState)(null),[a,u]=(0,te.useState)(!1),c=(0,te.useRef)(t);c.current=t;let g=(0,te.useRef)(0),l=(0,te.useRef)(null),v=(0,te.useRef)(!0);(0,te.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let R=(0,te.useCallback)(async S=>{l.current?.abort();let p=new AbortController;l.current=p;let b=++g.current,y=()=>v.current&&g.current===b;y()&&(u(!0),i(null));try{let U=await r.request(S,{...c.current,signal:p.signal});return y()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let h=ko(U);throw y()&&(i(h),u(!1),c.current?.onError?.(h)),h}},[r]),k=(0,te.useCallback)(S=>{R(S).catch(()=>{})},[R]),m=(0,te.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:k,mutateAsync:R,data:o,error:s,isPending:a,reset:m}}var oe=require("react");function Xr(e){return e instanceof Error?e:new Error(String(e))}var bo=e=>typeof e=="string"?e:String(e);function Jr(e,t){let r=(0,oe.useMemo)(()=>tt(e),[e]),[o,n]=(0,oe.useState)(""),[s,i]=(0,oe.useState)(!1),[a,u]=(0,oe.useState)(null),c=(0,oe.useRef)(t);c.current=t;let g=(0,oe.useRef)(0),l=(0,oe.useRef)(null),v=(0,oe.useRef)(!0);(0,oe.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let R=(0,oe.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),k=(0,oe.useCallback)(async m=>{l.current?.cancel();let S=++g.current,p=()=>v.current&&g.current===S,b=c.current,y=b?.parseChunk??bo,U=b?.buildPayload??(P=>({prompt:P}));p()&&(n(""),u(null),i(!0));let{parseChunk:h,buildPayload:C,onFinish:T,onError:w,...I}=b??{},d="",E;try{E=r.requestStream(U(m),I),l.current=E}catch(P){let L=Xr(P);p()&&(u(L),i(!1),b?.onError?.(L));return}try{for await(let P of E){if(g.current!==S)break;d+=y(P),p()&&n(d)}p()&&(i(!1),b?.onFinish?.(d))}catch(P){let L=Xr(P);p()&&(u(L),i(!1),b?.onError?.(L))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:k,stop:R,isStreaming:s,error:a}}var Y=require("react");function zr(e){return e instanceof Error?e:new Error(String(e))}var Po=e=>typeof e=="string"?e:String(e),Gr=0;function pr(e){return Gr+=1,`${e}-${Gr}`}function Yr(e,t){let r=(0,Y.useMemo)(()=>tt(e),[e]),[o,n]=(0,Y.useState)(()=>(t?.initialMessages??[]).map(y=>({id:y.id??pr("msg"),role:y.role,content:y.content}))),[s,i]=(0,Y.useState)(""),[a,u]=(0,Y.useState)(!1),[c,g]=(0,Y.useState)(null),l=(0,Y.useRef)(t);l.current=t;let v=(0,Y.useRef)(o);v.current=o;let R=(0,Y.useRef)(s);R.current=s;let k=(0,Y.useRef)(0),m=(0,Y.useRef)(null),S=(0,Y.useRef)(!0);(0,Y.useEffect)(()=>(S.current=!0,()=>{S.current=!1,m.current?.cancel(),m.current=null}),[]);let p=(0,Y.useCallback)(()=>{k.current++,m.current?.cancel(),m.current=null,S.current&&u(!1)},[]),b=(0,Y.useCallback)(async y=>{let U=y===void 0,h=(U?R.current:y)??"";if(!h.trim())return;m.current?.cancel();let T=++k.current,w=()=>S.current&&k.current===T,I=l.current,d=I?.parseChunk??Po,E={id:pr("msg"),role:"user",content:h},P={id:pr("msg"),role:"assistant",content:""},L=[...v.current,E].map(B=>({role:B.role,content:B.content})),q=[...v.current,E,P];v.current=q,n(q),U&&i(""),g(null),u(!0);let W=I?.buildPayload??(B=>({messages:B})),{initialMessages:V,parseChunk:A,buildPayload:H,onFinish:J,onError:Z,...j}=I??{},re=B=>{n(z=>z.map(be=>be.id===P.id?{...be,content:B}:be))},ce="",Q;try{Q=r.requestStream(W(L),j),m.current=Q}catch(B){let z=zr(B);w()&&(g(z),u(!1),I?.onError?.(z));return}try{for await(let B of Q){if(k.current!==T)break;ce+=d(B),w()&&re(ce)}w()&&(u(!1),I?.onFinish?.({...P,content:ce}))}catch(B){let z=zr(B);w()&&(g(z),u(!1),I?.onError?.(z))}finally{m.current===Q&&(m.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:b,stop:p,isStreaming:a,error:c}}var G=require("react"),rt=require("@urun-sh/core"),mr=[];function Zr(e,t={}){let{field:r=rt.INPUT_PRESENCE_FIELD,hz:o=rt.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,G.useMemo)(()=>s?(0,rt.createInputPresencePublisher)({awareness:{setLocalStateField:(h,C)=>s.setField(h,C)},field:r,hz:o}):null,[s,r,o]),a=(0,G.useRef)(null);a.current=i;let[u,c]=(0,G.useState)(!1),[g,l]=(0,G.useState)(mr),v=(0,G.useRef)(!1);(0,G.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let R=(0,G.useCallback)(()=>{let h=a.current;l(h?h.heldKeys():mr)},[]),k=(0,G.useCallback)(()=>{a.current?.clear(),l(mr)},[]);(0,G.useEffect)(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,C=()=>{if(h()){v.current=!1,c(!0);return}v.current||(c(!1),k())},T=P=>{h()&&(a.current?.keyDown(P.key),R())},w=P=>{a.current?.keyUp(P.key),R()},I=P=>{h()&&a.current?.movePointer(P.movementX,P.movementY)},d=P=>{h()&&a.current?.setButtons(P.buttons)},E=()=>{k()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",T),n.addEventListener("keyup",w),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",T),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,k,R]);let m=(0,G.useCallback)(h=>{h.requestPointerLock?.()},[]),S=(0,G.useCallback)(()=>{v.current=!0,c(!0)},[]),p=(0,G.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),k()},[n,k]),b=(0,G.useCallback)(h=>{a.current?.keyDown(h),R()},[R]),y=(0,G.useCallback)(h=>{a.current?.keyUp(h),R()},[R]),U=(0,G.useCallback)((h,C)=>{a.current?.movePointer(h,C)},[]);return{engage:m,engageTouch:S,release:p,engaged:u,heldKeys:g,pressKey:b,releaseKey:y,movePointer:U}}var ue=require("react"),un=require("@urun-sh/core");var O=require("react"),an=require("@urun-sh/core");var Ot=null;function Ro(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function vt(){if(Ot)return Ot;let e=Ro();return e?(Ot=new e,Ot):null}function je(){let e=vt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var yt=require("react"),tn=require("react/jsx-runtime"),fr=(0,yt.createContext)(null);function Qr({session:e,children:t}){return(0,tn.jsx)(fr.Provider,{value:e,children:t})}function Te(){return(0,yt.useContext)(fr)}function en(){let e=(0,yt.useContext)(fr);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 kt=require("react/jsx-runtime");function Co(e,t){return e-t>>>0<2147483648}var rn=1e3;function nn(...e){console.debug("[video]",...e)}function on(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function sn(e,t,r){return r?[r,t]:[e,t]}var Ke=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:R,poster:k,children:m,onTrack:S,onFirstFrame:p,frameMarker:b,onFrameMarkerReached:y,onFrameMarkerUnsupported:U,onUnlockChange:h}=t,C=Te(),T=o??C,w=(0,O.useRef)(null),I=(0,O.useRef)(null),[d,E]=(0,O.useState)(!1),[P,L]=(0,O.useState)(!1),q=(0,O.useRef)(!1),W=(0,O.useRef)(null),V=(0,O.useRef)(S);V.current=S;let A=(0,O.useRef)(h);A.current=h;let H=(0,O.useRef)(p);H.current=p;let J=(0,O.useRef)(y);J.current=y;let Z=(0,O.useRef)(U);Z.current=U;let j=(0,O.useRef)(b??null);j.current=b??null;let re=(0,O.useCallback)(f=>{W.current!==f&&(W.current=f,A.current?.(f))},[]),ce=(0,O.useRef)(null),Q=(0,O.useRef)(null),B=(0,O.useCallback)((f,_=!1)=>{if(!_&&f===ce.current||(ce.current=f,Q.current?.(),Q.current=null,q.current=!1,L(!1),!f))return;let x=w.current;if(!x)return;let K=j.current,ge=K?.rtpTimestamp??null,we=!1,N=()=>{we||(we=!0,Z.current?.())};K&&ge==null&&N();let Ue=K!=null&&ge!=null,Ge=Me=>{Q.current?.(),Q.current=null,q.current=!0,L(!0),H.current?.(),Me&&J.current?.()};if(typeof x.requestVideoFrameCallback=="function"){let Me=!1,D=0,F=(Se,he)=>{if(!Me){if(Ue){let Pe=he?.rtpTimestamp;if(typeof Pe!="number"){N(),Ge(!1);return}if(!Co(Pe,ge)){D=x.requestVideoFrameCallback(F);return}Ge(!0);return}Ge(!1)}};D=x.requestVideoFrameCallback(F),Q.current=()=>{Me=!0,x.cancelVideoFrameCallback?.(D)};return}Ue&&N();let Ae=()=>{let Me=x.getVideoPlaybackQuality?.();(Me?Me.totalVideoFrames>0:x.readyState>=2&&x.videoWidth>0)&&Ge(!1)};x.addEventListener("loadeddata",Ae),x.addEventListener("timeupdate",Ae),x.addEventListener("playing",Ae),Q.current=()=>{x.removeEventListener("loadeddata",Ae),x.removeEventListener("timeupdate",Ae),x.removeEventListener("playing",Ae)},Ae()},[]);(0,O.useEffect)(()=>()=>{Q.current?.(),Q.current=null},[]);let z=b==null?null:`${b.rtpTimestamp??""}|${b.ptsMs??""}`,be=(0,O.useRef)(z);(0,O.useEffect)(()=>{if(be.current===z||(be.current=z,z==null))return;let f=ce.current;f&&B(f,!0)},[z,B]);let se=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;I.current||(I.current=new MediaStream);let f=w.current;return f&&f.srcObject!==I.current&&(f.srcObject=I.current),I.current},[]),le=(0,O.useCallback)(f=>{let _=w.current;if(!_)return;let x=_.play();!x||typeof x.then!="function"||x.then(()=>{_.muted||re(!0)}).catch(K=>{if((K instanceof Error?K.name:String(K))==="NotAllowedError"&&!_.muted){nn(`play() blocked pending a user gesture (${f})`),re(!1);return}nn(`play() failed (${f})`,K)})},[re]),De=(0,O.useCallback)(()=>{let f=w.current;f&&(se(),!f.muted&&(le("gesture"),je(),re(!0)))},[se,le,re]),de=(0,O.useCallback)(f=>{let _=se();if(_){for(let x of _.getVideoTracks())x!==f&&_.removeTrack(x);if(f&&!_.getVideoTracks().includes(f)){_.addTrack(f);let x=w.current;x&&(x.srcObject=_)}f&&le("track-attach"),E(f!==null),B(f),V.current?.(f)}},[se,le,B]),xe=(0,O.useCallback)(f=>{let _=se();if(_){for(let x of _.getAudioTracks())x!==f&&_.removeTrack(x);f&&!_.getAudioTracks().includes(f)&&_.addTrack(f),f&&le("audio-attach")}},[se,le]),pe=(0,O.useCallback)(f=>{w.current=f,f&&(a?(f.muted=!0,f.defaultMuted=!0,f.setAttribute("muted",""),W.current=null):(f.muted=!1,f.defaultMuted=!1,f.removeAttribute("muted")),f.setAttribute("playsinline",""),f.setAttribute("webkit-playsinline",""),se())},[se,a]);(0,O.useImperativeHandle)(r,()=>({get element(){return w.current},get live(){return I.current?I.current.getVideoTracks().length>0:!1},get framed(){return q.current},unlock:De,get unlocked(){return W.current===!0}}),[De]);let ae=(0,an.derivedLegRole)(n)!==void 0;(0,O.useEffect)(()=>{ae&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ae,n]);let ne=i!==void 0;return(0,O.useEffect)(()=>{if(ne){de(i??null);return}if(ae){de(null);return}if(!T)return;let f=on(T,sn(n,"video")),_=()=>{let N=I.current;return N?N.getVideoTracks()[0]??null:null},x=N=>{if(N!==_()&&(de(N),N)){let Ue=()=>{_()===N&&de(null)};N.addEventListener("ended",Ue)}},K=f.track;K&&K.readyState==="live"&&x(K);let ge=f.on("track",N=>{N&&N.readyState!=="live"||x(N)}),we=setInterval(()=>{let N=f.track;N&&N.readyState==="live"&&x(N)},rn);return()=>{ge(),clearInterval(we)}},[T,n,ae,ne,i,de]),(0,O.useEffect)(()=>{if(ne||!T||s===!1||ae)return;let f=on(T,sn(n,"audio",s)),_=()=>{let N=I.current;return N?N.getAudioTracks()[0]??null:null},x=N=>{if(N!==_()&&(xe(N),N)){let Ue=()=>{_()===N&&xe(null)};N.addEventListener("ended",Ue)}},K=f.track;K&&K.readyState==="live"&&x(K);let ge=f.on("track",N=>{N&&N.readyState!=="live"||x(N)}),we=setInterval(()=>{let N=f.track;N&&N.readyState==="live"&&x(N)},rn);return()=>{ge(),clearInterval(we)}},[T,n,ae,s,ne,xe]),(0,kt.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":d?"true":"false","data-urun-video-framed":P?"true":"false",children:[(0,kt.jsx)("video",{ref:pe,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),d?null:R,k===void 0?null:(0,kt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":P||void 0,style:{position:"absolute",inset:0,...P?{opacity:0,pointerEvents:"none"}:null},children:k}),m]})});var bt=require("react/jsx-runtime"),Eo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},cn=(0,ue.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ue.useRef)(null),R=(0,ue.useRef)(null),k=(0,ue.useRef)(0),m=(0,ue.useRef)(g);m.current=g;let S=(0,ue.useMemo)(()=>(0,un.createCameraWarp)(m.current),[]);return(0,ue.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return R.current},warp:S,get lastDrawTs(){return k.current}}),[S]),(0,ue.useEffect)(()=>{if(!i)return;let p=0,b=0,y=null,U=C=>{typeof C.requestVideoFrameCallback=="function"&&(y=C,b=C.requestVideoFrameCallback(function T(){S.frameArrived(),b=C.requestVideoFrameCallback(T)}))},h=C=>{p=requestAnimationFrame(h);let T=R.current,w=v.current?.element??null;if(!T||!w||(w!==y&&(y&&b&&y.cancelVideoFrameCallback?.(b),U(w)),w.readyState<2))return;S.tick(C);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(T.clientWidth*I)),E=Math.max(1,Math.round(T.clientHeight*I));(T.width!==d||T.height!==E)&&(T.width=d,T.height=E);let P=T.getContext("2d");if(!P)return;let L=S.transform(),q=w.videoWidth||d,W=w.videoHeight||E,A=Math.max(d/q,E/W)*(1+a)*L.scale;P.setTransform(A,0,0,A,d/2+L.translateX*d,E/2+L.translateY*E),P.drawImage(w,-q/2,-W/2),k.current=C};return p=requestAnimationFrame(h),()=>{cancelAnimationFrame(p),y&&b&&y.cancelVideoFrameCallback?.(b)}},[i,a,S]),(0,ue.useEffect)(()=>{if(!i||!u||!l)return;let p=()=>!!l.pointerLockElement,b=T=>{p()&&S.keyDown(T.key)},y=T=>S.keyUp(T.key),U=T=>{p()&&S.pointerDelta(T.movementX,T.movementY)},h=()=>{p()||S.clearKeys()},C=()=>S.clearKeys();return l.addEventListener("keydown",b),l.addEventListener("keyup",y),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",h),l.defaultView?.addEventListener("blur",C),()=>{l.removeEventListener("keydown",b),l.removeEventListener("keyup",y),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",h),l.defaultView?.removeEventListener("blur",C)}},[i,u,l,S]),i?(0,bt.jsxs)(Ke,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,bt.jsx)("canvas",{ref:R,style:Eo,"data-urun-warp":""}),n]}):(0,bt.jsx)(Ke,{ref:v,...s,children:n})});var ln=new Map;function dn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);ln.set(e,{component:t,schema:r})}function pn(e,t){let r=ln.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 $e=require("react/jsx-runtime");function mn({name:e,props:t,fallback:r}){let o=pn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,$e.jsx)($e.Fragment,{children:r}):(0,$e.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,$e.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,$e.jsx)(n,{...o.validatedProps})}var nt=require("zod"),Xe=require("react/jsx-runtime"),fn=nt.z.object({step:nt.z.number().min(0),total:nt.z.number().min(1),label:nt.z.string().optional(),variant:nt.z.enum(["default","success","error"]).default("default")});function gr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function gn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=gr(e);return(0,Xe.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Xe.jsx)("div",{className:"urun-progress-label",children:o}),(0,Xe.jsx)("div",{className:"urun-progress-bar",children:(0,Xe.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Xe.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Vt=require("zod"),Pt=require("react/jsx-runtime"),Sn=Vt.z.object({state:Vt.z.enum(["thinking","generating","idle","error"]),message:Vt.z.string().optional()}),To={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Sr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??To[t]??t;return{state:t,message:n,isActive:o}}function hn(e){let{state:t,message:r,isActive:o}=Sr(e);return(0,Pt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,Pt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Pt.jsx)("span",{className:"urun-status-message",children:r})]})}var Rt=require("react"),Dt=require("zod"),Ct=require("react/jsx-runtime"),vn=Dt.z.object({text:Dt.z.string(),streaming:Dt.z.boolean().default(!1)});function hr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function yn(e){let{text:t,streaming:r}=hr(e),o=(0,Rt.useRef)(null),n=(0,Rt.useRef)(0);return(0,Rt.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Ct.jsxs)("div",{className:"urun-text-stream",children:[(0,Ct.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Ct.jsx)("span",{className:"urun-text-cursor"})]})}var Et=require("zod"),Tt=require("react/jsx-runtime"),kn=Et.z.object({src:Et.z.string().url(),alt:Et.z.string().optional(),caption:Et.z.string().optional()});function vr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function bn(e){let{src:t,alt:r,caption:o}=vr(e);return(0,Tt.jsxs)("figure",{className:"urun-image-frame",children:[(0,Tt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Tt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ie=require("zod"),ot=require("react/jsx-runtime"),Pn=Ie.z.object({metrics:Ie.z.array(Ie.z.object({label:Ie.z.string(),value:Ie.z.union([Ie.z.string(),Ie.z.number()]),unit:Ie.z.string().optional()}))});function yr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Rn(e){let{metrics:t}=yr(e);return(0,ot.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,ot.jsxs)("div",{className:"urun-metric-card",children:[(0,ot.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ot.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var Cn=require("react");var Tn=require("react/jsx-runtime"),En=(0,Cn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Tn.jsx)(Ke,{ref:r,stream:o,...n})});var X=require("react"),wn=require("@urun-sh/core");var An=require("react/jsx-runtime"),xo=1e3,xn=200;function kr(...e){console.debug("[audio]",...e)}var xt=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=Te(),v=o??l,R=(0,X.useRef)(null),k=(0,X.useRef)(null),m=(0,X.useRef)(null),S=(0,X.useRef)(null),p=(0,X.useRef)(u);p.current=u;let b=(0,X.useRef)(c);b.current=c;let y=(0,X.useCallback)(d=>{m.current!==d&&(m.current=d,b.current?.(d))},[]),U=(0,X.useCallback)(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let d=R.current;return d&&d.srcObject!==k.current&&(d.srcObject=k.current),k.current},[]),h=(0,X.useCallback)(d=>{let E=R.current;if(!E)return;let P=E.play();!P||typeof P.then!="function"||P.then(()=>{E.muted||y(!0)}).catch(L=>{let q=L instanceof Error?L.name:String(L);if(q==="AbortError"){kr(`play() aborted (${d}); retrying in ${xn}ms`),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=null,h(`${d}:retry`)},xn);return}if(q==="NotAllowedError"){kr(`play() blocked pending a user gesture (${d})`),y(!1);return}kr(`play() failed (${d})`,L)})},[y]),C=(0,X.useCallback)(d=>{let E=U();if(E){for(let P of E.getAudioTracks())P!==d&&E.removeTrack(P);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&h("track-attach"),p.current?.(d)}},[U,h]),T=(0,X.useCallback)(()=>{let d=R.current;d&&(U(),d.muted=!1,h("gesture"),je(),y(!0))},[U,h,y]);(0,X.useImperativeHandle)(r,()=>({unlock:T,get unlocked(){return m.current===!0},get element(){return R.current}}),[T]);let w=(0,X.useCallback)(d=>{R.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),g?.(d)},[U,g]),I=s!==void 0;return(0,X.useEffect)(()=>{if(I){C(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let V=k.current;return V?V.getAudioTracks()[0]??null:null},P=V=>{if(V!==E()&&(C(V),V)){let A=()=>{E()===V&&C(null)};V.addEventListener("ended",A)}},L=d.track;L&&L.readyState==="live"&&P(L);let q=d.on("track",V=>{V&&V.readyState!=="live"||P(V)}),W=setInterval(()=>{let V=d.track;V&&V.readyState==="live"&&P(V)},xo);return()=>{q(),clearInterval(W)}},[v,n,I,s,C]),(0,X.useEffect)(()=>(0,wn.observePageLifecycle)(()=>{je(),m.current===!0&&h("foreground")}),[h]),(0,X.useEffect)(()=>()=>{S.current&&clearTimeout(S.current)},[]),(0,An.jsx)("audio",{ref:w,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Un=xt;var $=require("react"),st=require("@urun-sh/core");var _n=require("react/jsx-runtime"),br={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ft(...e){console.debug("[voice]",...e)}var wt=(0,$.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=br,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:R,onUnlockChange:k,capture:m}=t,S=Te(),p=o??S,b=(0,$.useRef)(null),y=(0,$.useRef)(null),U=(0,$.useRef)(null),h=(0,$.useRef)([]),C=(0,$.useRef)(!1),T=(0,$.useRef)(g);T.current=g;let w=(0,$.useRef)(l);w.current=l;let I=(0,$.useRef)(v);I.current=v;let d=(0,$.useCallback)(A=>{C.current!==A&&(C.current=A,T.current?.(A))},[]),E=(0,$.useCallback)(()=>{for(let A of h.current)A();h.current=[],U.current?.release(),U.current=null,y.current&&(y.current=null,I.current?.(null))},[]),P=(0,$.useCallback)(async()=>{let A=U.current;if(A){let j=await A.update(i);return y.current=A.stream,I.current?.(A.stream),j}let J=await(m??(0,st.sharedCaptureController)()).claim("audio",i);U.current=J,h.current=[J.onTrack((j,re)=>{y.current=re,I.current?.(re),C.current&&p?.stream(n).attach(j).catch(ce=>Ft("mic re-attach after one-capture re-acquire failed",ce))}),J.onLost(j=>{U.current=null,h.current=[],y.current=null,I.current?.(null),d(!1),w.current?.(j)})],y.current=J.stream,I.current?.(J.stream);let Z=J.track;if(!Z)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return Z},[m,i,p,n,d]),L=(0,$.useCallback)(async()=>{E(),d(!1),await p?.stream(n).detach().catch(()=>{})},[p,n,E,d]),q=(0,$.useCallback)(async()=>{if(!p)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");b.current?.unlock();let A;try{A=await P()}catch(Z){E();let j=(0,st.sessionFailureFromMediaError)(Z,p.status);throw w.current?.(j),j}p.connect?.();let H;for(let Z=1;Z<=u;Z++)try{await p.whenLive(a!==void 0?{timeout:a}:void 0),await p.stream(n).attach(A),d(!0);return}catch(j){H=j,Ft(`start attempt ${Z}/${u} failed`,j),Z<u&&await new Promise(re=>setTimeout(re,c))}E(),d(!1);let J=H instanceof Error?H:new Error(String(H??"voice start failed"));throw w.current?.(J),J},[p,n,a,u,c,P,E,d]);(0,$.useImperativeHandle)(r,()=>({start:q,stop:L,unlock:()=>b.current?.unlock(),get active(){return C.current},get micStream(){return y.current},get audio(){return b.current}}),[q,L]);let W=(0,$.useRef)(!1),V=(0,$.useCallback)(async()=>{if(!p||!C.current||W.current)return;let A=y.current?.getAudioTracks()[0]??null;if(A&&A.readyState==="live"){try{await p.stream(n).attach(A)}catch(H){Ft("foreground mic re-assert failed (will retry on next pass)",H)}return}W.current=!0;try{let H=await P();await p.stream(n).attach(H)}catch(H){let J=H instanceof Error?H:new Error(String(H));Ft("foreground mic re-acquire failed",J),w.current?.(J)}finally{W.current=!1}},[p,n,P]);return(0,$.useEffect)(()=>{let A=()=>{V()};return p&&typeof p.onRecovery=="function"?p.onRecovery(A):(0,st.observePageLifecycle)(A)},[p,V]),(0,$.useEffect)(()=>E,[E]),s?(0,_n.jsx)(xt,{ref:b,session:p,stream:n,onTrack:R,onUnlockChange:k}):null}),Mn=wt;var Ce=require("react");var qt=require("react");var Pr={level:0,speaking:!1};function Ht(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,qt.useState)(Pr);return(0,qt.useEffect)(()=>{if(!e){i(Pr);return}let a=vt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),R=setInterval(()=>{g.getByteTimeDomainData(l);let k=0;for(let S=0;S<l.length;S++){let p=(l[S]-128)/128;k+=p*p}let m=Math.sqrt(k/l.length);i(S=>{let p=m>n;return Math.abs(S.level-m)<.005&&S.speaking===p?S:{level:m,speaking:p}})},o);return()=>{clearInterval(R),c.disconnect(),i(Pr)}},[e,r,o,n]),s}var Le=require("react/jsx-runtime"),wo={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"},Nn=(0,Ce.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,R=Te(),k=o??R,m=(0,Ce.useRef)(null),[S,p]=(0,Ce.useState)(null),b=(0,Ce.useRef)(l);b.current=l;let{level:y,speaking:U}=Ht(a?S:null);return(0,Ce.useImperativeHandle)(r,()=>({start:()=>{let h=m.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>m.current?.stop()??Promise.resolve(),get active(){return m.current?.active??!1},get micStream(){return m.current?.micStream??null}}),[]),(0,Ce.useEffect)(()=>{!i||!k||m.current?.start().catch(()=>{})},[i,k]),(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)(wt,{ref:m,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:h=>{p(h),b.current?.(h)}}),a?(0,Le.jsx)("span",{className:u,style:wo,"data-urun-mic":"","data-urun-mic-active":S?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(y*100)/100,children:(0,Le.jsx)("span",{style:Uo,children:(0,Le.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(y*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var it=require("@urun-sh/core"),M=require("react");var ve=require("react/jsx-runtime"),Cr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Rr(...e){console.debug("[camera]",...e)}function Ao(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Mo(){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 Er=(0,M.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:R,videoClassName:k,onActiveChange:m,onError:S,onStream:p,onTrack:b,children:y,capture:U,flipControl:h="auto",flipControlClassName:C,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",I=Te(),d=o??I,E=(0,M.useRef)(null),P=(0,M.useRef)(null),L=(0,M.useRef)(null),q=(0,M.useRef)([]),W=(0,M.useRef)(null),V=(0,M.useRef)(!1),A=(0,M.useRef)(!1),H=(0,M.useRef)(w),[J,Z]=(0,M.useState)(w),[j,re]=(0,M.useState)(!1),[ce,Q]=(0,M.useState)(null),[B,z]=(0,M.useState)(!1),[be]=(0,M.useState)(Ao),se=(0,M.useRef)(m);se.current=m;let le=(0,M.useRef)(S);le.current=S;let De=(0,M.useRef)(p);De.current=p;let de=(0,M.useRef)(b);de.current=b;let xe=(0,M.useRef)(T);xe.current=T;let pe=(0,M.useCallback)(D=>{V.current!==D&&(V.current=D,re(D),se.current?.(D))},[]);(0,M.useEffect)(()=>{if(!j){Q(null);return}let D=!1,F=()=>{Mo().then(he=>{D||(Q(he),he&&xe.current?.(he))})};F();let Se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Se?.addEventListener=="function"?(Se.addEventListener("devicechange",F),()=>{D=!0,Se.removeEventListener?.("devicechange",F)}):()=>{D=!0}},[j]);let ae=(0,M.useCallback)(D=>{let F=E.current;F&&(F.muted=!0,F.defaultMuted=!0,F.setAttribute("muted",""),F.setAttribute("playsinline",""),F.setAttribute("webkit-playsinline",""),F.srcObject=D,D&&F.play()?.catch?.(Se=>Rr("preview play() failed",Se)))},[]),ne=(0,M.useCallback)(()=>{A.current=!1,W.current?.(),W.current=null;for(let D of q.current)D();q.current=[],L.current?.release(),L.current=null,P.current&&(P.current=null,De.current?.(null),de.current?.(null)),ae(null)},[ae]),f=(0,M.useCallback)((D,F)=>{W.current?.(),P.current=F,ae(F),De.current?.(F);let Se=()=>{P.current===F&&(Rr("camera track ended (device removed or permission revoked)"),ne(),pe(!1))};D.addEventListener("ended",Se),W.current=()=>D.removeEventListener("ended",Se)},[ae,ne,pe]),_=(0,M.useCallback)(async D=>{let F=n!==!1;if(F&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let Se={...Cr,...s,facingMode:D},he;try{let Pe=L.current;if(Pe)he=await Pe.update(Se);else{let mt=await(U??(0,it.sharedCaptureController)()).claim("video",Se);if(L.current=mt,q.current=[mt.onTrack((ft,no)=>{f(ft,no),V.current&&(!F||!d||d.stream(n).attachVideo(ft).then(()=>de.current?.(ft)).catch(oo=>Rr("camera re-publish after one-capture re-acquire failed",oo)))}),mt.onLost(ft=>{L.current=null,q.current=[],ne(),pe(!1),le.current?.(ft)})],!mt.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});he=mt.track}}catch(Pe){let Ye=(0,it.sessionFailureFromMediaError)(Pe,d?.status);throw le.current?.(Ye),Ye}H.current=D,Z(D),f(he,L.current?.stream??new MediaStream([he]));try{F&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(he)),A.current=F?n:!1}catch(Pe){ne(),pe(!1);let Ye=Pe instanceof Error?Pe:new Error(String(Pe));throw le.current?.(Ye),Ye}de.current?.(he),pe(!0)},[d,n,s,l,U,f,ne,pe]),x=(0,M.useCallback)(D=>_(D?.facingMode??H.current),[_]),K=(0,M.useCallback)(async D=>{let F=A.current===n;V.current&&H.current===D&&F||await _(D)},[_,n]),ge=(0,M.useCallback)(()=>_(H.current==="environment"?"user":"environment"),[_]),we=(0,M.useCallback)(async()=>{ne(),pe(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,ne,pe]),N=(0,M.useCallback)(async D=>{let F=E.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,it.captureStillFromVideo)(F,D)},[]);(0,M.useImperativeHandle)(r,()=>({start:x,stop:we,flip:ge,setFacingMode:K,capturePhoto:N,get active(){return V.current},get facingMode(){return H.current},get stream(){return P.current},get element(){return E.current}}),[x,we,ge,K,N]);let Ue=(0,M.useRef)(K);if(Ue.current=K,(0,M.useEffect)(()=>{c&&(n!==!1&&!d||Ue.current(w).catch(()=>{}))},[c,d,w,n]),(0,M.useEffect)(()=>ne,[ne]),!v)return null;let Ge=g==="auto"?J==="user":g,Ae=j&&(h===!0||h==="auto"&&be&&(ce?.length??0)>1),Me=()=>{B||(z(!0),ge().catch(()=>{}).finally(()=>z(!1)))};return(0,ve.jsxs)("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":J,children:[(0,ve.jsx)("video",{ref:E,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ge?{transform:"scaleX(-1)"}:{}}}),Ae?(0,ve.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Me,disabled:B,className:C,style:C?{opacity:B?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:B?.6:1},children:(0,ve.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,ve.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ve.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ve.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ve.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ve.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,y]})}),In=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,ve.jsx)(Er,{ref:o,...r,visible:t,autoStart:!1})});var at=require("@urun-sh/core"),ee=require("react");function Ln(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,ee.useState)(null),[a,u]=(0,ee.useState)(null),[c,g]=(0,ee.useState)(!1),[l,v]=(0,ee.useState)(null),[R]=(0,ee.useState)(at.cameraCaptureAvailable),k=(0,ee.useRef)(n);k.current=n;let m=(0,ee.useRef)(null),S=(0,ee.useRef)(0),p=(0,ee.useCallback)(C=>{m.current&&URL.revokeObjectURL(m.current),m.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,u(m.current),i(C),k.current?.(C)},[]);(0,ee.useEffect)(()=>()=>{S.current++,m.current&&URL.revokeObjectURL(m.current),m.current=null},[]);let b=(0,ee.useCallback)(async C=>{let T=++S.current;g(!0),v(null);try{let w=await C();if(S.current!==T)return;p(w)}catch(w){if(S.current!==T)return;v((0,at.referenceImageErrorMessage)(w))}finally{S.current===T&&g(!1)}},[p]),y=(0,ee.useCallback)(C=>b(()=>(0,at.normalizeReferenceImage)(C,{maxSize:t,type:r,quality:o,source:"file"})),[b,t,r,o]),U=(0,ee.useCallback)(C=>b(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[b,t,r,o]),h=(0,ee.useCallback)(()=>{S.current++,v(null),g(!1),p(null)},[p]);return{reference:s,previewUrl:a,pick:y,capture:U,clear:h,busy:c,error:l,cameraAvailable:R}}var Wt=require("react");function On(e,t){let[r,o]=(0,Wt.useState)(null);return(0,Wt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Fn=require("react");var jt=require("react");var Vn=require("zustand/vanilla"),Dn=require("zustand"),_o=()=>{};function Bt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Vn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):_o,u=(c=>(0,Dn.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function ut(e,t){let r=(0,jt.useMemo)(()=>Bt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,jt.useEffect)(()=>r.bind(),[r]),r}function qn(e,t,r){let n=ut(e,t)(r??(a=>a)),s=(0,Fn.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var $t=require("react");var Fe=200;function Oe(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ct(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Kt(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 Xt(e,t,r={}){let o=r.cap??200,[n,s]=(0,$t.useState)([]);return(0,$t.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Oe(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Ee=require("react/jsx-runtime");function Hn({session:e,name:t,cap:r,className:o}){let n=Xt(e,t,{cap:r});return(0,Ee.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Ee.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Ee.jsx)("code",{children:t}),(0,Ee.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Ee.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Ee.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Ee.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Ee.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Ee.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ct(s.payload)]},`${s.at}-${i}`))})]})}var Ut=require("react");var fe=require("react/jsx-runtime");function At({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Ut.useState)(""),[i,a]=(0,Ut.useState)(null),u=(0,Ut.useCallback)(()=>{let c=Kt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,fe.jsxs)("div",{className:"urun-doc-patch",children:[(0,fe.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,fe.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,fe.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,fe.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Wn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=ut(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,fe.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,fe.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,fe.jsx)("code",{children:t}),(0,fe.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,fe.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,fe.jsx)(At,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Jt=require("react");var Ve=require("react/jsx-runtime");function Bn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function jn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Jt.useState)([]);return(0,Jt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Oe(u,{at:Date.now(),direction:"in",text:Bn(ct(a))},r))}):void 0),[e,t,r]),(0,Ve.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ve.jsx)(At,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Oe(u,{at:Date.now(),direction:"out",text:Bn(a)},r))}}),(0,Ve.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ve.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ve.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ve.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ve.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var zt=require("react");var Je=require("react/jsx-runtime");function Kn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,zt.useState)([]),a=t.join(","),u=r.join(",");return(0,zt.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(R=>Oe(R,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",R=>c("track",`${l}: ${R?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Je.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Je.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>(0,Je.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Je.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Je.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var rr=require("@urun-sh/core");var Gt=require("react");function ye(e){let[t,r]=(0,Gt.useState)(e?.phase??null);return(0,Gt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Xn=require("@urun-sh/core");var lt=require("react"),$n=require("@urun-sh/core");function Yt(e){let t=ye(e),r=(0,$n.isWakingPhase)(t?.name),o=(0,lt.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,lt.useState)(s);return(0,lt.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var qe=require("react/jsx-runtime");function Zt({session:e,render:t,className:r}){let o=Yt(e);return!o.waking||!o.phase?null:(0,qe.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,qe.jsxs)(qe.Fragment,{children:[(0,qe.jsx)("span",{className:"urun-session-waking-label",children:(0,Xn.describeSessionPhase)(o.phase)})," ",(0,qe.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var er=require("react");var He=require("react"),No={event:null,elapsedMs:0};function Qt(e,t){let[r,o]=(0,He.useState)(null),n=(0,He.useRef)(0);(0,He.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,He.useState)(0);return(0,He.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:No}var dt=require("react/jsx-runtime"),Io={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,er.useState)(!1);return(0,er.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 tr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Qt(e,t),i=Lo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,dt.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,dt.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,dt.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Io[u]})," ",(0,dt.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ke=require("react/jsx-runtime"),Oo={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Jn({session:e,className:t}){let r=ye(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,ke.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ke.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ke.jsx)("span",{className:"urun-session-status-label",children:Oo[o]}),n?(0,ke.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function zn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ye(e);if(s?.name==="live")return(0,ke.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ke.jsx)(tr,{session:e})]});let i=r?r(s):(0,ke.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,rr.isWakingPhase)(s.name)?(0,ke.jsx)(Zt,{session:e}):s&&s.name!=="idle"?(0,rr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ke.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ke.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var nr=require("react");var Yn=require("react/jsx-runtime");function Tr(e){return ye(e)?.endsAt??null}function Vo(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 Gn({session:e,urgentMs:t=6e4,className:r}){let n=Tr(e)?.getTime()??null,[s,i]=(0,nr.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,nr.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Vo(s);return(0,Yn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Mt=require("react/jsx-runtime"),Do=new Set(["expired","ended","error"]);function Zn({session:e,onNewSession:t,children:r,className:o}){let n=ye(e);if(!n||!Do.has(n.name))return null;let s=r?r(n):(0,Mt.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,Mt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Mt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var We=require("react"),ze=require("react/jsx-runtime");function xr(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 wr(e){let t=(0,We.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,We.useState)(()=>t?xr(t.get("idle")):null);return(0,We.useEffect)(()=>{if(!t){o(null);return}return o(xr(t.get("idle"))),t.on("change",()=>o(xr(t.get("idle"))))},[t]),r}function Fo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Qn({session:e,onStillHere:t,className:r}){let o=wr(e),n=o?.deadlineEpochS??null,[s,i]=(0,We.useState)(null);if((0,We.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,ze.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,ze.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,ze.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,ze.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Fo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,ze.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var pt=require("react"),eo=require("@urun-sh/core");function to(e){let t=(0,pt.useContext)(Qe),[r,o]=(0,pt.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return(0,pt.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,R=()=>{(0,eo.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(m=>{v||o(m)}).catch(()=>{})};R();let k=setInterval(R,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(k)}},[n,s,i,a,u,c,g,l]),r}var or=require("react");function ro(e){let[t,r]=(0,or.useState)(null);return(0,or.useEffect)(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}var sr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionStats,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 St,b as un,c as vt}from"./chunk-WF2OBDSX.mjs";import{useCallback as nr,useEffect as kn,useMemo as bn,useRef as or,useState as bt}from"react";import{Component as cn}from"react";import{jsx as Zt,jsxs as ln}from"react/jsx-runtime";var Be=class extends cn{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||ln("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Zt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Zt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as dn}from"react";var _e=dn(null);function ve(e){return e&&e.trim()?e.trim():void 0}function de(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return ve(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ve(typeof process<"u"?process.env?.[e]:void 0)}}function Qe(){let e=de("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||de("VERCEL_ENV")==="production"?"workos":de("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function pn(){return Qe()==="workos"}import{useEffect as mn,useRef as fn}from"react";var gn="urun.operator_token",er=null,Qt="op",hn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function tr(){return typeof window<"u"}function rr(){return er}function Sn(){if(!tr())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Qt);if(!r)return null;er=r,t.delete(Qt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function vn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function yt(e){let t=fn(e);t.current=e,mn(()=>{if(!tr())return;Sn();let r=o=>{if(!vn(o))return;let n=rr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as yn}from"react";function kt(e=!0){yn(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as Ne,jsxs as wn}from"react/jsx-runtime";var Rn="/api/urun-token",Cn=1e4;function En(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function sr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function ir(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function Pn(e,t){return typeof e=="function"?e(t):e!==void 0?e:wn("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:[Ne("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ne("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:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:f,confirmOnLeave:d=!1,fallback:y,errorFallback:b,children:k}){let l=n===void 0&&t===void 0;if(!l&&(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(!l&&(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 g=r??o;if(l&&(typeof g!="string"||g.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);kt(d);let[m,E]=bt(),[R,w]=bt(null),h=or(void 0),C=or(null),[T,x]=bt(null);yt(z=>x({jwt:z}));let U=vt(),p=de("NEXT_PUBLIC_SESSION_TOKEN")??de("NEXT_PUBLIC_URUN_JWT"),P=Qe(),v=T!==null,M=P==="workos"&&!n&&!v&&!l,H=n??(P==="jwt"?p:void 0)??m?.token,V=v?T.jwt:H,I=s??de("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),N=M&&!V&&!U?.getAccessToken,F=t??m?.orgId,W=e??m?.gatewayUrl,J=l&&m===void 0,B=l&&m!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,G=N?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,Y=R??B??G,j=ir("NEXT_PUBLIC_URUN_TOKEN_URL",de("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??Rn,q=ir("NEXT_PUBLIC_URUN_EVENTS_URL",de("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,$=nr(async z=>{if(!z?.forceRefresh){let X=h.current;if(!X)return X;let ee=En(X);if(ee===null||ee-Date.now()>Cn)return X}return(await(C.current??(C.current=(async()=>{try{let X=await sr(j);return h.current=X.token,E(X),X}finally{C.current=null}})()))).token},[j]),le=nr(async()=>V,[V]),ne=typeof V=="string"&&V.trim().length>0,Z=M?U?.getAccessToken:l&&!v?$:ne?le:void 0,ke=bn(()=>({appId:g,baseUrl:W??"",orgId:F??"",jwt:V,getAccessToken:M?U?.getAccessToken:l&&!v?$:void 0,authProvider:I,eventsUrl:q,sessionKey:a,releaseOnLeave:c,audioPlayout:f,priority:v?"preempt":void 0}),[g,U,W,I,V,q,F,a,c,f,M,v,l,$]);return kn(()=>{if(!l)return;let z=new AbortController;return w(null),(async()=>{try{let Q=await sr(j,z.signal);h.current=Q.token,E(Q)}catch(Q){if(z.signal.aborted)return;w(Q instanceof Error?Q:new Error(String(Q)))}})(),()=>z.abort()},[l,j]),Ne(Be,{fallback:y,children:Y?Pn(b,Y):J?Ne("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ne(_e.Provider,{value:ke,children:Z?Ne(St,{getAccessToken:Z,children:k}):k})})}import{useContext as xn,useEffect as Un,useMemo as ar,useReducer as An,useRef as Rt}from"react";import{App as Mn}from"@urun-sh/core";function _n(e,t){return`${e}:${JSON.stringify(t??{})}`}function Nn(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 Te=new Map;var Ct=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Et=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()}},Pt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new Ct(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Et(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 In(){let e=xn(_e);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=An(i=>i+1,0),r=Rt(new Map),o=Rt(new Map),n=Rt(null),s=ar(()=>Mn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority,audioPlayout:e.audioPlayout}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout]);return Un(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Te.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=Te.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let d=Te.get(u);!d||d.refCount!==0||(Te.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),ar(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=d=>{let y=_n(u,d),b=r.current.get(y);if(b&&!b.disposed)return b;let k=Nn(e,u,d),l=Te.get(k);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),Te.delete(k),o.current.get(k)===l&&o.current.delete(k),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new Pt(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},Te.set(k,l)),o.current.get(k)!==l&&(o.current.set(k,l),l.handle.addNotifier(t),l.refCount+=1),r.current.set(y,l.handle),l.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as Tt,useEffect as Ln,useMemo as On,useRef as et,useState as wt}from"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 Dn(e){return e instanceof Error?e:new Error(String(e))}function Vn(e,t){let r=On(()=>Ie(e),[e]),[o,n]=wt(void 0),[s,i]=wt(null),[a,u]=wt(!1),c=et(t);c.current=t;let f=et(0),d=et(null),y=et(!0);Ln(()=>(y.current=!0,()=>{y.current=!1,d.current?.abort()}),[]);let b=Tt(async g=>{d.current?.abort();let m=new AbortController;d.current=m;let E=++f.current,R=()=>y.current&&f.current===E;R()&&(u(!0),i(null));try{let w=await r.request(g,{...c.current,signal:m.signal});return R()&&(n(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let h=Dn(w);throw R()&&(i(h),u(!1),c.current?.onError?.(h)),h}},[r]),k=Tt(g=>{b(g).catch(()=>{})},[b]),l=Tt(()=>{f.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:k,mutateAsync:b,data:o,error:s,isPending:a,reset:l}}import{useCallback as ur,useEffect as Fn,useMemo as qn,useRef as tt,useState as xt}from"react";function cr(e){return e instanceof Error?e:new Error(String(e))}var Hn=e=>typeof e=="string"?e:String(e);function Wn(e,t){let r=qn(()=>Ie(e),[e]),[o,n]=xt(""),[s,i]=xt(!1),[a,u]=xt(null),c=tt(t);c.current=t;let f=tt(0),d=tt(null),y=tt(!0);Fn(()=>(y.current=!0,()=>{y.current=!1,d.current?.cancel(),d.current=null}),[]);let b=ur(()=>{f.current++,d.current?.cancel(),d.current=null,y.current&&i(!1)},[]),k=ur(async l=>{d.current?.cancel();let g=++f.current,m=()=>y.current&&f.current===g,E=c.current,R=E?.parseChunk??Hn,w=E?.buildPayload??(v=>({prompt:v}));m()&&(n(""),u(null),i(!0));let{parseChunk:h,buildPayload:C,onFinish:T,onError:x,...U}=E??{},p="",P;try{P=r.requestStream(w(l),U),d.current=P}catch(v){let M=cr(v);m()&&(u(M),i(!1),E?.onError?.(M));return}try{for await(let v of P){if(f.current!==g)break;p+=R(v),m()&&n(p)}m()&&(i(!1),E?.onFinish?.(p))}catch(v){let M=cr(v);m()&&(u(M),i(!1),E?.onError?.(M))}finally{d.current===P&&(d.current=null)}},[r]);return{completion:o,complete:k,stop:b,isStreaming:s,error:a}}import{useCallback as lr,useEffect as Bn,useMemo as jn,useRef as Le,useState as rt}from"react";function dr(e){return e instanceof Error?e:new Error(String(e))}var Kn=e=>typeof e=="string"?e:String(e),pr=0;function Ut(e){return pr+=1,`${e}-${pr}`}function $n(e,t){let r=jn(()=>Ie(e),[e]),[o,n]=rt(()=>(t?.initialMessages??[]).map(R=>({id:R.id??Ut("msg"),role:R.role,content:R.content}))),[s,i]=rt(""),[a,u]=rt(!1),[c,f]=rt(null),d=Le(t);d.current=t;let y=Le(o);y.current=o;let b=Le(s);b.current=s;let k=Le(0),l=Le(null),g=Le(!0);Bn(()=>(g.current=!0,()=>{g.current=!1,l.current?.cancel(),l.current=null}),[]);let m=lr(()=>{k.current++,l.current?.cancel(),l.current=null,g.current&&u(!1)},[]),E=lr(async R=>{let w=R===void 0,h=(w?b.current:R)??"";if(!h.trim())return;l.current?.cancel();let T=++k.current,x=()=>g.current&&k.current===T,U=d.current,p=U?.parseChunk??Kn,P={id:Ut("msg"),role:"user",content:h},v={id:Ut("msg"),role:"assistant",content:""},M=[...y.current,P].map(q=>({role:q.role,content:q.content})),H=[...y.current,P,v];y.current=H,n(H),w&&i(""),f(null),u(!0);let V=U?.buildPayload??(q=>({messages:q})),{initialMessages:I,parseChunk:N,buildPayload:F,onFinish:W,onError:J,...B}=U??{},G=q=>{n($=>$.map(le=>le.id===v.id?{...le,content:q}:le))},Y="",j;try{j=r.requestStream(V(M),B),l.current=j}catch(q){let $=dr(q);x()&&(f($),u(!1),U?.onError?.($));return}try{for await(let q of j){if(k.current!==T)break;Y+=p(q),x()&&G(Y)}x()&&(u(!1),U?.onFinish?.({...v,content:Y}))}catch(q){let $=dr(q);x()&&(f($),u(!1),U?.onError?.($))}finally{l.current===j&&(l.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:E,stop:m,isStreaming:a,error:c}}import{useCallback as be,useEffect as mr,useMemo as Xn,useRef as fr,useState as gr}from"react";import{createInputPresencePublisher as zn,INPUT_PRESENCE_DEFAULT_HZ as Jn,INPUT_PRESENCE_FIELD as Gn}from"@urun-sh/core";var At=[];function Yn(e,t={}){let{field:r=Gn,hz:o=Jn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Xn(()=>s?zn({awareness:{setLocalStateField:(h,C)=>s.setField(h,C)},field:r,hz:o}):null,[s,r,o]),a=fr(null);a.current=i;let[u,c]=gr(!1),[f,d]=gr(At),y=fr(!1);mr(()=>{if(i)return()=>i.dispose()},[i]);let b=be(()=>{let h=a.current;d(h?h.heldKeys():At)},[]),k=be(()=>{a.current?.clear(),d(At)},[]);mr(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,C=()=>{if(h()){y.current=!1,c(!0);return}y.current||(c(!1),k())},T=v=>{h()&&(a.current?.keyDown(v.key),b())},x=v=>{a.current?.keyUp(v.key),b()},U=v=>{h()&&a.current?.movePointer(v.movementX,v.movementY)},p=v=>{h()&&a.current?.setButtons(v.buttons)},P=()=>{k()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",T),n.addEventListener("keyup",x),n.addEventListener("mousemove",U),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",P),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",T),n.removeEventListener("keyup",x),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",P)}},[n,k,b]);let l=be(h=>{h.requestPointerLock?.()},[]),g=be(()=>{y.current=!0,c(!0)},[]),m=be(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),k()},[n,k]),E=be(h=>{a.current?.keyDown(h),b()},[b]),R=be(h=>{a.current?.keyUp(h),b()},[b]),w=be((h,C)=>{a.current?.movePointer(h,C)},[]);return{engage:l,engageTouch:g,release:m,engaged:u,heldKeys:f,pressKey:E,releaseKey:R,movePointer:w}}import{forwardRef as uo,useEffect as Cr,useImperativeHandle as co,useMemo as lo,useRef as st}from"react";import{createCameraWarp as po}from"@urun-sh/core";import{forwardRef as no,useCallback as Re,useEffect as je,useImperativeHandle as oo,useRef as oe,useState as Sr}from"react";import{derivedLegRole as so}from"@urun-sh/core";var nt=null;function Zn(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=Zn();return e?(nt=new e,nt):null}function Oe(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as Qn,useContext as hr}from"react";import{jsx as ro}from"react/jsx-runtime";var Mt=Qn(null);function eo({session:e,children:t}){return ro(Mt.Provider,{value:e,children:t})}function pe(){return hr(Mt)}function to(){let e=hr(Mt);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as Rr,jsxs as ao}from"react/jsx-runtime";function io(e,t){return e-t>>>0<2147483648}var vr=1e3;function yr(...e){console.debug("[video]",...e)}function kr(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function br(e,t,r){return r?[r,t]:[e,t]}var De=no(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:d,videoClassName:y,placeholder:b,poster:k,children:l,onTrack:g,onFirstFrame:m,frameMarker:E,onFrameMarkerReached:R,onFrameMarkerUnsupported:w,onUnlockChange:h}=t,C=pe(),T=o??C,x=oe(null),U=oe(null),[p,P]=Sr(!1),[v,M]=Sr(!1),H=oe(!1),V=oe(null),I=oe(g);I.current=g;let N=oe(h);N.current=h;let F=oe(m);F.current=m;let W=oe(R);W.current=R;let J=oe(w);J.current=w;let B=oe(E??null);B.current=E??null;let G=Re(S=>{V.current!==S&&(V.current=S,N.current?.(S))},[]),Y=oe(null),j=oe(null),q=Re((S,L=!1)=>{if(!L&&S===Y.current||(Y.current=S,j.current?.(),j.current=null,H.current=!1,M(!1),!S))return;let _=x.current;if(!_)return;let K=B.current,se=K?.rtpTimestamp??null,fe=!1,A=()=>{fe||(fe=!0,J.current?.())};K&&se==null&&A();let ge=K!=null&&se!=null,Ae=Se=>{j.current?.(),j.current=null,H.current=!0,M(!0),F.current?.(),Se&&W.current?.()};if(typeof _.requestVideoFrameCallback=="function"){let Se=!1,O=0,D=(ie,ae)=>{if(!Se){if(ge){let ue=ae?.rtpTimestamp;if(typeof ue!="number"){A(),Ae(!1);return}if(!io(ue,se)){O=_.requestVideoFrameCallback(D);return}Ae(!0);return}Ae(!1)}};O=_.requestVideoFrameCallback(D),j.current=()=>{Se=!0,_.cancelVideoFrameCallback?.(O)};return}ge&&A();let he=()=>{let Se=_.getVideoPlaybackQuality?.();(Se?Se.totalVideoFrames>0:_.readyState>=2&&_.videoWidth>0)&&Ae(!1)};_.addEventListener("loadeddata",he),_.addEventListener("timeupdate",he),_.addEventListener("playing",he),j.current=()=>{_.removeEventListener("loadeddata",he),_.removeEventListener("timeupdate",he),_.removeEventListener("playing",he)},he()},[]);je(()=>()=>{j.current?.(),j.current=null},[]);let $=E==null?null:`${E.rtpTimestamp??""}|${E.ptsMs??""}`,le=oe($);je(()=>{if(le.current===$||(le.current=$,$==null))return;let S=Y.current;S&&q(S,!0)},[$,q]);let ne=Re(()=>{if(typeof MediaStream>"u")return null;U.current||(U.current=new MediaStream);let S=x.current;return S&&S.srcObject!==U.current&&(S.srcObject=U.current),U.current},[]),Z=Re(S=>{let L=x.current;if(!L)return;let _=L.play();!_||typeof _.then!="function"||_.then(()=>{L.muted||G(!0)}).catch(K=>{if((K instanceof Error?K.name:String(K))==="NotAllowedError"&&!L.muted){yr(`play() blocked pending a user gesture (${S})`),G(!1);return}yr(`play() failed (${S})`,K)})},[G]),ke=Re(()=>{let S=x.current;S&&(ne(),!S.muted&&(Z("gesture"),Oe(),G(!0)))},[ne,Z,G]),z=Re(S=>{let L=ne();if(L){for(let _ of L.getVideoTracks())_!==S&&L.removeTrack(_);if(S&&!L.getVideoTracks().includes(S)){L.addTrack(S);let _=x.current;_&&(_.srcObject=L)}S&&Z("track-attach"),P(S!==null),q(S),I.current?.(S)}},[ne,Z,q]),Q=Re(S=>{let L=ne();if(L){for(let _ of L.getAudioTracks())_!==S&&L.removeTrack(_);S&&!L.getAudioTracks().includes(S)&&L.addTrack(S),S&&Z("audio-attach")}},[ne,Z]),X=Re(S=>{x.current=S,S&&(a?(S.muted=!0,S.defaultMuted=!0,S.setAttribute("muted",""),V.current=null):(S.muted=!1,S.defaultMuted=!1,S.removeAttribute("muted")),S.setAttribute("playsinline",""),S.setAttribute("webkit-playsinline",""),ne())},[ne,a]);oo(r,()=>({get element(){return x.current},get live(){return U.current?U.current.getVideoTracks().length>0:!1},get framed(){return H.current},unlock:ke,get unlocked(){return V.current===!0}}),[ke]);let ee=so(n)!==void 0;je(()=>{ee&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ee,n]);let te=i!==void 0;return je(()=>{if(te){z(i??null);return}if(ee){z(null);return}if(!T)return;let S=kr(T,br(n,"video")),L=()=>{let A=U.current;return A?A.getVideoTracks()[0]??null:null},_=A=>{if(A!==L()&&(z(A),A)){let ge=()=>{L()===A&&z(null)};A.addEventListener("ended",ge)}},K=S.track;K&&K.readyState==="live"&&_(K);let se=S.on("track",A=>{A&&A.readyState!=="live"||_(A)}),fe=setInterval(()=>{let A=S.track;A&&A.readyState==="live"&&_(A)},vr);return()=>{se(),clearInterval(fe)}},[T,n,ee,te,i,z]),je(()=>{if(te||!T||s===!1||ee)return;let S=kr(T,br(n,"audio",s)),L=()=>{let A=U.current;return A?A.getAudioTracks()[0]??null:null},_=A=>{if(A!==L()&&(Q(A),A)){let ge=()=>{L()===A&&Q(null)};A.addEventListener("ended",ge)}},K=S.track;K&&K.readyState==="live"&&_(K);let se=S.on("track",A=>{A&&A.readyState!=="live"||_(A)}),fe=setInterval(()=>{let A=S.track;A&&A.readyState==="live"&&_(A)},vr);return()=>{se(),clearInterval(fe)}},[T,n,ee,s,te,Q]),ao("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...d},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":v?"true":"false",children:[Rr("video",{ref:X,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,k===void 0?null:Rr("div",{"data-urun-video-poster":"","aria-hidden":v||void 0,style:{position:"absolute",inset:0,...v?{opacity:0,pointerEvents:"none"}:null},children:k}),l]})});import{jsx as Er,jsxs as go}from"react/jsx-runtime";var mo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},fo=uo(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},d=c!==void 0?c:typeof document<"u"?document:null,y=st(null),b=st(null),k=st(0),l=st(f);l.current=f;let g=lo(()=>po(l.current),[]);return co(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:g,get lastDrawTs(){return k.current}}),[g]),Cr(()=>{if(!i)return;let m=0,E=0,R=null,w=C=>{typeof C.requestVideoFrameCallback=="function"&&(R=C,E=C.requestVideoFrameCallback(function T(){g.frameArrived(),E=C.requestVideoFrameCallback(T)}))},h=C=>{m=requestAnimationFrame(h);let T=b.current,x=y.current?.element??null;if(!T||!x||(x!==R&&(R&&E&&R.cancelVideoFrameCallback?.(E),w(x)),x.readyState<2))return;g.tick(C);let U=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(T.clientWidth*U)),P=Math.max(1,Math.round(T.clientHeight*U));(T.width!==p||T.height!==P)&&(T.width=p,T.height=P);let v=T.getContext("2d");if(!v)return;let M=g.transform(),H=x.videoWidth||p,V=x.videoHeight||P,N=Math.max(p/H,P/V)*(1+a)*M.scale;v.setTransform(N,0,0,N,p/2+M.translateX*p,P/2+M.translateY*P),v.drawImage(x,-H/2,-V/2),k.current=C};return m=requestAnimationFrame(h),()=>{cancelAnimationFrame(m),R&&E&&R.cancelVideoFrameCallback?.(E)}},[i,a,g]),Cr(()=>{if(!i||!u||!d)return;let m=()=>!!d.pointerLockElement,E=T=>{m()&&g.keyDown(T.key)},R=T=>g.keyUp(T.key),w=T=>{m()&&g.pointerDelta(T.movementX,T.movementY)},h=()=>{m()||g.clearKeys()},C=()=>g.clearKeys();return d.addEventListener("keydown",E),d.addEventListener("keyup",R),d.addEventListener("mousemove",w),d.addEventListener("pointerlockchange",h),d.defaultView?.addEventListener("blur",C),()=>{d.removeEventListener("keydown",E),d.removeEventListener("keyup",R),d.removeEventListener("mousemove",w),d.removeEventListener("pointerlockchange",h),d.defaultView?.removeEventListener("blur",C)}},[i,u,d,g]),i?go(De,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Er("canvas",{ref:b,style:mo,"data-urun-warp":""}),n]}):Er(De,{ref:y,...s,children:n})});var Pr=new Map;function ho(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Pr.set(e,{component:t,schema:r})}function Tr(e,t){let r=Pr.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 vo,jsx as it}from"react/jsx-runtime";function So({name:e,props:t,fallback:r}){let o=Tr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?it(vo,{children:r}):it("div",{className:"urun-component-error",role:"alert",children:it("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return it(n,{...o.validatedProps})}import{z as Ke}from"zod";import{jsx as _t,jsxs as wr}from"react/jsx-runtime";var yo=Ke.object({step:Ke.number().min(0),total:Ke.number().min(1),label:Ke.string().optional(),variant:Ke.enum(["default","success","error"]).default("default")});function xr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function ko(e){let{step:t,total:r,label:o,variant:n,percentage:s}=xr(e);return wr("div",{className:"urun-progress-card","data-variant":n,children:[o&&_t("div",{className:"urun-progress-label",children:o}),_t("div",{className:"urun-progress-bar",children:_t("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),wr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Nt}from"zod";import{jsx as Ur,jsxs as Eo}from"react/jsx-runtime";var bo=Nt.object({state:Nt.enum(["thinking","generating","idle","error"]),message:Nt.string().optional()}),Ro={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Ar(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Ro[t]??t;return{state:t,message:n,isActive:o}}function Co(e){let{state:t,message:r,isActive:o}=Ar(e);return Eo("span",{className:"urun-status-badge","data-state":t,children:[Ur("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Ur("span",{className:"urun-status-message",children:r})]})}import{useRef as Mr,useEffect as Po}from"react";import{z as It}from"zod";import{jsx as _r,jsxs as xo}from"react/jsx-runtime";var To=It.object({text:It.string(),streaming:It.boolean().default(!1)});function Nr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function wo(e){let{text:t,streaming:r}=Nr(e),o=Mr(null),n=Mr(0);return Po(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),xo("div",{className:"urun-text-stream",children:[_r("span",{ref:o,className:"urun-text-content"}),r&&_r("span",{className:"urun-text-cursor"})]})}import{z as at}from"zod";import{jsx as Ir,jsxs as Mo}from"react/jsx-runtime";var Uo=at.object({src:at.string().url(),alt:at.string().optional(),caption:at.string().optional()});function Lr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Ao(e){let{src:t,alt:r,caption:o}=Lr(e);return Mo("figure",{className:"urun-image-frame",children:[Ir("img",{className:"urun-image",src:t,alt:r}),o&&Ir("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Ce}from"zod";import{jsx as Lt,jsxs as Io}from"react/jsx-runtime";var _o=Ce.object({metrics:Ce.array(Ce.object({label:Ce.string(),value:Ce.union([Ce.string(),Ce.number()]),unit:Ce.string().optional()}))});function Or(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function No(e){let{metrics:t}=Or(e);return Lt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Io("div",{className:"urun-metric-card",children:[Lt("div",{className:"urun-metric-label",children:r.label}),Lt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Lo}from"react";import{jsx as Do}from"react/jsx-runtime";var Oo=Lo(function(t,r){let{stream:o="image",...n}=t;return Do(De,{ref:r,stream:o,...n})});import{forwardRef as Vo,useCallback as Ve,useEffect as Ot,useImperativeHandle as Fo,useRef as Fe}from"react";import{observePageLifecycle as qo}from"@urun-sh/core";import{jsx as Bo}from"react/jsx-runtime";var Ho=1e3,Dr=200;function Dt(...e){console.debug("[audio]",...e)}var ut=Vo(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,d=pe(),y=o??d,b=Fe(null),k=Fe(null),l=Fe(null),g=Fe(null),m=Fe(u);m.current=u;let E=Fe(c);E.current=c;let R=Ve(p=>{l.current!==p&&(l.current=p,E.current?.(p))},[]),w=Ve(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let p=b.current;return p&&p.srcObject!==k.current&&(p.srcObject=k.current),k.current},[]),h=Ve(p=>{let P=b.current;if(!P)return;let v=P.play();!v||typeof v.then!="function"||v.then(()=>{P.muted||R(!0)}).catch(M=>{let H=M instanceof Error?M.name:String(M);if(H==="AbortError"){Dt(`play() aborted (${p}); retrying in ${Dr}ms`),g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{g.current=null,h(`${p}:retry`)},Dr);return}if(H==="NotAllowedError"){Dt(`play() blocked pending a user gesture (${p})`),R(!1);return}Dt(`play() failed (${p})`,M)})},[R]),C=Ve(p=>{let P=w();if(P){for(let v of P.getAudioTracks())v!==p&&P.removeTrack(v);p&&!P.getAudioTracks().includes(p)&&P.addTrack(p),p&&h("track-attach"),m.current?.(p)}},[w,h]),T=Ve(()=>{let p=b.current;p&&(w(),p.muted=!1,h("gesture"),Oe(),R(!0))},[w,h,R]);Fo(r,()=>({unlock:T,get unlocked(){return l.current===!0},get element(){return b.current}}),[T]);let x=Ve(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),w()),f?.(p)},[w,f]),U=s!==void 0;return Ot(()=>{if(U){C(s??null);return}if(!y)return;let p=y.stream(n),P=()=>{let I=k.current;return I?I.getAudioTracks()[0]??null:null},v=I=>{if(I!==P()&&(C(I),I)){let N=()=>{P()===I&&C(null)};I.addEventListener("ended",N)}},M=p.track;M&&M.readyState==="live"&&v(M);let H=p.on("track",I=>{I&&I.readyState!=="live"||v(I)}),V=setInterval(()=>{let I=p.track;I&&I.readyState==="live"&&v(I)},Ho);return()=>{H(),clearInterval(V)}},[y,n,U,s,C]),Ot(()=>qo(()=>{Oe(),l.current===!0&&h("foreground")}),[h]),Ot(()=>()=>{g.current&&clearTimeout(g.current)},[]),Bo("audio",{ref:x,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Wo=ut;import{forwardRef as jo,useCallback as qe,useEffect as Vr,useImperativeHandle as Ko,useRef as ye}from"react";import{observePageLifecycle as $o,sessionFailureFromMediaError as Xo,sharedCaptureController as zo}from"@urun-sh/core";import{jsx as Go}from"react/jsx-runtime";var Fr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ct(...e){console.debug("[voice]",...e)}var lt=jo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Fr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:d,onMicStream:y,onTrack:b,onUnlockChange:k,capture:l}=t,g=pe(),m=o??g,E=ye(null),R=ye(null),w=ye(null),h=ye([]),C=ye(!1),T=ye(f);T.current=f;let x=ye(d);x.current=d;let U=ye(y);U.current=y;let p=qe(N=>{C.current!==N&&(C.current=N,T.current?.(N))},[]),P=qe(()=>{for(let N of h.current)N();h.current=[],w.current?.release(),w.current=null,R.current&&(R.current=null,U.current?.(null))},[]),v=qe(async()=>{let N=w.current;if(N){let B=await N.update(i);return R.current=N.stream,U.current?.(N.stream),B}let W=await(l??zo()).claim("audio",i);w.current=W,h.current=[W.onTrack((B,G)=>{R.current=G,U.current?.(G),C.current&&m?.stream(n).attach(B).catch(Y=>ct("mic re-attach after one-capture re-acquire failed",Y))}),W.onLost(B=>{w.current=null,h.current=[],R.current=null,U.current?.(null),p(!1),x.current?.(B)})],R.current=W.stream,U.current?.(W.stream);let J=W.track;if(!J)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return J},[l,i,m,n,p]),M=qe(async()=>{P(),p(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,P,p]),H=qe(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let N;try{N=await v()}catch(J){P();let B=Xo(J,m.status);throw x.current?.(B),B}m.connect?.();let F;for(let J=1;J<=u;J++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(N),p(!0);return}catch(B){F=B,ct(`start attempt ${J}/${u} failed`,B),J<u&&await new Promise(G=>setTimeout(G,c))}P(),p(!1);let W=F instanceof Error?F:new Error(String(F??"voice start failed"));throw x.current?.(W),W},[m,n,a,u,c,v,P,p]);Ko(r,()=>({start:H,stop:M,unlock:()=>E.current?.unlock(),get active(){return C.current},get micStream(){return R.current},get audio(){return E.current}}),[H,M]);let V=ye(!1),I=qe(async()=>{if(!m||!C.current||V.current)return;let N=R.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await m.stream(n).attach(N)}catch(F){ct("foreground mic re-assert failed (will retry on next pass)",F)}return}V.current=!0;try{let F=await v();await m.stream(n).attach(F)}catch(F){let W=F instanceof Error?F:new Error(String(F));ct("foreground mic re-acquire failed",W),x.current?.(W)}finally{V.current=!1}},[m,n,v]);return Vr(()=>{let N=()=>{I()};return m&&typeof m.onRecovery=="function"?m.onRecovery(N):$o(N)},[m,I]),Vr(()=>P,[P]),s?Go(ut,{ref:E,session:m,stream:n,onTrack:b,onUnlockChange:k}):null}),Jo=lt;import{forwardRef as Qo,useEffect as es,useImperativeHandle as ts,useRef as qr,useState as rs}from"react";import{useEffect as Yo,useState as Zo}from"react";var Vt={level:0,speaking:!1};function Ft(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Zo(Vt);return Yo(()=>{if(!e){i(Vt);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),b=setInterval(()=>{f.getByteTimeDomainData(d);let k=0;for(let g=0;g<d.length;g++){let m=(d[g]-128)/128;k+=m*m}let l=Math.sqrt(k/d.length);i(g=>{let m=l>n;return Math.abs(g.level-l)<.005&&g.speaking===m?g:{level:l,speaking:m}})},o);return()=>{clearInterval(b),c.disconnect(),i(Vt)}},[e,r,o,n]),s}import{Fragment as is,jsx as dt,jsxs as as}from"react/jsx-runtime";var ns={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},os={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ss=Qo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:d,capture:y}=t,b=pe(),k=o??b,l=qr(null),[g,m]=rs(null),E=qr(d);E.current=d;let{level:R,speaking:w}=Ft(a?g:null);return ts(r,()=>({start:()=>{let h=l.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>l.current?.stop()??Promise.resolve(),get active(){return l.current?.active??!1},get micStream(){return l.current?.micStream??null}}),[]),es(()=>{!i||!k||l.current?.start().catch(()=>{})},[i,k]),as(is,{children:[dt(lt,{ref:l,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:f,onMicStream:h=>{m(h),E.current?.(h)}}),a?dt("span",{className:u,style:ns,"data-urun-mic":"","data-urun-mic-active":g?"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(R*100)/100,children:dt("span",{style:os,children:dt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(R*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as us,sessionFailureFromMediaError as cs,sharedCaptureController as ls}from"@urun-sh/core";import{forwardRef as Wr,useCallback as me,useEffect as qt,useImperativeHandle as ds,useRef as re,useState as $e}from"react";import{jsx as Ee,jsxs as Hr}from"react/jsx-runtime";var Br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ht(...e){console.debug("[camera]",...e)}function ps(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function ms(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var jr=Wr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:d,visible:y=!1,className:b,videoClassName:k,onActiveChange:l,onError:g,onStream:m,onTrack:E,children:R,capture:w,flipControl:h="auto",flipControlClassName:C,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let x=i?"user":a?"environment":u??"environment",U=pe(),p=o??U,P=re(null),v=re(null),M=re(null),H=re([]),V=re(null),I=re(!1),N=re(!1),F=re(x),[W,J]=$e(x),[B,G]=$e(!1),[Y,j]=$e(null),[q,$]=$e(!1),[le]=$e(ps),ne=re(l);ne.current=l;let Z=re(g);Z.current=g;let ke=re(m);ke.current=m;let z=re(E);z.current=E;let Q=re(T);Q.current=T;let X=me(O=>{I.current!==O&&(I.current=O,G(O),ne.current?.(O))},[]);qt(()=>{if(!B){j(null);return}let O=!1,D=()=>{ms().then(ae=>{O||(j(ae),ae&&Q.current?.(ae))})};D();let ie=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ie?.addEventListener=="function"?(ie.addEventListener("devicechange",D),()=>{O=!0,ie.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[B]);let ee=me(O=>{let D=P.current;D&&(D.muted=!0,D.defaultMuted=!0,D.setAttribute("muted",""),D.setAttribute("playsinline",""),D.setAttribute("webkit-playsinline",""),D.srcObject=O,O&&D.play()?.catch?.(ie=>Ht("preview play() failed",ie)))},[]),te=me(()=>{N.current=!1,V.current?.(),V.current=null;for(let O of H.current)O();H.current=[],M.current?.release(),M.current=null,v.current&&(v.current=null,ke.current?.(null),z.current?.(null)),ee(null)},[ee]),S=me((O,D)=>{V.current?.(),v.current=D,ee(D),ke.current?.(D);let ie=()=>{v.current===D&&(Ht("camera track ended (device removed or permission revoked)"),te(),X(!1))};O.addEventListener("ended",ie),V.current=()=>O.removeEventListener("ended",ie)},[ee,te,X]),L=me(async O=>{let D=n!==!1;if(D&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ie={...Br,...s,facingMode:O},ae;try{let ue=M.current;if(ue)ae=await ue.update(ie);else{let He=await(w??ls()).claim("video",ie);if(M.current=He,H.current=[He.onTrack((We,sn)=>{S(We,sn),I.current&&(!D||!p||p.stream(n).attachVideo(We).then(()=>z.current?.(We)).catch(an=>Ht("camera re-publish after one-capture re-acquire failed",an)))}),He.onLost(We=>{M.current=null,H.current=[],te(),X(!1),Z.current?.(We)})],!He.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ae=He.track}}catch(ue){let Me=cs(ue,p?.status);throw Z.current?.(Me),Me}F.current=O,J(O),S(ae,M.current?.stream??new MediaStream([ae]));try{D&&p&&(p.connect?.(),await p.whenLive(d!==void 0?{timeout:d}:void 0),await p.stream(n).attachVideo(ae)),N.current=D?n:!1}catch(ue){te(),X(!1);let Me=ue instanceof Error?ue:new Error(String(ue));throw Z.current?.(Me),Me}z.current?.(ae),X(!0)},[p,n,s,d,w,S,te,X]),_=me(O=>L(O?.facingMode??F.current),[L]),K=me(async O=>{let D=N.current===n;I.current&&F.current===O&&D||await L(O)},[L,n]),se=me(()=>L(F.current==="environment"?"user":"environment"),[L]),fe=me(async()=>{te(),X(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,te,X]),A=me(async O=>{let D=P.current;if(!D)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await us(D,O)},[]);ds(r,()=>({start:_,stop:fe,flip:se,setFacingMode:K,capturePhoto:A,get active(){return I.current},get facingMode(){return F.current},get stream(){return v.current},get element(){return P.current}}),[_,fe,se,K,A]);let ge=re(K);if(ge.current=K,qt(()=>{c&&(n!==!1&&!p||ge.current(x).catch(()=>{}))},[c,p,x,n]),qt(()=>te,[te]),!y)return null;let Ae=f==="auto"?W==="user":f,he=B&&(h===!0||h==="auto"&&le&&(Y?.length??0)>1),Se=()=>{q||($(!0),se().catch(()=>{}).finally(()=>$(!1)))};return Hr("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":W,children:[Ee("video",{ref:P,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ae?{transform:"scaleX(-1)"}:{}}}),he?Ee("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Se,disabled:q,className:C,style:C?{opacity:q?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:q?.6:1},children: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:[Ee("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),Ee("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),Ee("path",{d:"M14.5 10.5v1.6h-1.6"}),Ee("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),Ee("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,R]})}),fs=Wr(function({preview:t=!0,...r},o){return Ee(jr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as gs,normalizeReferenceImage as hs,referenceImageErrorMessage as Ss}from"@urun-sh/core";import{useCallback as Xe,useEffect as vs,useRef as Wt,useState as ze}from"react";function ys(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=ze(null),[a,u]=ze(null),[c,f]=ze(!1),[d,y]=ze(null),[b]=ze(gs),k=Wt(n);k.current=n;let l=Wt(null),g=Wt(0),m=Xe(C=>{l.current&&URL.revokeObjectURL(l.current),l.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,u(l.current),i(C),k.current?.(C)},[]);vs(()=>()=>{g.current++,l.current&&URL.revokeObjectURL(l.current),l.current=null},[]);let E=Xe(async C=>{let T=++g.current;f(!0),y(null);try{let x=await C();if(g.current!==T)return;m(x)}catch(x){if(g.current!==T)return;y(Ss(x))}finally{g.current===T&&f(!1)}},[m]),R=Xe(C=>E(()=>hs(C,{maxSize:t,type:r,quality:o,source:"file"})),[E,t,r,o]),w=Xe(C=>E(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[E,t,r,o]),h=Xe(()=>{g.current++,y(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:R,capture:w,clear:h,busy:c,error:d,cameraAvailable:b}}import{useEffect as ks,useState as bs}from"react";function Rs(e,t){let[r,o]=bs(null);return ks(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as xs}from"react";import{useEffect as Ts,useMemo as ws}from"react";import{createStore as Cs}from"zustand/vanilla";import{useStore as Es}from"zustand";var Ps=()=>{};function Bt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Cs(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Ps,u=(c=>Es(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Je(e,t){let r=ws(()=>Bt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Ts(()=>r.bind(),[r]),r}function Us(e,t,r){let n=Je(e,t)(r??(a=>a)),s=xs(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as As,useState as Ms}from"react";var we=200;function Pe(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Ge(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function jt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Kt(e,t,r={}){let o=r.cap??200,[n,s]=Ms([]);return As(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Pe(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as pt,jsxs as Ye}from"react/jsx-runtime";function _s({session:e,name:t,cap:r,className:o}){let n=Kt(e,t,{cap:r});return Ye("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ye("div",{className:"urun-stream-tail-meta",children:[pt("code",{children:t}),Ye("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),pt("div",{className:"urun-stream-tail-log",children:n.length===0?Ye("span",{className:"urun-stream-tail-empty",children:["Waiting for ",pt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ye("div",{className:"urun-stream-tail-line",children:[pt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Ge(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Ns,useState as Kr}from"react";import{jsx as xe,jsxs as mt}from"react/jsx-runtime";function ft({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Kr(""),[i,a]=Kr(null),u=Ns(()=>{let c=jt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return mt("div",{className:"urun-doc-patch",children:[xe("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),mt("div",{className:"urun-doc-patch-actions",children:[xe("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?xe("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Is({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Je(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return mt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[mt("div",{className:"urun-doc-panel-meta",children:[xe("code",{children:t}),xe("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),xe("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?xe(ft,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Ls,useState as Os}from"react";import{jsx as Ze,jsxs as Xr}from"react/jsx-runtime";function $r(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ds({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=Os([]);return Ls(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Pe(u,{at:Date.now(),direction:"in",text:$r(Ge(a))},r))}):void 0),[e,t,r]),Xr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Ze(ft,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Pe(u,{at:Date.now(),direction:"out",text:$r(a)},r))}}),Ze("div",{className:"urun-control-sender-log",children:n.length===0?Ze("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Xr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Ze("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Ze("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Vs,useState as Fs}from"react";import{jsx as gt,jsxs as Hs}from"react/jsx-runtime";function qs({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Fs([]),a=t.join(","),u=r.join(",");return Vs(()=>{if(i([]),!e)return;let c=(d,y)=>i(b=>Pe(b,{at:Date.now(),kind:d,text:y},o)),f=[];f.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let y=e.stream(d);f.push(y.on("track",b=>c("track",`${d}: ${b?"track arrived":"track ended"}`)))}for(let d of r){let y=e.doc(d);f.push(y.on("change",()=>c("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,a,u,o]),gt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?gt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>Hs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[gt("span",{className:"urun-event-spine-kind",children:c.kind})," ",gt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as ri,isWakingPhase as ni}from"@urun-sh/core";import{useEffect as Ws,useState as Bs}from"react";function ce(e){let[t,r]=Bs(e?.phase??null);return Ws(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as zs}from"@urun-sh/core";import{useEffect as js,useRef as Ks,useState as $s}from"react";import{isWakingPhase as Xs}from"@urun-sh/core";function $t(e){let t=ce(e),r=Xs(t?.name),o=Ks(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=$s(s);return js(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Js,jsx as zr,jsxs as Jr}from"react/jsx-runtime";function Xt({session:e,render:t,className:r}){let o=$t(e);return!o.waking||!o.phase?null:zr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Jr(Js,{children:[zr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",Jr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Zs,useState as Qs}from"react";import{useEffect as Gr,useRef as Gs,useState as Yr}from"react";var Ys={event:null,elapsedMs:0};function zt(e,t){let[r,o]=Yr(null),n=Gs(0);Gr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Yr(0);return Gr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ys}import{jsx as Zr,jsxs as Qr}from"react/jsx-runtime";var ei={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function ti(e){let[t,r]=Qs(!1);return Zs(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Jt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=zt(e,t),i=ti(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Zr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Qr("div",{className:"urun-activation-overlay-card",children:[Zr("span",{className:"urun-activation-overlay-copy",children:a.hint??ei[u]})," ",Qr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ue,jsxs as Gt}from"react/jsx-runtime";var oi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function si({session:e,className:t}){let r=ce(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Gt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ue("span",{className:"urun-session-status-dot","data-phase":o}),Ue("span",{className:"urun-session-status-label",children:oi[o]}),n?Ue("span",{className:"urun-session-status-detail",children:n}):null]})}function ii({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ce(e);if(s?.name==="live")return Gt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ue(Jt,{session:e})]});let i=r?r(s):Ue("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ni(s.name)?Ue(Xt,{session:e}):s&&s.name!=="idle"?ri(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Gt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ue("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ai,useState as ui}from"react";import{jsx as di}from"react/jsx-runtime";function en(e){return ce(e)?.endsAt??null}function ci(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function li({session:e,urgentMs:t=6e4,className:r}){let n=en(e)?.getTime()??null,[s,i]=ui(()=>n===null?null:Math.max(0,n-Date.now()));if(ai(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=ci(s);return di("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as tn,jsxs as fi}from"react/jsx-runtime";var pi=new Set(["expired","ended","error"]);function mi({session:e,onNewSession:t,children:r,className:o}){let n=ce(e);if(!n||!pi.has(n.name))return null;let s=r?r(n):tn("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return fi("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?tn("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as rn,useMemo as gi,useState as nn}from"react";import{jsx as ht,jsxs as vi}from"react/jsx-runtime";function Yt(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 on(e){let t=gi(()=>e?e.doc("control"):null,[e]),[r,o]=nn(()=>t?Yt(t.get("idle")):null);return rn(()=>{if(!t){o(null);return}return o(Yt(t.get("idle"))),t.on("change",()=>o(Yt(t.get("idle"))))},[t]),r}function hi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Si({session:e,onStillHere:t,className:r}){let o=on(e),n=o?.deadlineEpochS??null,[s,i]=nn(null);if(rn(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ht("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:vi("div",{className:"urun-idle-warning-card",children:[ht("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ht("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${hi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ht("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as yi,useEffect as ki,useState as bi}from"react";import{prewake as Ri}from"@urun-sh/core";function Ci(e){let t=yi(_e),[r,o]=bi(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,d=t?.authProvider;return ki(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{Ri({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:d}).then(l=>{y||o(l)}).catch(()=>{})};b();let k=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(k)}},[n,s,i,a,u,c,f,d]),r}import{describeSessionPhase as Ll,isWakingPhase as Ol}from"@urun-sh/core";export{ut as Audio,jr as Camera,So as ComponentRenderer,Br as DEFAULT_CAMERA_CONSTRAINTS,we as DEFAULT_LOG_CAP,Fr as DEFAULT_VOICE_CONSTRAINTS,ft as DocPatchForm,Oo as Image,Ao as ImageFrame,Uo as ImageFrameSchema,No as MetricsPanel,_o as MetricsPanelSchema,ss as Mic,hn as OPERATOR_CHORD_LABEL,gn as OPERATOR_TOKEN_STORAGE_KEY,ko as ProgressCard,yo as ProgressCardSchema,fo as ReprojectedVideo,eo as Session,Co as StatusBadge,bo as StatusBadgeSchema,wo as TextStream,To as TextStreamSchema,Jt as UrunActivationOverlay,Wo as UrunAudio,St as UrunAuthProvider,fs as UrunCamera,Ds as UrunControlSender,Is as UrunDocPanel,Be as UrunErrorBoundary,qs as UrunEventSpine,Si as UrunIdleWarning,un as UrunJwtProvider,Tn as UrunProvider,li as UrunSessionClock,mi as UrunSessionEnded,ii as UrunSessionGate,si as UrunSessionStatus,Xt as UrunSessionWaking,_s as UrunStreamTail,Jo as UrunVoice,De as Video,lt as Voice,Qe as authMode,Bt as createDocStore,Ll as describeSessionPhase,Ge as formatPayload,ot as getUrunAudioContext,Ol as isWakingPhase,jt as parseJsonObject,Pe as pushCapped,rr as readOperatorToken,ho as registerComponent,Oe as resumeUrunAudioContext,de as urunPublicEnv,zt as useActivation,In as useApp,$n as useChat,Wn as useCompletion,kt as useConfirmOnLeave,Je as useDocStore,Lr as useImageFrame,Yn as useInputPresence,Or as useMetricsPanel,yt as useOperatorOverride,xr as useProgressCard,ys as useReferenceImage,Vn as useRequest,to as useSession,Us as useSessionDoc,en as useSessionEndsAt,on as useSessionIdle,ce as useSessionPhase,Rs as useSessionTrack,$t as useSessionWake,Ar as useStatusBadge,Kt as useStreamMessages,Nr as useTextStream,Ft as useUrunAudioLevel,vt as useUrunAuth,Ci as useUrunPrewake,pn as usesWorkOSAuth};
|
|
2
|
+
import{a as ht,b as ln,c as vt}from"./chunk-WF2OBDSX.mjs";import{useCallback as or,useEffect as Pn,useMemo as ur,useRef as sr,useState as bt}from"react";import{Component as dn}from"react";import{jsx as Qt,jsxs as pn}from"react/jsx-runtime";var Be=class extends dn{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||pn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[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 mn}from"react";var _e=mn(null);function ve(e){return e&&e.trim()?e.trim():void 0}function le(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return ve(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ve(typeof process<"u"?process.env?.[e]:void 0)}}function Qe(){let e=le("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||le("VERCEL_ENV")==="production"?"workos":le("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function fn(){return Qe()==="workos"}import{useEffect as gn,useRef as Sn}from"react";var hn="urun.operator_token",tr=null,er="op",vn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function rr(){return typeof window<"u"}function nr(){return tr}function yn(){if(!rr())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(er);if(!r)return null;tr=r,t.delete(er);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function kn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function yt(e){let t=Sn(e);t.current=e,gn(()=>{if(!rr())return;yn();let r=o=>{if(!kn(o))return;let n=nr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as bn}from"react";function kt(e=!0){bn(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as Ne,jsxs as xn}from"react/jsx-runtime";var Rn="/api/urun-token",Cn=1e4;function En(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function ir(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function ar(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function Pt(e){let t=e===void 0?void 0:JSON.stringify(e);return ur(()=>e,[t])}function Tn(e,t){return typeof e=="function"?e(t):e!==void 0?e:xn("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:[Ne("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ne("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function wn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:v,confirmOnLeave:R=!1,fallback:k,errorFallback:m,children:S}){let p=n===void 0&&t===void 0;if(!p&&(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(!p&&(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 b=r??o;if(p&&(typeof b!="string"||b.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);kt(R);let[y,U]=bt(),[h,C]=bt(null),T=sr(void 0),x=sr(null),[N,d]=bt(null);yt(f=>d({jwt:f}));let E=vt(),P=le("NEXT_PUBLIC_SESSION_TOKEN")??le("NEXT_PUBLIC_URUN_JWT"),I=Qe(),D=N!==null,q=I==="workos"&&!n&&!D&&!p,L=n??(I==="jwt"?P:void 0)??y?.token,A=D?N.jwt:L,F=s??le("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),j=q&&!A&&!E?.getAccessToken,$=t??y?.orgId,W=e??y?.gatewayUrl,J=p&&y===void 0,Q=p&&y!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,X=j?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,H=h??Q??X,K=ar("NEXT_PUBLIC_URUN_TOKEN_URL",le("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??Rn,ae=ar("NEXT_PUBLIC_URUN_EVENTS_URL",le("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,G=or(async f=>{if(!f?.forceRefresh){let w=T.current;if(!w)return w;let B=En(w);if(B===null||B-Date.now()>Cn)return w}return(await(x.current??(x.current=(async()=>{try{let w=await ir(K);return T.current=w.token,U(w),w}finally{x.current=null}})()))).token},[K]),ee=or(async()=>A,[A]),ke=typeof A=="string"&&A.trim().length>0,te=q?E?.getAccessToken:p&&!D?G:ke?ee:void 0,me=Pt(g),re=Pt(l),Y=Pt(v),z=ur(()=>({appId:b,baseUrl:W??"",orgId:$??"",jwt:A,getAccessToken:q?E?.getAccessToken:p&&!D?G:void 0,authProvider:F,eventsUrl:ae,sessionKey:a,releaseOnLeave:c,audioPlayout:me,videoPlayout:re,sessionStats:Y,priority:D?"preempt":void 0}),[b,E,W,F,A,ae,$,a,c,me,re,Y,q,D,p,G]);return Pn(()=>{if(!p)return;let f=new AbortController;return C(null),(async()=>{try{let M=await ir(K,f.signal);T.current=M.token,U(M)}catch(M){if(f.signal.aborted)return;C(M instanceof Error?M:new Error(String(M)))}})(),()=>f.abort()},[p,K]),Ne(Be,{fallback:k,children:H?Tn(m,H):J?Ne("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ne(_e.Provider,{value:z,children:te?Ne(ht,{getAccessToken:te,children:S}):S})})}import{useContext as Un,useEffect as An,useMemo as cr,useReducer as Mn,useRef as Rt}from"react";import{App as _n}from"@urun-sh/core";function Nn(e,t){return`${e}:${JSON.stringify(t??{})}`}function In(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 Te=new Map;var Ct=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Et=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()}},Tt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new Ct(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Et(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=Un(_e);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Mn(i=>i+1,0),r=Rt(new Map),o=Rt(new Map),n=Rt(null),s=cr(()=>_n(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return An(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Te.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Te.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=Te.get(u);!l||l.refCount!==0||(Te.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),cr(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=Nn(u,l),R=r.current.get(v);if(R&&!R.disposed)return R;let k=In(e,u,l),m=Te.get(k);return m?.handle.disposed&&(m.disposeTimer&&clearTimeout(m.disposeTimer),Te.delete(k),o.current.get(k)===m&&o.current.delete(k),m=void 0),m?m.disposeTimer&&(clearTimeout(m.disposeTimer),m.disposeTimer=null):(m={handle:new Tt(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Te.set(k,m)),o.current.get(k)!==m&&(o.current.set(k,m),m.handle.addNotifier(t),m.refCount+=1),r.current.set(v,m.handle),m.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as wt,useEffect as On,useMemo as Vn,useRef as et,useState as xt}from"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 Dn(e){return e instanceof Error?e:new Error(String(e))}function Fn(e,t){let r=Vn(()=>Ie(e),[e]),[o,n]=xt(void 0),[s,i]=xt(null),[a,u]=xt(!1),c=et(t);c.current=t;let g=et(0),l=et(null),v=et(!0);On(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let R=wt(async S=>{l.current?.abort();let p=new AbortController;l.current=p;let b=++g.current,y=()=>v.current&&g.current===b;y()&&(u(!0),i(null));try{let U=await r.request(S,{...c.current,signal:p.signal});return y()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let h=Dn(U);throw y()&&(i(h),u(!1),c.current?.onError?.(h)),h}},[r]),k=wt(S=>{R(S).catch(()=>{})},[R]),m=wt(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:k,mutateAsync:R,data:o,error:s,isPending:a,reset:m}}import{useCallback as lr,useEffect as qn,useMemo as Hn,useRef as tt,useState as Ut}from"react";function dr(e){return e instanceof Error?e:new Error(String(e))}var Wn=e=>typeof e=="string"?e:String(e);function Bn(e,t){let r=Hn(()=>Ie(e),[e]),[o,n]=Ut(""),[s,i]=Ut(!1),[a,u]=Ut(null),c=tt(t);c.current=t;let g=tt(0),l=tt(null),v=tt(!0);qn(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let R=lr(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),k=lr(async m=>{l.current?.cancel();let S=++g.current,p=()=>v.current&&g.current===S,b=c.current,y=b?.parseChunk??Wn,U=b?.buildPayload??(P=>({prompt:P}));p()&&(n(""),u(null),i(!0));let{parseChunk:h,buildPayload:C,onFinish:T,onError:x,...N}=b??{},d="",E;try{E=r.requestStream(U(m),N),l.current=E}catch(P){let I=dr(P);p()&&(u(I),i(!1),b?.onError?.(I));return}try{for await(let P of E){if(g.current!==S)break;d+=y(P),p()&&n(d)}p()&&(i(!1),b?.onFinish?.(d))}catch(P){let I=dr(P);p()&&(u(I),i(!1),b?.onError?.(I))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:k,stop:R,isStreaming:s,error:a}}import{useCallback as pr,useEffect as jn,useMemo as Kn,useRef as Le,useState as rt}from"react";function mr(e){return e instanceof Error?e:new Error(String(e))}var $n=e=>typeof e=="string"?e:String(e),fr=0;function At(e){return fr+=1,`${e}-${fr}`}function Xn(e,t){let r=Kn(()=>Ie(e),[e]),[o,n]=rt(()=>(t?.initialMessages??[]).map(y=>({id:y.id??At("msg"),role:y.role,content:y.content}))),[s,i]=rt(""),[a,u]=rt(!1),[c,g]=rt(null),l=Le(t);l.current=t;let v=Le(o);v.current=o;let R=Le(s);R.current=s;let k=Le(0),m=Le(null),S=Le(!0);jn(()=>(S.current=!0,()=>{S.current=!1,m.current?.cancel(),m.current=null}),[]);let p=pr(()=>{k.current++,m.current?.cancel(),m.current=null,S.current&&u(!1)},[]),b=pr(async y=>{let U=y===void 0,h=(U?R.current:y)??"";if(!h.trim())return;m.current?.cancel();let T=++k.current,x=()=>S.current&&k.current===T,N=l.current,d=N?.parseChunk??$n,E={id:At("msg"),role:"user",content:h},P={id:At("msg"),role:"assistant",content:""},I=[...v.current,E].map(H=>({role:H.role,content:H.content})),D=[...v.current,E,P];v.current=D,n(D),U&&i(""),g(null),u(!0);let q=N?.buildPayload??(H=>({messages:H})),{initialMessages:L,parseChunk:A,buildPayload:F,onFinish:j,onError:$,...W}=N??{},J=H=>{n(K=>K.map(ae=>ae.id===P.id?{...ae,content:H}:ae))},Q="",X;try{X=r.requestStream(q(I),W),m.current=X}catch(H){let K=mr(H);x()&&(g(K),u(!1),N?.onError?.(K));return}try{for await(let H of X){if(k.current!==T)break;Q+=d(H),x()&&J(Q)}x()&&(u(!1),N?.onFinish?.({...P,content:Q}))}catch(H){let K=mr(H);x()&&(g(K),u(!1),N?.onError?.(K))}finally{m.current===X&&(m.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:b,stop:p,isStreaming:a,error:c}}import{useCallback as be,useEffect as gr,useMemo as Jn,useRef as Sr,useState as hr}from"react";import{createInputPresencePublisher as zn,INPUT_PRESENCE_DEFAULT_HZ as Gn,INPUT_PRESENCE_FIELD as Yn}from"@urun-sh/core";var Mt=[];function Zn(e,t={}){let{field:r=Yn,hz:o=Gn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Jn(()=>s?zn({awareness:{setLocalStateField:(h,C)=>s.setField(h,C)},field:r,hz:o}):null,[s,r,o]),a=Sr(null);a.current=i;let[u,c]=hr(!1),[g,l]=hr(Mt),v=Sr(!1);gr(()=>{if(i)return()=>i.dispose()},[i]);let R=be(()=>{let h=a.current;l(h?h.heldKeys():Mt)},[]),k=be(()=>{a.current?.clear(),l(Mt)},[]);gr(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,C=()=>{if(h()){v.current=!1,c(!0);return}v.current||(c(!1),k())},T=P=>{h()&&(a.current?.keyDown(P.key),R())},x=P=>{a.current?.keyUp(P.key),R()},N=P=>{h()&&a.current?.movePointer(P.movementX,P.movementY)},d=P=>{h()&&a.current?.setButtons(P.buttons)},E=()=>{k()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",T),n.addEventListener("keyup",x),n.addEventListener("mousemove",N),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",T),n.removeEventListener("keyup",x),n.removeEventListener("mousemove",N),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,k,R]);let m=be(h=>{h.requestPointerLock?.()},[]),S=be(()=>{v.current=!0,c(!0)},[]),p=be(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),k()},[n,k]),b=be(h=>{a.current?.keyDown(h),R()},[R]),y=be(h=>{a.current?.keyUp(h),R()},[R]),U=be((h,C)=>{a.current?.movePointer(h,C)},[]);return{engage:m,engageTouch:S,release:p,engaged:u,heldKeys:g,pressKey:b,releaseKey:y,movePointer:U}}import{forwardRef as co,useEffect as Er,useImperativeHandle as lo,useMemo as po,useRef as st}from"react";import{createCameraWarp as mo}from"@urun-sh/core";import{forwardRef as oo,useCallback as Pe,useEffect as je,useImperativeHandle as so,useRef as ne,useState as yr}from"react";import{derivedLegRole as io}from"@urun-sh/core";var nt=null;function Qn(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=Qn();return e?(nt=new e,nt):null}function Oe(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as eo,useContext as vr}from"react";import{jsx as no}from"react/jsx-runtime";var _t=eo(null);function to({session:e,children:t}){return no(_t.Provider,{value:e,children:t})}function de(){return vr(_t)}function ro(){let e=vr(_t);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as Cr,jsxs as uo}from"react/jsx-runtime";function ao(e,t){return e-t>>>0<2147483648}var kr=1e3;function br(...e){console.debug("[video]",...e)}function Pr(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function Rr(e,t,r){return r?[r,t]:[e,t]}var Ve=oo(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:R,poster:k,children:m,onTrack:S,onFirstFrame:p,frameMarker:b,onFrameMarkerReached:y,onFrameMarkerUnsupported:U,onUnlockChange:h}=t,C=de(),T=o??C,x=ne(null),N=ne(null),[d,E]=yr(!1),[P,I]=yr(!1),D=ne(!1),q=ne(null),L=ne(S);L.current=S;let A=ne(h);A.current=h;let F=ne(p);F.current=p;let j=ne(y);j.current=y;let $=ne(U);$.current=U;let W=ne(b??null);W.current=b??null;let J=Pe(f=>{q.current!==f&&(q.current=f,A.current?.(f))},[]),Q=ne(null),X=ne(null),H=Pe((f,M=!1)=>{if(!M&&f===Q.current||(Q.current=f,X.current?.(),X.current=null,D.current=!1,I(!1),!f))return;let w=x.current;if(!w)return;let B=W.current,oe=B?.rtpTimestamp??null,fe=!1,_=()=>{fe||(fe=!0,$.current?.())};B&&oe==null&&_();let ge=B!=null&&oe!=null,Ae=he=>{X.current?.(),X.current=null,D.current=!0,I(!0),F.current?.(),he&&j.current?.()};if(typeof w.requestVideoFrameCallback=="function"){let he=!1,O=0,V=(se,ie)=>{if(!he){if(ge){let ue=ie?.rtpTimestamp;if(typeof ue!="number"){_(),Ae(!1);return}if(!ao(ue,oe)){O=w.requestVideoFrameCallback(V);return}Ae(!0);return}Ae(!1)}};O=w.requestVideoFrameCallback(V),X.current=()=>{he=!0,w.cancelVideoFrameCallback?.(O)};return}ge&&_();let Se=()=>{let he=w.getVideoPlaybackQuality?.();(he?he.totalVideoFrames>0:w.readyState>=2&&w.videoWidth>0)&&Ae(!1)};w.addEventListener("loadeddata",Se),w.addEventListener("timeupdate",Se),w.addEventListener("playing",Se),X.current=()=>{w.removeEventListener("loadeddata",Se),w.removeEventListener("timeupdate",Se),w.removeEventListener("playing",Se)},Se()},[]);je(()=>()=>{X.current?.(),X.current=null},[]);let K=b==null?null:`${b.rtpTimestamp??""}|${b.ptsMs??""}`,ae=ne(K);je(()=>{if(ae.current===K||(ae.current=K,K==null))return;let f=Q.current;f&&H(f,!0)},[K,H]);let G=Pe(()=>{if(typeof MediaStream>"u")return null;N.current||(N.current=new MediaStream);let f=x.current;return f&&f.srcObject!==N.current&&(f.srcObject=N.current),N.current},[]),ee=Pe(f=>{let M=x.current;if(!M)return;let w=M.play();!w||typeof w.then!="function"||w.then(()=>{M.muted||J(!0)}).catch(B=>{if((B instanceof Error?B.name:String(B))==="NotAllowedError"&&!M.muted){br(`play() blocked pending a user gesture (${f})`),J(!1);return}br(`play() failed (${f})`,B)})},[J]),ke=Pe(()=>{let f=x.current;f&&(G(),!f.muted&&(ee("gesture"),Oe(),J(!0)))},[G,ee,J]),te=Pe(f=>{let M=G();if(M){for(let w of M.getVideoTracks())w!==f&&M.removeTrack(w);if(f&&!M.getVideoTracks().includes(f)){M.addTrack(f);let w=x.current;w&&(w.srcObject=M)}f&&ee("track-attach"),E(f!==null),H(f),L.current?.(f)}},[G,ee,H]),me=Pe(f=>{let M=G();if(M){for(let w of M.getAudioTracks())w!==f&&M.removeTrack(w);f&&!M.getAudioTracks().includes(f)&&M.addTrack(f),f&&ee("audio-attach")}},[G,ee]),re=Pe(f=>{x.current=f,f&&(a?(f.muted=!0,f.defaultMuted=!0,f.setAttribute("muted",""),q.current=null):(f.muted=!1,f.defaultMuted=!1,f.removeAttribute("muted")),f.setAttribute("playsinline",""),f.setAttribute("webkit-playsinline",""),G())},[G,a]);so(r,()=>({get element(){return x.current},get live(){return N.current?N.current.getVideoTracks().length>0:!1},get framed(){return D.current},unlock:ke,get unlocked(){return q.current===!0}}),[ke]);let Y=io(n)!==void 0;je(()=>{Y&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[Y,n]);let z=i!==void 0;return je(()=>{if(z){te(i??null);return}if(Y){te(null);return}if(!T)return;let f=Pr(T,Rr(n,"video")),M=()=>{let _=N.current;return _?_.getVideoTracks()[0]??null:null},w=_=>{if(_!==M()&&(te(_),_)){let ge=()=>{M()===_&&te(null)};_.addEventListener("ended",ge)}},B=f.track;B&&B.readyState==="live"&&w(B);let oe=f.on("track",_=>{_&&_.readyState!=="live"||w(_)}),fe=setInterval(()=>{let _=f.track;_&&_.readyState==="live"&&w(_)},kr);return()=>{oe(),clearInterval(fe)}},[T,n,Y,z,i,te]),je(()=>{if(z||!T||s===!1||Y)return;let f=Pr(T,Rr(n,"audio",s)),M=()=>{let _=N.current;return _?_.getAudioTracks()[0]??null:null},w=_=>{if(_!==M()&&(me(_),_)){let ge=()=>{M()===_&&me(null)};_.addEventListener("ended",ge)}},B=f.track;B&&B.readyState==="live"&&w(B);let oe=f.on("track",_=>{_&&_.readyState!=="live"||w(_)}),fe=setInterval(()=>{let _=f.track;_&&_.readyState==="live"&&w(_)},kr);return()=>{oe(),clearInterval(fe)}},[T,n,Y,s,z,me]),uo("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":d?"true":"false","data-urun-video-framed":P?"true":"false",children:[Cr("video",{ref:re,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),d?null:R,k===void 0?null:Cr("div",{"data-urun-video-poster":"","aria-hidden":P||void 0,style:{position:"absolute",inset:0,...P?{opacity:0,pointerEvents:"none"}:null},children:k}),m]})});import{jsx as Tr,jsxs as So}from"react/jsx-runtime";var fo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},go=co(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=st(null),R=st(null),k=st(0),m=st(g);m.current=g;let S=po(()=>mo(m.current),[]);return lo(r,()=>({get video(){return v.current},get canvas(){return R.current},warp:S,get lastDrawTs(){return k.current}}),[S]),Er(()=>{if(!i)return;let p=0,b=0,y=null,U=C=>{typeof C.requestVideoFrameCallback=="function"&&(y=C,b=C.requestVideoFrameCallback(function T(){S.frameArrived(),b=C.requestVideoFrameCallback(T)}))},h=C=>{p=requestAnimationFrame(h);let T=R.current,x=v.current?.element??null;if(!T||!x||(x!==y&&(y&&b&&y.cancelVideoFrameCallback?.(b),U(x)),x.readyState<2))return;S.tick(C);let N=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(T.clientWidth*N)),E=Math.max(1,Math.round(T.clientHeight*N));(T.width!==d||T.height!==E)&&(T.width=d,T.height=E);let P=T.getContext("2d");if(!P)return;let I=S.transform(),D=x.videoWidth||d,q=x.videoHeight||E,A=Math.max(d/D,E/q)*(1+a)*I.scale;P.setTransform(A,0,0,A,d/2+I.translateX*d,E/2+I.translateY*E),P.drawImage(x,-D/2,-q/2),k.current=C};return p=requestAnimationFrame(h),()=>{cancelAnimationFrame(p),y&&b&&y.cancelVideoFrameCallback?.(b)}},[i,a,S]),Er(()=>{if(!i||!u||!l)return;let p=()=>!!l.pointerLockElement,b=T=>{p()&&S.keyDown(T.key)},y=T=>S.keyUp(T.key),U=T=>{p()&&S.pointerDelta(T.movementX,T.movementY)},h=()=>{p()||S.clearKeys()},C=()=>S.clearKeys();return l.addEventListener("keydown",b),l.addEventListener("keyup",y),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",h),l.defaultView?.addEventListener("blur",C),()=>{l.removeEventListener("keydown",b),l.removeEventListener("keyup",y),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",h),l.defaultView?.removeEventListener("blur",C)}},[i,u,l,S]),i?So(Ve,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Tr("canvas",{ref:R,style:fo,"data-urun-warp":""}),n]}):Tr(Ve,{ref:v,...s,children:n})});var wr=new Map;function ho(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);wr.set(e,{component:t,schema:r})}function xr(e,t){let r=wr.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 yo,jsx as it}from"react/jsx-runtime";function vo({name:e,props:t,fallback:r}){let o=xr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?it(yo,{children:r}):it("div",{className:"urun-component-error",role:"alert",children:it("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return it(n,{...o.validatedProps})}import{z as Ke}from"zod";import{jsx as Nt,jsxs as Ur}from"react/jsx-runtime";var ko=Ke.object({step:Ke.number().min(0),total:Ke.number().min(1),label:Ke.string().optional(),variant:Ke.enum(["default","success","error"]).default("default")});function Ar(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function bo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Ar(e);return Ur("div",{className:"urun-progress-card","data-variant":n,children:[o&&Nt("div",{className:"urun-progress-label",children:o}),Nt("div",{className:"urun-progress-bar",children:Nt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Ur("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as It}from"zod";import{jsx as Mr,jsxs as Eo}from"react/jsx-runtime";var Po=It.object({state:It.enum(["thinking","generating","idle","error"]),message:It.string().optional()}),Ro={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function _r(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Ro[t]??t;return{state:t,message:n,isActive:o}}function Co(e){let{state:t,message:r,isActive:o}=_r(e);return Eo("span",{className:"urun-status-badge","data-state":t,children:[Mr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Mr("span",{className:"urun-status-message",children:r})]})}import{useRef as Nr,useEffect as To}from"react";import{z as Lt}from"zod";import{jsx as Ir,jsxs as Uo}from"react/jsx-runtime";var wo=Lt.object({text:Lt.string(),streaming:Lt.boolean().default(!1)});function Lr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function xo(e){let{text:t,streaming:r}=Lr(e),o=Nr(null),n=Nr(0);return To(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Uo("div",{className:"urun-text-stream",children:[Ir("span",{ref:o,className:"urun-text-content"}),r&&Ir("span",{className:"urun-text-cursor"})]})}import{z as at}from"zod";import{jsx as Or,jsxs as _o}from"react/jsx-runtime";var Ao=at.object({src:at.string().url(),alt:at.string().optional(),caption:at.string().optional()});function Vr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Mo(e){let{src:t,alt:r,caption:o}=Vr(e);return _o("figure",{className:"urun-image-frame",children:[Or("img",{className:"urun-image",src:t,alt:r}),o&&Or("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Re}from"zod";import{jsx as Ot,jsxs as Lo}from"react/jsx-runtime";var No=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 Io(e){let{metrics:t}=Dr(e);return Ot("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Lo("div",{className:"urun-metric-card",children:[Ot("div",{className:"urun-metric-label",children:r.label}),Ot("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Oo}from"react";import{jsx as Do}from"react/jsx-runtime";var Vo=Oo(function(t,r){let{stream:o="image",...n}=t;return Do(Ve,{ref:r,stream:o,...n})});import{forwardRef as Fo,useCallback as De,useEffect as Vt,useImperativeHandle as qo,useRef as Fe}from"react";import{observePageLifecycle as Ho}from"@urun-sh/core";import{jsx as jo}from"react/jsx-runtime";var Wo=1e3,Fr=200;function Dt(...e){console.debug("[audio]",...e)}var ut=Fo(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=de(),v=o??l,R=Fe(null),k=Fe(null),m=Fe(null),S=Fe(null),p=Fe(u);p.current=u;let b=Fe(c);b.current=c;let y=De(d=>{m.current!==d&&(m.current=d,b.current?.(d))},[]),U=De(()=>{if(typeof MediaStream>"u")return null;k.current||(k.current=new MediaStream);let d=R.current;return d&&d.srcObject!==k.current&&(d.srcObject=k.current),k.current},[]),h=De(d=>{let E=R.current;if(!E)return;let P=E.play();!P||typeof P.then!="function"||P.then(()=>{E.muted||y(!0)}).catch(I=>{let D=I instanceof Error?I.name:String(I);if(D==="AbortError"){Dt(`play() aborted (${d}); retrying in ${Fr}ms`),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=null,h(`${d}:retry`)},Fr);return}if(D==="NotAllowedError"){Dt(`play() blocked pending a user gesture (${d})`),y(!1);return}Dt(`play() failed (${d})`,I)})},[y]),C=De(d=>{let E=U();if(E){for(let P of E.getAudioTracks())P!==d&&E.removeTrack(P);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&h("track-attach"),p.current?.(d)}},[U,h]),T=De(()=>{let d=R.current;d&&(U(),d.muted=!1,h("gesture"),Oe(),y(!0))},[U,h,y]);qo(r,()=>({unlock:T,get unlocked(){return m.current===!0},get element(){return R.current}}),[T]);let x=De(d=>{R.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),g?.(d)},[U,g]),N=s!==void 0;return Vt(()=>{if(N){C(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let L=k.current;return L?L.getAudioTracks()[0]??null:null},P=L=>{if(L!==E()&&(C(L),L)){let A=()=>{E()===L&&C(null)};L.addEventListener("ended",A)}},I=d.track;I&&I.readyState==="live"&&P(I);let D=d.on("track",L=>{L&&L.readyState!=="live"||P(L)}),q=setInterval(()=>{let L=d.track;L&&L.readyState==="live"&&P(L)},Wo);return()=>{D(),clearInterval(q)}},[v,n,N,s,C]),Vt(()=>Ho(()=>{Oe(),m.current===!0&&h("foreground")}),[h]),Vt(()=>()=>{S.current&&clearTimeout(S.current)},[]),jo("audio",{ref:x,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Bo=ut;import{forwardRef as Ko,useCallback as qe,useEffect as qr,useImperativeHandle as $o,useRef as ye}from"react";import{observePageLifecycle as Xo,sessionFailureFromMediaError as Jo,sharedCaptureController as zo}from"@urun-sh/core";import{jsx as Yo}from"react/jsx-runtime";var Hr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ct(...e){console.debug("[voice]",...e)}var lt=Ko(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Hr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:R,onUnlockChange:k,capture:m}=t,S=de(),p=o??S,b=ye(null),y=ye(null),U=ye(null),h=ye([]),C=ye(!1),T=ye(g);T.current=g;let x=ye(l);x.current=l;let N=ye(v);N.current=v;let d=qe(A=>{C.current!==A&&(C.current=A,T.current?.(A))},[]),E=qe(()=>{for(let A of h.current)A();h.current=[],U.current?.release(),U.current=null,y.current&&(y.current=null,N.current?.(null))},[]),P=qe(async()=>{let A=U.current;if(A){let W=await A.update(i);return y.current=A.stream,N.current?.(A.stream),W}let j=await(m??zo()).claim("audio",i);U.current=j,h.current=[j.onTrack((W,J)=>{y.current=J,N.current?.(J),C.current&&p?.stream(n).attach(W).catch(Q=>ct("mic re-attach after one-capture re-acquire failed",Q))}),j.onLost(W=>{U.current=null,h.current=[],y.current=null,N.current?.(null),d(!1),x.current?.(W)})],y.current=j.stream,N.current?.(j.stream);let $=j.track;if(!$)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return $},[m,i,p,n,d]),I=qe(async()=>{E(),d(!1),await p?.stream(n).detach().catch(()=>{})},[p,n,E,d]),D=qe(async()=>{if(!p)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");b.current?.unlock();let A;try{A=await P()}catch($){E();let W=Jo($,p.status);throw x.current?.(W),W}p.connect?.();let F;for(let $=1;$<=u;$++)try{await p.whenLive(a!==void 0?{timeout:a}:void 0),await p.stream(n).attach(A),d(!0);return}catch(W){F=W,ct(`start attempt ${$}/${u} failed`,W),$<u&&await new Promise(J=>setTimeout(J,c))}E(),d(!1);let j=F instanceof Error?F:new Error(String(F??"voice start failed"));throw x.current?.(j),j},[p,n,a,u,c,P,E,d]);$o(r,()=>({start:D,stop:I,unlock:()=>b.current?.unlock(),get active(){return C.current},get micStream(){return y.current},get audio(){return b.current}}),[D,I]);let q=ye(!1),L=qe(async()=>{if(!p||!C.current||q.current)return;let A=y.current?.getAudioTracks()[0]??null;if(A&&A.readyState==="live"){try{await p.stream(n).attach(A)}catch(F){ct("foreground mic re-assert failed (will retry on next pass)",F)}return}q.current=!0;try{let F=await P();await p.stream(n).attach(F)}catch(F){let j=F instanceof Error?F:new Error(String(F));ct("foreground mic re-acquire failed",j),x.current?.(j)}finally{q.current=!1}},[p,n,P]);return qr(()=>{let A=()=>{L()};return p&&typeof p.onRecovery=="function"?p.onRecovery(A):Xo(A)},[p,L]),qr(()=>E,[E]),s?Yo(ut,{ref:b,session:p,stream:n,onTrack:R,onUnlockChange:k}):null}),Go=lt;import{forwardRef as es,useEffect as ts,useImperativeHandle as rs,useRef as Wr,useState as ns}from"react";import{useEffect as Zo,useState as Qo}from"react";var Ft={level:0,speaking:!1};function qt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Qo(Ft);return Zo(()=>{if(!e){i(Ft);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),R=setInterval(()=>{g.getByteTimeDomainData(l);let k=0;for(let S=0;S<l.length;S++){let p=(l[S]-128)/128;k+=p*p}let m=Math.sqrt(k/l.length);i(S=>{let p=m>n;return Math.abs(S.level-m)<.005&&S.speaking===p?S:{level:m,speaking:p}})},o);return()=>{clearInterval(R),c.disconnect(),i(Ft)}},[e,r,o,n]),s}import{Fragment as as,jsx as dt,jsxs as us}from"react/jsx-runtime";var os={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},ss={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},is=es(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,R=de(),k=o??R,m=Wr(null),[S,p]=ns(null),b=Wr(l);b.current=l;let{level:y,speaking:U}=qt(a?S:null);return rs(r,()=>({start:()=>{let h=m.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>m.current?.stop()??Promise.resolve(),get active(){return m.current?.active??!1},get micStream(){return m.current?.micStream??null}}),[]),ts(()=>{!i||!k||m.current?.start().catch(()=>{})},[i,k]),us(as,{children:[dt(lt,{ref:m,session:k,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:h=>{p(h),b.current?.(h)}}),a?dt("span",{className:u,style:os,"data-urun-mic":"","data-urun-mic-active":S?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(y*100)/100,children:dt("span",{style:ss,children:dt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(y*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as cs,sessionFailureFromMediaError as ls,sharedCaptureController as ds}from"@urun-sh/core";import{forwardRef as jr,useCallback as pe,useEffect as Ht,useImperativeHandle as ps,useRef as Z,useState as $e}from"react";import{jsx as Ce,jsxs as Br}from"react/jsx-runtime";var Kr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Wt(...e){console.debug("[camera]",...e)}function ms(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function fs(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var $r=jr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:R,videoClassName:k,onActiveChange:m,onError:S,onStream:p,onTrack:b,children:y,capture:U,flipControl:h="auto",flipControlClassName:C,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let x=i?"user":a?"environment":u??"environment",N=de(),d=o??N,E=Z(null),P=Z(null),I=Z(null),D=Z([]),q=Z(null),L=Z(!1),A=Z(!1),F=Z(x),[j,$]=$e(x),[W,J]=$e(!1),[Q,X]=$e(null),[H,K]=$e(!1),[ae]=$e(ms),G=Z(m);G.current=m;let ee=Z(S);ee.current=S;let ke=Z(p);ke.current=p;let te=Z(b);te.current=b;let me=Z(T);me.current=T;let re=pe(O=>{L.current!==O&&(L.current=O,J(O),G.current?.(O))},[]);Ht(()=>{if(!W){X(null);return}let O=!1,V=()=>{fs().then(ie=>{O||(X(ie),ie&&me.current?.(ie))})};V();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",V),()=>{O=!0,se.removeEventListener?.("devicechange",V)}):()=>{O=!0}},[W]);let Y=pe(O=>{let V=E.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=O,O&&V.play()?.catch?.(se=>Wt("preview play() failed",se)))},[]),z=pe(()=>{A.current=!1,q.current?.(),q.current=null;for(let O of D.current)O();D.current=[],I.current?.release(),I.current=null,P.current&&(P.current=null,ke.current?.(null),te.current?.(null)),Y(null)},[Y]),f=pe((O,V)=>{q.current?.(),P.current=V,Y(V),ke.current?.(V);let se=()=>{P.current===V&&(Wt("camera track ended (device removed or permission revoked)"),z(),re(!1))};O.addEventListener("ended",se),q.current=()=>O.removeEventListener("ended",se)},[Y,z,re]),M=pe(async O=>{let V=n!==!1;if(V&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...Kr,...s,facingMode:O},ie;try{let ue=I.current;if(ue)ie=await ue.update(se);else{let He=await(U??ds()).claim("video",se);if(I.current=He,D.current=[He.onTrack((We,un)=>{f(We,un),L.current&&(!V||!d||d.stream(n).attachVideo(We).then(()=>te.current?.(We)).catch(cn=>Wt("camera re-publish after one-capture re-acquire failed",cn)))}),He.onLost(We=>{I.current=null,D.current=[],z(),re(!1),ee.current?.(We)})],!He.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ie=He.track}}catch(ue){let Me=ls(ue,d?.status);throw ee.current?.(Me),Me}F.current=O,$(O),f(ie,I.current?.stream??new MediaStream([ie]));try{V&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ie)),A.current=V?n:!1}catch(ue){z(),re(!1);let Me=ue instanceof Error?ue:new Error(String(ue));throw ee.current?.(Me),Me}te.current?.(ie),re(!0)},[d,n,s,l,U,f,z,re]),w=pe(O=>M(O?.facingMode??F.current),[M]),B=pe(async O=>{let V=A.current===n;L.current&&F.current===O&&V||await M(O)},[M,n]),oe=pe(()=>M(F.current==="environment"?"user":"environment"),[M]),fe=pe(async()=>{z(),re(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,z,re]),_=pe(async O=>{let V=E.current;if(!V)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await cs(V,O)},[]);ps(r,()=>({start:w,stop:fe,flip:oe,setFacingMode:B,capturePhoto:_,get active(){return L.current},get facingMode(){return F.current},get stream(){return P.current},get element(){return E.current}}),[w,fe,oe,B,_]);let ge=Z(B);if(ge.current=B,Ht(()=>{c&&(n!==!1&&!d||ge.current(x).catch(()=>{}))},[c,d,x,n]),Ht(()=>z,[z]),!v)return null;let Ae=g==="auto"?j==="user":g,Se=W&&(h===!0||h==="auto"&&ae&&(Q?.length??0)>1),he=()=>{H||(K(!0),oe().catch(()=>{}).finally(()=>K(!1)))};return Br("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[Ce("video",{ref:E,className:k,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ae?{transform:"scaleX(-1)"}:{}}}),Se?Ce("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:he,disabled:H,className:C,style:C?{opacity:H?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:H?.6:1},children:Br("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:[Ce("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),Ce("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),Ce("path",{d:"M14.5 10.5v1.6h-1.6"}),Ce("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),Ce("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,y]})}),gs=jr(function({preview:t=!0,...r},o){return Ce($r,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as Ss,normalizeReferenceImage as hs,referenceImageErrorMessage as vs}from"@urun-sh/core";import{useCallback as Xe,useEffect as ys,useRef as Bt,useState as Je}from"react";function ks(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=Je(null),[a,u]=Je(null),[c,g]=Je(!1),[l,v]=Je(null),[R]=Je(Ss),k=Bt(n);k.current=n;let m=Bt(null),S=Bt(0),p=Xe(C=>{m.current&&URL.revokeObjectURL(m.current),m.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,u(m.current),i(C),k.current?.(C)},[]);ys(()=>()=>{S.current++,m.current&&URL.revokeObjectURL(m.current),m.current=null},[]);let b=Xe(async C=>{let T=++S.current;g(!0),v(null);try{let x=await C();if(S.current!==T)return;p(x)}catch(x){if(S.current!==T)return;v(vs(x))}finally{S.current===T&&g(!1)}},[p]),y=Xe(C=>b(()=>hs(C,{maxSize:t,type:r,quality:o,source:"file"})),[b,t,r,o]),U=Xe(C=>b(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[b,t,r,o]),h=Xe(()=>{S.current++,v(null),g(!1),p(null)},[p]);return{reference:s,previewUrl:a,pick:y,capture:U,clear:h,busy:c,error:l,cameraAvailable:R}}import{useEffect as bs,useState as Ps}from"react";function Rs(e,t){let[r,o]=Ps(null);return bs(()=>{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 Us}from"react";import{useEffect as ws,useMemo as xs}from"react";import{createStore as Cs}from"zustand/vanilla";import{useStore as Es}from"zustand";var Ts=()=>{};function jt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Cs(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Ts,u=(c=>Es(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function ze(e,t){let r=xs(()=>jt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return ws(()=>r.bind(),[r]),r}function As(e,t,r){let n=ze(e,t)(r??(a=>a)),s=Us(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as Ms,useState as _s}from"react";var we=200;function Ee(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Ge(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Kt(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 $t(e,t,r={}){let o=r.cap??200,[n,s]=_s([]);return Ms(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Ee(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as pt,jsxs as Ye}from"react/jsx-runtime";function Ns({session:e,name:t,cap:r,className:o}){let n=$t(e,t,{cap:r});return Ye("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ye("div",{className:"urun-stream-tail-meta",children:[pt("code",{children:t}),Ye("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),pt("div",{className:"urun-stream-tail-log",children:n.length===0?Ye("span",{className:"urun-stream-tail-empty",children:["Waiting for ",pt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ye("div",{className:"urun-stream-tail-line",children:[pt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Ge(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Is,useState as Xr}from"react";import{jsx as xe,jsxs as mt}from"react/jsx-runtime";function ft({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Xr(""),[i,a]=Xr(null),u=Is(()=>{let c=Kt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return mt("div",{className:"urun-doc-patch",children:[xe("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),mt("div",{className:"urun-doc-patch-actions",children:[xe("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?xe("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Ls({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=ze(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return mt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[mt("div",{className:"urun-doc-panel-meta",children:[xe("code",{children:t}),xe("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),xe("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?xe(ft,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Os,useState as Vs}from"react";import{jsx as Ze,jsxs as zr}from"react/jsx-runtime";function Jr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ds({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=Vs([]);return Os(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Ee(u,{at:Date.now(),direction:"in",text:Jr(Ge(a))},r))}):void 0),[e,t,r]),zr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Ze(ft,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ee(u,{at:Date.now(),direction:"out",text:Jr(a)},r))}}),Ze("div",{className:"urun-control-sender-log",children:n.length===0?Ze("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>zr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Ze("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Ze("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Fs,useState as qs}from"react";import{jsx as gt,jsxs as Ws}from"react/jsx-runtime";function Hs({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=qs([]),a=t.join(","),u=r.join(",");return Fs(()=>{if(i([]),!e)return;let c=(l,v)=>i(R=>Ee(R,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",R=>c("track",`${l}: ${R?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),gt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?gt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>Ws("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[gt("span",{className:"urun-event-spine-kind",children:c.kind})," ",gt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as ni,isWakingPhase as oi}from"@urun-sh/core";import{useEffect as Bs,useState as js}from"react";function ce(e){let[t,r]=js(e?.phase??null);return Bs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as zs}from"@urun-sh/core";import{useEffect as Ks,useRef as $s,useState as Xs}from"react";import{isWakingPhase as Js}from"@urun-sh/core";function Xt(e){let t=ce(e),r=Js(t?.name),o=$s(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=Xs(s);return Ks(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Gs,jsx as Gr,jsxs as Yr}from"react/jsx-runtime";function Jt({session:e,render:t,className:r}){let o=Xt(e);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:t?t(o):Yr(Gs,{children:[Gr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",Yr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Qs,useState as ei}from"react";import{useEffect as Zr,useRef as Ys,useState as Qr}from"react";var Zs={event:null,elapsedMs:0};function zt(e,t){let[r,o]=Qr(null),n=Ys(0);Zr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Qr(0);return Zr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Zs}import{jsx as en,jsxs as tn}from"react/jsx-runtime";var ti={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 ri(e){let[t,r]=ei(!1);return Qs(()=>{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 Gt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=zt(e,t),i=ri(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return en("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):tn("div",{className:"urun-activation-overlay-card",children:[en("span",{className:"urun-activation-overlay-copy",children:a.hint??ti[u]})," ",tn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ue,jsxs as Yt}from"react/jsx-runtime";var si={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function ii({session:e,className:t}){let r=ce(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Yt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ue("span",{className:"urun-session-status-dot","data-phase":o}),Ue("span",{className:"urun-session-status-label",children:si[o]}),n?Ue("span",{className:"urun-session-status-detail",children:n}):null]})}function ai({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ce(e);if(s?.name==="live")return Yt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ue(Gt,{session:e})]});let i=r?r(s):Ue("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&oi(s.name)?Ue(Jt,{session:e}):s&&s.name!=="idle"?ni(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Yt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ue("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ui,useState as ci}from"react";import{jsx as pi}from"react/jsx-runtime";function rn(e){return ce(e)?.endsAt??null}function li(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 di({session:e,urgentMs:t=6e4,className:r}){let n=rn(e)?.getTime()??null,[s,i]=ci(()=>n===null?null:Math.max(0,n-Date.now()));if(ui(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=li(s);return pi("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as nn,jsxs as gi}from"react/jsx-runtime";var mi=new Set(["expired","ended","error"]);function fi({session:e,onNewSession:t,children:r,className:o}){let n=ce(e);if(!n||!mi.has(n.name))return null;let s=r?r(n):nn("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 gi("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?nn("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as on,useMemo as Si,useState as sn}from"react";import{jsx as St,jsxs as yi}from"react/jsx-runtime";function Zt(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 an(e){let t=Si(()=>e?e.doc("control"):null,[e]),[r,o]=sn(()=>t?Zt(t.get("idle")):null);return on(()=>{if(!t){o(null);return}return o(Zt(t.get("idle"))),t.on("change",()=>o(Zt(t.get("idle"))))},[t]),r}function hi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function vi({session:e,onStillHere:t,className:r}){let o=an(e),n=o?.deadlineEpochS??null,[s,i]=sn(null);if(on(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return St("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:yi("div",{className:"urun-idle-warning-card",children:[St("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),St("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${hi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),St("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as ki,useEffect as bi,useState as Pi}from"react";import{prewake as Ri}from"@urun-sh/core";function Ci(e){let t=ki(_e),[r,o]=Pi(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return bi(()=>{if(!a||!u||!n||!s)return;let v=!1,R=()=>{Ri({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(m=>{v||o(m)}).catch(()=>{})};R();let k=setInterval(R,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(k)}},[n,s,i,a,u,c,g,l]),r}import{useEffect as Ei,useState as Ti}from"react";function wi(e){let[t,r]=Ti(null);return Ei(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}import{describeSessionPhase as Wl,isWakingPhase as Bl}from"@urun-sh/core";export{ut as Audio,$r as Camera,vo as ComponentRenderer,Kr as DEFAULT_CAMERA_CONSTRAINTS,we as DEFAULT_LOG_CAP,Hr as DEFAULT_VOICE_CONSTRAINTS,ft as DocPatchForm,Vo as Image,Mo as ImageFrame,Ao as ImageFrameSchema,Io as MetricsPanel,No as MetricsPanelSchema,is as Mic,vn as OPERATOR_CHORD_LABEL,hn as OPERATOR_TOKEN_STORAGE_KEY,bo as ProgressCard,ko as ProgressCardSchema,go as ReprojectedVideo,to as Session,Co as StatusBadge,Po as StatusBadgeSchema,xo as TextStream,wo as TextStreamSchema,Gt as UrunActivationOverlay,Bo as UrunAudio,ht as UrunAuthProvider,gs as UrunCamera,Ds as UrunControlSender,Ls as UrunDocPanel,Be as UrunErrorBoundary,Hs as UrunEventSpine,vi as UrunIdleWarning,ln as UrunJwtProvider,wn as UrunProvider,di as UrunSessionClock,fi as UrunSessionEnded,ai as UrunSessionGate,ii as UrunSessionStatus,Jt as UrunSessionWaking,Ns as UrunStreamTail,Go as UrunVoice,Ve as Video,lt as Voice,Qe as authMode,jt as createDocStore,Wl as describeSessionPhase,Ge as formatPayload,ot as getUrunAudioContext,Bl as isWakingPhase,Kt as parseJsonObject,Ee as pushCapped,nr as readOperatorToken,ho as registerComponent,Oe as resumeUrunAudioContext,le as urunPublicEnv,zt as useActivation,Ln as useApp,Xn as useChat,Bn as useCompletion,kt as useConfirmOnLeave,ze as useDocStore,Vr as useImageFrame,Zn as useInputPresence,Dr as useMetricsPanel,yt as useOperatorOverride,Ar as useProgressCard,ks as useReferenceImage,Fn as useRequest,ro as useSession,As as useSessionDoc,rn as useSessionEndsAt,an as useSessionIdle,ce as useSessionPhase,wi as useSessionStats,Rs as useSessionTrack,Xt as useSessionWake,_r as useStatusBadge,$t as useStreamMessages,Lr as useTextStream,qt as useUrunAudioLevel,vt as useUrunAuth,Ci as useUrunPrewake,fn as usesWorkOSAuth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urun-sh/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.58",
|
|
4
4
|
"description": "React bindings for the urun TypeScript SDK",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dev": "tsup --watch"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@urun-sh/core": "^0.2.
|
|
56
|
+
"@urun-sh/core": "^0.2.58",
|
|
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",
|