@urun-sh/react 0.2.39 → 0.2.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, RefObject, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
3
+ import { ReactNode, RefObject, Component, ErrorInfo, CSSProperties, ComponentType } from 'react';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
5
  export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
@@ -264,6 +264,97 @@ interface InputPresenceControls {
264
264
 
265
265
  declare function useInputPresence(session: InputPresenceSession | null | undefined, options?: UseInputPresenceOptions): InputPresenceControls;
266
266
 
267
+ interface VideoStreamSource {
268
+
269
+ readonly track: MediaStreamTrack | null;
270
+
271
+ on(event: 'track', handler: (track: MediaStreamTrack | null) => void): () => void;
272
+ }
273
+
274
+ interface VideoSessionSource {
275
+ stream(name: string): VideoStreamSource;
276
+ }
277
+
278
+ interface VideoHandle {
279
+
280
+ readonly element: HTMLVideoElement | null;
281
+
282
+ readonly live: boolean;
283
+
284
+ readonly framed: boolean;
285
+ }
286
+
287
+ interface FrameMarker {
288
+ rtpTimestamp?: number | null;
289
+ ptsMs?: number | null;
290
+ }
291
+
292
+ interface VideoProps {
293
+
294
+ session?: VideoSessionSource | null;
295
+
296
+ stream?: string;
297
+
298
+ track?: MediaStreamTrack | null;
299
+
300
+ audioStream?: string | false;
301
+
302
+ muted?: boolean;
303
+
304
+ mirror?: boolean;
305
+
306
+ objectFit?: CSSProperties['objectFit'];
307
+
308
+ className?: string;
309
+
310
+ style?: CSSProperties;
311
+
312
+ videoClassName?: string;
313
+
314
+ placeholder?: ReactNode;
315
+
316
+ poster?: ReactNode;
317
+
318
+ children?: ReactNode;
319
+
320
+ onTrack?: (track: MediaStreamTrack | null) => void;
321
+
322
+ onFirstFrame?: () => void;
323
+
324
+ frameMarker?: FrameMarker | null;
325
+
326
+ onFrameMarkerReached?: () => void;
327
+
328
+ onFrameMarkerUnsupported?: () => void;
329
+ }
330
+
331
+ declare const Video: react.ForwardRefExoticComponent<VideoProps & react.RefAttributes<VideoHandle>>;
332
+
333
+ interface ReprojectedVideoWarpOptions extends CameraWarpOptions {
334
+
335
+ enabled?: boolean;
336
+
337
+ overscan?: number;
338
+
339
+ captureInput?: boolean;
340
+
341
+ documentTarget?: Document | null;
342
+ }
343
+ interface ReprojectedVideoProps extends VideoProps {
344
+ warp?: ReprojectedVideoWarpOptions;
345
+ }
346
+ interface ReprojectedVideoHandle {
347
+
348
+ readonly video: VideoHandle | null;
349
+
350
+ readonly canvas: HTMLCanvasElement | null;
351
+
352
+ readonly warp: CameraWarp;
353
+
354
+ readonly lastDrawTs: number;
355
+ }
356
+ declare const ReprojectedVideo: react.ForwardRefExoticComponent<ReprojectedVideoProps & react.RefAttributes<ReprojectedVideoHandle>>;
357
+
267
358
  interface RegisteredComponent {
268
359
  component: ComponentType<any>;
269
360
  schema: ZodSchema;
@@ -346,12 +437,12 @@ declare const ImageFrameSchema: z.ZodObject<{
346
437
  caption: z.ZodOptional<z.ZodString>;
347
438
  }, "strip", z.ZodTypeAny, {
348
439
  src: string;
349
- alt?: string | undefined;
350
440
  caption?: string | undefined;
441
+ alt?: string | undefined;
351
442
  }, {
352
443
  src: string;
353
- alt?: string | undefined;
354
444
  caption?: string | undefined;
445
+ alt?: string | undefined;
355
446
  }>;
356
447
  type ImageFrameProps = z.infer<typeof ImageFrameSchema>;
357
448
  declare function useImageFrame(props: ImageFrameProps): {
@@ -439,61 +530,6 @@ declare function Session({ session, children }: SessionProps): react_jsx_runtime
439
530
 
440
531
  declare function useSession(): ScopedSession;
441
532
 
442
- interface VideoStreamSource {
443
-
444
- readonly track: MediaStreamTrack | null;
445
-
446
- on(event: 'track', handler: (track: MediaStreamTrack | null) => void): () => void;
447
- }
448
-
449
- interface VideoSessionSource {
450
- stream(name: string): VideoStreamSource;
451
- }
452
-
453
- interface VideoHandle {
454
-
455
- readonly element: HTMLVideoElement | null;
456
-
457
- readonly live: boolean;
458
-
459
- readonly framed: boolean;
460
- }
461
-
462
- interface VideoProps {
463
-
464
- session?: VideoSessionSource | null;
465
-
466
- stream?: string;
467
-
468
- track?: MediaStreamTrack | null;
469
-
470
- audioStream?: string | false;
471
-
472
- muted?: boolean;
473
-
474
- mirror?: boolean;
475
-
476
- objectFit?: CSSProperties['objectFit'];
477
-
478
- className?: string;
479
-
480
- style?: CSSProperties;
481
-
482
- videoClassName?: string;
483
-
484
- placeholder?: ReactNode;
485
-
486
- poster?: ReactNode;
487
-
488
- children?: ReactNode;
489
-
490
- onTrack?: (track: MediaStreamTrack | null) => void;
491
-
492
- onFirstFrame?: () => void;
493
- }
494
-
495
- declare const Video: react.ForwardRefExoticComponent<VideoProps & react.RefAttributes<VideoHandle>>;
496
-
497
533
  type ImageProps = Omit<VideoProps, 'muted' | 'mirror' | 'stream'> & {
498
534
 
499
535
  stream?: string;
@@ -687,6 +723,15 @@ interface CameraSessionSource {
687
723
 
688
724
  type CameraFacing = 'user' | 'environment';
689
725
 
726
+ interface CapturePhotoOptions {
727
+
728
+ maxSize?: number;
729
+
730
+ type?: 'image/png' | 'image/jpeg';
731
+
732
+ quality?: number;
733
+ }
734
+
690
735
  interface CameraHandle {
691
736
 
692
737
  start(options?: {
@@ -699,6 +744,8 @@ interface CameraHandle {
699
744
 
700
745
  setFacingMode(mode: CameraFacing): Promise<void>;
701
746
 
747
+ capturePhoto(options?: CapturePhotoOptions): Promise<ReferenceImage>;
748
+
702
749
  readonly active: boolean;
703
750
 
704
751
  readonly facingMode: CameraFacing;
@@ -712,7 +759,7 @@ interface CameraProps {
712
759
 
713
760
  session?: CameraSessionSource | null;
714
761
 
715
- stream?: string;
762
+ stream?: string | false;
716
763
 
717
764
  constraints?: MediaTrackConstraints;
718
765
 
@@ -774,6 +821,42 @@ type UrunCameraStreamSource = CameraStreamSource;
774
821
 
775
822
  type UrunCameraSessionSource = CameraSessionSource;
776
823
 
824
+ interface ReferenceImageCameraSource {
825
+ capturePhoto(options?: CapturePhotoOptions): Promise<ReferenceImage>;
826
+ }
827
+
828
+ interface UseReferenceImageOptions {
829
+
830
+ maxSize?: number;
831
+
832
+ type?: 'image/png' | 'image/jpeg';
833
+
834
+ quality?: number;
835
+
836
+ onChange?: (reference: ReferenceImage | null) => void;
837
+ }
838
+
839
+ interface UseReferenceImageResult {
840
+
841
+ reference: ReferenceImage | null;
842
+
843
+ previewUrl: string | null;
844
+
845
+ pick(file: Blob): Promise<void>;
846
+
847
+ capture(camera: ReferenceImageCameraSource): Promise<void>;
848
+
849
+ clear(): void;
850
+
851
+ busy: boolean;
852
+
853
+ error: string | null;
854
+
855
+ cameraAvailable: boolean;
856
+ }
857
+
858
+ declare function useReferenceImage(options?: UseReferenceImageOptions): UseReferenceImageResult;
859
+
777
860
  interface UseUrunAudioLevelOptions {
778
861
 
779
862
  fftSize?: number;
@@ -1097,4 +1180,4 @@ interface UrunActivationOverlayProps {
1097
1180
 
1098
1181
  declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
1099
1182
 
1100
- export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, OPERATOR_CHORD_LABEL, OPERATOR_TOKEN_STORAGE_KEY, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunIdleWarning, type UrunIdleWarningProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, readOperatorToken, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
1183
+ 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 };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
- import { ReactNode, RefObject, Component, ErrorInfo, ComponentType, CSSProperties } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
3
+ import { ReactNode, RefObject, Component, ErrorInfo, CSSProperties, ComponentType } from 'react';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CameraWarpOptions, CameraWarp, CaptureController, ReferenceImage, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
5
5
  export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
@@ -264,6 +264,97 @@ interface InputPresenceControls {
264
264
 
265
265
  declare function useInputPresence(session: InputPresenceSession | null | undefined, options?: UseInputPresenceOptions): InputPresenceControls;
266
266
 
267
+ interface VideoStreamSource {
268
+
269
+ readonly track: MediaStreamTrack | null;
270
+
271
+ on(event: 'track', handler: (track: MediaStreamTrack | null) => void): () => void;
272
+ }
273
+
274
+ interface VideoSessionSource {
275
+ stream(name: string): VideoStreamSource;
276
+ }
277
+
278
+ interface VideoHandle {
279
+
280
+ readonly element: HTMLVideoElement | null;
281
+
282
+ readonly live: boolean;
283
+
284
+ readonly framed: boolean;
285
+ }
286
+
287
+ interface FrameMarker {
288
+ rtpTimestamp?: number | null;
289
+ ptsMs?: number | null;
290
+ }
291
+
292
+ interface VideoProps {
293
+
294
+ session?: VideoSessionSource | null;
295
+
296
+ stream?: string;
297
+
298
+ track?: MediaStreamTrack | null;
299
+
300
+ audioStream?: string | false;
301
+
302
+ muted?: boolean;
303
+
304
+ mirror?: boolean;
305
+
306
+ objectFit?: CSSProperties['objectFit'];
307
+
308
+ className?: string;
309
+
310
+ style?: CSSProperties;
311
+
312
+ videoClassName?: string;
313
+
314
+ placeholder?: ReactNode;
315
+
316
+ poster?: ReactNode;
317
+
318
+ children?: ReactNode;
319
+
320
+ onTrack?: (track: MediaStreamTrack | null) => void;
321
+
322
+ onFirstFrame?: () => void;
323
+
324
+ frameMarker?: FrameMarker | null;
325
+
326
+ onFrameMarkerReached?: () => void;
327
+
328
+ onFrameMarkerUnsupported?: () => void;
329
+ }
330
+
331
+ declare const Video: react.ForwardRefExoticComponent<VideoProps & react.RefAttributes<VideoHandle>>;
332
+
333
+ interface ReprojectedVideoWarpOptions extends CameraWarpOptions {
334
+
335
+ enabled?: boolean;
336
+
337
+ overscan?: number;
338
+
339
+ captureInput?: boolean;
340
+
341
+ documentTarget?: Document | null;
342
+ }
343
+ interface ReprojectedVideoProps extends VideoProps {
344
+ warp?: ReprojectedVideoWarpOptions;
345
+ }
346
+ interface ReprojectedVideoHandle {
347
+
348
+ readonly video: VideoHandle | null;
349
+
350
+ readonly canvas: HTMLCanvasElement | null;
351
+
352
+ readonly warp: CameraWarp;
353
+
354
+ readonly lastDrawTs: number;
355
+ }
356
+ declare const ReprojectedVideo: react.ForwardRefExoticComponent<ReprojectedVideoProps & react.RefAttributes<ReprojectedVideoHandle>>;
357
+
267
358
  interface RegisteredComponent {
268
359
  component: ComponentType<any>;
269
360
  schema: ZodSchema;
@@ -346,12 +437,12 @@ declare const ImageFrameSchema: z.ZodObject<{
346
437
  caption: z.ZodOptional<z.ZodString>;
347
438
  }, "strip", z.ZodTypeAny, {
348
439
  src: string;
349
- alt?: string | undefined;
350
440
  caption?: string | undefined;
441
+ alt?: string | undefined;
351
442
  }, {
352
443
  src: string;
353
- alt?: string | undefined;
354
444
  caption?: string | undefined;
445
+ alt?: string | undefined;
355
446
  }>;
356
447
  type ImageFrameProps = z.infer<typeof ImageFrameSchema>;
357
448
  declare function useImageFrame(props: ImageFrameProps): {
@@ -439,61 +530,6 @@ declare function Session({ session, children }: SessionProps): react_jsx_runtime
439
530
 
440
531
  declare function useSession(): ScopedSession;
441
532
 
442
- interface VideoStreamSource {
443
-
444
- readonly track: MediaStreamTrack | null;
445
-
446
- on(event: 'track', handler: (track: MediaStreamTrack | null) => void): () => void;
447
- }
448
-
449
- interface VideoSessionSource {
450
- stream(name: string): VideoStreamSource;
451
- }
452
-
453
- interface VideoHandle {
454
-
455
- readonly element: HTMLVideoElement | null;
456
-
457
- readonly live: boolean;
458
-
459
- readonly framed: boolean;
460
- }
461
-
462
- interface VideoProps {
463
-
464
- session?: VideoSessionSource | null;
465
-
466
- stream?: string;
467
-
468
- track?: MediaStreamTrack | null;
469
-
470
- audioStream?: string | false;
471
-
472
- muted?: boolean;
473
-
474
- mirror?: boolean;
475
-
476
- objectFit?: CSSProperties['objectFit'];
477
-
478
- className?: string;
479
-
480
- style?: CSSProperties;
481
-
482
- videoClassName?: string;
483
-
484
- placeholder?: ReactNode;
485
-
486
- poster?: ReactNode;
487
-
488
- children?: ReactNode;
489
-
490
- onTrack?: (track: MediaStreamTrack | null) => void;
491
-
492
- onFirstFrame?: () => void;
493
- }
494
-
495
- declare const Video: react.ForwardRefExoticComponent<VideoProps & react.RefAttributes<VideoHandle>>;
496
-
497
533
  type ImageProps = Omit<VideoProps, 'muted' | 'mirror' | 'stream'> & {
498
534
 
499
535
  stream?: string;
@@ -687,6 +723,15 @@ interface CameraSessionSource {
687
723
 
688
724
  type CameraFacing = 'user' | 'environment';
689
725
 
726
+ interface CapturePhotoOptions {
727
+
728
+ maxSize?: number;
729
+
730
+ type?: 'image/png' | 'image/jpeg';
731
+
732
+ quality?: number;
733
+ }
734
+
690
735
  interface CameraHandle {
691
736
 
692
737
  start(options?: {
@@ -699,6 +744,8 @@ interface CameraHandle {
699
744
 
700
745
  setFacingMode(mode: CameraFacing): Promise<void>;
701
746
 
747
+ capturePhoto(options?: CapturePhotoOptions): Promise<ReferenceImage>;
748
+
702
749
  readonly active: boolean;
703
750
 
704
751
  readonly facingMode: CameraFacing;
@@ -712,7 +759,7 @@ interface CameraProps {
712
759
 
713
760
  session?: CameraSessionSource | null;
714
761
 
715
- stream?: string;
762
+ stream?: string | false;
716
763
 
717
764
  constraints?: MediaTrackConstraints;
718
765
 
@@ -774,6 +821,42 @@ type UrunCameraStreamSource = CameraStreamSource;
774
821
 
775
822
  type UrunCameraSessionSource = CameraSessionSource;
776
823
 
824
+ interface ReferenceImageCameraSource {
825
+ capturePhoto(options?: CapturePhotoOptions): Promise<ReferenceImage>;
826
+ }
827
+
828
+ interface UseReferenceImageOptions {
829
+
830
+ maxSize?: number;
831
+
832
+ type?: 'image/png' | 'image/jpeg';
833
+
834
+ quality?: number;
835
+
836
+ onChange?: (reference: ReferenceImage | null) => void;
837
+ }
838
+
839
+ interface UseReferenceImageResult {
840
+
841
+ reference: ReferenceImage | null;
842
+
843
+ previewUrl: string | null;
844
+
845
+ pick(file: Blob): Promise<void>;
846
+
847
+ capture(camera: ReferenceImageCameraSource): Promise<void>;
848
+
849
+ clear(): void;
850
+
851
+ busy: boolean;
852
+
853
+ error: string | null;
854
+
855
+ cameraAvailable: boolean;
856
+ }
857
+
858
+ declare function useReferenceImage(options?: UseReferenceImageOptions): UseReferenceImageResult;
859
+
777
860
  interface UseUrunAudioLevelOptions {
778
861
 
779
862
  fftSize?: number;
@@ -1097,4 +1180,4 @@ interface UrunActivationOverlayProps {
1097
1180
 
1098
1181
  declare function UrunActivationOverlay({ session, stream, videoElement, render, className, }: UrunActivationOverlayProps): react_jsx_runtime.JSX.Element | null;
1099
1182
 
1100
- export { type ActivationProgress, Audio, type AudioHandle, type AudioProps, type AudioSessionSource, type AudioStreamSource, Camera, type CameraFacing, type CameraHandle, type CameraProps, type CameraSessionSource, type CameraStreamSource, type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, Image, ImageFrame, ImageFrameSchema, type ImageHandle, type ImageProps, type InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, Mic, type MicHandle, type MicProps, OPERATOR_CHORD_LABEL, OPERATOR_TOKEN_STORAGE_KEY, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type ScopedSession, type ScopedStreamSource, Session, type SessionIdleState, type SessionProps, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunActivationOverlay, type UrunActivationOverlayProps, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunIdleWarning, type UrunIdleWarningProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, Video, type VideoHandle, type VideoProps, type VideoSessionSource, type VideoStreamSource, Voice, type VoiceHandle, type VoiceProps, type VoiceSessionSource, type VoiceStreamSource, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, readOperatorToken, registerComponent, resumeUrunAudioContext, urunPublicEnv, useActivation, useApp, useChat, useCompletion, useConfirmOnLeave, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useOperatorOverride, useProgressCard, useRequest, useSession, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
1183
+ 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 };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var Kt=Object.defineProperty;var Hn=Object.getOwnPropertyDescriptor;var Wn=Object.getOwnPropertyNames;var Bn=Object.prototype.hasOwnProperty;var $n=(e,t)=>{for(var r in t)Kt(e,r,{get:t[r],enumerable:!0})},Kn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wn(t))!Bn.call(e,n)&&n!==r&&Kt(e,n,{get:()=>t[n],enumerable:!(o=Hn(t,n))||o.enumerable});return e};var jn=e=>Kn(Kt({},"__esModule",{value:!0}),e);var bo={};$n(bo,{Audio:()=>it,Camera:()=>lr,ComponentRenderer:()=>Br,DEFAULT_CAMERA_CONSTRAINTS:()=>cr,DEFAULT_LOG_CAP:()=>Pe,DEFAULT_VOICE_CONSTRAINTS:()=>ir,DocPatchForm:()=>ct,Image:()=>sn,ImageFrame:()=>Yr,ImageFrameSchema:()=>Gr,MetricsPanel:()=>Qr,MetricsPanelSchema:()=>Zr,Mic:()=>fn,OPERATOR_CHORD_LABEL:()=>Er,OPERATOR_TOKEN_STORAGE_KEY:()=>xr,ProgressCard:()=>Kr,ProgressCardSchema:()=>$r,Session:()=>en,StatusBadge:()=>Jr,StatusBadgeSchema:()=>jr,TextStream:()=>Xr,TextStreamSchema:()=>zr,UrunActivationOverlay:()=>Ft,UrunAudio:()=>ln,UrunAuthProvider:()=>jt,UrunCamera:()=>gn,UrunControlSender:()=>xn,UrunDocPanel:()=>Pn,UrunErrorBoundary:()=>Ie,UrunEventSpine:()=>Tn,UrunIdleWarning:()=>Nn,UrunJwtProvider:()=>br,UrunProvider:()=>Ur,UrunSessionClock:()=>Un,UrunSessionEnded:()=>_n,UrunSessionGate:()=>An,UrunSessionStatus:()=>Rn,UrunSessionWaking:()=>Ot,UrunStreamTail:()=>bn,UrunVoice:()=>pn,Video:()=>kt,Voice:()=>at,authMode:()=>Ge,createDocStore:()=>wt,describeSessionPhase:()=>Wt.describeSessionPhase,formatPayload:()=>Be,getUrunAudioContext:()=>ot,isWakingPhase:()=>Wt.isWakingPhase,parseJsonObject:()=>At,pushCapped:()=>ve,readOperatorToken:()=>Jt,registerComponent:()=>Hr,resumeUrunAudioContext:()=>st,urunPublicEnv:()=>ge,useActivation:()=>Dt,useApp:()=>_r,useChat:()=>Vr,useCompletion:()=>Lr,useConfirmOnLeave:()=>ht,useDocStore:()=>We,useImageFrame:()=>rr,useInputPresence:()=>Fr,useMetricsPanel:()=>nr,useOperatorOverride:()=>St,useProgressCard:()=>Qt,useRequest:()=>Nr,useSession:()=>tn,useSessionDoc:()=>kn,useSessionEndsAt:()=>dr,useSessionIdle:()=>mr,useSessionPhase:()=>ue,useSessionTrack:()=>Sn,useSessionWake:()=>Lt,useStatusBadge:()=>er,useStreamMessages:()=>Mt,useTextStream:()=>tr,useUrunAudioLevel:()=>xt,useUrunAuth:()=>ft,useUrunPrewake:()=>Ln,usesWorkOSAuth:()=>yr});module.exports=jn(bo);var ne=require("react");var hr=require("react"),Xe=require("react/jsx-runtime"),Ie=class extends hr.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,Xe.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Xe.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Xe.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var vr=require("react"),Le=(0,vr.createContext)(null);function Ee(e){return e&&e.trim()?e.trim():void 0}function ge(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ee(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return Ee(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ee(typeof process<"u"?process.env?.[e]:void 0)}}function Ge(){let e=ge("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ge("VERCEL_ENV")==="production"?"workos":ge("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function yr(){return Ge()==="workos"}var Oe=require("react"),Pr=require("react/jsx-runtime"),kr=(0,Oe.createContext)(null);function jt({getAccessToken:e,children:t}){let r=(0,Oe.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Pr.jsx)(kr.Provider,{value:r,children:t})}var br=jt;function ft(){return(0,Oe.useContext)(kr)}var gt=require("react"),xr="urun.operator_token",Tr=null,Cr="op",Er="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function wr(){return typeof window<"u"}function Jt(){return Tr}function Jn(){if(!wr())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(Cr);if(!r)return null;Tr=r,t.delete(Cr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function zn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function St(e){let t=(0,gt.useRef)(e);t.current=e,(0,gt.useEffect)(()=>{if(!wr())return;Jn();let r=o=>{if(!zn(o))return;let n=Jt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Rr=require("react");function ht(e=!0){(0,Rr.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 be=require("react/jsx-runtime"),Xn="/api/urun-token",Gn=1e4;function Yn(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 Ar(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 Zn(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,be.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,be.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,be.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Ur({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:d,errorFallback:k,children:P}){let g=n===void 0&&t===void 0;if(!g&&(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(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);ht(f);let[x,S]=(0,ne.useState)(),[N,C]=(0,ne.useState)(),[E,m]=(0,ne.useState)(null),L=(0,ne.useRef)(void 0),j=(0,ne.useRef)(null),[O,D]=(0,ne.useState)(null);St($=>D({jwt:$}));let l=ft(),T=ge("NEXT_PUBLIC_SESSION_TOKEN")??ge("NEXT_PUBLIC_URUN_JWT"),v=Ge(),_=O!==null,I=v==="workos"&&!n&&!_&&!g,Q=n??(v==="jwt"?T:void 0)??x??N?.token,A=_?O.jwt:Q,U=s??ge("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),q=I&&!A,W=t??N?.orgId,J=e??N?.gatewayUrl,B=g&&N===void 0,h=g&&N!==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,b=E??h,R=u??Xn,M=(0,ne.useCallback)(async $=>{if(!$?.forceRefresh){let Y=L.current;if(!Y)return Y;let me=Yn(Y);if(me===null||me-Date.now()>Gn)return Y}return(await(j.current??(j.current=(async()=>{try{let Y=await Ar(R);return L.current=Y.token,C(Y),Y}finally{j.current=null}})()))).token},[R]),z=(0,ne.useMemo)(()=>({appId:p,baseUrl:J??"",orgId:W??"",jwt:A,getAccessToken:I?l?.getAccessToken:g&&!_?M:void 0,authProvider:U,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:_?"preempt":void 0}),[p,l,J,U,A,i,W,a,c,I,_,g,M]);return(0,ne.useEffect)(()=>{if(!g)return;let $=new AbortController;return m(null),(async()=>{try{let y=await Ar(R,$.signal);L.current=y.token,C(y)}catch(y){if($.signal.aborted)return;m(y instanceof Error?y:new Error(String(y)))}})(),()=>$.abort()},[g,R]),(0,ne.useEffect)(()=>{if(!I||!l)return;let $=!1,y=l;async function Y(){try{let dt=await y.getAccessToken();$||S(dt??void 0)}catch{$||S(void 0)}}Y();let me=window.setInterval(()=>{Y()},6e4);return()=>{$=!0,window.clearInterval(me)}},[l,I]),(0,be.jsx)(Ie,{fallback:d,children:b?Zn(k,b):q||B?(0,be.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,be.jsx)(Le.Provider,{value:z,children:P})})}var oe=require("react"),Mr=require("@urun-sh/core");function Qn(e,t){return`${e}:${JSON.stringify(t??{})}`}function eo(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 we=new Map;var zt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Xt=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()}},Gt=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 zt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Xt(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 _r(){let e=(0,oe.useContext)(Le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,oe.useReducer)(i=>i+1,0),r=(0,oe.useRef)(new Map),o=(0,oe.useRef)(new Map),n=(0,oe.useRef)(null),s=(0,oe.useMemo)(()=>(0,Mr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,oe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=we.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=we.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=we.get(u);!d||d.refCount!==0||(we.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),(0,oe.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 k=Qn(u,d),P=r.current.get(k);if(P&&!P.disposed)return P;let g=eo(e,u,d),p=we.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),we.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Gt(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},we.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(k,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}var ee=require("react");function De(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 to(e){return e instanceof Error?e:new Error(String(e))}function Nr(e,t){let r=(0,ee.useMemo)(()=>De(e),[e]),[o,n]=(0,ee.useState)(void 0),[s,i]=(0,ee.useState)(null),[a,u]=(0,ee.useState)(!1),c=(0,ee.useRef)(t);c.current=t;let f=(0,ee.useRef)(0),d=(0,ee.useRef)(null),k=(0,ee.useRef)(!0);(0,ee.useEffect)(()=>(k.current=!0,()=>{k.current=!1,d.current?.abort()}),[]);let P=(0,ee.useCallback)(async x=>{d.current?.abort();let S=new AbortController;d.current=S;let N=++f.current,C=()=>k.current&&f.current===N;C()&&(u(!0),i(null));try{let E=await r.request(x,{...c.current,signal:S.signal});return C()&&(n(E),u(!1),c.current?.onSuccess?.(E)),E}catch(E){let m=to(E);throw C()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),g=(0,ee.useCallback)(x=>{P(x).catch(()=>{})},[P]),p=(0,ee.useCallback)(()=>{f.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}var te=require("react");function Ir(e){return e instanceof Error?e:new Error(String(e))}var ro=e=>typeof e=="string"?e:String(e);function Lr(e,t){let r=(0,te.useMemo)(()=>De(e),[e]),[o,n]=(0,te.useState)(""),[s,i]=(0,te.useState)(!1),[a,u]=(0,te.useState)(null),c=(0,te.useRef)(t);c.current=t;let f=(0,te.useRef)(0),d=(0,te.useRef)(null),k=(0,te.useRef)(!0);(0,te.useEffect)(()=>(k.current=!0,()=>{k.current=!1,d.current?.cancel(),d.current=null}),[]);let P=(0,te.useCallback)(()=>{f.current++,d.current?.cancel(),d.current=null,k.current&&i(!1)},[]),g=(0,te.useCallback)(async p=>{d.current?.cancel();let x=++f.current,S=()=>k.current&&f.current===x,N=c.current,C=N?.parseChunk??ro,E=N?.buildPayload??(v=>({prompt:v}));S()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:L,onFinish:j,onError:O,...D}=N??{},l="",T;try{T=r.requestStream(E(p),D),d.current=T}catch(v){let _=Ir(v);S()&&(u(_),i(!1),N?.onError?.(_));return}try{for await(let v of T){if(f.current!==x)break;l+=C(v),S()&&n(l)}S()&&(i(!1),N?.onFinish?.(l))}catch(v){let _=Ir(v);S()&&(u(_),i(!1),N?.onError?.(_))}finally{d.current===T&&(d.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}var Z=require("react");function Or(e){return e instanceof Error?e:new Error(String(e))}var no=e=>typeof e=="string"?e:String(e),Dr=0;function Yt(e){return Dr+=1,`${e}-${Dr}`}function Vr(e,t){let r=(0,Z.useMemo)(()=>De(e),[e]),[o,n]=(0,Z.useState)(()=>(t?.initialMessages??[]).map(C=>({id:C.id??Yt("msg"),role:C.role,content:C.content}))),[s,i]=(0,Z.useState)(""),[a,u]=(0,Z.useState)(!1),[c,f]=(0,Z.useState)(null),d=(0,Z.useRef)(t);d.current=t;let k=(0,Z.useRef)(o);k.current=o;let P=(0,Z.useRef)(s);P.current=s;let g=(0,Z.useRef)(0),p=(0,Z.useRef)(null),x=(0,Z.useRef)(!0);(0,Z.useEffect)(()=>(x.current=!0,()=>{x.current=!1,p.current?.cancel(),p.current=null}),[]);let S=(0,Z.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,x.current&&u(!1)},[]),N=(0,Z.useCallback)(async C=>{let E=C===void 0,m=(E?P.current:C)??"";if(!m.trim())return;p.current?.cancel();let j=++g.current,O=()=>x.current&&g.current===j,D=d.current,l=D?.parseChunk??no,T={id:Yt("msg"),role:"user",content:m},v={id:Yt("msg"),role:"assistant",content:""},_=[...k.current,T].map(M=>({role:M.role,content:M.content})),I=[...k.current,T,v];k.current=I,n(I),E&&i(""),f(null),u(!0);let Q=D?.buildPayload??(M=>({messages:M})),{initialMessages:A,parseChunk:U,buildPayload:q,onFinish:W,onError:J,...B}=D??{},h=M=>{n(z=>z.map($=>$.id===v.id?{...$,content:M}:$))},b="",R;try{R=r.requestStream(Q(_),B),p.current=R}catch(M){let z=Or(M);O()&&(f(z),u(!1),D?.onError?.(z));return}try{for await(let M of R){if(g.current!==j)break;b+=l(M),O()&&h(b)}O()&&(u(!1),D?.onFinish?.({...v,content:b}))}catch(M){let z=Or(M);O()&&(f(z),u(!1),D?.onError?.(z))}finally{p.current===R&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:N,stop:S,isStreaming:a,error:c}}var G=require("react"),Ve=require("@urun-sh/core"),Zt=[];function Fr(e,t={}){let{field:r=Ve.INPUT_PRESENCE_FIELD,hz:o=Ve.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,Ve.createInputPresencePublisher)({awareness:{setLocalStateField:(m,L)=>s.setField(m,L)},field:r,hz:o}):null,[s,r,o]),a=(0,G.useRef)(null);a.current=i;let[u,c]=(0,G.useState)(!1),[f,d]=(0,G.useState)(Zt),k=(0,G.useRef)(!1);(0,G.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let P=(0,G.useCallback)(()=>{let m=a.current;d(m?m.heldKeys():Zt)},[]),g=(0,G.useCallback)(()=>{a.current?.clear(),d(Zt)},[]);(0,G.useEffect)(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,L=()=>{if(m()){k.current=!1,c(!0);return}k.current||(c(!1),g())},j=v=>{m()&&(a.current?.keyDown(v.key),P())},O=v=>{a.current?.keyUp(v.key),P()},D=v=>{m()&&a.current?.movePointer(v.movementX,v.movementY)},l=v=>{m()&&a.current?.setButtons(v.buttons)},T=()=>{g()};return n.addEventListener("pointerlockchange",L),n.addEventListener("keydown",j),n.addEventListener("keyup",O),n.addEventListener("mousemove",D),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",T),()=>{n.removeEventListener("pointerlockchange",L),n.removeEventListener("keydown",j),n.removeEventListener("keyup",O),n.removeEventListener("mousemove",D),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",T)}},[n,g,P]);let p=(0,G.useCallback)(m=>{m.requestPointerLock?.()},[]),x=(0,G.useCallback)(()=>{k.current=!0,c(!0)},[]),S=(0,G.useCallback)(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),N=(0,G.useCallback)(m=>{a.current?.keyDown(m),P()},[P]),C=(0,G.useCallback)(m=>{a.current?.keyUp(m),P()},[P]),E=(0,G.useCallback)((m,L)=>{a.current?.movePointer(m,L)},[]);return{engage:p,engageTouch:x,release:S,engaged:u,heldKeys:f,pressKey:N,releaseKey:C,movePointer:E}}var qr=new Map;function Hr(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);qr.set(e,{component:t,schema:r})}function Wr(e,t){let r=qr.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 Re=require("react/jsx-runtime");function Br({name:e,props:t,fallback:r}){let o=Wr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,Re.jsx)(Re.Fragment,{children:r}):(0,Re.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,Re.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,Re.jsx)(n,{...o.validatedProps})}var Fe=require("zod"),Ae=require("react/jsx-runtime"),$r=Fe.z.object({step:Fe.z.number().min(0),total:Fe.z.number().min(1),label:Fe.z.string().optional(),variant:Fe.z.enum(["default","success","error"]).default("default")});function Qt(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 Kr(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Qt(e);return(0,Ae.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Ae.jsx)("div",{className:"urun-progress-label",children:o}),(0,Ae.jsx)("div",{className:"urun-progress-bar",children:(0,Ae.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Ae.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var vt=require("zod"),Ye=require("react/jsx-runtime"),jr=vt.z.object({state:vt.z.enum(["thinking","generating","idle","error"]),message:vt.z.string().optional()}),oo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function er(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??oo[t]??t;return{state:t,message:n,isActive:o}}function Jr(e){let{state:t,message:r,isActive:o}=er(e);return(0,Ye.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,Ye.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Ye.jsx)("span",{className:"urun-status-message",children:r})]})}var Ze=require("react"),yt=require("zod"),Qe=require("react/jsx-runtime"),zr=yt.z.object({text:yt.z.string(),streaming:yt.z.boolean().default(!1)});function tr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Xr(e){let{text:t,streaming:r}=tr(e),o=(0,Ze.useRef)(null),n=(0,Ze.useRef)(0);return(0,Ze.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Qe.jsxs)("div",{className:"urun-text-stream",children:[(0,Qe.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Qe.jsx)("span",{className:"urun-text-cursor"})]})}var et=require("zod"),tt=require("react/jsx-runtime"),Gr=et.z.object({src:et.z.string().url(),alt:et.z.string().optional(),caption:et.z.string().optional()});function rr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Yr(e){let{src:t,alt:r,caption:o}=rr(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 Se=require("zod"),qe=require("react/jsx-runtime"),Zr=Se.z.object({metrics:Se.z.array(Se.z.object({label:Se.z.string(),value:Se.z.union([Se.z.string(),Se.z.number()]),unit:Se.z.string().optional()}))});function nr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Qr(e){let{metrics:t}=nr(e);return(0,qe.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,qe.jsxs)("div",{className:"urun-metric-card",children:[(0,qe.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,qe.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var rt=require("react"),rn=require("react/jsx-runtime"),or=(0,rt.createContext)(null);function en({session:e,children:t}){return(0,rn.jsx)(or.Provider,{value:e,children:t})}function pe(){return(0,rt.useContext)(or)}function tn(){let e=(0,rt.useContext)(or);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 V=require("react");var nt=require("react/jsx-runtime"),nn=1e3;function so(...e){console.debug("[video]",...e)}var kt=(0,V.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:k,placeholder:P,poster:g,children:p,onTrack:x,onFirstFrame:S}=t,N=pe(),C=o??N,E=(0,V.useRef)(null),m=(0,V.useRef)(null),[L,j]=(0,V.useState)(!1),[O,D]=(0,V.useState)(!1),l=(0,V.useRef)(!1),T=(0,V.useRef)(x);T.current=x;let v=(0,V.useRef)(S);v.current=S;let _=(0,V.useRef)(null),I=(0,V.useRef)(null),Q=(0,V.useCallback)(h=>{if(h===_.current||(_.current=h,I.current?.(),I.current=null,l.current=!1,D(!1),!h))return;let b=E.current;if(!b)return;let R=()=>{I.current?.(),I.current=null,l.current=!0,D(!0),v.current?.()};if(typeof b.requestVideoFrameCallback=="function"){let z=b.requestVideoFrameCallback(R);I.current=()=>b.cancelVideoFrameCallback?.(z);return}let M=()=>{let z=b.getVideoPlaybackQuality?.();(z?z.totalVideoFrames>0:b.readyState>=2&&b.videoWidth>0)&&R()};b.addEventListener("loadeddata",M),b.addEventListener("timeupdate",M),b.addEventListener("playing",M),I.current=()=>{b.removeEventListener("loadeddata",M),b.removeEventListener("timeupdate",M),b.removeEventListener("playing",M)},M()},[]);(0,V.useEffect)(()=>()=>{I.current?.(),I.current=null},[]);let A=(0,V.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let h=E.current;return h&&h.srcObject!==m.current&&(h.srcObject=m.current),m.current},[]),U=(0,V.useCallback)(h=>{let b=E.current;if(!b)return;let R=b.play();!R||typeof R.catch!="function"||R.catch(M=>so(`play() failed (${h})`,M))},[]),q=(0,V.useCallback)(h=>{let b=A();if(b){for(let R of b.getVideoTracks())R!==h&&b.removeTrack(R);if(h&&!b.getVideoTracks().includes(h)){b.addTrack(h);let R=E.current;R&&(R.srcObject=b)}h&&U("track-attach"),j(h!==null),Q(h),T.current?.(h)}},[A,U,Q]),W=(0,V.useCallback)(h=>{let b=A();if(b){for(let R of b.getAudioTracks())R!==h&&b.removeTrack(R);h&&!b.getAudioTracks().includes(h)&&b.addTrack(h),h&&U("audio-attach")}},[A,U]),J=(0,V.useCallback)(h=>{E.current=h,h&&(a&&(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted","")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),A())},[A,a]);(0,V.useImperativeHandle)(r,()=>({get element(){return E.current},get live(){return m.current?m.current.getVideoTracks().length>0:!1},get framed(){return l.current}}),[]);let B=i!==void 0;return(0,V.useEffect)(()=>{if(B){q(i??null);return}if(!C)return;let h=C.stream(n),b=()=>{let y=m.current;return y?y.getVideoTracks()[0]??null:null},R=y=>{if(y!==b()&&(q(y),y)){let Y=()=>{b()===y&&q(null)};y.addEventListener("ended",Y)}},M=h.track;M&&M.readyState==="live"&&R(M);let z=h.on("track",y=>{y&&y.readyState!=="live"||R(y)}),$=setInterval(()=>{let y=h.track;y&&y.readyState==="live"&&R(y)},nn);return()=>{z(),clearInterval($)}},[C,n,B,i,q]),(0,V.useEffect)(()=>{if(B||!C||s===!1)return;let h=C.stream(s),b=()=>{let y=m.current;return y?y.getAudioTracks()[0]??null:null},R=y=>{if(y!==b()&&(W(y),y)){let Y=()=>{b()===y&&W(null)};y.addEventListener("ended",Y)}},M=h.track;M&&M.readyState==="live"&&R(M);let z=h.on("track",y=>{y&&y.readyState!=="live"||R(y)}),$=setInterval(()=>{let y=h.track;y&&y.readyState==="live"&&R(y)},nn);return()=>{z(),clearInterval($)}},[C,s,B,W]),(0,nt.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...d},"data-urun-video":"","data-urun-video-live":L?"true":"false","data-urun-video-framed":O?"true":"false",children:[(0,nt.jsx)("video",{ref:J,className:k,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),L?null:P,g===void 0?null:(0,nt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":O||void 0,style:{position:"absolute",inset:0,...O?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});var on=require("react");var an=require("react/jsx-runtime"),sn=(0,on.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,an.jsx)(kt,{ref:r,stream:o,...n})});var K=require("react"),cn=require("@urun-sh/core");var bt=null;function io(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(bt)return bt;let e=io();return e?(bt=new e,bt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var dn=require("react/jsx-runtime"),ao=1e3,un=200;function sr(...e){console.debug("[audio]",...e)}var it=(0,K.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=pe(),k=o??d,P=(0,K.useRef)(null),g=(0,K.useRef)(null),p=(0,K.useRef)(null),x=(0,K.useRef)(null),S=(0,K.useRef)(u);S.current=u;let N=(0,K.useRef)(c);N.current=c;let C=(0,K.useCallback)(l=>{p.current!==l&&(p.current=l,N.current?.(l))},[]),E=(0,K.useCallback)(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let l=P.current;return l&&l.srcObject!==g.current&&(l.srcObject=g.current),g.current},[]),m=(0,K.useCallback)(l=>{let T=P.current;if(!T)return;let v=T.play();!v||typeof v.then!="function"||v.then(()=>{T.muted||C(!0)}).catch(_=>{let I=_ instanceof Error?_.name:String(_);if(I==="AbortError"){sr(`play() aborted (${l}); retrying in ${un}ms`),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{x.current=null,m(`${l}:retry`)},un);return}if(I==="NotAllowedError"){sr(`play() blocked pending a user gesture (${l})`),C(!1);return}sr(`play() failed (${l})`,_)})},[C]),L=(0,K.useCallback)(l=>{let T=E();if(T){for(let v of T.getAudioTracks())v!==l&&T.removeTrack(v);l&&!T.getAudioTracks().includes(l)&&T.addTrack(l),l&&m("track-attach"),S.current?.(l)}},[E,m]),j=(0,K.useCallback)(()=>{let l=P.current;l&&(E(),l.muted=!1,m("gesture"),st(),C(!0))},[E,m,C]);(0,K.useImperativeHandle)(r,()=>({unlock:j,get unlocked(){return p.current===!0},get element(){return P.current}}),[j]);let O=(0,K.useCallback)(l=>{P.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),E()),f?.(l)},[E,f]),D=s!==void 0;return(0,K.useEffect)(()=>{if(D){L(s??null);return}if(!k)return;let l=k.stream(n),T=()=>{let A=g.current;return A?A.getAudioTracks()[0]??null:null},v=A=>{if(A!==T()&&(L(A),A)){let U=()=>{T()===A&&L(null)};A.addEventListener("ended",U)}},_=l.track;_&&_.readyState==="live"&&v(_);let I=l.on("track",A=>{A&&A.readyState!=="live"||v(A)}),Q=setInterval(()=>{let A=l.track;A&&A.readyState==="live"&&v(A)},ao);return()=>{I(),clearInterval(Q)}},[k,n,D,s,L]),(0,K.useEffect)(()=>(0,cn.observePageLifecycle)(()=>{st(),p.current===!0&&m("foreground")}),[m]),(0,K.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,dn.jsx)("audio",{ref:O,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),ln=it;var H=require("react"),He=require("@urun-sh/core");var mn=require("react/jsx-runtime"),ir={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Pt(...e){console.debug("[voice]",...e)}var at=(0,H.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=ir,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:d,onMicStream:k,onTrack:P,onUnlockChange:g,capture:p}=t,x=pe(),S=o??x,N=(0,H.useRef)(null),C=(0,H.useRef)(null),E=(0,H.useRef)(null),m=(0,H.useRef)([]),L=(0,H.useRef)(!1),j=(0,H.useRef)(f);j.current=f;let O=(0,H.useRef)(d);O.current=d;let D=(0,H.useRef)(k);D.current=k;let l=(0,H.useCallback)(U=>{L.current!==U&&(L.current=U,j.current?.(U))},[]),T=(0,H.useCallback)(()=>{for(let U of m.current)U();m.current=[],E.current?.release(),E.current=null,C.current&&(C.current=null,D.current?.(null))},[]),v=(0,H.useCallback)(async()=>{let U=E.current;if(U){let B=await U.update(i);return C.current=U.stream,D.current?.(U.stream),B}let W=await(p??(0,He.sharedCaptureController)()).claim("audio",i);E.current=W,m.current=[W.onTrack((B,h)=>{C.current=h,D.current?.(h),L.current&&S?.stream(n).attach(B).catch(b=>Pt("mic re-attach after one-capture re-acquire failed",b))}),W.onLost(B=>{E.current=null,m.current=[],C.current=null,D.current?.(null),l(!1),O.current?.(B)})],C.current=W.stream,D.current?.(W.stream);let J=W.track;if(!J)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return J},[p,i,S,n,l]),_=(0,H.useCallback)(async()=>{T(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,T,l]),I=(0,H.useCallback)(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");N.current?.unlock();let U;try{U=await v()}catch(J){T();let B=(0,He.sessionFailureFromMediaError)(J,S.status);throw O.current?.(B),B}S.connect?.();let q;for(let J=1;J<=u;J++)try{await S.whenLive(a!==void 0?{timeout:a}:void 0),await S.stream(n).attach(U),l(!0);return}catch(B){q=B,Pt(`start attempt ${J}/${u} failed`,B),J<u&&await new Promise(h=>setTimeout(h,c))}T(),l(!1);let W=q instanceof Error?q:new Error(String(q??"voice start failed"));throw O.current?.(W),W},[S,n,a,u,c,v,T,l]);(0,H.useImperativeHandle)(r,()=>({start:I,stop:_,unlock:()=>N.current?.unlock(),get active(){return L.current},get micStream(){return C.current},get audio(){return N.current}}),[I,_]);let Q=(0,H.useRef)(!1),A=(0,H.useCallback)(async()=>{if(!S||!L.current||Q.current)return;let U=C.current?.getAudioTracks()[0]??null;if(U&&U.readyState==="live"){try{await S.stream(n).attach(U)}catch(q){Pt("foreground mic re-assert failed (will retry on next pass)",q)}return}Q.current=!0;try{let q=await v();await S.stream(n).attach(q)}catch(q){let W=q instanceof Error?q:new Error(String(q));Pt("foreground mic re-acquire failed",W),O.current?.(W)}finally{Q.current=!1}},[S,n,v]);return(0,H.useEffect)(()=>{let U=()=>{A()};return S&&typeof S.onRecovery=="function"?S.onRecovery(U):(0,He.observePageLifecycle)(U)},[S,A]),(0,H.useEffect)(()=>T,[T]),s?(0,mn.jsx)(it,{ref:N,session:S,stream:n,onTrack:P,onUnlockChange:g}):null}),pn=at;var le=require("react");var Ct=require("react");var ar={level:0,speaking:!1};function xt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Ct.useState)(ar);return(0,Ct.useEffect)(()=>{if(!e){i(ar);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),P=setInterval(()=>{f.getByteTimeDomainData(d);let g=0;for(let x=0;x<d.length;x++){let S=(d[x]-128)/128;g+=S*S}let p=Math.sqrt(g/d.length);i(x=>{let S=p>n;return Math.abs(x.level-p)<.005&&x.speaking===S?x:{level:p,speaking:S}})},o);return()=>{clearInterval(P),c.disconnect(),i(ar)}},[e,r,o,n]),s}var he=require("react/jsx-runtime"),uo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},co={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},fn=(0,le.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:k}=t,P=pe(),g=o??P,p=(0,le.useRef)(null),[x,S]=(0,le.useState)(null),N=(0,le.useRef)(d);N.current=d;let{level:C,speaking:E}=xt(a?x:null);return(0,le.useImperativeHandle)(r,()=>({start:()=>{let m=p.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,le.useEffect)(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),(0,he.jsxs)(he.Fragment,{children:[(0,he.jsx)(at,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:f,onMicStream:m=>{S(m),N.current?.(m)}}),a?(0,he.jsx)("span",{className:u,style:uo,"data-urun-mic":"","data-urun-mic-active":x?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(C*100)/100,children:(0,he.jsx)("span",{style:co,children:(0,he.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var Tt=require("@urun-sh/core"),w=require("react");var ae=require("react/jsx-runtime"),cr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ur(...e){console.debug("[camera]",...e)}function lo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function po(){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 lr=(0,w.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:k=!1,className:P,videoClassName:g,onActiveChange:p,onError:x,onStream:S,onTrack:N,children:C,capture:E,flipControl:m="auto",flipControlClassName:L,onDevices:j}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let O=i?"user":a?"environment":u??"environment",D=pe(),l=o??D,T=(0,w.useRef)(null),v=(0,w.useRef)(null),_=(0,w.useRef)(null),I=(0,w.useRef)([]),Q=(0,w.useRef)(null),A=(0,w.useRef)(!1),U=(0,w.useRef)(O),[q,W]=(0,w.useState)(O),[J,B]=(0,w.useState)(!1),[h,b]=(0,w.useState)(null),[R,M]=(0,w.useState)(!1),[z]=(0,w.useState)(lo),$=(0,w.useRef)(p);$.current=p;let y=(0,w.useRef)(x);y.current=x;let Y=(0,w.useRef)(S);Y.current=S;let me=(0,w.useRef)(N);me.current=N;let dt=(0,w.useRef)(j);dt.current=j;let ke=(0,w.useCallback)(F=>{A.current!==F&&(A.current=F,B(F),$.current?.(F))},[]);(0,w.useEffect)(()=>{if(!J){b(null);return}let F=!1,X=()=>{po().then(ie=>{F||(b(ie),ie&&dt.current?.(ie))})};X();let re=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof re?.addEventListener=="function"?(re.addEventListener("devicechange",X),()=>{F=!0,re.removeEventListener?.("devicechange",X)}):()=>{F=!0}},[J]);let pt=(0,w.useCallback)(F=>{let X=T.current;X&&(X.muted=!0,X.defaultMuted=!0,X.setAttribute("muted",""),X.setAttribute("playsinline",""),X.setAttribute("webkit-playsinline",""),X.srcObject=F,F&&X.play()?.catch?.(re=>ur("preview play() failed",re)))},[]),fe=(0,w.useCallback)(()=>{Q.current?.(),Q.current=null;for(let F of I.current)F();I.current=[],_.current?.release(),_.current=null,v.current&&(v.current=null,Y.current?.(null),me.current?.(null)),pt(null)},[pt]),Bt=(0,w.useCallback)((F,X)=>{Q.current?.(),v.current=X,pt(X),Y.current?.(X);let re=()=>{v.current===X&&(ur("camera track ended (device removed or permission revoked)"),fe(),ke(!1))};F.addEventListener("ended",re),Q.current=()=>F.removeEventListener("ended",re)},[pt,fe,ke]),_e=(0,w.useCallback)(async F=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let X={...cr,...s,facingMode:F},re;try{let ie=_.current;if(ie)re=await ie.update(X);else{let Je=await(E??(0,Tt.sharedCaptureController)()).claim("video",X);if(_.current=Je,I.current=[Je.onTrack((ze,Fn)=>{Bt(ze,Fn),A.current&&l.stream(n).attachVideo(ze).then(()=>me.current?.(ze)).catch(qn=>ur("camera re-publish after one-capture re-acquire failed",qn))}),Je.onLost(ze=>{_.current=null,I.current=[],fe(),ke(!1),y.current?.(ze)})],!Je.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});re=Je.track}}catch(ie){let Ne=(0,Tt.sessionFailureFromMediaError)(ie,l.status);throw y.current?.(Ne),Ne}U.current=F,W(F),Bt(re,_.current?.stream??new MediaStream([re]));try{l.connect?.(),await l.whenLive(d!==void 0?{timeout:d}:void 0),await l.stream(n).attachVideo(re)}catch(ie){fe(),ke(!1);let Ne=ie instanceof Error?ie:new Error(String(ie));throw y.current?.(Ne),Ne}me.current?.(re),ke(!0)},[l,n,s,d,E,Bt,fe,ke]),fr=(0,w.useCallback)(F=>_e(F?.facingMode??U.current),[_e]),mt=(0,w.useCallback)(async F=>{A.current&&U.current===F||await _e(F)},[_e]),$t=(0,w.useCallback)(()=>_e(U.current==="environment"?"user":"environment"),[_e]),gr=(0,w.useCallback)(async()=>{fe(),ke(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,fe,ke]);(0,w.useImperativeHandle)(r,()=>({start:fr,stop:gr,flip:$t,setFacingMode:mt,get active(){return A.current},get facingMode(){return U.current},get stream(){return v.current},get element(){return T.current}}),[fr,gr,$t,mt]);let Sr=(0,w.useRef)(mt);if(Sr.current=mt,(0,w.useEffect)(()=>{!c||!l||Sr.current(O).catch(()=>{})},[c,l,O]),(0,w.useEffect)(()=>fe,[fe]),!k)return null;let On=f==="auto"?q==="user":f,Dn=J&&(m===!0||m==="auto"&&z&&(h?.length??0)>1),Vn=()=>{R||(M(!0),$t().catch(()=>{}).finally(()=>M(!1)))};return(0,ae.jsxs)("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[(0,ae.jsx)("video",{ref:T,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...On?{transform:"scaleX(-1)"}:{}}}),Dn?(0,ae.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Vn,disabled:R,className:L,style:L?{opacity:R?.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:R?.6:1},children:(0,ae.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,ae.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ae.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ae.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ae.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ae.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),gn=(0,w.forwardRef)(function({preview:t=!0,...r},o){return(0,ae.jsx)(lr,{ref:o,...r,visible:t,autoStart:!1})});var Et=require("react");function Sn(e,t){let[r,o]=(0,Et.useState)(null);return(0,Et.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var yn=require("react");var Rt=require("react");var hn=require("zustand/vanilla"),vn=require("zustand"),mo=()=>{};function wt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,hn.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):mo,u=(c=>(0,vn.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 We(e,t){let r=(0,Rt.useMemo)(()=>wt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Rt.useEffect)(()=>r.bind(),[r]),r}function kn(e,t,r){let n=We(e,t)(r??(a=>a)),s=(0,yn.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 Ut=require("react");var Pe=200;function ve(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Be(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function At(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 Mt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Ut.useState)([]);return(0,Ut.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=>ve(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var de=require("react/jsx-runtime");function bn({session:e,name:t,cap:r,className:o}){let n=Mt(e,t,{cap:r});return(0,de.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,de.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,de.jsx)("code",{children:t}),(0,de.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,de.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,de.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,de.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,de.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,de.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Be(s.payload)]},`${s.at}-${i}`))})]})}var ut=require("react");var se=require("react/jsx-runtime");function ct({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=At(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,se.jsxs)("div",{className:"urun-doc-patch",children:[(0,se.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,se.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,se.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,se.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Pn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=We(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,se.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,se.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,se.jsx)("code",{children:t}),(0,se.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,se.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,se.jsx)(ct,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var _t=require("react");var ye=require("react/jsx-runtime");function Cn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function xn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,_t.useState)([]);return(0,_t.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ve(u,{at:Date.now(),direction:"in",text:Cn(Be(a))},r))}):void 0),[e,t,r]),(0,ye.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,ye.jsx)(ct,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ve(u,{at:Date.now(),direction:"out",text:Cn(a)},r))}}),(0,ye.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,ye.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,ye.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,ye.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,ye.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Nt=require("react");var Ue=require("react/jsx-runtime");function Tn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Nt.useState)([]),a=t.join(","),u=r.join(",");return(0,Nt.useEffect)(()=>{if(i([]),!e)return;let c=(d,k)=>i(P=>ve(P,{at:Date.now(),kind:d,text:k},o)),f=[];f.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let k=e.stream(d);f.push(k.on("track",P=>c("track",`${d}: ${P?"track arrived":"track ended"}`)))}for(let d of r){let k=e.doc(d);f.push(k.on("change",()=>c("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,a,u,o]),(0,Ue.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Ue.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,Ue.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Ue.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Ue.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}var qt=require("@urun-sh/core");var It=require("react");function ue(e){let[t,r]=(0,It.useState)(e?.phase??null);return(0,It.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var wn=require("@urun-sh/core");var $e=require("react"),En=require("@urun-sh/core");function Lt(e){let t=ue(e),r=(0,En.isWakingPhase)(t?.name),o=(0,$e.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,$e.useState)(s);return(0,$e.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 Ce=require("react/jsx-runtime");function Ot({session:e,render:t,className:r}){let o=Lt(e);return!o.waking||!o.phase?null:(0,Ce.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,Ce.jsxs)(Ce.Fragment,{children:[(0,Ce.jsx)("span",{className:"urun-session-waking-label",children:(0,wn.describeSessionPhase)(o.phase)})," ",(0,Ce.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Vt=require("react");var xe=require("react"),fo={event:null,elapsedMs:0};function Dt(e,t){let[r,o]=(0,xe.useState)(null),n=(0,xe.useRef)(0);(0,xe.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,xe.useState)(0);return(0,xe.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}:fo}var Ke=require("react/jsx-runtime"),go={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 So(e){let[t,r]=(0,Vt.useState)(!1);return(0,Vt.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 Ft({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Dt(e,t),i=So(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,Ke.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,Ke.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,Ke.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??go[u]})," ",(0,Ke.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ce=require("react/jsx-runtime"),ho={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Rn({session:e,className:t}){let r=ue(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,ce.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ce.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ce.jsx)("span",{className:"urun-session-status-label",children:ho[o]}),n?(0,ce.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function An({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ue(e);if(s?.name==="live")return(0,ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ce.jsx)(Ft,{session:e})]});let i=r?r(s):(0,ce.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,qt.isWakingPhase)(s.name)?(0,ce.jsx)(Ot,{session:e}):s&&s.name!=="idle"?(0,qt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ce.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Ht=require("react");var Mn=require("react/jsx-runtime");function dr(e){return ue(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 Un({session:e,urgentMs:t=6e4,className:r}){let n=dr(e)?.getTime()??null,[s,i]=(0,Ht.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Ht.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,Mn.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 lt=require("react/jsx-runtime"),yo=new Set(["expired","ended","error"]);function _n({session:e,onNewSession:t,children:r,className:o}){let n=ue(e);if(!n||!yo.has(n.name))return null;let s=r?r(n):(0,lt.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,lt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,lt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Te=require("react"),Me=require("react/jsx-runtime");function pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function mr(e){let t=(0,Te.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Te.useState)(()=>t?pr(t.get("idle")):null);return(0,Te.useEffect)(()=>{if(!t){o(null);return}return o(pr(t.get("idle"))),t.on("change",()=>o(pr(t.get("idle"))))},[t]),r}function ko(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Nn({session:e,onStillHere:t,className:r}){let o=mr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Te.useState)(null);if((0,Te.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,Me.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,Me.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Me.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Me.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ko(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Me.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var je=require("react"),In=require("@urun-sh/core");function Ln(e){let t=(0,je.useContext)(Le),[r,o]=(0,je.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,je.useEffect)(()=>{if(!a||!u||!n||!s)return;let k=!1,P=()=>{(0,In.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:d}).then(p=>{k||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(g)}},[n,s,i,a,u,c,f,d]),r}var Wt=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var nr=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var Zn=Object.getOwnPropertyNames;var Qn=Object.prototype.hasOwnProperty;var eo=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},to=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Zn(t))!Qn.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=Yn(t,n))||o.enumerable});return e};var ro=e=>to(nr({},"__esModule",{value:!0}),e);var No={};eo(No,{Audio:()=>Rt,Camera:()=>Rr,ComponentRenderer:()=>on,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>_e,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>xt,Image:()=>Sn,ImageFrame:()=>mn,ImageFrameSchema:()=>pn,MetricsPanel:()=>gn,MetricsPanelSchema:()=>fn,Mic:()=>xn,OPERATOR_CHORD_LABEL:()=>Lr,OPERATOR_TOKEN_STORAGE_KEY:()=>Nr,ProgressCard:()=>an,ProgressCardSchema:()=>sn,ReprojectedVideo:()=>en,Session:()=>Xr,StatusBadge:()=>cn,StatusBadgeSchema:()=>un,TextStream:()=>dn,TextStreamSchema:()=>ln,UrunActivationOverlay:()=>Yt,UrunAudio:()=>bn,UrunAuthProvider:()=>or,UrunCamera:()=>En,UrunControlSender:()=>On,UrunDocPanel:()=>In,UrunErrorBoundary:()=>$e,UrunEventSpine:()=>Dn,UrunIdleWarning:()=>Kn,UrunJwtProvider:()=>Ur,UrunProvider:()=>Fr,UrunSessionClock:()=>Wn,UrunSessionEnded:()=>jn,UrunSessionGate:()=>Hn,UrunSessionStatus:()=>qn,UrunSessionWaking:()=>Jt,UrunStreamTail:()=>Nn,UrunVoice:()=>Cn,Video:()=>Fe,Voice:()=>Ct,authMode:()=>dt,createDocStore:()=>Ft,describeSessionPhase:()=>er.describeSessionPhase,formatPayload:()=>nt,getUrunAudioContext:()=>kt,isWakingPhase:()=>er.isWakingPhase,parseJsonObject:()=>Ht,pushCapped:()=>Te,readOperatorToken:()=>sr,registerComponent:()=>rn,resumeUrunAudioContext:()=>bt,urunPublicEnv:()=>xe,useActivation:()=>Xt,useApp:()=>Hr,useChat:()=>zr,useCompletion:()=>jr,useConfirmOnLeave:()=>Mt,useDocStore:()=>rt,useImageFrame:()=>gr,useInputPresence:()=>Jr,useMetricsPanel:()=>hr,useOperatorOverride:()=>Ut,useProgressCard:()=>pr,useReferenceImage:()=>wn,useRequest:()=>Wr,useSession:()=>Gr,useSessionDoc:()=>_n,useSessionEndsAt:()=>Cr,useSessionIdle:()=>xr,useSessionPhase:()=>Se,useSessionTrack:()=>Tn,useSessionWake:()=>zt,useStatusBadge:()=>mr,useStreamMessages:()=>Bt,useTextStream:()=>fr,useUrunAudioLevel:()=>Dt,useUrunAuth:()=>Tt,useUrunPrewake:()=>zn,usesWorkOSAuth:()=>Tr});module.exports=ro(No);var ae=require("react");var Er=require("react"),lt=require("react/jsx-runtime"),$e=class extends Er.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,lt.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,lt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,lt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var wr=require("react"),ze=(0,wr.createContext)(null);function De(e){return e&&e.trim()?e.trim():void 0}function xe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return De(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return De(typeof process<"u"?process.env?.[e]:void 0)}}function dt(){let e=xe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||xe("VERCEL_ENV")==="production"?"workos":xe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Tr(){return dt()==="workos"}var Je=require("react"),Mr=require("react/jsx-runtime"),Ar=(0,Je.createContext)(null);function or({getAccessToken:e,children:t}){let r=(0,Je.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Mr.jsx)(Ar.Provider,{value:r,children:t})}var Ur=or;function Tt(){return(0,Je.useContext)(Ar)}var At=require("react"),Nr="urun.operator_token",Ir=null,_r="op",Lr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Or(){return typeof window<"u"}function sr(){return Ir}function no(){if(!Or())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(_r);if(!r)return null;Ir=r,t.delete(_r);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function oo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ut(e){let t=(0,At.useRef)(e);t.current=e,(0,At.useEffect)(()=>{if(!Or())return;no();let r=o=>{if(!oo(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Dr=require("react");function Mt(e=!0){(0,Dr.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 Me=require("react/jsx-runtime"),so="/api/urun-token",io=1e4;function ao(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 Vr(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 uo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Me.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,Me.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Me.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Fr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){let g=n===void 0&&t===void 0;if(!g&&(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(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Mt(f);let[h,m]=(0,ae.useState)(),[k,b]=(0,ae.useState)(),[T,S]=(0,ae.useState)(null),y=(0,ae.useRef)(void 0),E=(0,ae.useRef)(null),[w,L]=(0,ae.useState)(null);Ut(X=>L({jwt:X}));let d=Tt(),x=xe("NEXT_PUBLIC_SESSION_TOKEN")??xe("NEXT_PUBLIC_URUN_JWT"),R=dt(),M=w!==null,V=R==="workos"&&!n&&!M&&!g,Y=n??(R==="jwt"?x:void 0)??h??k?.token,I=M?w.jwt:Y,N=s??xe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),H=V&&!I,$=t??k?.orgId,W=e??k?.gatewayUrl,j=g&&k===void 0,oe=g&&k!==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,le=T??oe,Q=u??so,B=(0,ae.useCallback)(async X=>{if(!X?.forceRefresh){let G=y.current;if(!G)return G;let C=ao(G);if(C===null||C-Date.now()>io)return G}return(await(E.current??(E.current=(async()=>{try{let G=await Vr(Q);return y.current=G.token,b(G),G}finally{E.current=null}})()))).token},[Q]),re=(0,ae.useMemo)(()=>({appId:p,baseUrl:W??"",orgId:$??"",jwt:I,getAccessToken:V?d?.getAccessToken:g&&!M?B:void 0,authProvider:N,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:M?"preempt":void 0}),[p,d,W,N,I,i,$,a,c,V,M,g,B]);return(0,ae.useEffect)(()=>{if(!g)return;let X=new AbortController;return S(null),(async()=>{try{let ue=await Vr(Q,X.signal);y.current=ue.token,b(ue)}catch(ue){if(X.signal.aborted)return;S(ue instanceof Error?ue:new Error(String(ue)))}})(),()=>X.abort()},[g,Q]),(0,ae.useEffect)(()=>{if(!V||!d)return;let X=!1,ue=d;async function G(){try{let D=await ue.getAccessToken();X||m(D??void 0)}catch{X||m(void 0)}}G();let C=window.setInterval(()=>{G()},6e4);return()=>{X=!0,window.clearInterval(C)}},[d,V]),(0,Me.jsx)($e,{fallback:l,children:le?uo(v,le):H||j?(0,Me.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Me.jsx)(ze.Provider,{value:re,children:P})})}var pe=require("react"),qr=require("@urun-sh/core");function co(e,t){return`${e}:${JSON.stringify(t??{})}`}function lo(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 Ve=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Hr(){let e=(0,pe.useContext)(ze);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,pe.useReducer)(i=>i+1,0),r=(0,pe.useRef)(new Map),o=(0,pe.useRef)(new Map),n=(0,pe.useRef)(null),s=(0,pe.useMemo)(()=>(0,qr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,pe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Ve.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=Ve.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 l=Ve.get(u);!l||l.refCount!==0||(Ve.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,pe.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=l=>{let v=co(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=lo(e,u,l),p=Ve.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Ve.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Ve.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}var ne=require("react");function Xe(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function po(e){return e instanceof Error?e:new Error(String(e))}function Wr(e,t){let r=(0,ne.useMemo)(()=>Xe(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),l=(0,ne.useRef)(null),v=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=(0,ne.useCallback)(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let T=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(T),u(!1),c.current?.onSuccess?.(T)),T}catch(T){let S=po(T);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=(0,ne.useCallback)(h=>{P(h).catch(()=>{})},[P]),p=(0,ne.useCallback)(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}var ie=require("react");function Br(e){return e instanceof Error?e:new Error(String(e))}var mo=e=>typeof e=="string"?e:String(e);function jr(e,t){let r=(0,ie.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ie.useState)(""),[s,i]=(0,ie.useState)(!1),[a,u]=(0,ie.useState)(null),c=(0,ie.useRef)(t);c.current=t;let f=(0,ie.useRef)(0),l=(0,ie.useRef)(null),v=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=(0,ie.useCallback)(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=(0,ie.useCallback)(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??mo,T=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:E,onError:w,...L}=k??{},d="",x;try{x=r.requestStream(T(p),L),l.current=x}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M));return}try{for await(let R of x){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M))}finally{l.current===x&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}var ee=require("react");function Kr(e){return e instanceof Error?e:new Error(String(e))}var fo=e=>typeof e=="string"?e:String(e),$r=0;function cr(e){return $r+=1,`${e}-${$r}`}function zr(e,t){let r=(0,ee.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ee.useState)(()=>(t?.initialMessages??[]).map(b=>({id:b.id??cr("msg"),role:b.role,content:b.content}))),[s,i]=(0,ee.useState)(""),[a,u]=(0,ee.useState)(!1),[c,f]=(0,ee.useState)(null),l=(0,ee.useRef)(t);l.current=t;let v=(0,ee.useRef)(o);v.current=o;let P=(0,ee.useRef)(s);P.current=s;let g=(0,ee.useRef)(0),p=(0,ee.useRef)(null),h=(0,ee.useRef)(!0);(0,ee.useEffect)(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=(0,ee.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=(0,ee.useCallback)(async b=>{let T=b===void 0,S=(T?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let E=++g.current,w=()=>h.current&&g.current===E,L=l.current,d=L?.parseChunk??fo,x={id:cr("msg"),role:"user",content:S},R={id:cr("msg"),role:"assistant",content:""},M=[...v.current,x].map(B=>({role:B.role,content:B.content})),V=[...v.current,x,R];v.current=V,n(V),T&&i(""),f(null),u(!0);let Y=L?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:H,onFinish:$,onError:W,...j}=L??{},oe=B=>{n(re=>re.map(X=>X.id===R.id?{...X,content:B}:X))},le="",Q;try{Q=r.requestStream(Y(M),j),p.current=Q}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re));return}try{for await(let B of Q){if(g.current!==E)break;le+=d(B),w()&&oe(le)}w()&&(u(!1),L?.onFinish?.({...R,content:le}))}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re))}finally{p.current===Q&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}var Z=require("react"),Ge=require("@urun-sh/core"),lr=[];function Jr(e,t={}){let{field:r=Ge.INPUT_PRESENCE_FIELD,hz:o=Ge.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,Z.useMemo)(()=>s?(0,Ge.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,Z.useRef)(null);a.current=i;let[u,c]=(0,Z.useState)(!1),[f,l]=(0,Z.useState)(lr),v=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let P=(0,Z.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),g=(0,Z.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,Z.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},E=R=>{S()&&(a.current?.keyDown(R.key),P())},w=R=>{a.current?.keyUp(R.key),P()},L=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},x=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",E),n.addEventListener("keyup",w),n.addEventListener("mousemove",L),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",x),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",E),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",L),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",x)}},[n,g,P]);let p=(0,Z.useCallback)(S=>{S.requestPointerLock?.()},[]),h=(0,Z.useCallback)(()=>{v.current=!0,c(!0)},[]),m=(0,Z.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=(0,Z.useCallback)(S=>{a.current?.keyDown(S),P()},[P]),b=(0,Z.useCallback)(S=>{a.current?.keyUp(S),P()},[P]),T=(0,Z.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:T}}var ce=require("react"),Qr=require("@urun-sh/core");var O=require("react");var pt=require("react"),Yr=require("react/jsx-runtime"),dr=(0,pt.createContext)(null);function Xr({session:e,children:t}){return(0,Yr.jsx)(dr.Provider,{value:e,children:t})}function Pe(){return(0,pt.useContext)(dr)}function Gr(){let e=(0,pt.useContext)(dr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var mt=require("react/jsx-runtime");function go(e,t){return e-t>>>0<2147483648}var Zr=1e3;function ho(...e){console.debug("[video]",...e)}var Fe=(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:f,style:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:T}=t,S=Pe(),y=o??S,E=(0,O.useRef)(null),w=(0,O.useRef)(null),[L,d]=(0,O.useState)(!1),[x,R]=(0,O.useState)(!1),M=(0,O.useRef)(!1),V=(0,O.useRef)(h);V.current=h;let Y=(0,O.useRef)(m);Y.current=m;let I=(0,O.useRef)(b);I.current=b;let N=(0,O.useRef)(T);N.current=T;let H=(0,O.useRef)(k??null);H.current=k??null;let $=(0,O.useRef)(null),W=(0,O.useRef)(null),j=(0,O.useCallback)((C,D=!1)=>{if(!D&&C===$.current||($.current=C,W.current?.(),W.current=null,M.current=!1,R(!1),!C))return;let _=E.current;if(!_)return;let z=H.current,fe=z?.rtpTimestamp??null,se=!1,A=()=>{se||(se=!0,N.current?.())};z&&fe==null&&A();let de=z!=null&&fe!=null,Oe=ye=>{W.current?.(),W.current=null,M.current=!0,R(!0),Y.current?.(),ye&&I.current?.()};if(typeof _.requestVideoFrameCallback=="function"){let ye=!1,je=0,at=(tr,rr)=>{if(!ye){if(de){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){A(),Oe(!1);return}if(!go(wt,fe)){je=_.requestVideoFrameCallback(at);return}Oe(!0);return}Oe(!1)}};je=_.requestVideoFrameCallback(at),W.current=()=>{ye=!0,_.cancelVideoFrameCallback?.(je)};return}de&&A();let ge=()=>{let ye=_.getVideoPlaybackQuality?.();(ye?ye.totalVideoFrames>0:_.readyState>=2&&_.videoWidth>0)&&Oe(!1)};_.addEventListener("loadeddata",ge),_.addEventListener("timeupdate",ge),_.addEventListener("playing",ge),W.current=()=>{_.removeEventListener("loadeddata",ge),_.removeEventListener("timeupdate",ge),_.removeEventListener("playing",ge)},ge()},[]);(0,O.useEffect)(()=>()=>{W.current?.(),W.current=null},[]);let oe=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,le=(0,O.useRef)(oe);(0,O.useEffect)(()=>{if(le.current===oe||(le.current=oe,oe==null))return;let C=$.current;C&&j(C,!0)},[oe,j]);let Q=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let C=E.current;return C&&C.srcObject!==w.current&&(C.srcObject=w.current),w.current},[]),B=(0,O.useCallback)(C=>{let D=E.current;if(!D)return;let _=D.play();!_||typeof _.catch!="function"||_.catch(z=>ho(`play() failed (${C})`,z))},[]),re=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getVideoTracks())_!==C&&D.removeTrack(_);if(C&&!D.getVideoTracks().includes(C)){D.addTrack(C);let _=E.current;_&&(_.srcObject=D)}C&&B("track-attach"),d(C!==null),j(C),V.current?.(C)}},[Q,B,j]),X=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getAudioTracks())_!==C&&D.removeTrack(_);C&&!D.getAudioTracks().includes(C)&&D.addTrack(C),C&&B("audio-attach")}},[Q,B]),ue=(0,O.useCallback)(C=>{E.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),Q())},[Q,a]);(0,O.useImperativeHandle)(r,()=>({get element(){return E.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let G=i!==void 0;return(0,O.useEffect)(()=>{if(G){re(i??null);return}if(!y)return;let C=y.stream(n),D=()=>{let A=w.current;return A?A.getVideoTracks()[0]??null:null},_=A=>{if(A!==D()&&(re(A),A)){let de=()=>{D()===A&&re(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,n,G,i,re]),(0,O.useEffect)(()=>{if(G||!y||s===!1)return;let C=y.stream(s),D=()=>{let A=w.current;return A?A.getAudioTracks()[0]??null:null},_=A=>{if(A!==D()&&(X(A),A)){let de=()=>{D()===A&&X(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,s,G,X]),(0,mt.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":L?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,mt.jsx)("video",{ref:ue,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),L?null:P,g===void 0?null:(0,mt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});var ft=require("react/jsx-runtime"),So={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},en=(0,ce.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ce.useRef)(null),P=(0,ce.useRef)(null),g=(0,ce.useRef)(0),p=(0,ce.useRef)(f);p.current=f;let h=(0,ce.useMemo)(()=>(0,Qr.createCameraWarp)(p.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),(0,ce.useEffect)(()=>{if(!i)return;let m=0,k=0,b=null,T=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function E(){h.frameArrived(),k=y.requestVideoFrameCallback(E)}))},S=y=>{m=requestAnimationFrame(S);let E=P.current,w=v.current?.element??null;if(!E||!w||(w!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),T(w)),w.readyState<2))return;h.tick(y);let L=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(E.clientWidth*L)),x=Math.max(1,Math.round(E.clientHeight*L));(E.width!==d||E.height!==x)&&(E.width=d,E.height=x);let R=E.getContext("2d");if(!R)return;let M=h.transform(),V=w.videoWidth||d,Y=w.videoHeight||x,N=Math.max(d/V,x/Y)*(1+a)*M.scale;R.setTransform(N,0,0,N,d/2+M.translateX*d,x/2+M.translateY*x),R.drawImage(w,-V/2,-Y/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=E=>{m()&&h.keyDown(E.key)},b=E=>h.keyUp(E.key),T=E=>{m()&&h.pointerDelta(E.movementX,E.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?(0,ft.jsxs)(Fe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,ft.jsx)("canvas",{ref:P,style:So,"data-urun-warp":""}),n]}):(0,ft.jsx)(Fe,{ref:v,...s,children:n})});var tn=new Map;function rn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tn.set(e,{component:t,schema:r})}function nn(e,t){let r=tn.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 qe=require("react/jsx-runtime");function on({name:e,props:t,fallback:r}){let o=nn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,qe.jsx)(qe.Fragment,{children:r}):(0,qe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,qe.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,qe.jsx)(n,{...o.validatedProps})}var Ye=require("zod"),He=require("react/jsx-runtime"),sn=Ye.z.object({step:Ye.z.number().min(0),total:Ye.z.number().min(1),label:Ye.z.string().optional(),variant:Ye.z.enum(["default","success","error"]).default("default")});function pr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function an(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,He.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,He.jsx)("div",{className:"urun-progress-label",children:o}),(0,He.jsx)("div",{className:"urun-progress-bar",children:(0,He.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,He.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var _t=require("zod"),gt=require("react/jsx-runtime"),un=_t.z.object({state:_t.z.enum(["thinking","generating","idle","error"]),message:_t.z.string().optional()}),vo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??vo[t]??t;return{state:t,message:n,isActive:o}}function cn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,gt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,gt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,gt.jsx)("span",{className:"urun-status-message",children:r})]})}var ht=require("react"),Nt=require("zod"),St=require("react/jsx-runtime"),ln=Nt.z.object({text:Nt.z.string(),streaming:Nt.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function dn(e){let{text:t,streaming:r}=fr(e),o=(0,ht.useRef)(null),n=(0,ht.useRef)(0);return(0,ht.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,St.jsxs)("div",{className:"urun-text-stream",children:[(0,St.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,St.jsx)("span",{className:"urun-text-cursor"})]})}var vt=require("zod"),yt=require("react/jsx-runtime"),pn=vt.z.object({src:vt.z.string().url(),alt:vt.z.string().optional(),caption:vt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function mn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,yt.jsxs)("figure",{className:"urun-image-frame",children:[(0,yt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,yt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ee=require("zod"),Ze=require("react/jsx-runtime"),fn=Ee.z.object({metrics:Ee.z.array(Ee.z.object({label:Ee.z.string(),value:Ee.z.union([Ee.z.string(),Ee.z.number()]),unit:Ee.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function gn(e){let{metrics:t}=hr(e);return(0,Ze.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Ze.jsxs)("div",{className:"urun-metric-card",children:[(0,Ze.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Ze.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var hn=require("react");var vn=require("react/jsx-runtime"),Sn=(0,hn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,vn.jsx)(Fe,{ref:r,stream:o,...n})});var J=require("react"),kn=require("@urun-sh/core");var It=null;function yo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function kt(){if(It)return It;let e=yo();return e?(It=new e,It):null}function bt(){let e=kt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Rn=require("react/jsx-runtime"),ko=1e3,yn=200;function Sr(...e){console.debug("[audio]",...e)}var Rt=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=Pe(),v=o??l,P=(0,J.useRef)(null),g=(0,J.useRef)(null),p=(0,J.useRef)(null),h=(0,J.useRef)(null),m=(0,J.useRef)(u);m.current=u;let k=(0,J.useRef)(c);k.current=c;let b=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),T=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=(0,J.useCallback)(d=>{let x=P.current;if(!x)return;let R=x.play();!R||typeof R.then!="function"||R.then(()=>{x.muted||b(!0)}).catch(M=>{let V=M instanceof Error?M.name:String(M);if(V==="AbortError"){Sr(`play() aborted (${d}); retrying in ${yn}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},yn);return}if(V==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),b(!1);return}Sr(`play() failed (${d})`,M)})},[b]),y=(0,J.useCallback)(d=>{let x=T();if(x){for(let R of x.getAudioTracks())R!==d&&x.removeTrack(R);d&&!x.getAudioTracks().includes(d)&&x.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[T,S]),E=(0,J.useCallback)(()=>{let d=P.current;d&&(T(),d.muted=!1,S("gesture"),bt(),b(!0))},[T,S,b]);(0,J.useImperativeHandle)(r,()=>({unlock:E,get unlocked(){return p.current===!0},get element(){return P.current}}),[E]);let w=(0,J.useCallback)(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),T()),f?.(d)},[T,f]),L=s!==void 0;return(0,J.useEffect)(()=>{if(L){y(s??null);return}if(!v)return;let d=v.stream(n),x=()=>{let I=g.current;return I?I.getAudioTracks()[0]??null:null},R=I=>{if(I!==x()&&(y(I),I)){let N=()=>{x()===I&&y(null)};I.addEventListener("ended",N)}},M=d.track;M&&M.readyState==="live"&&R(M);let V=d.on("track",I=>{I&&I.readyState!=="live"||R(I)}),Y=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&R(I)},ko);return()=>{V(),clearInterval(Y)}},[v,n,L,s,y]),(0,J.useEffect)(()=>(0,kn.observePageLifecycle)(()=>{bt(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{h.current&&clearTimeout(h.current)},[]),(0,Rn.jsx)("audio",{ref:w,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),bn=Rt;var K=require("react"),Qe=require("@urun-sh/core");var Pn=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Lt(...e){console.debug("[voice]",...e)}var Ct=(0,K.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=Pe(),m=o??h,k=(0,K.useRef)(null),b=(0,K.useRef)(null),T=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),E=(0,K.useRef)(f);E.current=f;let w=(0,K.useRef)(l);w.current=l;let L=(0,K.useRef)(v);L.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,E.current?.(N))},[]),x=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],T.current?.release(),T.current=null,b.current&&(b.current=null,L.current?.(null))},[]),R=(0,K.useCallback)(async()=>{let N=T.current;if(N){let j=await N.update(i);return b.current=N.stream,L.current?.(N.stream),j}let $=await(p??(0,Qe.sharedCaptureController)()).claim("audio",i);T.current=$,S.current=[$.onTrack((j,oe)=>{b.current=oe,L.current?.(oe),y.current&&m?.stream(n).attach(j).catch(le=>Lt("mic re-attach after one-capture re-acquire failed",le))}),$.onLost(j=>{T.current=null,S.current=[],b.current=null,L.current?.(null),d(!1),w.current?.(j)})],b.current=$.stream,L.current?.($.stream);let W=$.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,m,n,d]),M=(0,K.useCallback)(async()=>{x(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,x,d]),V=(0,K.useCallback)(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let N;try{N=await R()}catch(W){x();let j=(0,Qe.sessionFailureFromMediaError)(W,m.status);throw w.current?.(j),j}m.connect?.();let H;for(let W=1;W<=u;W++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(N),d(!0);return}catch(j){H=j,Lt(`start attempt ${W}/${u} failed`,j),W<u&&await new Promise(oe=>setTimeout(oe,c))}x(),d(!1);let $=H instanceof Error?H:new Error(String(H??"voice start failed"));throw w.current?.($),$},[m,n,a,u,c,R,x,d]);(0,K.useImperativeHandle)(r,()=>({start:V,stop:M,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[V,M]);let Y=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!m||!y.current||Y.current)return;let N=b.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await m.stream(n).attach(N)}catch(H){Lt("foreground mic re-assert failed (will retry on next pass)",H)}return}Y.current=!0;try{let H=await R();await m.stream(n).attach(H)}catch(H){let $=H instanceof Error?H:new Error(String(H));Lt("foreground mic re-acquire failed",$),w.current?.($)}finally{Y.current=!1}},[m,n,R]);return(0,K.useEffect)(()=>{let N=()=>{I()};return m&&typeof m.onRecovery=="function"?m.onRecovery(N):(0,Qe.observePageLifecycle)(N)},[m,I]),(0,K.useEffect)(()=>x,[x]),s?(0,Pn.jsx)(Rt,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Cn=Ct;var be=require("react");var Ot=require("react");var yr={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Ot.useState)(yr);return(0,Ot.useEffect)(()=>{if(!e){i(yr);return}let a=kt();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 l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(yr)}},[e,r,o,n]),s}var we=require("react/jsx-runtime"),bo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ro={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},xn=(0,be.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:l,capture:v}=t,P=Pe(),g=o??P,p=(0,be.useRef)(null),[h,m]=(0,be.useState)(null),k=(0,be.useRef)(l);k.current=l;let{level:b,speaking:T}=Dt(a?h:null);return(0,be.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,be.useEffect)(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),(0,we.jsxs)(we.Fragment,{children:[(0,we.jsx)(Ct,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?(0,we.jsx)("span",{className:u,style:bo,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":T?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:(0,we.jsx)("span",{style:Ro,children:(0,we.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var et=require("@urun-sh/core"),U=require("react");var he=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function Co(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Po(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Rr=(0,U.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:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:T,flipControl:S="auto",flipControlClassName:y,onDevices:E}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",L=Pe(),d=o??L,x=(0,U.useRef)(null),R=(0,U.useRef)(null),M=(0,U.useRef)(null),V=(0,U.useRef)([]),Y=(0,U.useRef)(null),I=(0,U.useRef)(!1),N=(0,U.useRef)(!1),H=(0,U.useRef)(w),[$,W]=(0,U.useState)(w),[j,oe]=(0,U.useState)(!1),[le,Q]=(0,U.useState)(null),[B,re]=(0,U.useState)(!1),[X]=(0,U.useState)(Co),ue=(0,U.useRef)(p);ue.current=p;let G=(0,U.useRef)(h);G.current=h;let C=(0,U.useRef)(m);C.current=m;let D=(0,U.useRef)(k);D.current=k;let _=(0,U.useRef)(E);_.current=E;let z=(0,U.useCallback)(F=>{I.current!==F&&(I.current=F,oe(F),ue.current?.(F))},[]);(0,U.useEffect)(()=>{if(!j){Q(null);return}let F=!1,q=()=>{Po().then(Ce=>{F||(Q(Ce),Ce&&_.current?.(Ce))})};q();let ke=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ke?.addEventListener=="function"?(ke.addEventListener("devicechange",q),()=>{F=!0,ke.removeEventListener?.("devicechange",q)}):()=>{F=!0}},[j]);let fe=(0,U.useCallback)(F=>{let q=x.current;q&&(q.muted=!0,q.defaultMuted=!0,q.setAttribute("muted",""),q.setAttribute("playsinline",""),q.setAttribute("webkit-playsinline",""),q.srcObject=F,F&&q.play()?.catch?.(ke=>kr("preview play() failed",ke)))},[]),se=(0,U.useCallback)(()=>{N.current=!1,Y.current?.(),Y.current=null;for(let F of V.current)F();V.current=[],M.current?.release(),M.current=null,R.current&&(R.current=null,C.current?.(null),D.current?.(null)),fe(null)},[fe]),A=(0,U.useCallback)((F,q)=>{Y.current?.(),R.current=q,fe(q),C.current?.(q);let ke=()=>{R.current===q&&(kr("camera track ended (device removed or permission revoked)"),se(),z(!1))};F.addEventListener("ended",ke),Y.current=()=>F.removeEventListener("ended",ke)},[fe,se,z]),de=(0,U.useCallback)(async F=>{let q=n!==!1;if(q&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ke={...br,...s,facingMode:F},Ce;try{let Ue=M.current;if(Ue)Ce=await Ue.update(ke);else{let ut=await(T??(0,et.sharedCaptureController)()).claim("video",ke);if(M.current=ut,V.current=[ut.onTrack((ct,Xn)=>{A(ct,Xn),I.current&&(!q||!d||d.stream(n).attachVideo(ct).then(()=>D.current?.(ct)).catch(Gn=>kr("camera re-publish after one-capture re-acquire failed",Gn)))}),ut.onLost(ct=>{M.current=null,V.current=[],se(),z(!1),G.current?.(ct)})],!ut.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ut.track}}catch(Ue){let Ke=(0,et.sessionFailureFromMediaError)(Ue,d?.status);throw G.current?.(Ke),Ke}H.current=F,W(F),A(Ce,M.current?.stream??new MediaStream([Ce]));try{q&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=q?n:!1}catch(Ue){se(),z(!1);let Ke=Ue instanceof Error?Ue:new Error(String(Ue));throw G.current?.(Ke),Ke}D.current?.(Ce),z(!0)},[d,n,s,l,T,A,se,z]),Oe=(0,U.useCallback)(F=>de(F?.facingMode??H.current),[de]),ge=(0,U.useCallback)(async F=>{let q=N.current===n;I.current&&H.current===F&&q||await de(F)},[de,n]),ye=(0,U.useCallback)(()=>de(H.current==="environment"?"user":"environment"),[de]),je=(0,U.useCallback)(async()=>{se(),z(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,se,z]),at=(0,U.useCallback)(async F=>{let q=x.current;if(!q)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,et.captureStillFromVideo)(q,F)},[]);(0,U.useImperativeHandle)(r,()=>({start:Oe,stop:je,flip:ye,setFacingMode:ge,capturePhoto:at,get active(){return I.current},get facingMode(){return H.current},get stream(){return R.current},get element(){return x.current}}),[Oe,je,ye,ge,at]);let tr=(0,U.useRef)(ge);if(tr.current=ge,(0,U.useEffect)(()=>{c&&(n!==!1&&!d||tr.current(w).catch(()=>{}))},[c,d,w,n]),(0,U.useEffect)(()=>se,[se]),!v)return null;let rr=f==="auto"?$==="user":f,wt=j&&(S===!0||S==="auto"&&X&&(le?.length??0)>1),Jn=()=>{B||(re(!0),ye().catch(()=>{}).finally(()=>re(!1)))};return(0,he.jsxs)("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":$,children:[(0,he.jsx)("video",{ref:x,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...rr?{transform:"scaleX(-1)"}:{}}}),wt?(0,he.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Jn,disabled:B,className:y,style:y?{opacity:B?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:B?.6:1},children:(0,he.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,he.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,he.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,he.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,he.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,he.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),En=(0,U.forwardRef)(function({preview:t=!0,...r},o){return(0,he.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var tt=require("@urun-sh/core"),te=require("react");function wn(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),[l,v]=(0,te.useState)(null),[P]=(0,te.useState)(tt.cameraCaptureAvailable),g=(0,te.useRef)(n);g.current=n;let p=(0,te.useRef)(null),h=(0,te.useRef)(0),m=(0,te.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);(0,te.useEffect)(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=(0,te.useCallback)(async y=>{let E=++h.current;f(!0),v(null);try{let w=await y();if(h.current!==E)return;m(w)}catch(w){if(h.current!==E)return;v((0,tt.referenceImageErrorMessage)(w))}finally{h.current===E&&f(!1)}},[m]),b=(0,te.useCallback)(y=>k(()=>(0,tt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),T=(0,te.useCallback)(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=(0,te.useCallback)(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:T,clear:S,busy:c,error:l,cameraAvailable:P}}var Vt=require("react");function Tn(e,t){let[r,o]=(0,Vt.useState)(null);return(0,Vt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Mn=require("react");var qt=require("react");var An=require("zustand/vanilla"),Un=require("zustand"),xo=()=>{};function Ft(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,An.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):xo,u=(c=>(0,Un.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 rt(e,t){let r=(0,qt.useMemo)(()=>Ft(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,qt.useEffect)(()=>r.bind(),[r]),r}function _n(e,t,r){let n=rt(e,t)(r??(a=>a)),s=(0,Mn.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 Wt=require("react");var _e=200;function Te(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function nt(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ht(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Bt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Wt.useState)([]);return(0,Wt.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=>Te(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Re=require("react/jsx-runtime");function Nn({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return(0,Re.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Re.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Re.jsx)("code",{children:t}),(0,Re.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Re.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Re.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Re.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Re.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Re.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",nt(s.payload)]},`${s.at}-${i}`))})]})}var Pt=require("react");var me=require("react/jsx-runtime");function xt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Pt.useState)(""),[i,a]=(0,Pt.useState)(null),u=(0,Pt.useCallback)(()=>{let c=Ht(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,me.jsxs)("div",{className:"urun-doc-patch",children:[(0,me.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,me.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,me.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,me.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function In({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=rt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,me.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,me.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,me.jsx)("code",{children:t}),(0,me.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,me.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,me.jsx)(xt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var jt=require("react");var Ae=require("react/jsx-runtime");function Ln(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function On({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=>Te(u,{at:Date.now(),direction:"in",text:Ln(nt(a))},r))}):void 0),[e,t,r]),(0,Ae.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ae.jsx)(xt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Te(u,{at:Date.now(),direction:"out",text:Ln(a)},r))}}),(0,Ae.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ae.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ae.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ae.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ae.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Kt=require("react");var We=require("react/jsx-runtime");function Dn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Kt.useState)([]),a=t.join(","),u=r.join(",");return(0,Kt.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Te(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),(0,We.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,We.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,We.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,We.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,We.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}var Zt=require("@urun-sh/core");var $t=require("react");function Se(e){let[t,r]=(0,$t.useState)(e?.phase??null);return(0,$t.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Fn=require("@urun-sh/core");var ot=require("react"),Vn=require("@urun-sh/core");function zt(e){let t=Se(e),r=(0,Vn.isWakingPhase)(t?.name),o=(0,ot.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,ot.useState)(s);return(0,ot.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 Ne=require("react/jsx-runtime");function Jt({session:e,render:t,className:r}){let o=zt(e);return!o.waking||!o.phase?null:(0,Ne.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,Ne.jsxs)(Ne.Fragment,{children:[(0,Ne.jsx)("span",{className:"urun-session-waking-label",children:(0,Fn.describeSessionPhase)(o.phase)})," ",(0,Ne.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Gt=require("react");var Ie=require("react"),Eo={event:null,elapsedMs:0};function Xt(e,t){let[r,o]=(0,Ie.useState)(null),n=(0,Ie.useRef)(0);(0,Ie.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,Ie.useState)(0);return(0,Ie.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}:Eo}var st=require("react/jsx-runtime"),wo={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 To(e){let[t,r]=(0,Gt.useState)(!1);return(0,Gt.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 Yt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Xt(e,t),i=To(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,st.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,st.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,st.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??wo[u]})," ",(0,st.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ve=require("react/jsx-runtime"),Ao={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function qn({session:e,className:t}){let r=Se(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,ve.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ve.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ve.jsx)("span",{className:"urun-session-status-label",children:Ao[o]}),n?(0,ve.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Hn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Se(e);if(s?.name==="live")return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ve.jsx)(Yt,{session:e})]});let i=r?r(s):(0,ve.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Zt.isWakingPhase)(s.name)?(0,ve.jsx)(Jt,{session:e}):s&&s.name!=="idle"?(0,Zt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ve.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Qt=require("react");var Bn=require("react/jsx-runtime");function Cr(e){return Se(e)?.endsAt??null}function Uo(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 Wn({session:e,urgentMs:t=6e4,className:r}){let n=Cr(e)?.getTime()??null,[s,i]=(0,Qt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Qt.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=Uo(s);return(0,Bn.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 Et=require("react/jsx-runtime"),Mo=new Set(["expired","ended","error"]);function jn({session:e,onNewSession:t,children:r,className:o}){let n=Se(e);if(!n||!Mo.has(n.name))return null;let s=r?r(n):(0,Et.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,Et.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Et.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Le=require("react"),Be=require("react/jsx-runtime");function Pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function xr(e){let t=(0,Le.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Le.useState)(()=>t?Pr(t.get("idle")):null);return(0,Le.useEffect)(()=>{if(!t){o(null);return}return o(Pr(t.get("idle"))),t.on("change",()=>o(Pr(t.get("idle"))))},[t]),r}function _o(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Kn({session:e,onStillHere:t,className:r}){let o=xr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Le.useState)(null);if((0,Le.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,Be.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,Be.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Be.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Be.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${_o(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Be.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var it=require("react"),$n=require("@urun-sh/core");function zn(e){let t=(0,it.useContext)(ze),[r,o]=(0,it.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,l=t?.authProvider;return(0,it.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{(0,$n.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}var er=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as Jr,b as zr,c as ot}from"./chunk-WF2OBDSX.mjs";import{useCallback as an,useEffect as Kt,useMemo as un,useRef as Jt,useState as Ve}from"react";import{Component as Xr}from"react";import{jsx as Ht,jsxs as Gr}from"react/jsx-runtime";var xe=class extends Xr{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||Gr("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:[Ht("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Ht("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Yr}from"react";var he=Yr(null);function ce(e){return e&&e.trim()?e.trim():void 0}function oe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ce(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ce(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ce(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ce(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ce(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ce(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ce(typeof process<"u"?process.env?.[e]:void 0)}}function De(){let e=oe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||oe("VERCEL_ENV")==="production"?"workos":oe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Zr(){return De()==="workos"}import{useEffect as Qr,useRef as en}from"react";var tn="urun.operator_token",Bt=null,Wt="op",rn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function $t(){return typeof window<"u"}function jt(){return Bt}function nn(){if(!$t())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(Wt);if(!r)return null;Bt=r,t.delete(Wt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function on(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function st(e){let t=en(e);t.current=e,Qr(()=>{if(!$t())return;nn();let r=o=>{if(!on(o))return;let n=jt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as sn}from"react";function it(e=!0){sn(()=>{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 we,jsxs as fn}from"react/jsx-runtime";var cn="/api/urun-token",ln=1e4;function dn(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 zt(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 pn(e,t){return typeof e=="function"?e(t):e!==void 0?e:fn("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:[we("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),we("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function mn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:d,errorFallback:k,children:C}){let g=n===void 0&&t===void 0;if(!g&&(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(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);it(f);let[E,S]=Ve(),[_,P]=Ve(),[x,m]=Ve(null),I=Jt(void 0),W=Jt(null),[L,O]=Ve(null);st(H=>O({jwt:H}));let l=ot(),T=oe("NEXT_PUBLIC_SESSION_TOKEN")??oe("NEXT_PUBLIC_URUN_JWT"),v=De(),M=L!==null,N=v==="workos"&&!n&&!M&&!g,J=n??(v==="jwt"?T:void 0)??E??_?.token,R=M?L.jwt:J,A=s??oe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),V=N&&!R,F=t??_?.orgId,B=e??_?.gatewayUrl,q=g&&_===void 0,h=g&&_!==void 0&&!B?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,b=x??h,w=u??cn,U=an(async H=>{if(!H?.forceRefresh){let K=I.current;if(!K)return K;let Q=dn(K);if(Q===null||Q-Date.now()>ln)return K}return(await(W.current??(W.current=(async()=>{try{let K=await zt(w);return I.current=K.token,P(K),K}finally{W.current=null}})()))).token},[w]),$=un(()=>({appId:p,baseUrl:B??"",orgId:F??"",jwt:R,getAccessToken:N?l?.getAccessToken:g&&!M?U:void 0,authProvider:A,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:M?"preempt":void 0}),[p,l,B,A,R,i,F,a,c,N,M,g,U]);return Kt(()=>{if(!g)return;let H=new AbortController;return m(null),(async()=>{try{let y=await zt(w,H.signal);I.current=y.token,P(y)}catch(y){if(H.signal.aborted)return;m(y instanceof Error?y:new Error(String(y)))}})(),()=>H.abort()},[g,w]),Kt(()=>{if(!N||!l)return;let H=!1,y=l;async function K(){try{let Ie=await y.getAccessToken();H||S(Ie??void 0)}catch{H||S(void 0)}}K();let Q=window.setInterval(()=>{K()},6e4);return()=>{H=!0,window.clearInterval(Q)}},[l,N]),we(xe,{fallback:d,children:b?pn(k,b):V||q?we("div",{role:"status","aria-live":"polite",children:"Signing in..."}):we(he.Provider,{value:$,children:C})})}import{useContext as gn,useEffect as Sn,useMemo as Xt,useReducer as hn,useRef as at}from"react";import{App as vn}from"@urun-sh/core";function yn(e,t){return`${e}:${JSON.stringify(t??{})}`}function kn(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 le=new Map;var ut=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ct=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},lt=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 ut(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ct(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function bn(){let e=gn(he);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=hn(i=>i+1,0),r=at(new Map),o=at(new Map),n=at(null),s=Xt(()=>vn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return Sn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=le.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=le.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=le.get(u);!d||d.refCount!==0||(le.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),Xt(()=>{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 k=yn(u,d),C=r.current.get(k);if(C&&!C.disposed)return C;let g=kn(e,u,d),p=le.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),le.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new lt(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},le.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(k,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as dt,useEffect as Cn,useMemo as Pn,useRef as Fe,useState as pt}from"react";function ve(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 En(e){return e instanceof Error?e:new Error(String(e))}function Tn(e,t){let r=Pn(()=>ve(e),[e]),[o,n]=pt(void 0),[s,i]=pt(null),[a,u]=pt(!1),c=Fe(t);c.current=t;let f=Fe(0),d=Fe(null),k=Fe(!0);Cn(()=>(k.current=!0,()=>{k.current=!1,d.current?.abort()}),[]);let C=dt(async E=>{d.current?.abort();let S=new AbortController;d.current=S;let _=++f.current,P=()=>k.current&&f.current===_;P()&&(u(!0),i(null));try{let x=await r.request(E,{...c.current,signal:S.signal});return P()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let m=En(x);throw P()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),g=dt(E=>{C(E).catch(()=>{})},[C]),p=dt(()=>{f.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}import{useCallback as Gt,useEffect as xn,useMemo as wn,useRef as qe,useState as mt}from"react";function Yt(e){return e instanceof Error?e:new Error(String(e))}var Rn=e=>typeof e=="string"?e:String(e);function An(e,t){let r=wn(()=>ve(e),[e]),[o,n]=mt(""),[s,i]=mt(!1),[a,u]=mt(null),c=qe(t);c.current=t;let f=qe(0),d=qe(null),k=qe(!0);xn(()=>(k.current=!0,()=>{k.current=!1,d.current?.cancel(),d.current=null}),[]);let C=Gt(()=>{f.current++,d.current?.cancel(),d.current=null,k.current&&i(!1)},[]),g=Gt(async p=>{d.current?.cancel();let E=++f.current,S=()=>k.current&&f.current===E,_=c.current,P=_?.parseChunk??Rn,x=_?.buildPayload??(v=>({prompt:v}));S()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:I,onFinish:W,onError:L,...O}=_??{},l="",T;try{T=r.requestStream(x(p),O),d.current=T}catch(v){let M=Yt(v);S()&&(u(M),i(!1),_?.onError?.(M));return}try{for await(let v of T){if(f.current!==E)break;l+=P(v),S()&&n(l)}S()&&(i(!1),_?.onFinish?.(l))}catch(v){let M=Yt(v);S()&&(u(M),i(!1),_?.onError?.(M))}finally{d.current===T&&(d.current=null)}},[r]);return{completion:o,complete:g,stop:C,isStreaming:s,error:a}}import{useCallback as Zt,useEffect as Un,useMemo as Mn,useRef as ye,useState as He}from"react";function Qt(e){return e instanceof Error?e:new Error(String(e))}var _n=e=>typeof e=="string"?e:String(e),er=0;function ft(e){return er+=1,`${e}-${er}`}function Nn(e,t){let r=Mn(()=>ve(e),[e]),[o,n]=He(()=>(t?.initialMessages??[]).map(P=>({id:P.id??ft("msg"),role:P.role,content:P.content}))),[s,i]=He(""),[a,u]=He(!1),[c,f]=He(null),d=ye(t);d.current=t;let k=ye(o);k.current=o;let C=ye(s);C.current=s;let g=ye(0),p=ye(null),E=ye(!0);Un(()=>(E.current=!0,()=>{E.current=!1,p.current?.cancel(),p.current=null}),[]);let S=Zt(()=>{g.current++,p.current?.cancel(),p.current=null,E.current&&u(!1)},[]),_=Zt(async P=>{let x=P===void 0,m=(x?C.current:P)??"";if(!m.trim())return;p.current?.cancel();let W=++g.current,L=()=>E.current&&g.current===W,O=d.current,l=O?.parseChunk??_n,T={id:ft("msg"),role:"user",content:m},v={id:ft("msg"),role:"assistant",content:""},M=[...k.current,T].map(U=>({role:U.role,content:U.content})),N=[...k.current,T,v];k.current=N,n(N),x&&i(""),f(null),u(!0);let J=O?.buildPayload??(U=>({messages:U})),{initialMessages:R,parseChunk:A,buildPayload:V,onFinish:F,onError:B,...q}=O??{},h=U=>{n($=>$.map(H=>H.id===v.id?{...H,content:U}:H))},b="",w;try{w=r.requestStream(J(M),q),p.current=w}catch(U){let $=Qt(U);L()&&(f($),u(!1),O?.onError?.($));return}try{for await(let U of w){if(g.current!==W)break;b+=l(U),L()&&h(b)}L()&&(u(!1),O?.onFinish?.({...v,content:b}))}catch(U){let $=Qt(U);L()&&(f($),u(!1),O?.onError?.($))}finally{p.current===w&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:_,stop:S,isStreaming:a,error:c}}import{useCallback as se,useEffect as tr,useMemo as In,useRef as rr,useState as nr}from"react";import{createInputPresencePublisher as Ln,INPUT_PRESENCE_DEFAULT_HZ as On,INPUT_PRESENCE_FIELD as Dn}from"@urun-sh/core";var gt=[];function Vn(e,t={}){let{field:r=Dn,hz:o=On}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=In(()=>s?Ln({awareness:{setLocalStateField:(m,I)=>s.setField(m,I)},field:r,hz:o}):null,[s,r,o]),a=rr(null);a.current=i;let[u,c]=nr(!1),[f,d]=nr(gt),k=rr(!1);tr(()=>{if(i)return()=>i.dispose()},[i]);let C=se(()=>{let m=a.current;d(m?m.heldKeys():gt)},[]),g=se(()=>{a.current?.clear(),d(gt)},[]);tr(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,I=()=>{if(m()){k.current=!1,c(!0);return}k.current||(c(!1),g())},W=v=>{m()&&(a.current?.keyDown(v.key),C())},L=v=>{a.current?.keyUp(v.key),C()},O=v=>{m()&&a.current?.movePointer(v.movementX,v.movementY)},l=v=>{m()&&a.current?.setButtons(v.buttons)},T=()=>{g()};return n.addEventListener("pointerlockchange",I),n.addEventListener("keydown",W),n.addEventListener("keyup",L),n.addEventListener("mousemove",O),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",T),()=>{n.removeEventListener("pointerlockchange",I),n.removeEventListener("keydown",W),n.removeEventListener("keyup",L),n.removeEventListener("mousemove",O),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",T)}},[n,g,C]);let p=se(m=>{m.requestPointerLock?.()},[]),E=se(()=>{k.current=!0,c(!0)},[]),S=se(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),_=se(m=>{a.current?.keyDown(m),C()},[C]),P=se(m=>{a.current?.keyUp(m),C()},[C]),x=se((m,I)=>{a.current?.movePointer(m,I)},[]);return{engage:p,engageTouch:E,release:S,engaged:u,heldKeys:f,pressKey:_,releaseKey:P,movePointer:x}}var or=new Map;function Fn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);or.set(e,{component:t,schema:r})}function sr(e,t){let r=or.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 Hn,jsx as We}from"react/jsx-runtime";function qn({name:e,props:t,fallback:r}){let o=sr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?We(Hn,{children:r}):We("div",{className:"urun-component-error",role:"alert",children:We("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return We(n,{...o.validatedProps})}import{z as Re}from"zod";import{jsx as St,jsxs as ir}from"react/jsx-runtime";var Wn=Re.object({step:Re.number().min(0),total:Re.number().min(1),label:Re.string().optional(),variant:Re.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 Bn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=ar(e);return ir("div",{className:"urun-progress-card","data-variant":n,children:[o&&St("div",{className:"urun-progress-label",children:o}),St("div",{className:"urun-progress-bar",children:St("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),ir("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as ht}from"zod";import{jsx as ur,jsxs as Jn}from"react/jsx-runtime";var $n=ht.object({state:ht.enum(["thinking","generating","idle","error"]),message:ht.string().optional()}),jn={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function cr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??jn[t]??t;return{state:t,message:n,isActive:o}}function Kn(e){let{state:t,message:r,isActive:o}=cr(e);return Jn("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 lr,useEffect as zn}from"react";import{z as vt}from"zod";import{jsx as dr,jsxs as Yn}from"react/jsx-runtime";var Xn=vt.object({text:vt.string(),streaming:vt.boolean().default(!1)});function pr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Gn(e){let{text:t,streaming:r}=pr(e),o=lr(null),n=lr(0);return zn(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Yn("div",{className:"urun-text-stream",children:[dr("span",{ref:o,className:"urun-text-content"}),r&&dr("span",{className:"urun-text-cursor"})]})}import{z as Be}from"zod";import{jsx as mr,jsxs as eo}from"react/jsx-runtime";var Zn=Be.object({src:Be.string().url(),alt:Be.string().optional(),caption:Be.string().optional()});function fr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Qn(e){let{src:t,alt:r,caption:o}=fr(e);return eo("figure",{className:"urun-image-frame",children:[mr("img",{className:"urun-image",src:t,alt:r}),o&&mr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as ie}from"zod";import{jsx as yt,jsxs as no}from"react/jsx-runtime";var to=ie.object({metrics:ie.array(ie.object({label:ie.string(),value:ie.union([ie.string(),ie.number()]),unit:ie.string().optional()}))});function gr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function ro(e){let{metrics:t}=gr(e);return yt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>no("div",{className:"urun-metric-card",children:[yt("div",{className:"urun-metric-label",children:r.label}),yt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{createContext as oo,useContext as Sr}from"react";import{jsx as ao}from"react/jsx-runtime";var kt=oo(null);function so({session:e,children:t}){return ao(kt.Provider,{value:e,children:t})}function Z(){return Sr(kt)}function io(){let e=Sr(kt);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{forwardRef as uo,useCallback as ke,useEffect as bt,useImperativeHandle as co,useRef as de,useState as hr}from"react";import{jsx as yr,jsxs as po}from"react/jsx-runtime";var vr=1e3;function lo(...e){console.debug("[video]",...e)}var Ct=uo(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:k,placeholder:C,poster:g,children:p,onTrack:E,onFirstFrame:S}=t,_=Z(),P=o??_,x=de(null),m=de(null),[I,W]=hr(!1),[L,O]=hr(!1),l=de(!1),T=de(E);T.current=E;let v=de(S);v.current=S;let M=de(null),N=de(null),J=ke(h=>{if(h===M.current||(M.current=h,N.current?.(),N.current=null,l.current=!1,O(!1),!h))return;let b=x.current;if(!b)return;let w=()=>{N.current?.(),N.current=null,l.current=!0,O(!0),v.current?.()};if(typeof b.requestVideoFrameCallback=="function"){let $=b.requestVideoFrameCallback(w);N.current=()=>b.cancelVideoFrameCallback?.($);return}let U=()=>{let $=b.getVideoPlaybackQuality?.();($?$.totalVideoFrames>0:b.readyState>=2&&b.videoWidth>0)&&w()};b.addEventListener("loadeddata",U),b.addEventListener("timeupdate",U),b.addEventListener("playing",U),N.current=()=>{b.removeEventListener("loadeddata",U),b.removeEventListener("timeupdate",U),b.removeEventListener("playing",U)},U()},[]);bt(()=>()=>{N.current?.(),N.current=null},[]);let R=ke(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let h=x.current;return h&&h.srcObject!==m.current&&(h.srcObject=m.current),m.current},[]),A=ke(h=>{let b=x.current;if(!b)return;let w=b.play();!w||typeof w.catch!="function"||w.catch(U=>lo(`play() failed (${h})`,U))},[]),V=ke(h=>{let b=R();if(b){for(let w of b.getVideoTracks())w!==h&&b.removeTrack(w);if(h&&!b.getVideoTracks().includes(h)){b.addTrack(h);let w=x.current;w&&(w.srcObject=b)}h&&A("track-attach"),W(h!==null),J(h),T.current?.(h)}},[R,A,J]),F=ke(h=>{let b=R();if(b){for(let w of b.getAudioTracks())w!==h&&b.removeTrack(w);h&&!b.getAudioTracks().includes(h)&&b.addTrack(h),h&&A("audio-attach")}},[R,A]),B=ke(h=>{x.current=h,h&&(a&&(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted","")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),R())},[R,a]);co(r,()=>({get element(){return x.current},get live(){return m.current?m.current.getVideoTracks().length>0:!1},get framed(){return l.current}}),[]);let q=i!==void 0;return bt(()=>{if(q){V(i??null);return}if(!P)return;let h=P.stream(n),b=()=>{let y=m.current;return y?y.getVideoTracks()[0]??null:null},w=y=>{if(y!==b()&&(V(y),y)){let K=()=>{b()===y&&V(null)};y.addEventListener("ended",K)}},U=h.track;U&&U.readyState==="live"&&w(U);let $=h.on("track",y=>{y&&y.readyState!=="live"||w(y)}),H=setInterval(()=>{let y=h.track;y&&y.readyState==="live"&&w(y)},vr);return()=>{$(),clearInterval(H)}},[P,n,q,i,V]),bt(()=>{if(q||!P||s===!1)return;let h=P.stream(s),b=()=>{let y=m.current;return y?y.getAudioTracks()[0]??null:null},w=y=>{if(y!==b()&&(F(y),y)){let K=()=>{b()===y&&F(null)};y.addEventListener("ended",K)}},U=h.track;U&&U.readyState==="live"&&w(U);let $=h.on("track",y=>{y&&y.readyState!=="live"||w(y)}),H=setInterval(()=>{let y=h.track;y&&y.readyState==="live"&&w(y)},vr);return()=>{$(),clearInterval(H)}},[P,s,q,F]),po("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...d},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":L?"true":"false",children:[yr("video",{ref:B,className:k,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:C,g===void 0?null:yr("div",{"data-urun-video-poster":"","aria-hidden":L||void 0,style:{position:"absolute",inset:0,...L?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});import{forwardRef as mo}from"react";import{jsx as go}from"react/jsx-runtime";var fo=mo(function(t,r){let{stream:o="image",...n}=t;return go(Ct,{ref:r,stream:o,...n})});import{forwardRef as ho,useCallback as be,useEffect as Pt,useImperativeHandle as vo,useRef as Ce}from"react";import{observePageLifecycle as yo}from"@urun-sh/core";var $e=null;function So(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function je(){if($e)return $e;let e=So();return e?($e=new e,$e):null}function Ke(){let e=je();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Co}from"react/jsx-runtime";var ko=1e3,kr=200;function Et(...e){console.debug("[audio]",...e)}var Je=ho(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,d=Z(),k=o??d,C=Ce(null),g=Ce(null),p=Ce(null),E=Ce(null),S=Ce(u);S.current=u;let _=Ce(c);_.current=c;let P=be(l=>{p.current!==l&&(p.current=l,_.current?.(l))},[]),x=be(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let l=C.current;return l&&l.srcObject!==g.current&&(l.srcObject=g.current),g.current},[]),m=be(l=>{let T=C.current;if(!T)return;let v=T.play();!v||typeof v.then!="function"||v.then(()=>{T.muted||P(!0)}).catch(M=>{let N=M instanceof Error?M.name:String(M);if(N==="AbortError"){Et(`play() aborted (${l}); retrying in ${kr}ms`),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{E.current=null,m(`${l}:retry`)},kr);return}if(N==="NotAllowedError"){Et(`play() blocked pending a user gesture (${l})`),P(!1);return}Et(`play() failed (${l})`,M)})},[P]),I=be(l=>{let T=x();if(T){for(let v of T.getAudioTracks())v!==l&&T.removeTrack(v);l&&!T.getAudioTracks().includes(l)&&T.addTrack(l),l&&m("track-attach"),S.current?.(l)}},[x,m]),W=be(()=>{let l=C.current;l&&(x(),l.muted=!1,m("gesture"),Ke(),P(!0))},[x,m,P]);vo(r,()=>({unlock:W,get unlocked(){return p.current===!0},get element(){return C.current}}),[W]);let L=be(l=>{C.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),x()),f?.(l)},[x,f]),O=s!==void 0;return Pt(()=>{if(O){I(s??null);return}if(!k)return;let l=k.stream(n),T=()=>{let R=g.current;return R?R.getAudioTracks()[0]??null:null},v=R=>{if(R!==T()&&(I(R),R)){let A=()=>{T()===R&&I(null)};R.addEventListener("ended",A)}},M=l.track;M&&M.readyState==="live"&&v(M);let N=l.on("track",R=>{R&&R.readyState!=="live"||v(R)}),J=setInterval(()=>{let R=l.track;R&&R.readyState==="live"&&v(R)},ko);return()=>{N(),clearInterval(J)}},[k,n,O,s,I]),Pt(()=>yo(()=>{Ke(),p.current===!0&&m("foreground")}),[m]),Pt(()=>()=>{E.current&&clearTimeout(E.current)},[]),Co("audio",{ref:L,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),bo=Je;import{forwardRef as Po,useCallback as Pe,useEffect as br,useImperativeHandle as Eo,useRef as te}from"react";import{observePageLifecycle as To,sessionFailureFromMediaError as xo,sharedCaptureController as wo}from"@urun-sh/core";import{jsx as Ao}from"react/jsx-runtime";var Cr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ze(...e){console.debug("[voice]",...e)}var Xe=Po(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Cr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:d,onMicStream:k,onTrack:C,onUnlockChange:g,capture:p}=t,E=Z(),S=o??E,_=te(null),P=te(null),x=te(null),m=te([]),I=te(!1),W=te(f);W.current=f;let L=te(d);L.current=d;let O=te(k);O.current=k;let l=Pe(A=>{I.current!==A&&(I.current=A,W.current?.(A))},[]),T=Pe(()=>{for(let A of m.current)A();m.current=[],x.current?.release(),x.current=null,P.current&&(P.current=null,O.current?.(null))},[]),v=Pe(async()=>{let A=x.current;if(A){let q=await A.update(i);return P.current=A.stream,O.current?.(A.stream),q}let F=await(p??wo()).claim("audio",i);x.current=F,m.current=[F.onTrack((q,h)=>{P.current=h,O.current?.(h),I.current&&S?.stream(n).attach(q).catch(b=>ze("mic re-attach after one-capture re-acquire failed",b))}),F.onLost(q=>{x.current=null,m.current=[],P.current=null,O.current?.(null),l(!1),L.current?.(q)})],P.current=F.stream,O.current?.(F.stream);let B=F.track;if(!B)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return B},[p,i,S,n,l]),M=Pe(async()=>{T(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,T,l]),N=Pe(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");_.current?.unlock();let A;try{A=await v()}catch(B){T();let q=xo(B,S.status);throw L.current?.(q),q}S.connect?.();let V;for(let B=1;B<=u;B++)try{await S.whenLive(a!==void 0?{timeout:a}:void 0),await S.stream(n).attach(A),l(!0);return}catch(q){V=q,ze(`start attempt ${B}/${u} failed`,q),B<u&&await new Promise(h=>setTimeout(h,c))}T(),l(!1);let F=V instanceof Error?V:new Error(String(V??"voice start failed"));throw L.current?.(F),F},[S,n,a,u,c,v,T,l]);Eo(r,()=>({start:N,stop:M,unlock:()=>_.current?.unlock(),get active(){return I.current},get micStream(){return P.current},get audio(){return _.current}}),[N,M]);let J=te(!1),R=Pe(async()=>{if(!S||!I.current||J.current)return;let A=P.current?.getAudioTracks()[0]??null;if(A&&A.readyState==="live"){try{await S.stream(n).attach(A)}catch(V){ze("foreground mic re-assert failed (will retry on next pass)",V)}return}J.current=!0;try{let V=await v();await S.stream(n).attach(V)}catch(V){let F=V instanceof Error?V:new Error(String(V));ze("foreground mic re-acquire failed",F),L.current?.(F)}finally{J.current=!1}},[S,n,v]);return br(()=>{let A=()=>{R()};return S&&typeof S.onRecovery=="function"?S.onRecovery(A):To(A)},[S,R]),br(()=>T,[T]),s?Ao(Je,{ref:_,session:S,stream:n,onTrack:C,onUnlockChange:g}):null}),Ro=Xe;import{forwardRef as _o,useEffect as No,useImperativeHandle as Io,useRef as Pr,useState as Lo}from"react";import{useEffect as Uo,useState as Mo}from"react";var Tt={level:0,speaking:!1};function xt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Mo(Tt);return Uo(()=>{if(!e){i(Tt);return}let a=je();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),C=setInterval(()=>{f.getByteTimeDomainData(d);let g=0;for(let E=0;E<d.length;E++){let S=(d[E]-128)/128;g+=S*S}let p=Math.sqrt(g/d.length);i(E=>{let S=p>n;return Math.abs(E.level-p)<.005&&E.speaking===S?E:{level:p,speaking:S}})},o);return()=>{clearInterval(C),c.disconnect(),i(Tt)}},[e,r,o,n]),s}import{Fragment as Fo,jsx as Ge,jsxs as qo}from"react/jsx-runtime";var Oo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Do={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Vo=_o(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:k}=t,C=Z(),g=o??C,p=Pr(null),[E,S]=Lo(null),_=Pr(d);_.current=d;let{level:P,speaking:x}=xt(a?E:null);return Io(r,()=>({start:()=>{let m=p.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),No(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),qo(Fo,{children:[Ge(Xe,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:f,onMicStream:m=>{S(m),_.current?.(m)}}),a?Ge("span",{className:u,style:Oo,"data-urun-mic":"","data-urun-mic-active":E?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(P*100)/100,children:Ge("span",{style:Do,children:Ge("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(P*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{sessionFailureFromMediaError as Ho,sharedCaptureController as Wo}from"@urun-sh/core";import{forwardRef as Tr,useCallback as re,useEffect as wt,useImperativeHandle as Bo,useRef as X,useState as Ae}from"react";import{jsx as ae,jsxs as Er}from"react/jsx-runtime";var xr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Rt(...e){console.debug("[camera]",...e)}function $o(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function jo(){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 wr=Tr(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:k=!1,className:C,videoClassName:g,onActiveChange:p,onError:E,onStream:S,onTrack:_,children:P,capture:x,flipControl:m="auto",flipControlClassName:I,onDevices:W}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let L=i?"user":a?"environment":u??"environment",O=Z(),l=o??O,T=X(null),v=X(null),M=X(null),N=X([]),J=X(null),R=X(!1),A=X(L),[V,F]=Ae(L),[B,q]=Ae(!1),[h,b]=Ae(null),[w,U]=Ae(!1),[$]=Ae($o),H=X(p);H.current=p;let y=X(E);y.current=E;let K=X(S);K.current=S;let Q=X(_);Q.current=_;let Ie=X(W);Ie.current=W;let ne=re(D=>{R.current!==D&&(R.current=D,q(D),H.current?.(D))},[]);wt(()=>{if(!B){b(null);return}let D=!1,j=()=>{jo().then(G=>{D||(b(G),G&&Ie.current?.(G))})};j();let z=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof z?.addEventListener=="function"?(z.addEventListener("devicechange",j),()=>{D=!0,z.removeEventListener?.("devicechange",j)}):()=>{D=!0}},[B]);let Le=re(D=>{let j=T.current;j&&(j.muted=!0,j.defaultMuted=!0,j.setAttribute("muted",""),j.setAttribute("playsinline",""),j.setAttribute("webkit-playsinline",""),j.srcObject=D,D&&j.play()?.catch?.(z=>Rt("preview play() failed",z)))},[]),ee=re(()=>{J.current?.(),J.current=null;for(let D of N.current)D();N.current=[],M.current?.release(),M.current=null,v.current&&(v.current=null,K.current?.(null),Q.current?.(null)),Le(null)},[Le]),rt=re((D,j)=>{J.current?.(),v.current=j,Le(j),K.current?.(j);let z=()=>{v.current===j&&(Rt("camera track ended (device removed or permission revoked)"),ee(),ne(!1))};D.addEventListener("ended",z),J.current=()=>D.removeEventListener("ended",z)},[Le,ee,ne]),ge=re(async D=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let j={...xr,...s,facingMode:D},z;try{let G=M.current;if(G)z=await G.update(j);else{let Ee=await(x??Wo()).claim("video",j);if(M.current=Ee,N.current=[Ee.onTrack((Te,jr)=>{rt(Te,jr),R.current&&l.stream(n).attachVideo(Te).then(()=>Q.current?.(Te)).catch(Kr=>Rt("camera re-publish after one-capture re-acquire failed",Kr))}),Ee.onLost(Te=>{M.current=null,N.current=[],ee(),ne(!1),y.current?.(Te)})],!Ee.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});z=Ee.track}}catch(G){let Se=Ho(G,l.status);throw y.current?.(Se),Se}A.current=D,F(D),rt(z,M.current?.stream??new MediaStream([z]));try{l.connect?.(),await l.whenLive(d!==void 0?{timeout:d}:void 0),await l.stream(n).attachVideo(z)}catch(G){ee(),ne(!1);let Se=G instanceof Error?G:new Error(String(G));throw y.current?.(Se),Se}Q.current?.(z),ne(!0)},[l,n,s,d,x,rt,ee,ne]),Vt=re(D=>ge(D?.facingMode??A.current),[ge]),Oe=re(async D=>{R.current&&A.current===D||await ge(D)},[ge]),nt=re(()=>ge(A.current==="environment"?"user":"environment"),[ge]),Ft=re(async()=>{ee(),ne(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,ee,ne]);Bo(r,()=>({start:Vt,stop:Ft,flip:nt,setFacingMode:Oe,get active(){return R.current},get facingMode(){return A.current},get stream(){return v.current},get element(){return T.current}}),[Vt,Ft,nt,Oe]);let qt=X(Oe);if(qt.current=Oe,wt(()=>{!c||!l||qt.current(L).catch(()=>{})},[c,l,L]),wt(()=>ee,[ee]),!k)return null;let Wr=f==="auto"?V==="user":f,Br=B&&(m===!0||m==="auto"&&$&&(h?.length??0)>1),$r=()=>{w||(U(!0),nt().catch(()=>{}).finally(()=>U(!1)))};return Er("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":V,children:[ae("video",{ref:T,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Wr?{transform:"scaleX(-1)"}:{}}}),Br?ae("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:$r,disabled:w,className:I,style:I?{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:Er("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:[ae("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ae("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ae("path",{d:"M14.5 10.5v1.6h-1.6"}),ae("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ae("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,P]})}),Ko=Tr(function({preview:t=!0,...r},o){return ae(wr,{ref:o,...r,visible:t,autoStart:!1})});import{useEffect as Jo,useState as zo}from"react";function Xo(e,t){let[r,o]=zo(null);return Jo(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as ts}from"react";import{useEffect as Qo,useMemo as es}from"react";import{createStore as Go}from"zustand/vanilla";import{useStore as Yo}from"zustand";var Zo=()=>{};function At(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Go(()=>({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):Zo,u=(c=>Yo(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 Ue(e,t){let r=es(()=>At(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Qo(()=>r.bind(),[r]),r}function rs(e,t,r){let n=Ue(e,t)(r??(a=>a)),s=ts(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as ns,useState as os}from"react";var pe=200;function ue(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Me(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ut(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 Mt(e,t,r={}){let o=r.cap??200,[n,s]=os([]);return ns(()=>{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=>ue(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as Ye,jsxs as _e}from"react/jsx-runtime";function ss({session:e,name:t,cap:r,className:o}){let n=Mt(e,t,{cap:r});return _e("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[_e("div",{className:"urun-stream-tail-meta",children:[Ye("code",{children:t}),_e("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),Ye("div",{className:"urun-stream-tail-log",children:n.length===0?_e("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ye("code",{children:t})," messages\u2026"]}):n.map((s,i)=>_e("div",{className:"urun-stream-tail-line",children:[Ye("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Me(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as is,useState as Rr}from"react";import{jsx as me,jsxs as Ze}from"react/jsx-runtime";function Qe({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Rr(""),[i,a]=Rr(null),u=is(()=>{let c=Ut(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return Ze("div",{className:"urun-doc-patch",children:[me("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),Ze("div",{className:"urun-doc-patch-actions",children:[me("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?me("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function as({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ue(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return Ze("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[Ze("div",{className:"urun-doc-panel-meta",children:[me("code",{children:t}),me("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),me("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?me(Qe,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as us,useState as cs}from"react";import{jsx as Ne,jsxs as Ur}from"react/jsx-runtime";function Ar(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function ls({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=cs([]);return us(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ue(u,{at:Date.now(),direction:"in",text:Ar(Me(a))},r))}):void 0),[e,t,r]),Ur("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Ne(Qe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ue(u,{at:Date.now(),direction:"out",text:Ar(a)},r))}}),Ne("div",{className:"urun-control-sender-log",children:n.length===0?Ne("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Ur("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Ne("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Ne("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as ds,useState as ps}from"react";import{jsx as et,jsxs as fs}from"react/jsx-runtime";function ms({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=ps([]),a=t.join(","),u=r.join(",");return ds(()=>{if(i([]),!e)return;let c=(d,k)=>i(C=>ue(C,{at:Date.now(),kind:d,text:k},o)),f=[];f.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let k=e.stream(d);f.push(k.on("track",C=>c("track",`${d}: ${C?"track arrived":"track ended"}`)))}for(let d of r){let k=e.doc(d);f.push(k.on("change",()=>c("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,a,u,o]),et("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?et("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)=>fs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[et("span",{className:"urun-event-spine-kind",children:c.kind})," ",et("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as As,isWakingPhase as Us}from"@urun-sh/core";import{useEffect as gs,useState as Ss}from"react";function Y(e){let[t,r]=Ss(e?.phase??null);return gs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as bs}from"@urun-sh/core";import{useEffect as hs,useRef as vs,useState as ys}from"react";import{isWakingPhase as ks}from"@urun-sh/core";function _t(e){let t=Y(e),r=ks(t?.name),o=vs(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]=ys(s);return hs(()=>{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 Cs,jsx as Mr,jsxs as _r}from"react/jsx-runtime";function Nt({session:e,render:t,className:r}){let o=_t(e);return!o.waking||!o.phase?null:Mr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):_r(Cs,{children:[Mr("span",{className:"urun-session-waking-label",children:bs(o.phase)})," ",_r("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Ts,useState as xs}from"react";import{useEffect as Nr,useRef as Ps,useState as Ir}from"react";var Es={event:null,elapsedMs:0};function It(e,t){let[r,o]=Ir(null),n=Ps(0);Nr(()=>{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]=Ir(0);return Nr(()=>{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}:Es}import{jsx as Lr,jsxs as Or}from"react/jsx-runtime";var ws={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 Rs(e){let[t,r]=xs(!1);return Ts(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Lt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=It(e,t),i=Rs(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Lr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Or("div",{className:"urun-activation-overlay-card",children:[Lr("span",{className:"urun-activation-overlay-copy",children:a.hint??ws[u]})," ",Or("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as fe,jsxs as Ot}from"react/jsx-runtime";var Ms={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function _s({session:e,className:t}){let r=Y(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 Ot("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[fe("span",{className:"urun-session-status-dot","data-phase":o}),fe("span",{className:"urun-session-status-label",children:Ms[o]}),n?fe("span",{className:"urun-session-status-detail",children:n}):null]})}function Ns({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Y(e);if(s?.name==="live")return Ot("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,fe(Lt,{session:e})]});let i=r?r(s):fe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Us(s.name)?fe(Nt,{session:e}):s&&s.name!=="idle"?As(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Ot("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?fe("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as Vs}from"react/jsx-runtime";function Dr(e){return Y(e)?.endsAt??null}function Os(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 Ds({session:e,urgentMs:t=6e4,className:r}){let n=Dr(e)?.getTime()??null,[s,i]=Ls(()=>n===null?null:Math.max(0,n-Date.now()));if(Is(()=>{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=Os(s);return Vs("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 Vr,jsxs as Hs}from"react/jsx-runtime";var Fs=new Set(["expired","ended","error"]);function qs({session:e,onNewSession:t,children:r,className:o}){let n=Y(e);if(!n||!Fs.has(n.name))return null;let s=r?r(n):Vr("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 Hs("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Vr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Fr,useMemo as Ws,useState as qr}from"react";import{jsx as tt,jsxs as js}from"react/jsx-runtime";function Dt(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 Hr(e){let t=Ws(()=>e?e.doc("control"):null,[e]),[r,o]=qr(()=>t?Dt(t.get("idle")):null);return Fr(()=>{if(!t){o(null);return}return o(Dt(t.get("idle"))),t.on("change",()=>o(Dt(t.get("idle"))))},[t]),r}function Bs(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function $s({session:e,onStillHere:t,className:r}){let o=Hr(e),n=o?.deadlineEpochS??null,[s,i]=qr(null);if(Fr(()=>{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 tt("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:js("div",{className:"urun-idle-warning-card",children:[tt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),tt("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Bs(s)} due to inactivity.`:"This session will end soon due to inactivity."}),tt("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as Ks,useEffect as Js,useState as zs}from"react";import{prewake as Xs}from"@urun-sh/core";function Gs(e){let t=Ks(he),[r,o]=zs(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 Js(()=>{if(!a||!u||!n||!s)return;let k=!1,C=()=>{Xs({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:d}).then(p=>{k||o(p)}).catch(()=>{})};C();let g=setInterval(C,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(g)}},[n,s,i,a,u,c,f,d]),r}import{describeSessionPhase as Gc,isWakingPhase as Yc}from"@urun-sh/core";export{Je as Audio,wr as Camera,qn as ComponentRenderer,xr as DEFAULT_CAMERA_CONSTRAINTS,pe as DEFAULT_LOG_CAP,Cr as DEFAULT_VOICE_CONSTRAINTS,Qe as DocPatchForm,fo as Image,Qn as ImageFrame,Zn as ImageFrameSchema,ro as MetricsPanel,to as MetricsPanelSchema,Vo as Mic,rn as OPERATOR_CHORD_LABEL,tn as OPERATOR_TOKEN_STORAGE_KEY,Bn as ProgressCard,Wn as ProgressCardSchema,so as Session,Kn as StatusBadge,$n as StatusBadgeSchema,Gn as TextStream,Xn as TextStreamSchema,Lt as UrunActivationOverlay,bo as UrunAudio,Jr as UrunAuthProvider,Ko as UrunCamera,ls as UrunControlSender,as as UrunDocPanel,xe as UrunErrorBoundary,ms as UrunEventSpine,$s as UrunIdleWarning,zr as UrunJwtProvider,mn as UrunProvider,Ds as UrunSessionClock,qs as UrunSessionEnded,Ns as UrunSessionGate,_s as UrunSessionStatus,Nt as UrunSessionWaking,ss as UrunStreamTail,Ro as UrunVoice,Ct as Video,Xe as Voice,De as authMode,At as createDocStore,Gc as describeSessionPhase,Me as formatPayload,je as getUrunAudioContext,Yc as isWakingPhase,Ut as parseJsonObject,ue as pushCapped,jt as readOperatorToken,Fn as registerComponent,Ke as resumeUrunAudioContext,oe as urunPublicEnv,It as useActivation,bn as useApp,Nn as useChat,An as useCompletion,it as useConfirmOnLeave,Ue as useDocStore,fr as useImageFrame,Vn as useInputPresence,gr as useMetricsPanel,st as useOperatorOverride,ar as useProgressCard,Tn as useRequest,io as useSession,rs as useSessionDoc,Dr as useSessionEndsAt,Hr as useSessionIdle,Y as useSessionPhase,Xo as useSessionTrack,_t as useSessionWake,cr as useStatusBadge,Mt as useStreamMessages,pr as useTextStream,xt as useUrunAudioLevel,ot as useUrunAuth,Gs as useUrunPrewake,Zr as usesWorkOSAuth};
2
+ import{a as rn,b as nn,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as hn,useEffect as tr,useMemo as Sn,useRef as rr,useState as Xe}from"react";import{Component as on}from"react";import{jsx as Gt,jsxs as sn}from"react/jsx-runtime";var De=class extends on{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||sn("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:[Gt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Gt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as an}from"react";var we=an(null);function ye(e){return e&&e.trim()?e.trim():void 0}function me(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ye(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ye(typeof process<"u"?process.env?.[e]:void 0)}}function Je(){let e=me("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||me("VERCEL_ENV")==="production"?"workos":me("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function un(){return Je()==="workos"}import{useEffect as cn,useRef as ln}from"react";var dn="urun.operator_token",Zt=null,Yt="op",pn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Qt(){return typeof window<"u"}function er(){return Zt}function mn(){if(!Qt())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(Yt);if(!r)return null;Zt=r,t.delete(Yt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function fn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function vt(e){let t=ln(e);t.current=e,cn(()=>{if(!Qt())return;mn();let r=o=>{if(!fn(o))return;let n=er();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as gn}from"react";function yt(e=!0){gn(()=>{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 Ve,jsxs as Cn}from"react/jsx-runtime";var vn="/api/urun-token",yn=1e4;function kn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function nr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function bn(e,t){return typeof e=="function"?e(t):e!==void 0?e:Cn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Ve("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ve("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Rn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){let g=n===void 0&&t===void 0;if(!g&&(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(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);yt(f);let[h,m]=Xe(),[k,b]=Xe(),[x,S]=Xe(null),y=rr(void 0),w=rr(null),[T,I]=Xe(null);vt(K=>I({jwt:K}));let d=St(),E=me("NEXT_PUBLIC_SESSION_TOKEN")??me("NEXT_PUBLIC_URUN_JWT"),R=Je(),U=T!==null,O=R==="workos"&&!n&&!U&&!g,z=n??(R==="jwt"?E:void 0)??h??k?.token,N=U?T.jwt:z,_=s??me("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),F=O&&!N,B=t??k?.orgId,q=e??k?.gatewayUrl,W=g&&k===void 0,G=g&&k!==void 0&&!q?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,ee=x??G,J=u??vn,H=hn(async K=>{if(!K?.forceRefresh){let $=y.current;if(!$)return $;let C=kn($);if(C===null||C-Date.now()>yn)return $}return(await(w.current??(w.current=(async()=>{try{let $=await nr(J);return y.current=$.token,b($),$}finally{w.current=null}})()))).token},[J]),X=Sn(()=>({appId:p,baseUrl:q??"",orgId:B??"",jwt:N,getAccessToken:O?d?.getAccessToken:g&&!U?H:void 0,authProvider:_,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:U?"preempt":void 0}),[p,d,q,_,N,i,B,a,c,O,U,g,H]);return tr(()=>{if(!g)return;let K=new AbortController;return S(null),(async()=>{try{let Z=await nr(J,K.signal);y.current=Z.token,b(Z)}catch(Z){if(K.signal.aborted)return;S(Z instanceof Error?Z:new Error(String(Z)))}})(),()=>K.abort()},[g,J]),tr(()=>{if(!O||!d)return;let K=!1,Z=d;async function $(){try{let L=await Z.getAccessToken();K||m(L??void 0)}catch{K||m(void 0)}}$();let C=window.setInterval(()=>{$()},6e4);return()=>{K=!0,window.clearInterval(C)}},[d,O]),Ve(De,{fallback:l,children:ee?bn(v,ee):F||W?Ve("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ve(we.Provider,{value:X,children:P})})}import{useContext as Pn,useEffect as En,useMemo as or,useReducer as wn,useRef as kt}from"react";import{App as Tn}from"@urun-sh/core";function xn(e,t){return`${e}:${JSON.stringify(t??{})}`}function An(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 ke=new Map;var bt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}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()}},Rt=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()}},Ct=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new bt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Rt(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 Un(){let e=Pn(we);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=wn(i=>i+1,0),r=kt(new Map),o=kt(new Map),n=kt(null),s=or(()=>Tn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return En(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=ke.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=ke.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 l=ke.get(u);!l||l.refCount!==0||(ke.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),or(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=xn(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=An(e,u,l),p=ke.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),ke.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Ct(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},ke.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as Pt,useEffect as Mn,useMemo as _n,useRef as Ge,useState as Et}from"react";function Te(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 Nn(e){return e instanceof Error?e:new Error(String(e))}function In(e,t){let r=_n(()=>Te(e),[e]),[o,n]=Et(void 0),[s,i]=Et(null),[a,u]=Et(!1),c=Ge(t);c.current=t;let f=Ge(0),l=Ge(null),v=Ge(!0);Mn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=Pt(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let x=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let S=Nn(x);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=Pt(h=>{P(h).catch(()=>{})},[P]),p=Pt(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Ln,useMemo as On,useRef as Ye,useState as wt}from"react";function ir(e){return e instanceof Error?e:new Error(String(e))}var Dn=e=>typeof e=="string"?e:String(e);function Vn(e,t){let r=On(()=>Te(e),[e]),[o,n]=wt(""),[s,i]=wt(!1),[a,u]=wt(null),c=Ye(t);c.current=t;let f=Ye(0),l=Ye(null),v=Ye(!0);Ln(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=sr(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=sr(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??Dn,x=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:w,onError:T,...I}=k??{},d="",E;try{E=r.requestStream(x(p),I),l.current=E}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U));return}try{for await(let R of E){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}import{useCallback as ar,useEffect as Fn,useMemo as qn,useRef as xe,useState as Ze}from"react";function ur(e){return e instanceof Error?e:new Error(String(e))}var Hn=e=>typeof e=="string"?e:String(e),cr=0;function Tt(e){return cr+=1,`${e}-${cr}`}function Wn(e,t){let r=qn(()=>Te(e),[e]),[o,n]=Ze(()=>(t?.initialMessages??[]).map(b=>({id:b.id??Tt("msg"),role:b.role,content:b.content}))),[s,i]=Ze(""),[a,u]=Ze(!1),[c,f]=Ze(null),l=xe(t);l.current=t;let v=xe(o);v.current=o;let P=xe(s);P.current=s;let g=xe(0),p=xe(null),h=xe(!0);Fn(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=ar(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=ar(async b=>{let x=b===void 0,S=(x?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let w=++g.current,T=()=>h.current&&g.current===w,I=l.current,d=I?.parseChunk??Hn,E={id:Tt("msg"),role:"user",content:S},R={id:Tt("msg"),role:"assistant",content:""},U=[...v.current,E].map(H=>({role:H.role,content:H.content})),O=[...v.current,E,R];v.current=O,n(O),x&&i(""),f(null),u(!0);let z=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:F,onFinish:B,onError:q,...W}=I??{},G=H=>{n(X=>X.map(K=>K.id===R.id?{...K,content:H}:K))},ee="",J;try{J=r.requestStream(z(U),W),p.current=J}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X));return}try{for await(let H of J){if(g.current!==w)break;ee+=d(H),T()&&G(ee)}T()&&(u(!1),I?.onFinish?.({...R,content:ee}))}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X))}finally{p.current===J&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}import{useCallback as fe,useEffect as lr,useMemo as Bn,useRef as dr,useState as pr}from"react";import{createInputPresencePublisher as jn,INPUT_PRESENCE_DEFAULT_HZ as Kn,INPUT_PRESENCE_FIELD as $n}from"@urun-sh/core";var xt=[];function zn(e,t={}){let{field:r=$n,hz:o=Kn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Bn(()=>s?jn({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=dr(null);a.current=i;let[u,c]=pr(!1),[f,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let P=fe(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),g=fe(()=>{a.current?.clear(),l(xt)},[]);lr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},w=R=>{S()&&(a.current?.keyDown(R.key),P())},T=R=>{a.current?.keyUp(R.key),P()},I=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},E=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",w),n.addEventListener("keyup",T),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",w),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,g,P]);let p=fe(S=>{S.requestPointerLock?.()},[]),h=fe(()=>{v.current=!0,c(!0)},[]),m=fe(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=fe(S=>{a.current?.keyDown(S),P()},[P]),b=fe(S=>{a.current?.keyUp(S),P()},[P]),x=fe((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:x}}import{forwardRef as no,useEffect as Sr,useImperativeHandle as oo,useMemo as so,useRef as et}from"react";import{createCameraWarp as io}from"@urun-sh/core";import{forwardRef as Zn,useCallback as Ae,useEffect as Qe,useImperativeHandle as Qn,useRef as ie,useState as fr}from"react";import{createContext as Jn,useContext as mr}from"react";import{jsx as Yn}from"react/jsx-runtime";var At=Jn(null);function Xn({session:e,children:t}){return Yn(At.Provider,{value:e,children:t})}function ce(){return mr(At)}function Gn(){let e=mr(At);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as hr,jsxs as ro}from"react/jsx-runtime";function eo(e,t){return e-t>>>0<2147483648}var gr=1e3;function to(...e){console.debug("[video]",...e)}var Ue=Zn(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:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:x}=t,S=ce(),y=o??S,w=ie(null),T=ie(null),[I,d]=fr(!1),[E,R]=fr(!1),U=ie(!1),O=ie(h);O.current=h;let z=ie(m);z.current=m;let N=ie(b);N.current=b;let _=ie(x);_.current=x;let F=ie(k??null);F.current=k??null;let B=ie(null),q=ie(null),W=Ae((C,L=!1)=>{if(!L&&C===B.current||(B.current=C,q.current?.(),q.current=null,U.current=!1,R(!1),!C))return;let M=w.current;if(!M)return;let j=F.current,re=j?.rtpTimestamp??null,Y=!1,A=()=>{Y||(Y=!0,_.current?.())};j&&re==null&&A();let te=j!=null&&re!=null,ve=oe=>{q.current?.(),q.current=null,U.current=!0,R(!0),z.current?.(),oe&&N.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let oe=!1,Pe=0,Ie=(gt,ht)=>{if(!oe){if(te){let ze=ht?.rtpTimestamp;if(typeof ze!="number"){A(),ve(!1);return}if(!eo(ze,re)){Pe=M.requestVideoFrameCallback(Ie);return}ve(!0);return}ve(!1)}};Pe=M.requestVideoFrameCallback(Ie),q.current=()=>{oe=!0,M.cancelVideoFrameCallback?.(Pe)};return}te&&A();let ne=()=>{let oe=M.getVideoPlaybackQuality?.();(oe?oe.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&ve(!1)};M.addEventListener("loadeddata",ne),M.addEventListener("timeupdate",ne),M.addEventListener("playing",ne),q.current=()=>{M.removeEventListener("loadeddata",ne),M.removeEventListener("timeupdate",ne),M.removeEventListener("playing",ne)},ne()},[]);Qe(()=>()=>{q.current?.(),q.current=null},[]);let G=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,ee=ie(G);Qe(()=>{if(ee.current===G||(ee.current=G,G==null))return;let C=B.current;C&&W(C,!0)},[G,W]);let J=Ae(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let C=w.current;return C&&C.srcObject!==T.current&&(C.srcObject=T.current),T.current},[]),H=Ae(C=>{let L=w.current;if(!L)return;let M=L.play();!M||typeof M.catch!="function"||M.catch(j=>to(`play() failed (${C})`,j))},[]),X=Ae(C=>{let L=J();if(L){for(let M of L.getVideoTracks())M!==C&&L.removeTrack(M);if(C&&!L.getVideoTracks().includes(C)){L.addTrack(C);let M=w.current;M&&(M.srcObject=L)}C&&H("track-attach"),d(C!==null),W(C),O.current?.(C)}},[J,H,W]),K=Ae(C=>{let L=J();if(L){for(let M of L.getAudioTracks())M!==C&&L.removeTrack(M);C&&!L.getAudioTracks().includes(C)&&L.addTrack(C),C&&H("audio-attach")}},[J,H]),Z=Ae(C=>{w.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),J())},[J,a]);Qn(r,()=>({get element(){return w.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return U.current}}),[]);let $=i!==void 0;return Qe(()=>{if($){X(i??null);return}if(!y)return;let C=y.stream(n),L=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},M=A=>{if(A!==L()&&(X(A),A)){let te=()=>{L()===A&&X(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,n,$,i,X]),Qe(()=>{if($||!y||s===!1)return;let C=y.stream(s),L=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},M=A=>{if(A!==L()&&(K(A),A)){let te=()=>{L()===A&&K(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,s,$,K]),ro("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":E?"true":"false",children:[hr("video",{ref:Z,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:P,g===void 0?null:hr("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});import{jsx as vr,jsxs as co}from"react/jsx-runtime";var ao={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},uo=no(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),P=et(null),g=et(0),p=et(f);p.current=f;let h=so(()=>io(p.current),[]);return oo(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),Sr(()=>{if(!i)return;let m=0,k=0,b=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function w(){h.frameArrived(),k=y.requestVideoFrameCallback(w)}))},S=y=>{m=requestAnimationFrame(S);let w=P.current,T=v.current?.element??null;if(!w||!T||(T!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),x(T)),T.readyState<2))return;h.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(w.clientWidth*I)),E=Math.max(1,Math.round(w.clientHeight*I));(w.width!==d||w.height!==E)&&(w.width=d,w.height=E);let R=w.getContext("2d");if(!R)return;let U=h.transform(),O=T.videoWidth||d,z=T.videoHeight||E,_=Math.max(d/O,E/z)*(1+a)*U.scale;R.setTransform(_,0,0,_,d/2+U.translateX*d,E/2+U.translateY*E),R.drawImage(T,-O/2,-z/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),Sr(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=w=>{m()&&h.keyDown(w.key)},b=w=>h.keyUp(w.key),x=w=>{m()&&h.pointerDelta(w.movementX,w.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?co(Ue,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[vr("canvas",{ref:P,style:ao,"data-urun-warp":""}),n]}):vr(Ue,{ref:v,...s,children:n})});var yr=new Map;function lo(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);yr.set(e,{component:t,schema:r})}function kr(e,t){let r=yr.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 mo,jsx as tt}from"react/jsx-runtime";function po({name:e,props:t,fallback:r}){let o=kr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(mo,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as Fe}from"zod";import{jsx as Ut,jsxs as br}from"react/jsx-runtime";var fo=Fe.object({step:Fe.number().min(0),total:Fe.number().min(1),label:Fe.string().optional(),variant:Fe.enum(["default","success","error"]).default("default")});function Rr(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 go(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Rr(e);return br("div",{className:"urun-progress-card","data-variant":n,children:[o&&Ut("div",{className:"urun-progress-label",children:o}),Ut("div",{className:"urun-progress-bar",children:Ut("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),br("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Cr,jsxs as yo}from"react/jsx-runtime";var ho=Mt.object({state:Mt.enum(["thinking","generating","idle","error"]),message:Mt.string().optional()}),So={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Pr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??So[t]??t;return{state:t,message:n,isActive:o}}function vo(e){let{state:t,message:r,isActive:o}=Pr(e);return yo("span",{className:"urun-status-badge","data-state":t,children:[Cr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Cr("span",{className:"urun-status-message",children:r})]})}import{useRef as Er,useEffect as ko}from"react";import{z as _t}from"zod";import{jsx as wr,jsxs as Co}from"react/jsx-runtime";var bo=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Tr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Ro(e){let{text:t,streaming:r}=Tr(e),o=Er(null),n=Er(0);return ko(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Co("div",{className:"urun-text-stream",children:[wr("span",{ref:o,className:"urun-text-content"}),r&&wr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as xr,jsxs as wo}from"react/jsx-runtime";var Po=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Ar(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Eo(e){let{src:t,alt:r,caption:o}=Ar(e);return wo("figure",{className:"urun-image-frame",children:[xr("img",{className:"urun-image",src:t,alt:r}),o&&xr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as ge}from"zod";import{jsx as Nt,jsxs as Ao}from"react/jsx-runtime";var To=ge.object({metrics:ge.array(ge.object({label:ge.string(),value:ge.union([ge.string(),ge.number()]),unit:ge.string().optional()}))});function Ur(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function xo(e){let{metrics:t}=Ur(e);return Nt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Ao("div",{className:"urun-metric-card",children:[Nt("div",{className:"urun-metric-label",children:r.label}),Nt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Uo}from"react";import{jsx as _o}from"react/jsx-runtime";var Mo=Uo(function(t,r){let{stream:o="image",...n}=t;return _o(Ue,{ref:r,stream:o,...n})});import{forwardRef as Io,useCallback as Me,useEffect as It,useImperativeHandle as Lo,useRef as _e}from"react";import{observePageLifecycle as Oo}from"@urun-sh/core";var nt=null;function No(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=No();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Fo}from"react/jsx-runtime";var Do=1e3,Mr=200;function Lt(...e){console.debug("[audio]",...e)}var it=Io(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=ce(),v=o??l,P=_e(null),g=_e(null),p=_e(null),h=_e(null),m=_e(u);m.current=u;let k=_e(c);k.current=c;let b=Me(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),x=Me(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=Me(d=>{let E=P.current;if(!E)return;let R=E.play();!R||typeof R.then!="function"||R.then(()=>{E.muted||b(!0)}).catch(U=>{let O=U instanceof Error?U.name:String(U);if(O==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Mr}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},Mr);return}if(O==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),b(!1);return}Lt(`play() failed (${d})`,U)})},[b]),y=Me(d=>{let E=x();if(E){for(let R of E.getAudioTracks())R!==d&&E.removeTrack(R);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[x,S]),w=Me(()=>{let d=P.current;d&&(x(),d.muted=!1,S("gesture"),st(),b(!0))},[x,S,b]);Lo(r,()=>({unlock:w,get unlocked(){return p.current===!0},get element(){return P.current}}),[w]);let T=Me(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),f?.(d)},[x,f]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let N=g.current;return N?N.getAudioTracks()[0]??null:null},R=N=>{if(N!==E()&&(y(N),N)){let _=()=>{E()===N&&y(null)};N.addEventListener("ended",_)}},U=d.track;U&&U.readyState==="live"&&R(U);let O=d.on("track",N=>{N&&N.readyState!=="live"||R(N)}),z=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&R(N)},Do);return()=>{O(),clearInterval(z)}},[v,n,I,s,y]),It(()=>Oo(()=>{st(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{h.current&&clearTimeout(h.current)},[]),Fo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Vo=it;import{forwardRef as qo,useCallback as Ne,useEffect as _r,useImperativeHandle as Ho,useRef as de}from"react";import{observePageLifecycle as Wo,sessionFailureFromMediaError as Bo,sharedCaptureController as jo}from"@urun-sh/core";import{jsx as $o}from"react/jsx-runtime";var Nr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=qo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Nr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=ce(),m=o??h,k=de(null),b=de(null),x=de(null),S=de([]),y=de(!1),w=de(f);w.current=f;let T=de(l);T.current=l;let I=de(v);I.current=v;let d=Ne(_=>{y.current!==_&&(y.current=_,w.current?.(_))},[]),E=Ne(()=>{for(let _ of S.current)_();S.current=[],x.current?.release(),x.current=null,b.current&&(b.current=null,I.current?.(null))},[]),R=Ne(async()=>{let _=x.current;if(_){let W=await _.update(i);return b.current=_.stream,I.current?.(_.stream),W}let B=await(p??jo()).claim("audio",i);x.current=B,S.current=[B.onTrack((W,G)=>{b.current=G,I.current?.(G),y.current&&m?.stream(n).attach(W).catch(ee=>at("mic re-attach after one-capture re-acquire failed",ee))}),B.onLost(W=>{x.current=null,S.current=[],b.current=null,I.current?.(null),d(!1),T.current?.(W)})],b.current=B.stream,I.current?.(B.stream);let q=B.track;if(!q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return q},[p,i,m,n,d]),U=Ne(async()=>{E(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,E,d]),O=Ne(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let _;try{_=await R()}catch(q){E();let W=Bo(q,m.status);throw T.current?.(W),W}m.connect?.();let F;for(let q=1;q<=u;q++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(_),d(!0);return}catch(W){F=W,at(`start attempt ${q}/${u} failed`,W),q<u&&await new Promise(G=>setTimeout(G,c))}E(),d(!1);let B=F instanceof Error?F:new Error(String(F??"voice start failed"));throw T.current?.(B),B},[m,n,a,u,c,R,E,d]);Ho(r,()=>({start:O,stop:U,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[O,U]);let z=de(!1),N=Ne(async()=>{if(!m||!y.current||z.current)return;let _=b.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await m.stream(n).attach(_)}catch(F){at("foreground mic re-assert failed (will retry on next pass)",F)}return}z.current=!0;try{let F=await R();await m.stream(n).attach(F)}catch(F){let B=F instanceof Error?F:new Error(String(F));at("foreground mic re-acquire failed",B),T.current?.(B)}finally{z.current=!1}},[m,n,R]);return _r(()=>{let _=()=>{N()};return m&&typeof m.onRecovery=="function"?m.onRecovery(_):Wo(_)},[m,N]),_r(()=>E,[E]),s?$o(it,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Ko=ut;import{forwardRef as Xo,useEffect as Go,useImperativeHandle as Yo,useRef as Ir,useState as Zo}from"react";import{useEffect as zo,useState as Jo}from"react";var Ot={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Jo(Ot);return zo(()=>{if(!e){i(Ot);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as rs,jsx as ct,jsxs as ns}from"react/jsx-runtime";var Qo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},es={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ts=Xo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,P=ce(),g=o??P,p=Ir(null),[h,m]=Zo(null),k=Ir(l);k.current=l;let{level:b,speaking:x}=Dt(a?h:null);return Yo(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Go(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),ns(rs,{children:[ct(ut,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?ct("span",{className:u,style:Qo,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:ct("span",{style:es,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as os,sessionFailureFromMediaError as ss,sharedCaptureController as is}from"@urun-sh/core";import{forwardRef as Or,useCallback as le,useEffect as Vt,useImperativeHandle as as,useRef as Q,useState as qe}from"react";import{jsx as he,jsxs as Lr}from"react/jsx-runtime";var Dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ft(...e){console.debug("[camera]",...e)}function us(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function cs(){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 Vr=Or(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:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:x,flipControl:S="auto",flipControlClassName:y,onDevices:w}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",I=ce(),d=o??I,E=Q(null),R=Q(null),U=Q(null),O=Q([]),z=Q(null),N=Q(!1),_=Q(!1),F=Q(T),[B,q]=qe(T),[W,G]=qe(!1),[ee,J]=qe(null),[H,X]=qe(!1),[K]=qe(us),Z=Q(p);Z.current=p;let $=Q(h);$.current=h;let C=Q(m);C.current=m;let L=Q(k);L.current=k;let M=Q(w);M.current=w;let j=le(D=>{N.current!==D&&(N.current=D,G(D),Z.current?.(D))},[]);Vt(()=>{if(!W){J(null);return}let D=!1,V=()=>{cs().then(ue=>{D||(J(ue),ue&&M.current?.(ue))})};V();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",V),()=>{D=!0,se.removeEventListener?.("devicechange",V)}):()=>{D=!0}},[W]);let re=le(D=>{let V=E.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=D,D&&V.play()?.catch?.(se=>Ft("preview play() failed",se)))},[]),Y=le(()=>{_.current=!1,z.current?.(),z.current=null;for(let D of O.current)D();O.current=[],U.current?.release(),U.current=null,R.current&&(R.current=null,C.current?.(null),L.current?.(null)),re(null)},[re]),A=le((D,V)=>{z.current?.(),R.current=V,re(V),C.current?.(V);let se=()=>{R.current===V&&(Ft("camera track ended (device removed or permission revoked)"),Y(),j(!1))};D.addEventListener("ended",se),z.current=()=>D.removeEventListener("ended",se)},[re,Y,j]),te=le(async D=>{let V=n!==!1;if(V&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...Dr,...s,facingMode:D},ue;try{let pe=U.current;if(pe)ue=await pe.update(se);else{let Le=await(x??is()).claim("video",se);if(U.current=Le,O.current=[Le.onTrack((Oe,en)=>{A(Oe,en),N.current&&(!V||!d||d.stream(n).attachVideo(Oe).then(()=>L.current?.(Oe)).catch(tn=>Ft("camera re-publish after one-capture re-acquire failed",tn)))}),Le.onLost(Oe=>{U.current=null,O.current=[],Y(),j(!1),$.current?.(Oe)})],!Le.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Le.track}}catch(pe){let Ee=ss(pe,d?.status);throw $.current?.(Ee),Ee}F.current=D,q(D),A(ue,U.current?.stream??new MediaStream([ue]));try{V&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ue)),_.current=V?n:!1}catch(pe){Y(),j(!1);let Ee=pe instanceof Error?pe:new Error(String(pe));throw $.current?.(Ee),Ee}L.current?.(ue),j(!0)},[d,n,s,l,x,A,Y,j]),ve=le(D=>te(D?.facingMode??F.current),[te]),ne=le(async D=>{let V=_.current===n;N.current&&F.current===D&&V||await te(D)},[te,n]),oe=le(()=>te(F.current==="environment"?"user":"environment"),[te]),Pe=le(async()=>{Y(),j(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,Y,j]),Ie=le(async D=>{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 os(V,D)},[]);as(r,()=>({start:ve,stop:Pe,flip:oe,setFacingMode:ne,capturePhoto:Ie,get active(){return N.current},get facingMode(){return F.current},get stream(){return R.current},get element(){return E.current}}),[ve,Pe,oe,ne,Ie]);let gt=Q(ne);if(gt.current=ne,Vt(()=>{c&&(n!==!1&&!d||gt.current(T).catch(()=>{}))},[c,d,T,n]),Vt(()=>Y,[Y]),!v)return null;let ht=f==="auto"?B==="user":f,ze=W&&(S===!0||S==="auto"&&K&&(ee?.length??0)>1),Qr=()=>{H||(X(!0),oe().catch(()=>{}).finally(()=>X(!1)))};return Lr("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":B,children:[he("video",{ref:E,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ht?{transform:"scaleX(-1)"}:{}}}),ze?he("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Qr,disabled:H,className:y,style:y?{opacity:H?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:H?.6:1},children:Lr("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:[he("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),he("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),he("path",{d:"M14.5 10.5v1.6h-1.6"}),he("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),he("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),ls=Or(function({preview:t=!0,...r},o){return he(Vr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as ds,normalizeReferenceImage as ps,referenceImageErrorMessage as ms}from"@urun-sh/core";import{useCallback as He,useEffect as fs,useRef as qt,useState as We}from"react";function gs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=We(null),[a,u]=We(null),[c,f]=We(!1),[l,v]=We(null),[P]=We(ds),g=qt(n);g.current=n;let p=qt(null),h=qt(0),m=He(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);fs(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=He(async y=>{let w=++h.current;f(!0),v(null);try{let T=await y();if(h.current!==w)return;m(T)}catch(T){if(h.current!==w)return;v(ms(T))}finally{h.current===w&&f(!1)}},[m]),b=He(y=>k(()=>ps(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),x=He(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=He(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:x,clear:S,busy:c,error:l,cameraAvailable:P}}import{useEffect as hs,useState as Ss}from"react";function vs(e,t){let[r,o]=Ss(null);return hs(()=>{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 Ps}from"react";import{useEffect as Rs,useMemo as Cs}from"react";import{createStore as ys}from"zustand/vanilla";import{useStore as ks}from"zustand";var bs=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=ys(()=>({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):bs,u=(c=>ks(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 Be(e,t){let r=Cs(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Rs(()=>r.bind(),[r]),r}function Es(e,t,r){let n=Be(e,t)(r??(a=>a)),s=Ps(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 ws,useState as Ts}from"react";var be=200;function Se(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function je(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Bt(e,t,r={}){let o=r.cap??200,[n,s]=Ts([]);return ws(()=>{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=>Se(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as Ke}from"react/jsx-runtime";function xs({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return Ke("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ke("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),Ke("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?Ke("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ke("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",je(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as As,useState as Fr}from"react";import{jsx as Re,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Fr(""),[i,a]=Fr(null),u=As(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Re("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Re("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Us({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Be(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Re("code",{children:t}),Re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Re(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Ms,useState as _s}from"react";import{jsx as $e,jsxs as Hr}from"react/jsx-runtime";function qr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ns({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=_s([]);return Ms(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Se(u,{at:Date.now(),direction:"in",text:qr(je(a))},r))}):void 0),[e,t,r]),Hr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[$e(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Se(u,{at:Date.now(),direction:"out",text:qr(a)},r))}}),$e("div",{className:"urun-control-sender-log",children:n.length===0?$e("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Hr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[$e("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",$e("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as mt,jsxs as Ds}from"react/jsx-runtime";function Os({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Ls([]),a=t.join(","),u=r.join(",");return Is(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Se(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>Ds("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as Zs,isWakingPhase as Qs}from"@urun-sh/core";import{useEffect as Vs,useState as Fs}from"react";function ae(e){let[t,r]=Fs(e?.phase??null);return Vs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as js}from"@urun-sh/core";import{useEffect as qs,useRef as Hs,useState as Ws}from"react";import{isWakingPhase as Bs}from"@urun-sh/core";function jt(e){let t=ae(e),r=Bs(t?.name),o=Hs(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]=Ws(s);return qs(()=>{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 Ks,jsx as Wr,jsxs as Br}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:Wr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Br(Ks,{children:[Wr("span",{className:"urun-session-waking-label",children:js(o.phase)})," ",Br("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Js,useState as Xs}from"react";import{useEffect as jr,useRef as $s,useState as Kr}from"react";var zs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=Kr(null),n=$s(0);jr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Kr(0);return jr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:zs}import{jsx as $r,jsxs as zr}from"react/jsx-runtime";var Gs={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 Ys(e){let[t,r]=Xs(!1);return Js(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=$t(e,t),i=Ys(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return $r("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):zr("div",{className:"urun-activation-overlay-card",children:[$r("span",{className:"urun-activation-overlay-copy",children:a.hint??Gs[u]})," ",zr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ce,jsxs as Jt}from"react/jsx-runtime";var ei={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function ti({session:e,className:t}){let r=ae(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ce("span",{className:"urun-session-status-dot","data-phase":o}),Ce("span",{className:"urun-session-status-label",children:ei[o]}),n?Ce("span",{className:"urun-session-status-detail",children:n}):null]})}function ri({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ae(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ce(zt,{session:e})]});let i=r?r(s):Ce("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Qs(s.name)?Ce(Kt,{session:e}):s&&s.name!=="idle"?Zs(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ce("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ni,useState as oi}from"react";import{jsx as ai}from"react/jsx-runtime";function Jr(e){return ae(e)?.endsAt??null}function si(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 ii({session:e,urgentMs:t=6e4,className:r}){let n=Jr(e)?.getTime()??null,[s,i]=oi(()=>n===null?null:Math.max(0,n-Date.now()));if(ni(()=>{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=si(s);return ai("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 Xr,jsxs as li}from"react/jsx-runtime";var ui=new Set(["expired","ended","error"]);function ci({session:e,onNewSession:t,children:r,className:o}){let n=ae(e);if(!n||!ui.has(n.name))return null;let s=r?r(n):Xr("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 li("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Xr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Gr,useMemo as di,useState as Yr}from"react";import{jsx as ft,jsxs as fi}from"react/jsx-runtime";function Xt(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Zr(e){let t=di(()=>e?e.doc("control"):null,[e]),[r,o]=Yr(()=>t?Xt(t.get("idle")):null);return Gr(()=>{if(!t){o(null);return}return o(Xt(t.get("idle"))),t.on("change",()=>o(Xt(t.get("idle"))))},[t]),r}function pi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function mi({session:e,onStillHere:t,className:r}){let o=Zr(e),n=o?.deadlineEpochS??null,[s,i]=Yr(null);if(Gr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:fi("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${pi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as gi,useEffect as hi,useState as Si}from"react";import{prewake as vi}from"@urun-sh/core";function yi(e){let t=gi(we),[r,o]=Si(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,l=t?.authProvider;return hi(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{vi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}import{describeSessionPhase as Al,isWakingPhase as Ul}from"@urun-sh/core";export{it as Audio,Vr as Camera,po as ComponentRenderer,Dr as DEFAULT_CAMERA_CONSTRAINTS,be as DEFAULT_LOG_CAP,Nr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Mo as Image,Eo as ImageFrame,Po as ImageFrameSchema,xo as MetricsPanel,To as MetricsPanelSchema,ts as Mic,pn as OPERATOR_CHORD_LABEL,dn as OPERATOR_TOKEN_STORAGE_KEY,go as ProgressCard,fo as ProgressCardSchema,uo as ReprojectedVideo,Xn as Session,vo as StatusBadge,ho as StatusBadgeSchema,Ro as TextStream,bo as TextStreamSchema,zt as UrunActivationOverlay,Vo as UrunAudio,rn as UrunAuthProvider,ls as UrunCamera,Ns as UrunControlSender,Us as UrunDocPanel,De as UrunErrorBoundary,Os as UrunEventSpine,mi as UrunIdleWarning,nn as UrunJwtProvider,Rn as UrunProvider,ii as UrunSessionClock,ci as UrunSessionEnded,ri as UrunSessionGate,ti as UrunSessionStatus,Kt as UrunSessionWaking,xs as UrunStreamTail,Ko as UrunVoice,Ue as Video,ut as Voice,Je as authMode,Ht as createDocStore,Al as describeSessionPhase,je as formatPayload,ot as getUrunAudioContext,Ul as isWakingPhase,Wt as parseJsonObject,Se as pushCapped,er as readOperatorToken,lo as registerComponent,st as resumeUrunAudioContext,me as urunPublicEnv,$t as useActivation,Un as useApp,Wn as useChat,Vn as useCompletion,yt as useConfirmOnLeave,Be as useDocStore,Ar as useImageFrame,zn as useInputPresence,Ur as useMetricsPanel,vt as useOperatorOverride,Rr as useProgressCard,gs as useReferenceImage,In as useRequest,Gn as useSession,Es as useSessionDoc,Jr as useSessionEndsAt,Zr as useSessionIdle,ae as useSessionPhase,vs as useSessionTrack,jt as useSessionWake,Pr as useStatusBadge,Bt as useStreamMessages,Tr as useTextStream,Dt as useUrunAudioLevel,St as useUrunAuth,yi as useUrunPrewake,un as usesWorkOSAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.39",
3
+ "version": "0.2.40",
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.39",
56
+ "@urun-sh/core": "^0.2.40",
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",