@urun-sh/react 0.2.5 → 0.2.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ - **BREAKING**: `UrunVideo` moved from the root entry to the `./video` subpath
6
+ — import it as `import { UrunVideo } from '@urun-sh/react/video'`. video.js
7
+ is an optional peer dependency, but the root entry statically imported
8
+ `video.js/dist/video-js.css` (kept external), so every consumer WITHOUT
9
+ video.js installed failed module resolution at build time on ANY
10
+ `@urun-sh/react` import. The root entry graph is now video.js-free (guarded
11
+ by `videojs-optional-peer.test.ts` and `pack:check`); only apps that render
12
+ video install video.js and import from `@urun-sh/react/video`.
13
+
3
14
  ## 0.2.5
4
15
 
5
16
  - Session workbench building blocks: generic, composable debug/steer components
package/README.md CHANGED
@@ -78,6 +78,56 @@ For other auth providers, use `UrunAuthProvider` with a `getAccessToken` functio
78
78
  - `session.doc(name)` — returns a render-safe synced document with `.get()`, `.set(patch)` (write `desired.*` state), and lifecycle events.
79
79
  - `registerComponent()` and built-in components — optional generative UI support.
80
80
 
81
+ ## Session docs as a zustand store
82
+
83
+ Session docs (prompts, desired state, status) read like a plain [zustand](https://github.com/pmndrs/zustand) store. The doc — a vanilla Yjs document synced by the platform — stays the single source of truth: the store is a read-projection plus write-through, never an authoritative copy. Selectors give granular re-renders; `set(patch)` deep-merges through the doc's field-granular CRDT write path, so concurrent writers to different subkeys both survive.
84
+
85
+ ```tsx
86
+ import { useDocStore } from '@urun-sh/react'
87
+
88
+ type ControlDoc = {
89
+ session?: { status?: string }
90
+ desired?: { prompt?: { text?: string } }
91
+ }
92
+
93
+ function PromptControls({ session }) {
94
+ const useControl = useDocStore<ControlDoc>(session, 'control')
95
+
96
+ // Status field read — re-renders ONLY when the selected value changes.
97
+ const status = useControl((s) => s.doc.session?.status ?? 'idle')
98
+
99
+ // Desired-state write — write-through to the doc (field-granular merge).
100
+ const set = useControl((s) => s.set)
101
+
102
+ return (
103
+ <div>
104
+ <span>{status}</span>
105
+ <button onClick={() => set({ desired: { prompt: { text: 'a sunset' } } })}>
106
+ Set prompt
107
+ </button>
108
+ </div>
109
+ )
110
+ }
111
+ ```
112
+
113
+ Outside React (or with a session handle you own), bind a store directly to a doc:
114
+
115
+ ```ts
116
+ import { createDocStore } from '@urun-sh/react'
117
+
118
+ const control = createDocStore<ControlDoc>(session.doc('control'))
119
+ control.getState().doc.session?.status
120
+ control.subscribe((s) => console.log(s.doc))
121
+ control.set({ desired: { prompt: { text: 'dawn' } } })
122
+ control.unbind() // detach the projection; the session still owns the doc
123
+ ```
124
+
125
+ Notes:
126
+
127
+ - Selectors that return objects/arrays should use zustand's `useShallow` (`zustand/react/shallow`) — each doc change produces a fresh snapshot tree.
128
+ - Arrays in the doc are read as plain snapshots. Do not read-modify-write an array through `set` for append-only logs; use the platform's stream/text primitives for growing data.
129
+ - `useSessionDoc(session, key, selector?)` also accepts a selector for one-off reads.
130
+
81
131
  ## Styling
82
132
 
83
133
  Import the package CSS when using built-in components:
package/dist/auth.mjs CHANGED
@@ -1 +1 @@
1
- import{a as u,b as o,c as e}from"./chunk-SSZO4I6Y.mjs";export{o as authMode,u as urunPublicEnv,e as usesWorkOSAuth};
1
+ function n(e){return e&&e.trim()?e.trim():void 0}function r(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return n(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return n(typeof process<"u"?process.env?.[e]:void 0)}}function o(){let e=r("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||r("VERCEL_ENV")==="production"?"workos":r("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function t(){return o()==="workos"}export{o as authMode,r as urunPublicEnv,t as usesWorkOSAuth};
@@ -1 +1,2 @@
1
+ "use client"
1
2
  import{createContext as t,useContext as u,useMemo as s}from"react";import{jsx as i}from"react/jsx-runtime";var r=t(null);function c({getAccessToken:e,children:n}){let o=s(()=>({getAccessToken:e}),[e]);return i(r.Provider,{value:o,children:n})}var U=c;function p(){return u(r)}export{c as a,U as b,p as c};
package/dist/index.d.mts CHANGED
@@ -1,11 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- export { UrunAuthMode, authMode, urunPublicEnv, usesWorkOSAuth } from './auth.mjs';
5
4
  import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus } from '@urun-sh/core';
6
- export { App as AppInterface, AppOptions, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase } from '@urun-sh/core';
7
6
  import { ZodSchema, z } from 'zod';
8
- import Player from 'video.js/dist/types/player';
7
+ import { StoreApi } from 'zustand/vanilla';
9
8
 
10
9
  interface UrunProviderProps {
11
10
  baseUrl: string;
@@ -61,6 +60,11 @@ declare function UrunAuthProvider({ getAccessToken, children }: UrunAuthProvider
61
60
  declare const UrunJwtProvider: typeof UrunAuthProvider;
62
61
  declare function useUrunAuth(): UrunAuthContextValue | null;
63
62
 
63
+ type UrunAuthMode = 'workos' | 'jwt';
64
+ declare function urunPublicEnv(name: string): string | undefined;
65
+ declare function authMode(): UrunAuthMode;
66
+ declare function usesWorkOSAuth(): boolean;
67
+
64
68
  type Unsubscribe = () => void;
65
69
  type ReactSessionDocument<T = Record<string, unknown>> = Omit<SessionDocument, 'get' | 'set' | 'on'> & {
66
70
  get(): T;
@@ -277,12 +281,12 @@ declare const ImageFrameSchema: z.ZodObject<{
277
281
  caption: z.ZodOptional<z.ZodString>;
278
282
  }, "strip", z.ZodTypeAny, {
279
283
  src: string;
280
- caption?: string | undefined;
281
284
  alt?: string | undefined;
285
+ caption?: string | undefined;
282
286
  }, {
283
287
  src: string;
284
- caption?: string | undefined;
285
288
  alt?: string | undefined;
289
+ caption?: string | undefined;
286
290
  }>;
287
291
  type ImageFrameProps = z.infer<typeof ImageFrameSchema>;
288
292
  declare function useImageFrame(props: ImageFrameProps): {
@@ -298,24 +302,24 @@ declare const MetricsPanelSchema: z.ZodObject<{
298
302
  value: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
299
303
  unit: z.ZodOptional<z.ZodString>;
300
304
  }, "strip", z.ZodTypeAny, {
301
- label: string;
302
305
  value: string | number;
306
+ label: string;
303
307
  unit?: string | undefined;
304
308
  }, {
305
- label: string;
306
309
  value: string | number;
310
+ label: string;
307
311
  unit?: string | undefined;
308
312
  }>, "many">;
309
313
  }, "strip", z.ZodTypeAny, {
310
314
  metrics: {
311
- label: string;
312
315
  value: string | number;
316
+ label: string;
313
317
  unit?: string | undefined;
314
318
  }[];
315
319
  }, {
316
320
  metrics: {
317
- label: string;
318
321
  value: string | number;
322
+ label: string;
319
323
  unit?: string | undefined;
320
324
  }[];
321
325
  }>;
@@ -331,39 +335,6 @@ declare function useMetricsPanel(props: MetricsPanelProps): {
331
335
  };
332
336
  declare function MetricsPanel(props: MetricsPanelProps): react_jsx_runtime.JSX.Element;
333
337
 
334
- interface UrunVideoProps {
335
-
336
- track?: MediaStreamTrack | null;
337
-
338
- stream?: MediaStream | null;
339
-
340
- name?: string;
341
-
342
- src?: string;
343
-
344
- type?: string;
345
-
346
- className?: string;
347
-
348
- videoClassName?: string;
349
-
350
- poster?: string;
351
-
352
- controls?: boolean;
353
-
354
- autoPlay?: boolean;
355
-
356
- muted?: boolean;
357
-
358
- onVideoElement?: (el: HTMLVideoElement | null) => void;
359
-
360
- onPlayerReady?: (player: Player | null) => void;
361
-
362
- children?: ReactNode;
363
- }
364
-
365
- declare const UrunVideo: react.ForwardRefExoticComponent<UrunVideoProps & react.RefAttributes<HTMLVideoElement>>;
366
-
367
338
  interface UrunAudioStreamSource {
368
339
 
369
340
  readonly track: MediaStreamTrack | null;
@@ -598,6 +569,40 @@ interface WorkbenchSession {
598
569
 
599
570
  declare function useSessionTrack(session: WorkbenchSession | null, name: string): MediaStreamTrack | null;
600
571
 
572
+ type DeepPartial<T> = {
573
+ [K in keyof T]?: T[K] extends readonly unknown[] ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];
574
+ };
575
+
576
+ type DocPatch<T> = DeepPartial<T> & Record<string, unknown>;
577
+
578
+ interface DocState<T = Record<string, unknown>> {
579
+
580
+ doc: T;
581
+
582
+ synced: boolean;
583
+
584
+ set: (patch: DocPatch<T>) => void;
585
+ }
586
+
587
+ interface DocStore<T = Record<string, unknown>> extends Pick<StoreApi<DocState<T>>, 'getState' | 'getInitialState' | 'subscribe'> {
588
+
589
+ <U>(selector: (state: DocState<T>) => U): U;
590
+
591
+ (): DocState<T>;
592
+
593
+ set(patch: DocPatch<T>): void;
594
+
595
+ bind(): () => void;
596
+
597
+ unbind(): void;
598
+ }
599
+ interface CreateDocStoreOptions {
600
+
601
+ bind?: boolean;
602
+ }
603
+
604
+ declare function createDocStore<T = Record<string, unknown>>(doc: WorkbenchDocSource | null, options?: CreateDocStoreOptions): DocStore<T>;
605
+
601
606
  interface UseSessionDocResult<T> {
602
607
 
603
608
  snapshot: T | null;
@@ -608,6 +613,11 @@ interface UseSessionDocResult<T> {
608
613
  }
609
614
 
610
615
  declare function useSessionDoc<T = Record<string, unknown>>(session: WorkbenchSession | null, key: string): UseSessionDocResult<T>;
616
+ declare function useSessionDoc<T = Record<string, unknown>, U = unknown>(session: WorkbenchSession | null, key: string, selector: (state: DocState<T>) => U): U;
617
+
618
+ type DocHost = Pick<WorkbenchSession, 'doc'>;
619
+
620
+ declare function useDocStore<T = Record<string, unknown>>(session: DocHost | null, key: string): DocStore<T>;
611
621
 
612
622
  declare const DEFAULT_LOG_CAP = 200;
613
623
 
@@ -715,4 +725,4 @@ interface UrunSessionGateProps {
715
725
 
716
726
  declare function UrunSessionGate({ session, children, fallback, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
717
727
 
718
- export { type ChatMessage, type ChatRole, ComponentRenderer, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, DocPatchForm, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVideo, type UrunVideoProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, useApp, useChat, useCompletion, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth };
728
+ export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- export { UrunAuthMode, authMode, urunPublicEnv, usesWorkOSAuth } from './auth.js';
5
4
  import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus } from '@urun-sh/core';
6
- export { App as AppInterface, AppOptions, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase } from '@urun-sh/core';
7
6
  import { ZodSchema, z } from 'zod';
8
- import Player from 'video.js/dist/types/player';
7
+ import { StoreApi } from 'zustand/vanilla';
9
8
 
10
9
  interface UrunProviderProps {
11
10
  baseUrl: string;
@@ -61,6 +60,11 @@ declare function UrunAuthProvider({ getAccessToken, children }: UrunAuthProvider
61
60
  declare const UrunJwtProvider: typeof UrunAuthProvider;
62
61
  declare function useUrunAuth(): UrunAuthContextValue | null;
63
62
 
63
+ type UrunAuthMode = 'workos' | 'jwt';
64
+ declare function urunPublicEnv(name: string): string | undefined;
65
+ declare function authMode(): UrunAuthMode;
66
+ declare function usesWorkOSAuth(): boolean;
67
+
64
68
  type Unsubscribe = () => void;
65
69
  type ReactSessionDocument<T = Record<string, unknown>> = Omit<SessionDocument, 'get' | 'set' | 'on'> & {
66
70
  get(): T;
@@ -277,12 +281,12 @@ declare const ImageFrameSchema: z.ZodObject<{
277
281
  caption: z.ZodOptional<z.ZodString>;
278
282
  }, "strip", z.ZodTypeAny, {
279
283
  src: string;
280
- caption?: string | undefined;
281
284
  alt?: string | undefined;
285
+ caption?: string | undefined;
282
286
  }, {
283
287
  src: string;
284
- caption?: string | undefined;
285
288
  alt?: string | undefined;
289
+ caption?: string | undefined;
286
290
  }>;
287
291
  type ImageFrameProps = z.infer<typeof ImageFrameSchema>;
288
292
  declare function useImageFrame(props: ImageFrameProps): {
@@ -298,24 +302,24 @@ declare const MetricsPanelSchema: z.ZodObject<{
298
302
  value: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
299
303
  unit: z.ZodOptional<z.ZodString>;
300
304
  }, "strip", z.ZodTypeAny, {
301
- label: string;
302
305
  value: string | number;
306
+ label: string;
303
307
  unit?: string | undefined;
304
308
  }, {
305
- label: string;
306
309
  value: string | number;
310
+ label: string;
307
311
  unit?: string | undefined;
308
312
  }>, "many">;
309
313
  }, "strip", z.ZodTypeAny, {
310
314
  metrics: {
311
- label: string;
312
315
  value: string | number;
316
+ label: string;
313
317
  unit?: string | undefined;
314
318
  }[];
315
319
  }, {
316
320
  metrics: {
317
- label: string;
318
321
  value: string | number;
322
+ label: string;
319
323
  unit?: string | undefined;
320
324
  }[];
321
325
  }>;
@@ -331,39 +335,6 @@ declare function useMetricsPanel(props: MetricsPanelProps): {
331
335
  };
332
336
  declare function MetricsPanel(props: MetricsPanelProps): react_jsx_runtime.JSX.Element;
333
337
 
334
- interface UrunVideoProps {
335
-
336
- track?: MediaStreamTrack | null;
337
-
338
- stream?: MediaStream | null;
339
-
340
- name?: string;
341
-
342
- src?: string;
343
-
344
- type?: string;
345
-
346
- className?: string;
347
-
348
- videoClassName?: string;
349
-
350
- poster?: string;
351
-
352
- controls?: boolean;
353
-
354
- autoPlay?: boolean;
355
-
356
- muted?: boolean;
357
-
358
- onVideoElement?: (el: HTMLVideoElement | null) => void;
359
-
360
- onPlayerReady?: (player: Player | null) => void;
361
-
362
- children?: ReactNode;
363
- }
364
-
365
- declare const UrunVideo: react.ForwardRefExoticComponent<UrunVideoProps & react.RefAttributes<HTMLVideoElement>>;
366
-
367
338
  interface UrunAudioStreamSource {
368
339
 
369
340
  readonly track: MediaStreamTrack | null;
@@ -598,6 +569,40 @@ interface WorkbenchSession {
598
569
 
599
570
  declare function useSessionTrack(session: WorkbenchSession | null, name: string): MediaStreamTrack | null;
600
571
 
572
+ type DeepPartial<T> = {
573
+ [K in keyof T]?: T[K] extends readonly unknown[] ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];
574
+ };
575
+
576
+ type DocPatch<T> = DeepPartial<T> & Record<string, unknown>;
577
+
578
+ interface DocState<T = Record<string, unknown>> {
579
+
580
+ doc: T;
581
+
582
+ synced: boolean;
583
+
584
+ set: (patch: DocPatch<T>) => void;
585
+ }
586
+
587
+ interface DocStore<T = Record<string, unknown>> extends Pick<StoreApi<DocState<T>>, 'getState' | 'getInitialState' | 'subscribe'> {
588
+
589
+ <U>(selector: (state: DocState<T>) => U): U;
590
+
591
+ (): DocState<T>;
592
+
593
+ set(patch: DocPatch<T>): void;
594
+
595
+ bind(): () => void;
596
+
597
+ unbind(): void;
598
+ }
599
+ interface CreateDocStoreOptions {
600
+
601
+ bind?: boolean;
602
+ }
603
+
604
+ declare function createDocStore<T = Record<string, unknown>>(doc: WorkbenchDocSource | null, options?: CreateDocStoreOptions): DocStore<T>;
605
+
601
606
  interface UseSessionDocResult<T> {
602
607
 
603
608
  snapshot: T | null;
@@ -608,6 +613,11 @@ interface UseSessionDocResult<T> {
608
613
  }
609
614
 
610
615
  declare function useSessionDoc<T = Record<string, unknown>>(session: WorkbenchSession | null, key: string): UseSessionDocResult<T>;
616
+ declare function useSessionDoc<T = Record<string, unknown>, U = unknown>(session: WorkbenchSession | null, key: string, selector: (state: DocState<T>) => U): U;
617
+
618
+ type DocHost = Pick<WorkbenchSession, 'doc'>;
619
+
620
+ declare function useDocStore<T = Record<string, unknown>>(session: DocHost | null, key: string): DocStore<T>;
611
621
 
612
622
  declare const DEFAULT_LOG_CAP = 200;
613
623
 
@@ -715,4 +725,4 @@ interface UrunSessionGateProps {
715
725
 
716
726
  declare function UrunSessionGate({ session, children, fallback, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
717
727
 
718
- export { type ChatMessage, type ChatRole, ComponentRenderer, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, DocPatchForm, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVideo, type UrunVideoProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, useApp, useChat, useCompletion, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth };
728
+ export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
package/dist/index.js CHANGED
@@ -1,9 +1,2 @@
1
- "use strict";var mt=Object.create;var Ue=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,vt=Object.prototype.hasOwnProperty;var St=(e,r)=>{for(var t in r)Ue(e,t,{get:r[t],enumerable:!0})},mr=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of gt(r))!vt.call(e,o)&&o!==t&&Ue(e,o,{get:()=>r[o],enumerable:!(n=ft(r,o))||n.enumerable});return e};var yt=(e,r,t)=>(t=e!=null?mt(ht(e)):{},mr(r||!e||!e.__esModule?Ue(t,"default",{value:e,enumerable:!0}):t,e)),bt=e=>mr(Ue({},"__esModule",{value:!0}),e);var qt={};St(qt,{ComponentRenderer:()=>Nr,DEFAULT_CAMERA_CONSTRAINTS:()=>dr,DEFAULT_LOG_CAP:()=>re,DEFAULT_VOICE_CONSTRAINTS:()=>cr,DocPatchForm:()=>Re,ImageFrame:()=>jr,ImageFrameSchema:()=>Dr,MetricsPanel:()=>Br,MetricsPanelSchema:()=>Fr,ProgressCard:()=>Lr,ProgressCardSchema:()=>_r,StatusBadge:()=>Ir,StatusBadgeSchema:()=>Or,TextStream:()=>Vr,TextStreamSchema:()=>qr,UrunAudio:()=>Oe,UrunAuthProvider:()=>Ze,UrunCamera:()=>rt,UrunControlSender:()=>it,UrunDocPanel:()=>st,UrunErrorBoundary:()=>ue,UrunEventSpine:()=>ut,UrunJwtProvider:()=>Sr,UrunProvider:()=>br,UrunSessionGate:()=>lt,UrunSessionStatus:()=>ct,UrunStreamTail:()=>ot,UrunVideo:()=>Gr,UrunVoice:()=>Yr,authMode:()=>ve,formatPayload:()=>ge,getUrunAudioContext:()=>Te,parseJsonObject:()=>je,pushCapped:()=>Z,registerComponent:()=>Ar,resumeUrunAudioContext:()=>Le,urunPublicEnv:()=>X,useApp:()=>xr,useChat:()=>Er,useCompletion:()=>Pr,useImageFrame:()=>sr,useMetricsPanel:()=>ar,useProgressCard:()=>tr,useRequest:()=>Cr,useSessionDoc:()=>De,useSessionPhase:()=>We,useSessionTrack:()=>nt,useStatusBadge:()=>nr,useStreamMessages:()=>Be,useTextStream:()=>or,useUrunAudioLevel:()=>tt,useUrunAuth:()=>we,usesWorkOSAuth:()=>hr});module.exports=bt(qt);var le=require("react");var fr=require("react"),he=require("react/jsx-runtime"),ue=class extends fr.Component{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||(0,he.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,he.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,he.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var gr=require("react"),Ee=(0,gr.createContext)(null);function ne(e){return e&&e.trim()?e.trim():void 0}function X(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ne(typeof process<"u"?process.env?.[e]:void 0)}}function ve(){let e=X("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||X("VERCEL_ENV")==="production"?"workos":X("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function hr(){return ve()==="workos"}var ce=require("react"),yr=require("react/jsx-runtime"),vr=(0,ce.createContext)(null);function Ze({getAccessToken:e,children:r}){let t=(0,ce.useMemo)(()=>({getAccessToken:e}),[e]);return(0,yr.jsx)(vr.Provider,{value:t,children:r})}var Sr=Ze;function we(){return(0,ce.useContext)(vr)}var Ae=require("react/jsx-runtime");function br({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:a,children:i}){let[d,u]=(0,le.useState)(),c=we(),h=X("NEXT_PUBLIC_SESSION_TOKEN")??X("NEXT_PUBLIC_URUN_JWT"),l=ve(),f=l==="workos"&&!n,R=n??(l==="jwt"?h:void 0)??d,x=o??X("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),T=f&&!R,b=(0,le.useMemo)(()=>({appId:t,baseUrl:e,orgId:r,jwt:R,getAccessToken:f?c?.getAccessToken:void 0,authProvider:x}),[t,c,e,x,R,r,f]);return(0,le.useEffect)(()=>{if(!f||!c)return;let g=!1,v=c;async function S(){try{let k=await v.getAccessToken();g||u(k??void 0)}catch{g||u(void 0)}}S();let U=window.setInterval(()=>{S()},6e4);return()=>{g=!0,window.clearInterval(U)}},[c,f]),(0,Ae.jsx)(ue,{fallback:a,children:T?(0,Ae.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ae.jsx)(Ee.Provider,{value:b,children:i})})}var G=require("react"),kr=require("@urun-sh/core");function kt(e,r){return`${e}:${JSON.stringify(r??{})}`}var Ye=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,a)=>t.on(o,i=>{a(i),n()})}}dispose(){this._unsubscribeChange()}},Qe=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},er=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new Ye(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new Qe(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function xr(){let e=(0,G.useContext)(Ee);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=(0,G.useReducer)(o=>o+1,0),t=(0,G.useRef)(new Map),n=(0,G.useMemo)(()=>(0,kr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,G.useMemo)(()=>new Proxy({},{get(o,a){if(typeof a=="string")return i=>{let d=kt(a,i),u=t.current.get(d);if(u&&!u.disposed)return u;let c=new er(n[a](i),r);return t.current.set(d,c),c}}}),[n])}var q=require("react");function de(e){let r=e;if(!r||typeof r.request!="function"||typeof r.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return r}function xt(e){return e instanceof Error?e:new Error(String(e))}function Cr(e,r){let t=(0,q.useMemo)(()=>de(e),[e]),[n,o]=(0,q.useState)(void 0),[a,i]=(0,q.useState)(null),[d,u]=(0,q.useState)(!1),c=(0,q.useRef)(r);c.current=r;let h=(0,q.useRef)(0),l=(0,q.useRef)(null),f=(0,q.useRef)(!0);(0,q.useEffect)(()=>(f.current=!0,()=>{f.current=!1,l.current?.abort()}),[]);let R=(0,q.useCallback)(async b=>{l.current?.abort();let g=new AbortController;l.current=g;let v=++h.current,S=()=>f.current&&h.current===v;S()&&(u(!0),i(null));try{let U=await t.request(b,{...c.current,signal:g.signal});return S()&&(o(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let k=xt(U);throw S()&&(i(k),u(!1),c.current?.onError?.(k)),k}},[t]),x=(0,q.useCallback)(b=>{R(b).catch(()=>{})},[R]),T=(0,q.useCallback)(()=>{h.current++,l.current?.abort(),l.current=null,o(void 0),i(null),u(!1)},[]);return{mutate:x,mutateAsync:R,data:n,error:a,isPending:d,reset:T}}var V=require("react");function Tr(e){return e instanceof Error?e:new Error(String(e))}var Ct=e=>typeof e=="string"?e:String(e);function Pr(e,r){let t=(0,V.useMemo)(()=>de(e),[e]),[n,o]=(0,V.useState)(""),[a,i]=(0,V.useState)(!1),[d,u]=(0,V.useState)(null),c=(0,V.useRef)(r);c.current=r;let h=(0,V.useRef)(0),l=(0,V.useRef)(null),f=(0,V.useRef)(!0);(0,V.useEffect)(()=>(f.current=!0,()=>{f.current=!1,l.current?.cancel(),l.current=null}),[]);let R=(0,V.useCallback)(()=>{h.current++,l.current?.cancel(),l.current=null,f.current&&i(!1)},[]),x=(0,V.useCallback)(async T=>{l.current?.cancel();let b=++h.current,g=()=>f.current&&h.current===b,v=c.current,S=v?.parseChunk??Ct,U=v?.buildPayload??(m=>({prompt:m}));g()&&(o(""),u(null),i(!0));let{parseChunk:k,buildPayload:z,onFinish:N,onError:s,...p}=v??{},y="",C;try{C=t.requestStream(U(T),p),l.current=C}catch(m){let w=Tr(m);g()&&(u(w),i(!1),v?.onError?.(w));return}try{for await(let m of C){if(h.current!==b)break;y+=S(m),g()&&o(y)}g()&&(i(!1),v?.onFinish?.(y))}catch(m){let w=Tr(m);g()&&(u(w),i(!1),v?.onError?.(w))}finally{l.current===C&&(l.current=null)}},[t]);return{completion:n,complete:x,stop:R,isStreaming:a,error:d}}var L=require("react");function Rr(e){return e instanceof Error?e:new Error(String(e))}var Tt=e=>typeof e=="string"?e:String(e),Ur=0;function rr(e){return Ur+=1,`${e}-${Ur}`}function Er(e,r){let t=(0,L.useMemo)(()=>de(e),[e]),[n,o]=(0,L.useState)(()=>(r?.initialMessages??[]).map(S=>({id:S.id??rr("msg"),role:S.role,content:S.content}))),[a,i]=(0,L.useState)(""),[d,u]=(0,L.useState)(!1),[c,h]=(0,L.useState)(null),l=(0,L.useRef)(r);l.current=r;let f=(0,L.useRef)(n);f.current=n;let R=(0,L.useRef)(a);R.current=a;let x=(0,L.useRef)(0),T=(0,L.useRef)(null),b=(0,L.useRef)(!0);(0,L.useEffect)(()=>(b.current=!0,()=>{b.current=!1,T.current?.cancel(),T.current=null}),[]);let g=(0,L.useCallback)(()=>{x.current++,T.current?.cancel(),T.current=null,b.current&&u(!1)},[]),v=(0,L.useCallback)(async S=>{let U=S===void 0,k=(U?R.current:S)??"";if(!k.trim())return;T.current?.cancel();let N=++x.current,s=()=>b.current&&x.current===N,p=l.current,y=p?.parseChunk??Tt,C={id:rr("msg"),role:"user",content:k},m={id:rr("msg"),role:"assistant",content:""},w=[...f.current,C].map(_=>({role:_.role,content:_.content})),P=[...f.current,C,m];f.current=P,o(P),U&&i(""),h(null),u(!0);let J=p?.buildPayload??(_=>({messages:_})),{initialMessages:Je,parseChunk:Xe,buildPayload:Ge,onFinish:Ke,onError:dt,...M}=p??{},D=_=>{o(H=>H.map(F=>F.id===m.id?{...F,content:_}:F))},ee="",j;try{j=t.requestStream(J(w),M),T.current=j}catch(_){let H=Rr(_);s()&&(h(H),u(!1),p?.onError?.(H));return}try{for await(let _ of j){if(x.current!==N)break;ee+=y(_),s()&&D(ee)}s()&&(u(!1),p?.onFinish?.({...m,content:ee}))}catch(_){let H=Rr(_);s()&&(h(H),u(!1),p?.onError?.(H))}finally{T.current===j&&(T.current=null)}},[t]);return{messages:n,input:a,setInput:i,sendMessage:v,stop:g,isStreaming:d,error:c}}var wr=new Map;function Ar(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);wr.set(e,{component:r,schema:t})}function Mr(e,r){let t=wr.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var oe=require("react/jsx-runtime");function Nr({name:e,props:r,fallback:t}){let n=Mr(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,oe.jsx)(oe.Fragment,{children:t}):(0,oe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,oe.jsx)("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return(0,oe.jsx)(o,{...n.validatedProps})}var pe=require("zod"),se=require("react/jsx-runtime"),_r=pe.z.object({step:pe.z.number().min(0),total:pe.z.number().min(1),label:pe.z.string().optional(),variant:pe.z.enum(["default","success","error"]).default("default")});function tr(e){let{step:r,total:t,label:n,variant:o="default"}=e,a=Math.min(r/t*100,100),i=r>=t;return{step:r,total:t,label:n,variant:o,percentage:a,isComplete:i}}function Lr(e){let{step:r,total:t,label:n,variant:o,percentage:a}=tr(e);return(0,se.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,se.jsx)("div",{className:"urun-progress-label",children:n}),(0,se.jsx)("div",{className:"urun-progress-bar",children:(0,se.jsx)("div",{className:"urun-progress-fill",style:{width:`${a}%`}})}),(0,se.jsxs)("div",{className:"urun-progress-text",children:[r,"/",t]})]})}var Me=require("zod"),Se=require("react/jsx-runtime"),Or=Me.z.object({state:Me.z.enum(["thinking","generating","idle","error"]),message:Me.z.string().optional()}),Pt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function nr(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??Pt[r]??r;return{state:r,message:o,isActive:n}}function Ir(e){let{state:r,message:t,isActive:n}=nr(e);return(0,Se.jsxs)("span",{className:"urun-status-badge","data-state":r,children:[(0,Se.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,Se.jsx)("span",{className:"urun-status-message",children:t})]})}var ye=require("react"),Ne=require("zod"),be=require("react/jsx-runtime"),qr=Ne.z.object({text:Ne.z.string(),streaming:Ne.z.boolean().default(!1)});function or(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function Vr(e){let{text:r,streaming:t}=or(e),n=(0,ye.useRef)(null),o=(0,ye.useRef)(0);return(0,ye.useEffect)(()=>{let a=n.current;a&&r.length!==o.current&&(a.textContent=r,o.current=r.length)},[r]),(0,be.jsxs)("div",{className:"urun-text-stream",children:[(0,be.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,be.jsx)("span",{className:"urun-text-cursor"})]})}var ke=require("zod"),xe=require("react/jsx-runtime"),Dr=ke.z.object({src:ke.z.string().url(),alt:ke.z.string().optional(),caption:ke.z.string().optional()});function sr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function jr(e){let{src:r,alt:t,caption:n}=sr(e);return(0,xe.jsxs)("figure",{className:"urun-image-frame",children:[(0,xe.jsx)("img",{className:"urun-image",src:r,alt:t}),n&&(0,xe.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var K=require("zod"),me=require("react/jsx-runtime"),Fr=K.z.object({metrics:K.z.array(K.z.object({label:K.z.string(),value:K.z.union([K.z.string(),K.z.number()]),unit:K.z.string().optional()}))});function ar(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Br(e){let{metrics:r}=ar(e);return(0,me.jsx)("div",{className:"urun-metrics-panel",children:r.map((t,n)=>(0,me.jsxs)("div",{className:"urun-metric-card",children:[(0,me.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,me.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var O=require("react"),Jr=yt(require("video.js")),vn=require("video.js/dist/video-js.css");var fe=require("react");var Ce=require("react"),Rt=require("@urun-sh/core/internal");var Ut=require("react/jsx-runtime"),zr=(0,Ce.createContext)(null);function Hr(e){let r=(0,fe.useContext)(zr);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=(0,fe.useState)(null);return(0,fe.useEffect)(()=>{let o=r.getState()._transport;if(!o)return;let a=o.getTrackByName?.bind(o),i=a?.(e);i&&i.readyState!=="ended"&&n(i);let d=o.on("track",u=>{let c=a?.(e);c&&c.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{d()}},[e,r]),t}var $=require("react/jsx-runtime");function $r(e){e.posterImage?.hide?.()}var Et=`
2
- [data-urun-video]{width:100%;height:100%}
3
- [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
4
- [data-urun-video] .vjs-tech{object-fit:contain}
5
- .urun-video-live.vjs-has-started .vjs-poster,
6
- .urun-video-live.vjs-has-started .vjs-loading-spinner,
7
- .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
8
- .urun-video-live .vjs-poster{background-color:transparent}
9
- `,Wr="urun-video-critical-css";function wt(){if(typeof document>"u"||document.getElementById(Wr))return;let e=document.createElement("style");e.id=Wr,e.textContent=Et,document.head.appendChild(e)}var At=["playToggle","volumePanel","fullscreenToggle"],Mt=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Xr=(0,O.forwardRef)(function(r,t){let{track:n,stream:o,src:a,type:i="video/mp4",className:d,videoClassName:u,poster:c,controls:h=!0,autoPlay:l=!0,muted:f=!0,onVideoElement:R,onPlayerReady:x,children:T}=r,b=typeof a=="string"&&a.length>0,g=!b,v=(0,O.useRef)(null),S=(0,O.useRef)(null),[U,k]=(0,O.useState)(!1),z=(0,O.useCallback)(s=>{v.current=s,typeof t=="function"?t(s):t&&(t.current=s),R?.(s)},[t,R]);(0,O.useImperativeHandle)(t,()=>v.current,[]);let N=(0,O.useCallback)(()=>{let s=v.current;if(!s||!s.srcObject&&!s.src)return;f&&(s.muted=!0,s.defaultMuted=!0),s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let p=s.play();p&&typeof p.then=="function"&&p.then(()=>k(!1)).catch(y=>{(y instanceof Error?y.name:String(y))!=="AbortError"&&k(!0)})},[f]);return(0,O.useEffect)(()=>{if(typeof document>"u")return;let s=v.current;if(!s)return;wt(),f&&(s.muted=!0,s.defaultMuted=!0,s.setAttribute("muted","")),s.autoplay=l,s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline","");let p=(0,Jr.default)(s,{controls:h,autoplay:l,muted:f,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:c,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:g?At:Mt}});g&&p.addClass("urun-video-live");let y=()=>k(!1),C=()=>{p.hasStarted(!0),$r(p),y()},m=()=>{g&&N()};return s.addEventListener("playing",C),s.addEventListener("loadedmetadata",m),g&&s.addEventListener("pause",m),S.current=p,x?.(p),()=>{s.removeEventListener("playing",C),s.removeEventListener("loadedmetadata",m),s.removeEventListener("pause",m),x?.(null),S.current&&(S.current.dispose(),S.current=null)}},[g]),(0,O.useEffect)(()=>{if(!b)return;let s=S.current;if(!s)return;let p=s.tech?.(!0)?.el?.();p&&(p.srcObject=null),s.src({src:a,type:i}),l&&N()},[b,a,i,l,N]),(0,O.useEffect)(()=>{if(!g)return;let s=S.current;if(!s)return;let p=n??null,y=o??null;!y&&p&&(y=new MediaStream([p]));let C=s.tech?.(!0)?.el?.()??v.current;if(!C)return;if(!y){C.srcObject=null,k(!1);return}C.srcObject=y,N();let m=y.getVideoTracks()[0]??p??null,w=()=>{s.hasStarted(!0),$r(s),N()},P=()=>{C.srcObject=null,k(!1)};return m&&(m.addEventListener("unmute",w),m.addEventListener("ended",P),m.muted||w()),()=>{m&&(m.removeEventListener("unmute",w),m.removeEventListener("ended",P))}},[g,n,o,N]),(0,$.jsxs)("div",{className:d,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":g?"live":"vod",children:[(0,$.jsx)("video",{ref:z,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),U&&(0,$.jsx)("button",{type:"button",onClick:N,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,$.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,$.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,$.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),T]})}),Nt=(0,O.forwardRef)(function({name:r,...t},n){let o=Hr(r);return(0,$.jsx)(Xr,{ref:n,...t,track:o})}),Gr=(0,O.forwardRef)(function(r,t){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,$.jsx)(Nt,{ref:t,...r,name:r.name}):(0,$.jsx)(Xr,{ref:t,...r})});var A=require("react");var _e=null;function _t(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Te(){if(_e)return _e;let e=_t();return e?(_e=new e,_e):null}function Le(){let e=Te();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Zr=require("react/jsx-runtime"),Lt=1e3,Kr=200;function ir(...e){console.debug("[urun-audio]",...e)}var Oe=(0,A.forwardRef)(function(r,t){let{session:n,stream:o="audio",track:a,controls:i=!1,className:d,onTrack:u,onUnlockChange:c,onAudioElement:h}=r,l=(0,A.useRef)(null),f=(0,A.useRef)(null),R=(0,A.useRef)(null),x=(0,A.useRef)(null),T=(0,A.useRef)(u);T.current=u;let b=(0,A.useRef)(c);b.current=c;let g=(0,A.useCallback)(s=>{R.current!==s&&(R.current=s,b.current?.(s))},[]),v=(0,A.useCallback)(()=>{if(typeof MediaStream>"u")return null;f.current||(f.current=new MediaStream);let s=l.current;return s&&s.srcObject!==f.current&&(s.srcObject=f.current),f.current},[]),S=(0,A.useCallback)(s=>{let p=l.current;if(!p)return;let y=p.play();!y||typeof y.then!="function"||y.then(()=>{p.muted||g(!0)}).catch(C=>{let m=C instanceof Error?C.name:String(C);if(m==="AbortError"){ir(`play() aborted (${s}); retrying in ${Kr}ms`),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{x.current=null,S(`${s}:retry`)},Kr);return}if(m==="NotAllowedError"){ir(`play() blocked pending a user gesture (${s})`),g(!1);return}ir(`play() failed (${s})`,C)})},[g]),U=(0,A.useCallback)(s=>{let p=v();if(p){for(let y of p.getAudioTracks())y!==s&&p.removeTrack(y);s&&!p.getAudioTracks().includes(s)&&p.addTrack(s),s&&S("track-attach"),T.current?.(s)}},[v,S]),k=(0,A.useCallback)(()=>{let s=l.current;s&&(v(),s.muted=!1,S("gesture"),Le(),g(!0))},[v,S,g]);(0,A.useImperativeHandle)(t,()=>({unlock:k,get unlocked(){return R.current===!0},get element(){return l.current}}),[k]);let z=(0,A.useCallback)(s=>{l.current=s,s&&(s.setAttribute("playsinline",""),s.setAttribute("webkit-playsinline",""),v()),h?.(s)},[v,h]),N=a!==void 0;return(0,A.useEffect)(()=>{if(N){U(a??null);return}if(!n)return;let s=n.stream(o),p=()=>{let P=f.current;return P?P.getAudioTracks()[0]??null:null},y=P=>{if(P!==p()&&(U(P),P)){let J=()=>{p()===P&&U(null)};P.addEventListener("ended",J)}},C=s.track;C&&C.readyState==="live"&&y(C);let m=s.on("track",P=>{P&&P.readyState!=="live"||y(P)}),w=setInterval(()=>{let P=s.track;P&&P.readyState==="live"&&y(P)},Lt);return()=>{m(),clearInterval(w)}},[n,o,N,a,U]),(0,A.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,Zr.jsx)("audio",{ref:z,className:d,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var I=require("react"),ur=require("@urun-sh/core");var Qr=require("react/jsx-runtime"),cr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ot(...e){console.debug("[urun-voice]",...e)}var Yr=(0,I.forwardRef)(function(r,t){let{session:n,stream:o="audio",constraints:a=cr,connectTimeoutMs:i,attempts:d=3,retryDelayMs:u=1500,onActiveChange:c,onError:h,onMicStream:l,onTrack:f,onUnlockChange:R}=r,x=(0,I.useRef)(null),T=(0,I.useRef)(null),b=(0,I.useRef)(!1),g=(0,I.useRef)(c);g.current=c;let v=(0,I.useRef)(h);v.current=h;let S=(0,I.useRef)(l);S.current=l;let U=(0,I.useCallback)(s=>{b.current!==s&&(b.current=s,g.current?.(s))},[]),k=(0,I.useCallback)(()=>{let s=T.current;if(s){for(let p of s.getTracks())p.stop();T.current=null,S.current?.(null)}},[]),z=(0,I.useCallback)(async()=>{k(),U(!1),await n.stream(o).detach().catch(()=>{})},[n,o,k,U]),N=(0,I.useCallback)(async()=>{x.current?.unlock();let s;try{s=await navigator.mediaDevices.getUserMedia({audio:a,video:!1})}catch(m){let w=(0,ur.sessionFailureFromMediaError)(m,n.status);throw v.current?.(w),w}k(),T.current=s,S.current?.(s);let p=s.getAudioTracks()[0];if(!p){k();let m=(0,ur.sessionFailureFromMediaError)(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw v.current?.(m),m}n.connect?.();let y;for(let m=1;m<=d;m++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(o).attach(p),U(!0);return}catch(w){y=w,Ot(`start attempt ${m}/${d} failed`,w),m<d&&await new Promise(P=>setTimeout(P,u))}k(),U(!1);let C=y instanceof Error?y:new Error(String(y??"voice start failed"));throw v.current?.(C),C},[n,o,a,i,d,u,k,U]);return(0,I.useImperativeHandle)(t,()=>({start:N,stop:z,unlock:()=>x.current?.unlock(),get active(){return b.current},get micStream(){return T.current},get audio(){return x.current}}),[N,z]),(0,I.useEffect)(()=>k,[k]),(0,Qr.jsx)(Oe,{ref:x,session:n,stream:o,onTrack:f,onUnlockChange:R})});var lr=require("@urun-sh/core"),E=require("react"),Ie=require("react/jsx-runtime"),dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function et(...e){console.debug("[urun-camera]",...e)}var rt=(0,E.forwardRef)(function(r,t){let{session:n,stream:o="video",constraints:a,facingMode:i="environment",mirror:d="auto",connectTimeoutMs:u,preview:c=!0,className:h,videoClassName:l,onActiveChange:f,onError:R,onStream:x,onTrack:T,children:b}=r,g=(0,E.useRef)(null),v=(0,E.useRef)(null),S=(0,E.useRef)(null),U=(0,E.useRef)(!1),k=(0,E.useRef)(i),[z,N]=(0,E.useState)(i),s=(0,E.useRef)(f);s.current=f;let p=(0,E.useRef)(R);p.current=R;let y=(0,E.useRef)(x);y.current=x;let C=(0,E.useRef)(T);C.current=T;let m=(0,E.useCallback)(M=>{U.current!==M&&(U.current=M,s.current?.(M))},[]),w=(0,E.useCallback)(M=>{let D=g.current;D&&(D.muted=!0,D.srcObject=M,M&&D.play()?.catch?.(ee=>et("preview play() failed",ee)))},[]),P=(0,E.useCallback)(()=>{S.current?.(),S.current=null;let M=v.current;if(M){for(let D of M.getTracks())D.stop();v.current=null,y.current?.(null),C.current?.(null)}w(null)},[w]),J=(0,E.useCallback)(async M=>{let D=v.current,ee=S.current,j;try{j=await navigator.mediaDevices.getUserMedia({video:{...dr,...a,facingMode:M},audio:!1})}catch(F){let te=(0,lr.sessionFailureFromMediaError)(F,n.status);throw p.current?.(te),te}let _=j.getVideoTracks()[0];if(!_){for(let te of j.getTracks())te.stop();let F=(0,lr.sessionFailureFromMediaError)(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw p.current?.(F),F}v.current=j,k.current=M,N(M),w(j),y.current?.(j);let H=()=>{v.current===j&&(et("camera track ended (device removed or permission revoked)"),P(),m(!1))};_.addEventListener("ended",H),S.current=()=>_.removeEventListener("ended",H);try{n.connect?.(),await n.whenLive(u!==void 0?{timeout:u}:void 0),await n.stream(o).attachVideo(_)}catch(F){_.removeEventListener("ended",H);for(let pt of j.getTracks())pt.stop();v.current===j&&(v.current=D,S.current=ee,w(D),y.current?.(D));let te=F instanceof Error?F:new Error(String(F));throw p.current?.(te),te}if(D&&D!==j){ee?.();for(let F of D.getTracks())F.stop()}C.current?.(_),m(!0)},[n,o,a,u,w,P,m]),Je=(0,E.useCallback)(M=>J(M?.facingMode??k.current),[J]),Xe=(0,E.useCallback)(async M=>{U.current&&k.current===M||await J(M)},[J]),Ge=(0,E.useCallback)(()=>J(k.current==="environment"?"user":"environment"),[J]),Ke=(0,E.useCallback)(async()=>{P(),m(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,P,m]);return(0,E.useImperativeHandle)(t,()=>({start:Je,stop:Ke,flip:Ge,setFacingMode:Xe,get active(){return U.current},get facingMode(){return k.current},get stream(){return v.current},get element(){return g.current}}),[Je,Ke,Ge,Xe]),(0,E.useEffect)(()=>P,[P]),c?(0,Ie.jsxs)("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":z,children:[(0,Ie.jsx)("video",{ref:g,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(d==="auto"?z==="user":d)?{transform:"scaleX(-1)"}:{}}}),b]}):null});var qe=require("react");var pr={level:0,speaking:!1};function tt(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[a,i]=(0,qe.useState)(pr);return(0,qe.useEffect)(()=>{if(!e){i(pr);return}let d=Te();if(!d||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,h;try{c=d.createMediaStreamSource(u),h=d.createAnalyser(),h.fftSize=t,c.connect(h)}catch{return}let l=new Uint8Array(h.fftSize),R=setInterval(()=>{h.getByteTimeDomainData(l);let x=0;for(let b=0;b<l.length;b++){let g=(l[b]-128)/128;x+=g*g}let T=Math.sqrt(x/l.length);i(b=>{let g=T>o;return Math.abs(b.level-T)<.005&&b.speaking===g?b:{level:T,speaking:g}})},n);return()=>{clearInterval(R),c.disconnect(),i(pr)}},[e,t,n,o]),a}var Ve=require("react");function nt(e,r){let[t,n]=(0,Ve.useState)(null);return(0,Ve.useEffect)(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}var ae=require("react");function De(e,r){let[t,n]=(0,ae.useState)(null),[o,a]=(0,ae.useState)(!1);(0,ae.useEffect)(()=>{if(!e||!r){n(null),a(!1);return}let d=e.doc(r);n(d.get()??{}),a(d.synced);let u=d.on("change",h=>n(h)),c=d.onSynced(()=>a(!0));return()=>{u(),c()}},[e,r]);let i=(0,ae.useCallback)(d=>{e&&r&&e.doc(r).set(d)},[e,r]);return{snapshot:t,synced:o,set:i}}var Fe=require("react");var re=200;function Z(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function ge(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function je(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function Be(e,r,t={}){let n=t.cap??200,[o,a]=(0,Fe.useState)([]);return(0,Fe.useEffect)(()=>{if(a([]),!e||!r)return;let i=!0,d=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await d.next();if(!i||u.done)break;a(c=>Z(c,{at:Date.now(),payload:u.value},n))}})(),()=>{i=!1,d.return?.()}},[e,r,n]),o}var W=require("react/jsx-runtime");function ot({session:e,name:r,cap:t,className:n}){let o=Be(e,r,{cap:t});return(0,W.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,W.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,W.jsx)("code",{children:r}),(0,W.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,W.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,W.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,W.jsx)("code",{children:r})," messages\u2026"]}):o.map((a,i)=>(0,W.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,W.jsx)("span",{className:"urun-stream-tail-time",children:new Date(a.at).toLocaleTimeString()})," ",ge(a.payload)]},`${a.at}-${i}`))})]})}var Pe=require("react");var B=require("react/jsx-runtime");function Re({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,a]=(0,Pe.useState)(""),[i,d]=(0,Pe.useState)(null),u=(0,Pe.useCallback)(()=>{let c=je(o);if(!c.ok){d(c.error);return}d(null),n(c.value,o.trim()),a("")},[o,n]);return(0,B.jsxs)("div",{className:"urun-doc-patch",children:[(0,B.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:c=>a(c.target.value),placeholder:e,rows:3}),(0,B.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,B.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:u,children:r}),i?(0,B.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function st({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let{snapshot:a,synced:i,set:d}=De(e,r);return(0,B.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,B.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,B.jsx)("code",{children:r}),(0,B.jsx)("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),(0,B.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?(0,B.jsx)(Re,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:u=>d(u)}):null]})}var ze=require("react");var Y=require("react/jsx-runtime");function at(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function it({session:e,docKey:r="control",cap:t=200,className:n}){let[o,a]=(0,ze.useState)([]);return(0,ze.useEffect)(()=>(a([]),e?e.doc(r).on("change",d=>{a(u=>Z(u,{at:Date.now(),direction:"in",text:at(ge(d))},t))}):void 0),[e,r,t]),(0,Y.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,Y.jsx)(Re,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(i,d)=>{e?.doc(r).set(i),a(u=>Z(u,{at:Date.now(),direction:"out",text:at(d)},t))}}),(0,Y.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,Y.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,d)=>(0,Y.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Y.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Y.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${d}`))})]})}var He=require("react");var ie=require("react/jsx-runtime");function ut({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[a,i]=(0,He.useState)([]),d=r.join(","),u=t.join(",");return(0,He.useEffect)(()=>{if(i([]),!e)return;let c=(l,f)=>i(R=>Z(R,{at:Date.now(),kind:l,text:f},n)),h=[];h.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of r){let f=e.stream(l);h.push(f.on("track",R=>c("track",`${l}: ${R?"track arrived":"track ended"}`)))}for(let l of t){let f=e.doc(l);h.push(f.on("change",()=>c("doc",`${l} changed`)))}return()=>h.forEach(l=>l())},[e,d,u,n]),(0,ie.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:a.length===0?(0,ie.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...a].reverse().map((c,h)=>(0,ie.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,ie.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,ie.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${h}`))})}var $e=require("react"),Q=require("react/jsx-runtime"),It={idle:"idle",queued:"queued",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function We(e){let[r,t]=(0,$e.useState)(e?.phase??null);return(0,$e.useEffect)(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}function ct({session:e,className:r}){let t=We(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:null;return(0,Q.jsxs)("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[(0,Q.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,Q.jsx)("span",{className:"urun-session-status-label",children:It[n]}),o?(0,Q.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function lt({session:e,children:r,fallback:t,className:n}){let o=We(e);if(o?.name==="live")return(0,Q.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:r});let a=t?t(o):(0,Q.jsx)("span",{className:"urun-session-gate-fallback",children:o?.name==="error"?`Session ${o.error?.reason??"failed"}.`:o?.name==="ended"?"Session ended.":"Waiting for a live session\u2026"});return(0,Q.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:a})}0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionGate,UrunSessionStatus,UrunStreamTail,UrunVideo,UrunVoice,authMode,formatPayload,getUrunAudioContext,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionPhase,useSessionTrack,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,usesWorkOSAuth});
1
+ "use client"
2
+ "use strict";var ze=Object.defineProperty;var ur=Object.getOwnPropertyDescriptor;var cr=Object.getOwnPropertyNames;var lr=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var r in t)ze(e,r,{get:t[r],enumerable:!0})},pr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of cr(t))!lr.call(e,o)&&o!==r&&ze(e,o,{get:()=>t[o],enumerable:!(n=ur(t,o))||n.enumerable});return e};var mr=e=>pr(ze({},"__esModule",{value:!0}),e);var Ur={};dr(Ur,{ComponentRenderer:()=>At,DEFAULT_CAMERA_CONSTRAINTS:()=>ut,DEFAULT_LOG_CAP:()=>Q,DEFAULT_VOICE_CONSTRAINTS:()=>at,DocPatchForm:()=>Ce,ImageFrame:()=>It,ImageFrameSchema:()=>Ot,MetricsPanel:()=>Lt,MetricsPanelSchema:()=>qt,ProgressCard:()=>wt,ProgressCardSchema:()=>Et,StatusBadge:()=>Mt,StatusBadgeSchema:()=>_t,TextStream:()=>Dt,TextStreamSchema:()=>Nt,UrunAudio:()=>we,UrunAuthProvider:()=>Xe,UrunCamera:()=>$t,UrunControlSender:()=>er,UrunDocPanel:()=>Yt,UrunErrorBoundary:()=>se,UrunEventSpine:()=>tr,UrunJwtProvider:()=>ft,UrunProvider:()=>St,UrunSessionGate:()=>or,UrunSessionStatus:()=>nr,UrunStreamTail:()=>Zt,UrunVoice:()=>Vt,authMode:()=>fe,createDocStore:()=>De,describeSessionPhase:()=>sr.describeSessionPhase,formatPayload:()=>pe,getUrunAudioContext:()=>ke,parseJsonObject:()=>Ie,pushCapped:()=>G,registerComponent:()=>Rt,resumeUrunAudioContext:()=>Ee,urunPublicEnv:()=>J,useApp:()=>vt,useChat:()=>Ut,useCompletion:()=>Tt,useDocStore:()=>de,useImageFrame:()=>rt,useMetricsPanel:()=>nt,useProgressCard:()=>Qe,useRequest:()=>yt,useSessionDoc:()=>Kt,useSessionPhase:()=>We,useSessionTrack:()=>Jt,useStatusBadge:()=>et,useStreamMessages:()=>Le,useTextStream:()=>tt,useUrunAudioLevel:()=>jt,useUrunAuth:()=>Ue,usesWorkOSAuth:()=>pt});module.exports=mr(Ur);var ie=require("react");var lt=require("react"),me=require("react/jsx-runtime"),se=class extends lt.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,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:"Connection interrupted"}),(0,me.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var dt=require("react"),be=(0,dt.createContext)(null);function te(e){return e&&e.trim()?e.trim():void 0}function J(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return te(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return te(typeof process<"u"?process.env?.[e]:void 0)}}function fe(){let e=J("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||J("VERCEL_ENV")==="production"?"workos":J("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function pt(){return fe()==="workos"}var ae=require("react"),gt=require("react/jsx-runtime"),mt=(0,ae.createContext)(null);function Xe({getAccessToken:e,children:t}){let r=(0,ae.useMemo)(()=>({getAccessToken:e}),[e]);return(0,gt.jsx)(mt.Provider,{value:r,children:t})}var ft=Xe;function Ue(){return(0,ae.useContext)(mt)}var xe=require("react/jsx-runtime");function St({baseUrl:e,orgId:t,appId:r,jwt:n,authProvider:o,fallback:s,children:i}){let[l,c]=(0,ie.useState)(),a=Ue(),m=J("NEXT_PUBLIC_SESSION_TOKEN")??J("NEXT_PUBLIC_URUN_JWT"),d=fe(),p=d==="workos"&&!n,U=n??(d==="jwt"?m:void 0)??l,k=o??J("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),T=p&&!U,y=(0,ie.useMemo)(()=>({appId:r,baseUrl:e,orgId:t,jwt:U,getAccessToken:p?a?.getAccessToken:void 0,authProvider:k}),[r,a,e,k,U,t,p]);return(0,ie.useEffect)(()=>{if(!p||!a)return;let f=!1,g=a;async function h(){try{let x=await g.getAccessToken();f||c(x??void 0)}catch{f||c(void 0)}}h();let C=window.setInterval(()=>{h()},6e4);return()=>{f=!0,window.clearInterval(C)}},[a,p]),(0,xe.jsx)(se,{fallback:s,children:T?(0,xe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,xe.jsx)(be.Provider,{value:y,children:i})})}var z=require("react"),ht=require("@urun-sh/core");function fr(e,t){return`${e}:${JSON.stringify(t??{})}`}var Ge=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,n=>r(n))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),n=this._notify;return{append(o){r.append(o),n()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),n()})}}dispose(){this._unsubscribeChange()}},Ke=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()}},Ze=class{constructor(t,r){this._session=t;this._notify=r;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(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}doc(t){let r=this._docs.get(t);return r||(r=new Ge(this._session.doc(t),this._notify),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ke(this._session.stream(t),this._notify),this._streams.set(t,r)),r}disconnect(){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._session.disconnect(),this._notify()}};function vt(){let e=(0,z.useContext)(be);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,z.useReducer)(o=>o+1,0),r=(0,z.useRef)(new Map),n=(0,z.useMemo)(()=>(0,ht.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,z.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return i=>{let l=fr(s,i),c=r.current.get(l);if(c&&!c.disposed)return c;let a=new Ze(n[s](i),t);return r.current.set(l,a),a}}}),[n])}var O=require("react");function ue(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 gr(e){return e instanceof Error?e:new Error(String(e))}function yt(e,t){let r=(0,O.useMemo)(()=>ue(e),[e]),[n,o]=(0,O.useState)(void 0),[s,i]=(0,O.useState)(null),[l,c]=(0,O.useState)(!1),a=(0,O.useRef)(t);a.current=t;let m=(0,O.useRef)(0),d=(0,O.useRef)(null),p=(0,O.useRef)(!0);(0,O.useEffect)(()=>(p.current=!0,()=>{p.current=!1,d.current?.abort()}),[]);let U=(0,O.useCallback)(async y=>{d.current?.abort();let f=new AbortController;d.current=f;let g=++m.current,h=()=>p.current&&m.current===g;h()&&(c(!0),i(null));try{let C=await r.request(y,{...a.current,signal:f.signal});return h()&&(o(C),c(!1),a.current?.onSuccess?.(C)),C}catch(C){let x=gr(C);throw h()&&(i(x),c(!1),a.current?.onError?.(x)),x}},[r]),k=(0,O.useCallback)(y=>{U(y).catch(()=>{})},[U]),T=(0,O.useCallback)(()=>{m.current++,d.current?.abort(),d.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:k,mutateAsync:U,data:n,error:s,isPending:l,reset:T}}var I=require("react");function kt(e){return e instanceof Error?e:new Error(String(e))}var Sr=e=>typeof e=="string"?e:String(e);function Tt(e,t){let r=(0,I.useMemo)(()=>ue(e),[e]),[n,o]=(0,I.useState)(""),[s,i]=(0,I.useState)(!1),[l,c]=(0,I.useState)(null),a=(0,I.useRef)(t);a.current=t;let m=(0,I.useRef)(0),d=(0,I.useRef)(null),p=(0,I.useRef)(!0);(0,I.useEffect)(()=>(p.current=!0,()=>{p.current=!1,d.current?.cancel(),d.current=null}),[]);let U=(0,I.useCallback)(()=>{m.current++,d.current?.cancel(),d.current=null,p.current&&i(!1)},[]),k=(0,I.useCallback)(async T=>{d.current?.cancel();let y=++m.current,f=()=>p.current&&m.current===y,g=a.current,h=g?.parseChunk??Sr,C=g?.buildPayload??(S=>({prompt:S}));f()&&(o(""),c(null),i(!0));let{parseChunk:x,buildPayload:j,onFinish:V,onError:u,...v}=g??{},P="",A;try{A=r.requestStream(C(T),v),d.current=A}catch(S){let E=kt(S);f()&&(c(E),i(!1),g?.onError?.(E));return}try{for await(let S of A){if(m.current!==y)break;P+=h(S),f()&&o(P)}f()&&(i(!1),g?.onFinish?.(P))}catch(S){let E=kt(S);f()&&(c(E),i(!1),g?.onError?.(E))}finally{d.current===A&&(d.current=null)}},[r]);return{completion:n,complete:k,stop:U,isStreaming:s,error:l}}var N=require("react");function Ct(e){return e instanceof Error?e:new Error(String(e))}var hr=e=>typeof e=="string"?e:String(e),bt=0;function Ye(e){return bt+=1,`${e}-${bt}`}function Ut(e,t){let r=(0,N.useMemo)(()=>ue(e),[e]),[n,o]=(0,N.useState)(()=>(t?.initialMessages??[]).map(h=>({id:h.id??Ye("msg"),role:h.role,content:h.content}))),[s,i]=(0,N.useState)(""),[l,c]=(0,N.useState)(!1),[a,m]=(0,N.useState)(null),d=(0,N.useRef)(t);d.current=t;let p=(0,N.useRef)(n);p.current=n;let U=(0,N.useRef)(s);U.current=s;let k=(0,N.useRef)(0),T=(0,N.useRef)(null),y=(0,N.useRef)(!0);(0,N.useEffect)(()=>(y.current=!0,()=>{y.current=!1,T.current?.cancel(),T.current=null}),[]);let f=(0,N.useCallback)(()=>{k.current++,T.current?.cancel(),T.current=null,y.current&&c(!1)},[]),g=(0,N.useCallback)(async h=>{let C=h===void 0,x=(C?U.current:h)??"";if(!x.trim())return;T.current?.cancel();let V=++k.current,u=()=>y.current&&k.current===V,v=d.current,P=v?.parseChunk??hr,A={id:Ye("msg"),role:"user",content:x},S={id:Ye("msg"),role:"assistant",content:""},E=[...p.current,A].map(M=>({role:M.role,content:M.content})),b=[...p.current,A,S];p.current=b,o(b),C&&i(""),m(null),c(!0);let $=v?.buildPayload??(M=>({messages:M})),{initialMessages:He,parseChunk:$e,buildPayload:je,onFinish:Je,onError:ar,..._}=v??{},q=M=>{o(W=>W.map(F=>F.id===S.id?{...F,content:M}:F))},Y="",L;try{L=r.requestStream($(E),_),T.current=L}catch(M){let W=Ct(M);u()&&(m(W),c(!1),v?.onError?.(W));return}try{for await(let M of L){if(k.current!==V)break;Y+=P(M),u()&&q(Y)}u()&&(c(!1),v?.onFinish?.({...S,content:Y}))}catch(M){let W=Ct(M);u()&&(m(W),c(!1),v?.onError?.(W))}finally{T.current===L&&(T.current=null)}},[r]);return{messages:n,input:s,setInput:i,sendMessage:g,stop:f,isStreaming:l,error:a}}var xt=new Map;function Rt(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);xt.set(e,{component:t,schema:r})}function Pt(e,t){let r=xt.get(e);if(!r)return{error:`Unknown component: "${e}"`};let n=r.schema.safeParse(t);return n.success?{Component:r.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var re=require("react/jsx-runtime");function At({name:e,props:t,fallback:r}){let n=Pt(e,t);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.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:n.error})});let o=n.Component;return(0,re.jsx)(o,{...n.validatedProps})}var ce=require("zod"),ne=require("react/jsx-runtime"),Et=ce.z.object({step:ce.z.number().min(0),total:ce.z.number().min(1),label:ce.z.string().optional(),variant:ce.z.enum(["default","success","error"]).default("default")});function Qe(e){let{step:t,total:r,label:n,variant:o="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:n,variant:o,percentage:s,isComplete:i}}function wt(e){let{step:t,total:r,label:n,variant:o,percentage:s}=Qe(e);return(0,ne.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,ne.jsx)("div",{className:"urun-progress-label",children:n}),(0,ne.jsx)("div",{className:"urun-progress-bar",children:(0,ne.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ne.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Re=require("zod"),ge=require("react/jsx-runtime"),_t=Re.z.object({state:Re.z.enum(["thinking","generating","idle","error"]),message:Re.z.string().optional()}),vr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function et(e){let{state:t,message:r}=e,n=t==="thinking"||t==="generating",o=r??vr[t]??t;return{state:t,message:o,isActive:n}}function Mt(e){let{state:t,message:r,isActive:n}=et(e);return(0,ge.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,ge.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,ge.jsx)("span",{className:"urun-status-message",children:r})]})}var Se=require("react"),Pe=require("zod"),he=require("react/jsx-runtime"),Nt=Pe.z.object({text:Pe.z.string(),streaming:Pe.z.boolean().default(!1)});function tt(e){let{text:t,streaming:r=!1}=e,n=t.length===0;return{text:t,streaming:r,isEmpty:n}}function Dt(e){let{text:t,streaming:r}=tt(e),n=(0,Se.useRef)(null),o=(0,Se.useRef)(0);return(0,Se.useEffect)(()=>{let s=n.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),(0,he.jsxs)("div",{className:"urun-text-stream",children:[(0,he.jsx)("span",{ref:n,className:"urun-text-content"}),r&&(0,he.jsx)("span",{className:"urun-text-cursor"})]})}var ve=require("zod"),ye=require("react/jsx-runtime"),Ot=ve.z.object({src:ve.z.string().url(),alt:ve.z.string().optional(),caption:ve.z.string().optional()});function rt(e){let{src:t,alt:r,caption:n}=e;return{src:t,alt:r??"",caption:n}}function It(e){let{src:t,alt:r,caption:n}=rt(e);return(0,ye.jsxs)("figure",{className:"urun-image-frame",children:[(0,ye.jsx)("img",{className:"urun-image",src:t,alt:r}),n&&(0,ye.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var X=require("zod"),le=require("react/jsx-runtime"),qt=X.z.object({metrics:X.z.array(X.z.object({label:X.z.string(),value:X.z.union([X.z.string(),X.z.number()]),unit:X.z.string().optional()}))});function nt(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Lt(e){let{metrics:t}=nt(e);return(0,le.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,n)=>(0,le.jsxs)("div",{className:"urun-metric-card",children:[(0,le.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,le.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},n))})}var w=require("react");var Ae=null;function yr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ke(){if(Ae)return Ae;let e=yr();return e?(Ae=new e,Ae):null}function Ee(){let e=ke();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Bt=require("react/jsx-runtime"),kr=1e3,Ft=200;function ot(...e){console.debug("[urun-audio]",...e)}var we=(0,w.forwardRef)(function(t,r){let{session:n,stream:o="audio",track:s,controls:i=!1,className:l,onTrack:c,onUnlockChange:a,onAudioElement:m}=t,d=(0,w.useRef)(null),p=(0,w.useRef)(null),U=(0,w.useRef)(null),k=(0,w.useRef)(null),T=(0,w.useRef)(c);T.current=c;let y=(0,w.useRef)(a);y.current=a;let f=(0,w.useCallback)(u=>{U.current!==u&&(U.current=u,y.current?.(u))},[]),g=(0,w.useCallback)(()=>{if(typeof MediaStream>"u")return null;p.current||(p.current=new MediaStream);let u=d.current;return u&&u.srcObject!==p.current&&(u.srcObject=p.current),p.current},[]),h=(0,w.useCallback)(u=>{let v=d.current;if(!v)return;let P=v.play();!P||typeof P.then!="function"||P.then(()=>{v.muted||f(!0)}).catch(A=>{let S=A instanceof Error?A.name:String(A);if(S==="AbortError"){ot(`play() aborted (${u}); retrying in ${Ft}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,h(`${u}:retry`)},Ft);return}if(S==="NotAllowedError"){ot(`play() blocked pending a user gesture (${u})`),f(!1);return}ot(`play() failed (${u})`,A)})},[f]),C=(0,w.useCallback)(u=>{let v=g();if(v){for(let P of v.getAudioTracks())P!==u&&v.removeTrack(P);u&&!v.getAudioTracks().includes(u)&&v.addTrack(u),u&&h("track-attach"),T.current?.(u)}},[g,h]),x=(0,w.useCallback)(()=>{let u=d.current;u&&(g(),u.muted=!1,h("gesture"),Ee(),f(!0))},[g,h,f]);(0,w.useImperativeHandle)(r,()=>({unlock:x,get unlocked(){return U.current===!0},get element(){return d.current}}),[x]);let j=(0,w.useCallback)(u=>{d.current=u,u&&(u.setAttribute("playsinline",""),u.setAttribute("webkit-playsinline",""),g()),m?.(u)},[g,m]),V=s!==void 0;return(0,w.useEffect)(()=>{if(V){C(s??null);return}if(!n)return;let u=n.stream(o),v=()=>{let b=p.current;return b?b.getAudioTracks()[0]??null:null},P=b=>{if(b!==v()&&(C(b),b)){let $=()=>{v()===b&&C(null)};b.addEventListener("ended",$)}},A=u.track;A&&A.readyState==="live"&&P(A);let S=u.on("track",b=>{b&&b.readyState!=="live"||P(b)}),E=setInterval(()=>{let b=u.track;b&&b.readyState==="live"&&P(b)},kr);return()=>{S(),clearInterval(E)}},[n,o,V,s,C]),(0,w.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,Bt.jsx)("audio",{ref:j,className:l,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var D=require("react"),st=require("@urun-sh/core");var Wt=require("react/jsx-runtime"),at={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Tr(...e){console.debug("[urun-voice]",...e)}var Vt=(0,D.forwardRef)(function(t,r){let{session:n,stream:o="audio",constraints:s=at,connectTimeoutMs:i,attempts:l=3,retryDelayMs:c=1500,onActiveChange:a,onError:m,onMicStream:d,onTrack:p,onUnlockChange:U}=t,k=(0,D.useRef)(null),T=(0,D.useRef)(null),y=(0,D.useRef)(!1),f=(0,D.useRef)(a);f.current=a;let g=(0,D.useRef)(m);g.current=m;let h=(0,D.useRef)(d);h.current=d;let C=(0,D.useCallback)(u=>{y.current!==u&&(y.current=u,f.current?.(u))},[]),x=(0,D.useCallback)(()=>{let u=T.current;if(u){for(let v of u.getTracks())v.stop();T.current=null,h.current?.(null)}},[]),j=(0,D.useCallback)(async()=>{x(),C(!1),await n.stream(o).detach().catch(()=>{})},[n,o,x,C]),V=(0,D.useCallback)(async()=>{k.current?.unlock();let u;try{u=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(S){let E=(0,st.sessionFailureFromMediaError)(S,n.status);throw g.current?.(E),E}x(),T.current=u,h.current?.(u);let v=u.getAudioTracks()[0];if(!v){x();let S=(0,st.sessionFailureFromMediaError)(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw g.current?.(S),S}n.connect?.();let P;for(let S=1;S<=l;S++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(o).attach(v),C(!0);return}catch(E){P=E,Tr(`start attempt ${S}/${l} failed`,E),S<l&&await new Promise(b=>setTimeout(b,c))}x(),C(!1);let A=P instanceof Error?P:new Error(String(P??"voice start failed"));throw g.current?.(A),A},[n,o,s,i,l,c,x,C]);return(0,D.useImperativeHandle)(r,()=>({start:V,stop:j,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return T.current},get audio(){return k.current}}),[V,j]),(0,D.useEffect)(()=>x,[x]),(0,Wt.jsx)(we,{ref:k,session:n,stream:o,onTrack:p,onUnlockChange:U})});var it=require("@urun-sh/core"),R=require("react"),_e=require("react/jsx-runtime"),ut={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ht(...e){console.debug("[urun-camera]",...e)}var $t=(0,R.forwardRef)(function(t,r){let{session:n,stream:o="video",constraints:s,facingMode:i="environment",mirror:l="auto",connectTimeoutMs:c,preview:a=!0,className:m,videoClassName:d,onActiveChange:p,onError:U,onStream:k,onTrack:T,children:y}=t,f=(0,R.useRef)(null),g=(0,R.useRef)(null),h=(0,R.useRef)(null),C=(0,R.useRef)(!1),x=(0,R.useRef)(i),[j,V]=(0,R.useState)(i),u=(0,R.useRef)(p);u.current=p;let v=(0,R.useRef)(U);v.current=U;let P=(0,R.useRef)(k);P.current=k;let A=(0,R.useRef)(T);A.current=T;let S=(0,R.useCallback)(_=>{C.current!==_&&(C.current=_,u.current?.(_))},[]),E=(0,R.useCallback)(_=>{let q=f.current;q&&(q.muted=!0,q.srcObject=_,_&&q.play()?.catch?.(Y=>Ht("preview play() failed",Y)))},[]),b=(0,R.useCallback)(()=>{h.current?.(),h.current=null;let _=g.current;if(_){for(let q of _.getTracks())q.stop();g.current=null,P.current?.(null),A.current?.(null)}E(null)},[E]),$=(0,R.useCallback)(async _=>{let q=g.current,Y=h.current,L;try{L=await navigator.mediaDevices.getUserMedia({video:{...ut,...s,facingMode:_},audio:!1})}catch(F){let ee=(0,it.sessionFailureFromMediaError)(F,n.status);throw v.current?.(ee),ee}let M=L.getVideoTracks()[0];if(!M){for(let ee of L.getTracks())ee.stop();let F=(0,it.sessionFailureFromMediaError)(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw v.current?.(F),F}g.current=L,x.current=_,V(_),E(L),P.current?.(L);let W=()=>{g.current===L&&(Ht("camera track ended (device removed or permission revoked)"),b(),S(!1))};M.addEventListener("ended",W),h.current=()=>M.removeEventListener("ended",W);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(M)}catch(F){M.removeEventListener("ended",W);for(let ir of L.getTracks())ir.stop();g.current===L&&(g.current=q,h.current=Y,E(q),P.current?.(q));let ee=F instanceof Error?F:new Error(String(F));throw v.current?.(ee),ee}if(q&&q!==L){Y?.();for(let F of q.getTracks())F.stop()}A.current?.(M),S(!0)},[n,o,s,c,E,b,S]),He=(0,R.useCallback)(_=>$(_?.facingMode??x.current),[$]),$e=(0,R.useCallback)(async _=>{C.current&&x.current===_||await $(_)},[$]),je=(0,R.useCallback)(()=>$(x.current==="environment"?"user":"environment"),[$]),Je=(0,R.useCallback)(async()=>{b(),S(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,b,S]);return(0,R.useImperativeHandle)(r,()=>({start:He,stop:Je,flip:je,setFacingMode:$e,get active(){return C.current},get facingMode(){return x.current},get stream(){return g.current},get element(){return f.current}}),[He,Je,je,$e]),(0,R.useEffect)(()=>b,[b]),a?(0,_e.jsxs)("div",{className:m,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[(0,_e.jsx)("video",{ref:f,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(l==="auto"?j==="user":l)?{transform:"scaleX(-1)"}:{}}}),y]}):null});var Me=require("react");var ct={level:0,speaking:!1};function jt(e,t={}){let{fftSize:r=512,intervalMs:n=100,speakingThreshold:o=.02}=t,[s,i]=(0,Me.useState)(ct);return(0,Me.useEffect)(()=>{if(!e){i(ct);return}let l=ke();if(!l||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let a,m;try{a=l.createMediaStreamSource(c),m=l.createAnalyser(),m.fftSize=r,a.connect(m)}catch{return}let d=new Uint8Array(m.fftSize),U=setInterval(()=>{m.getByteTimeDomainData(d);let k=0;for(let y=0;y<d.length;y++){let f=(d[y]-128)/128;k+=f*f}let T=Math.sqrt(k/d.length);i(y=>{let f=T>o;return Math.abs(y.level-T)<.005&&y.speaking===f?y:{level:T,speaking:f}})},n);return()=>{clearInterval(U),a.disconnect(),i(ct)}},[e,r,n,o]),s}var Ne=require("react");function Jt(e,t){let[r,n]=(0,Ne.useState)(null);return(0,Ne.useEffect)(()=>{if(!e||!t){n(null);return}let o=e.stream(t);return n(o.track),o.on("track",n)},[e,t]),r}var Gt=require("react");var Oe=require("react");var zt=require("zustand/vanilla"),Xt=require("zustand"),Cr=()=>{};function De(e,t={}){let r=a=>{e?.set(a)},n=()=>e?e.get()??{}:{},o=(0,zt.createStore)(()=>({doc:n(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let a of s)a();s=null}},l=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",a=>o.setState({doc:a})),e.onSynced(()=>o.setState({synced:!0}))]),i):Cr,c=(a=>(0,Xt.useStore)(o,a));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:l,unbind:i}),t.bind!==!1&&l(),c}function de(e,t){let r=(0,Oe.useMemo)(()=>De(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Oe.useEffect)(()=>r.bind(),[r]),r}function Kt(e,t,r){let o=de(e,t)(r??(l=>l)),s=(0,Gt.useCallback)(l=>{e&&t&&e.doc(t).set(l)},[e,t]);if(r)return o;let i=o;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var qe=require("react");var Q=200;function G(e,t,r=200){let n=[...e,t];return n.length>r?n.slice(n.length-r):n}function pe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ie(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(n){return{ok:!1,error:n instanceof Error?n.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 Le(e,t,r={}){let n=r.cap??200,[o,s]=(0,qe.useState)([]);return(0,qe.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,l=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await l.next();if(!i||c.done)break;s(a=>G(a,{at:Date.now(),payload:c.value},n))}})(),()=>{i=!1,l.return?.()}},[e,t,n]),o}var H=require("react/jsx-runtime");function Zt({session:e,name:t,cap:r,className:n}){let o=Le(e,t,{cap:r});return(0,H.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,H.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,H.jsx)("code",{children:t}),(0,H.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,H.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,H.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,H.jsx)("code",{children:t})," messages\u2026"]}):o.map((s,i)=>(0,H.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,H.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pe(s.payload)]},`${s.at}-${i}`))})]})}var Te=require("react");var B=require("react/jsx-runtime");function Ce({placeholder:e,buttonLabel:t,disabled:r,onApply:n}){let[o,s]=(0,Te.useState)(""),[i,l]=(0,Te.useState)(null),c=(0,Te.useCallback)(()=>{let a=Ie(o);if(!a.ok){l(a.error);return}l(null),n(a.value,o.trim()),s("")},[o,n]);return(0,B.jsxs)("div",{className:"urun-doc-patch",children:[(0,B.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:a=>s(a.target.value),placeholder:e,rows:3}),(0,B.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,B.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:c,children:t}),i?(0,B.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Yt({session:e,docKey:t,editable:r=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=de(e,t),i=s(a=>a.doc),l=s(a=>a.synced),c=s(a=>a.set);return(0,B.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,B.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,B.jsx)("code",{children:t}),(0,B.jsx)("span",{className:"urun-doc-panel-synced","data-synced":l?"true":"false",children:l?"synced":"syncing\u2026"})]}),(0,B.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,B.jsx)(Ce,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:a=>c(a)}):null]})}var Fe=require("react");var K=require("react/jsx-runtime");function Qt(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function er({session:e,docKey:t="control",cap:r=200,className:n}){let[o,s]=(0,Fe.useState)([]);return(0,Fe.useEffect)(()=>(s([]),e?e.doc(t).on("change",l=>{s(c=>G(c,{at:Date.now(),direction:"in",text:Qt(pe(l))},r))}):void 0),[e,t,r]),(0,K.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,K.jsx)(Ce,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,l)=>{e?.doc(t).set(i),s(c=>G(c,{at:Date.now(),direction:"out",text:Qt(l)},r))}}),(0,K.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,K.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,l)=>(0,K.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,K.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,K.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${l}`))})]})}var Be=require("react");var oe=require("react/jsx-runtime");function tr({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:n=200,className:o}){let[s,i]=(0,Be.useState)([]),l=t.join(","),c=r.join(",");return(0,Be.useEffect)(()=>{if(i([]),!e)return;let a=(d,p)=>i(U=>G(U,{at:Date.now(),kind:d,text:p},n)),m=[];m.push(e.onPhase(d=>a("phase",`phase \u2192 ${d.name}`)));for(let d of t){let p=e.stream(d);m.push(p.on("track",U=>a("track",`${d}: ${U?"track arrived":"track ended"}`)))}for(let d of r){let p=e.doc(d);m.push(p.on("change",()=>a("doc",`${d} changed`)))}return()=>m.forEach(d=>d())},[e,l,c,n]),(0,oe.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,oe.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((a,m)=>(0,oe.jsxs)("div",{className:"urun-event-spine-line","data-kind":a.kind,children:[(0,oe.jsx)("span",{className:"urun-event-spine-kind",children:a.kind})," ",(0,oe.jsx)("span",{className:"urun-event-spine-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${m}`))})}var Ve=require("react"),rr=require("@urun-sh/core"),Z=require("react/jsx-runtime"),br={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function We(e){let[t,r]=(0,Ve.useState)(e?.phase??null);return(0,Ve.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}function nr({session:e,className:t}){let r=We(e),n=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,Z.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":n,children:[(0,Z.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,Z.jsx)("span",{className:"urun-session-status-label",children:br[n]}),o?(0,Z.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function or({session:e,children:t,fallback:r,className:n}){let o=We(e);if(o?.name==="live")return(0,Z.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:t});let s=r?r(o):(0,Z.jsx)("span",{className:"urun-session-gate-fallback",children:o?.name==="error"?`Session ${o.error?.reason??"failed"}.`:o?.name==="ended"?"Session ended.":o&&o.name!=="idle"?(0,rr.describeSessionPhase)(o):"Waiting for a live session\u2026"});return(0,Z.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:s})}var sr=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionGate,UrunSessionStatus,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionPhase,useSessionTrack,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,9 +1,2 @@
1
- import{a as Q,b as xe,c as Nr}from"./chunk-SSZO4I6Y.mjs";import{a as _r,b as Or,c as Ce}from"./chunk-QAEWAWV4.mjs";import{useEffect as Vr,useMemo as jr,useState as Dr}from"react";import{Component as Lr}from"react";import{jsx as We,jsxs as Ir}from"react/jsx-runtime";var ee=class extends Lr{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Ir("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[We("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),We("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as qr}from"react";var se=qr(null);import{jsx as Te}from"react/jsx-runtime";function Fr({baseUrl:r,orgId:e,appId:t,jwt:n,authProvider:s,fallback:a,children:i}){let[d,u]=Dr(),c=Ce(),h=Q("NEXT_PUBLIC_SESSION_TOKEN")??Q("NEXT_PUBLIC_URUN_JWT"),l=xe(),f=l==="workos"&&!n,P=n??(l==="jwt"?h:void 0)??d,x=s??Q("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),T=f&&!P,y=jr(()=>({appId:t,baseUrl:r,orgId:e,jwt:P,getAccessToken:f?c?.getAccessToken:void 0,authProvider:x}),[t,c,r,x,P,e,f]);return Vr(()=>{if(!f||!c)return;let g=!1,v=c;async function S(){try{let k=await v.getAccessToken();g||u(k??void 0)}catch{g||u(void 0)}}S();let w=window.setInterval(()=>{S()},6e4);return()=>{g=!0,window.clearInterval(w)}},[c,f]),Te(ee,{fallback:a,children:T?Te("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Te(se.Provider,{value:y,children:i})})}import{useContext as zr,useMemo as Je,useReducer as Br,useRef as Hr}from"react";import{App as $r}from"@urun-sh/core";function Wr(r,e){return`${r}:${JSON.stringify(e??{})}`}var Re=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,n=>t(n))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),n=this._notify;return{append(s){t.append(s),n()},toString:()=>t.toString(),get length(){return t.length},on:(s,a)=>t.on(s,i=>{a(i),n()})}}dispose(){this._unsubscribeChange()}},Pe=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},we=class{constructor(e,t){this._session=e;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(e){let t=this._docs.get(e);return t||(t=new Re(this._session.doc(e),this._notify),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new Pe(this._session.stream(e),this._notify),this._streams.set(e,t)),t}disconnect(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Jr(){let r=zr(se);if(!r)throw new Error("useApp must be used within <UrunProvider>");if(!r.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=Br(s=>s+1,0),t=Hr(new Map),n=Je(()=>$r(r.appId,{baseUrl:r.baseUrl,orgId:r.orgId,jwt:r.jwt,getAccessToken:r.getAccessToken,authProvider:r.authProvider}),[r.appId,r.baseUrl,r.orgId,r.jwt,r.getAccessToken,r.authProvider]);return Je(()=>new Proxy({},{get(s,a){if(typeof a=="string")return i=>{let d=Wr(a,i),u=t.current.get(d);if(u&&!u.disposed)return u;let c=new we(n[a](i),e);return t.current.set(d,c),c}}}),[n])}import{useCallback as Ue,useEffect as Gr,useMemo as Xr,useRef as ae,useState as Ee}from"react";function J(r){let e=r;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function Zr(r){return r instanceof Error?r:new Error(String(r))}function Kr(r,e){let t=Xr(()=>J(r),[r]),[n,s]=Ee(void 0),[a,i]=Ee(null),[d,u]=Ee(!1),c=ae(e);c.current=e;let h=ae(0),l=ae(null),f=ae(!0);Gr(()=>(f.current=!0,()=>{f.current=!1,l.current?.abort()}),[]);let P=Ue(async y=>{l.current?.abort();let g=new AbortController;l.current=g;let v=++h.current,S=()=>f.current&&h.current===v;S()&&(u(!0),i(null));try{let w=await t.request(y,{...c.current,signal:g.signal});return S()&&(s(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let k=Zr(w);throw S()&&(i(k),u(!1),c.current?.onError?.(k)),k}},[t]),x=Ue(y=>{P(y).catch(()=>{})},[P]),T=Ue(()=>{h.current++,l.current?.abort(),l.current=null,s(void 0),i(null),u(!1)},[]);return{mutate:x,mutateAsync:P,data:n,error:a,isPending:d,reset:T}}import{useCallback as Ge,useEffect as Yr,useMemo as Qr,useRef as ie,useState as Ae}from"react";function Xe(r){return r instanceof Error?r:new Error(String(r))}var et=r=>typeof r=="string"?r:String(r);function rt(r,e){let t=Qr(()=>J(r),[r]),[n,s]=Ae(""),[a,i]=Ae(!1),[d,u]=Ae(null),c=ie(e);c.current=e;let h=ie(0),l=ie(null),f=ie(!0);Yr(()=>(f.current=!0,()=>{f.current=!1,l.current?.cancel(),l.current=null}),[]);let P=Ge(()=>{h.current++,l.current?.cancel(),l.current=null,f.current&&i(!1)},[]),x=Ge(async T=>{l.current?.cancel();let y=++h.current,g=()=>f.current&&h.current===y,v=c.current,S=v?.parseChunk??et,w=v?.buildPayload??(m=>({prompt:m}));g()&&(s(""),u(null),i(!0));let{parseChunk:k,buildPayload:L,onFinish:A,onError:o,...p}=v??{},b="",C;try{C=t.requestStream(w(T),p),l.current=C}catch(m){let U=Xe(m);g()&&(u(U),i(!1),v?.onError?.(U));return}try{for await(let m of C){if(h.current!==y)break;b+=S(m),g()&&s(b)}g()&&(i(!1),v?.onFinish?.(b))}catch(m){let U=Xe(m);g()&&(u(U),i(!1),v?.onError?.(U))}finally{l.current===C&&(l.current=null)}},[t]);return{completion:n,complete:x,stop:P,isStreaming:a,error:d}}import{useCallback as Ze,useEffect as tt,useMemo as nt,useRef as G,useState as ue}from"react";function Ke(r){return r instanceof Error?r:new Error(String(r))}var ot=r=>typeof r=="string"?r:String(r),Ye=0;function Me(r){return Ye+=1,`${r}-${Ye}`}function st(r,e){let t=nt(()=>J(r),[r]),[n,s]=ue(()=>(e?.initialMessages??[]).map(S=>({id:S.id??Me("msg"),role:S.role,content:S.content}))),[a,i]=ue(""),[d,u]=ue(!1),[c,h]=ue(null),l=G(e);l.current=e;let f=G(n);f.current=n;let P=G(a);P.current=a;let x=G(0),T=G(null),y=G(!0);tt(()=>(y.current=!0,()=>{y.current=!1,T.current?.cancel(),T.current=null}),[]);let g=Ze(()=>{x.current++,T.current?.cancel(),T.current=null,y.current&&u(!1)},[]),v=Ze(async S=>{let w=S===void 0,k=(w?P.current:S)??"";if(!k.trim())return;T.current?.cancel();let A=++x.current,o=()=>y.current&&x.current===A,p=l.current,b=p?.parseChunk??ot,C={id:Me("msg"),role:"user",content:k},m={id:Me("msg"),role:"assistant",content:""},U=[...f.current,C].map(M=>({role:M.role,content:M.content})),R=[...f.current,C,m];f.current=R,s(R),w&&i(""),h(null),u(!0);let q=p?.buildPayload??(M=>({messages:M})),{initialMessages:Se,parseChunk:be,buildPayload:ye,onFinish:ke,onError:Ar,...E}=p??{},N=M=>{s(I=>I.map(O=>O.id===m.id?{...O,content:M}:O))},j="",_;try{_=t.requestStream(q(U),E),T.current=_}catch(M){let I=Ke(M);o()&&(h(I),u(!1),p?.onError?.(I));return}try{for await(let M of _){if(x.current!==A)break;j+=b(M),o()&&N(j)}o()&&(u(!1),p?.onFinish?.({...m,content:j}))}catch(M){let I=Ke(M);o()&&(h(I),u(!1),p?.onError?.(I))}finally{T.current===_&&(T.current=null)}},[t]);return{messages:n,input:a,setInput:i,sendMessage:v,stop:g,isStreaming:d,error:c}}var Qe=new Map;function at(r,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${r}"): schema must be a valid Zod schema`);Qe.set(r,{component:e,schema:t})}function er(r,e){let t=Qe.get(r);if(!t)return{error:`Unknown component: "${r}"`};let n=t.schema.safeParse(e);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${r}": ${n.error.message}`}}import{Fragment as ut,jsx as ce}from"react/jsx-runtime";function it({name:r,props:e,fallback:t}){let n=er(r,e);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?ce(ut,{children:t}):ce("div",{className:"urun-component-error",role:"alert",children:ce("span",{className:"urun-component-error-text",children:n.error})});let s=n.Component;return ce(s,{...n.validatedProps})}import{z as re}from"zod";import{jsx as Ne,jsxs as rr}from"react/jsx-runtime";var ct=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 tr(r){let{step:e,total:t,label:n,variant:s="default"}=r,a=Math.min(e/t*100,100),i=e>=t;return{step:e,total:t,label:n,variant:s,percentage:a,isComplete:i}}function lt(r){let{step:e,total:t,label:n,variant:s,percentage:a}=tr(r);return rr("div",{className:"urun-progress-card","data-variant":s,children:[n&&Ne("div",{className:"urun-progress-label",children:n}),Ne("div",{className:"urun-progress-bar",children:Ne("div",{className:"urun-progress-fill",style:{width:`${a}%`}})}),rr("div",{className:"urun-progress-text",children:[e,"/",t]})]})}import{z as _e}from"zod";import{jsx as nr,jsxs as ft}from"react/jsx-runtime";var dt=_e.object({state:_e.enum(["thinking","generating","idle","error"]),message:_e.string().optional()}),pt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function or(r){let{state:e,message:t}=r,n=e==="thinking"||e==="generating",s=t??pt[e]??e;return{state:e,message:s,isActive:n}}function mt(r){let{state:e,message:t,isActive:n}=or(r);return ft("span",{className:"urun-status-badge","data-state":e,children:[nr("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),nr("span",{className:"urun-status-message",children:t})]})}import{useRef as sr,useEffect as gt}from"react";import{z as Oe}from"zod";import{jsx as ar,jsxs as St}from"react/jsx-runtime";var ht=Oe.object({text:Oe.string(),streaming:Oe.boolean().default(!1)});function ir(r){let{text:e,streaming:t=!1}=r,n=e.length===0;return{text:e,streaming:t,isEmpty:n}}function vt(r){let{text:e,streaming:t}=ir(r),n=sr(null),s=sr(0);return gt(()=>{let a=n.current;a&&e.length!==s.current&&(a.textContent=e,s.current=e.length)},[e]),St("div",{className:"urun-text-stream",children:[ar("span",{ref:n,className:"urun-text-content"}),t&&ar("span",{className:"urun-text-cursor"})]})}import{z as le}from"zod";import{jsx as ur,jsxs as kt}from"react/jsx-runtime";var bt=le.object({src:le.string().url(),alt:le.string().optional(),caption:le.string().optional()});function cr(r){let{src:e,alt:t,caption:n}=r;return{src:e,alt:t??"",caption:n}}function yt(r){let{src:e,alt:t,caption:n}=cr(r);return kt("figure",{className:"urun-image-frame",children:[ur("img",{className:"urun-image",src:e,alt:t}),n&&ur("figcaption",{className:"urun-image-caption",children:n})]})}import{z as D}from"zod";import{jsx as Le,jsxs as Tt}from"react/jsx-runtime";var xt=D.object({metrics:D.array(D.object({label:D.string(),value:D.union([D.string(),D.number()]),unit:D.string().optional()}))});function lr(r){return{metrics:r.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function Ct(r){let{metrics:e}=lr(r);return Le("div",{className:"urun-metrics-panel",children:e.map((t,n)=>Tt("div",{className:"urun-metric-card",children:[Le("div",{className:"urun-metric-label",children:t.label}),Le("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as qe,useCallback as mr,useEffect as Ie,useImperativeHandle as Et,useRef as fr,useState as At}from"react";import Mt from"video.js";import"video.js/dist/video-js.css";import{useContext as Pt,useState as wt,useEffect as Ut}from"react";import{createContext as Rt,useState as Ro,useEffect as Po,useRef as wo}from"react";import{TransportSession as Eo}from"@urun-sh/core/internal";import{jsx as Mo}from"react/jsx-runtime";var dr=Rt(null);function pr(r){let e=Pt(dr);if(!e)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[t,n]=wt(null);return Ut(()=>{let s=e.getState()._transport;if(!s)return;let a=s.getTrackByName?.bind(s),i=a?.(r);i&&i.readyState!=="ended"&&n(i);let d=s.on("track",u=>{let c=a?.(r);c&&c.id!==u.id||(n(u),u.addEventListener("ended",()=>{n(null)}))});return()=>{d()}},[r,e]),t}import{jsx as H,jsxs as vr}from"react/jsx-runtime";function gr(r){r.posterImage?.hide?.()}var Nt=`
2
- [data-urun-video]{width:100%;height:100%}
3
- [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
4
- [data-urun-video] .vjs-tech{object-fit:contain}
5
- .urun-video-live.vjs-has-started .vjs-poster,
6
- .urun-video-live.vjs-has-started .vjs-loading-spinner,
7
- .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
8
- .urun-video-live .vjs-poster{background-color:transparent}
9
- `,hr="urun-video-critical-css";function _t(){if(typeof document>"u"||document.getElementById(hr))return;let r=document.createElement("style");r.id=hr,r.textContent=Nt,document.head.appendChild(r)}var Ot=["playToggle","volumePanel","fullscreenToggle"],Lt=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],Sr=qe(function(e,t){let{track:n,stream:s,src:a,type:i="video/mp4",className:d,videoClassName:u,poster:c,controls:h=!0,autoPlay:l=!0,muted:f=!0,onVideoElement:P,onPlayerReady:x,children:T}=e,y=typeof a=="string"&&a.length>0,g=!y,v=fr(null),S=fr(null),[w,k]=At(!1),L=mr(o=>{v.current=o,typeof t=="function"?t(o):t&&(t.current=o),P?.(o)},[t,P]);Et(t,()=>v.current,[]);let A=mr(()=>{let o=v.current;if(!o||!o.srcObject&&!o.src)return;f&&(o.muted=!0,o.defaultMuted=!0),o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let p=o.play();p&&typeof p.then=="function"&&p.then(()=>k(!1)).catch(b=>{(b instanceof Error?b.name:String(b))!=="AbortError"&&k(!0)})},[f]);return Ie(()=>{if(typeof document>"u")return;let o=v.current;if(!o)return;_t(),f&&(o.muted=!0,o.defaultMuted=!0,o.setAttribute("muted","")),o.autoplay=l,o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline","");let p=Mt(o,{controls:h,autoplay:l,muted:f,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:c,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:g?Ot:Lt}});g&&p.addClass("urun-video-live");let b=()=>k(!1),C=()=>{p.hasStarted(!0),gr(p),b()},m=()=>{g&&A()};return o.addEventListener("playing",C),o.addEventListener("loadedmetadata",m),g&&o.addEventListener("pause",m),S.current=p,x?.(p),()=>{o.removeEventListener("playing",C),o.removeEventListener("loadedmetadata",m),o.removeEventListener("pause",m),x?.(null),S.current&&(S.current.dispose(),S.current=null)}},[g]),Ie(()=>{if(!y)return;let o=S.current;if(!o)return;let p=o.tech?.(!0)?.el?.();p&&(p.srcObject=null),o.src({src:a,type:i}),l&&A()},[y,a,i,l,A]),Ie(()=>{if(!g)return;let o=S.current;if(!o)return;let p=n??null,b=s??null;!b&&p&&(b=new MediaStream([p]));let C=o.tech?.(!0)?.el?.()??v.current;if(!C)return;if(!b){C.srcObject=null,k(!1);return}C.srcObject=b,A();let m=b.getVideoTracks()[0]??p??null,U=()=>{o.hasStarted(!0),gr(o),A()},R=()=>{C.srcObject=null,k(!1)};return m&&(m.addEventListener("unmute",U),m.addEventListener("ended",R),m.muted||U()),()=>{m&&(m.removeEventListener("unmute",U),m.removeEventListener("ended",R))}},[g,n,s,A]),vr("div",{className:d,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":g?"live":"vod",children:[H("video",{ref:L,className:["video-js","vjs-default-skin",u].filter(Boolean).join(" "),playsInline:!0}),w&&H("button",{type:"button",onClick:A,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:vr("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[H("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:H("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),T]})}),It=qe(function({name:e,...t},n){let s=pr(e);return H(Sr,{ref:n,...t,track:s})}),qt=qe(function(e,t){return!!e.name&&!e.track&&!e.stream&&!(typeof e.src=="string"&&e.src)?H(It,{ref:t,...e,name:e.name}):H(Sr,{ref:t,...e})});import{forwardRef as jt,useCallback as X,useEffect as br,useImperativeHandle as Dt,useRef as Z}from"react";var de=null;function Vt(){if(typeof window>"u")return null;let r=window;return r.AudioContext??r.webkitAudioContext??null}function pe(){if(de)return de;let r=Vt();return r?(de=new r,de):null}function Ve(){let r=pe();r&&r.state==="suspended"&&r.resume().catch(()=>{})}import{jsx as zt}from"react/jsx-runtime";var Ft=1e3,yr=200;function je(...r){console.debug("[urun-audio]",...r)}var De=jt(function(e,t){let{session:n,stream:s="audio",track:a,controls:i=!1,className:d,onTrack:u,onUnlockChange:c,onAudioElement:h}=e,l=Z(null),f=Z(null),P=Z(null),x=Z(null),T=Z(u);T.current=u;let y=Z(c);y.current=c;let g=X(o=>{P.current!==o&&(P.current=o,y.current?.(o))},[]),v=X(()=>{if(typeof MediaStream>"u")return null;f.current||(f.current=new MediaStream);let o=l.current;return o&&o.srcObject!==f.current&&(o.srcObject=f.current),f.current},[]),S=X(o=>{let p=l.current;if(!p)return;let b=p.play();!b||typeof b.then!="function"||b.then(()=>{p.muted||g(!0)}).catch(C=>{let m=C instanceof Error?C.name:String(C);if(m==="AbortError"){je(`play() aborted (${o}); retrying in ${yr}ms`),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{x.current=null,S(`${o}:retry`)},yr);return}if(m==="NotAllowedError"){je(`play() blocked pending a user gesture (${o})`),g(!1);return}je(`play() failed (${o})`,C)})},[g]),w=X(o=>{let p=v();if(p){for(let b of p.getAudioTracks())b!==o&&p.removeTrack(b);o&&!p.getAudioTracks().includes(o)&&p.addTrack(o),o&&S("track-attach"),T.current?.(o)}},[v,S]),k=X(()=>{let o=l.current;o&&(v(),o.muted=!1,S("gesture"),Ve(),g(!0))},[v,S,g]);Dt(t,()=>({unlock:k,get unlocked(){return P.current===!0},get element(){return l.current}}),[k]);let L=X(o=>{l.current=o,o&&(o.setAttribute("playsinline",""),o.setAttribute("webkit-playsinline",""),v()),h?.(o)},[v,h]),A=a!==void 0;return br(()=>{if(A){w(a??null);return}if(!n)return;let o=n.stream(s),p=()=>{let R=f.current;return R?R.getAudioTracks()[0]??null:null},b=R=>{if(R!==p()&&(w(R),R)){let q=()=>{p()===R&&w(null)};R.addEventListener("ended",q)}},C=o.track;C&&C.readyState==="live"&&b(C);let m=o.on("track",R=>{R&&R.readyState!=="live"||b(R)}),U=setInterval(()=>{let R=o.track;R&&R.readyState==="live"&&b(R)},Ft);return()=>{m(),clearInterval(U)}},[n,s,A,a,w]),br(()=>()=>{x.current&&clearTimeout(x.current)},[]),zt("audio",{ref:L,className:d,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as Bt,useCallback as me,useEffect as Ht,useImperativeHandle as $t,useRef as K}from"react";import{sessionFailureFromMediaError as kr}from"@urun-sh/core";import{jsx as Gt}from"react/jsx-runtime";var xr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Wt(...r){console.debug("[urun-voice]",...r)}var Jt=Bt(function(e,t){let{session:n,stream:s="audio",constraints:a=xr,connectTimeoutMs:i,attempts:d=3,retryDelayMs:u=1500,onActiveChange:c,onError:h,onMicStream:l,onTrack:f,onUnlockChange:P}=e,x=K(null),T=K(null),y=K(!1),g=K(c);g.current=c;let v=K(h);v.current=h;let S=K(l);S.current=l;let w=me(o=>{y.current!==o&&(y.current=o,g.current?.(o))},[]),k=me(()=>{let o=T.current;if(o){for(let p of o.getTracks())p.stop();T.current=null,S.current?.(null)}},[]),L=me(async()=>{k(),w(!1),await n.stream(s).detach().catch(()=>{})},[n,s,k,w]),A=me(async()=>{x.current?.unlock();let o;try{o=await navigator.mediaDevices.getUserMedia({audio:a,video:!1})}catch(m){let U=kr(m,n.status);throw v.current?.(U),U}k(),T.current=o,S.current?.(o);let p=o.getAudioTracks()[0];if(!p){k();let m=kr(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw v.current?.(m),m}n.connect?.();let b;for(let m=1;m<=d;m++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(s).attach(p),w(!0);return}catch(U){b=U,Wt(`start attempt ${m}/${d} failed`,U),m<d&&await new Promise(R=>setTimeout(R,u))}k(),w(!1);let C=b instanceof Error?b:new Error(String(b??"voice start failed"));throw v.current?.(C),C},[n,s,a,i,d,u,k,w]);return $t(t,()=>({start:A,stop:L,unlock:()=>x.current?.unlock(),get active(){return y.current},get micStream(){return T.current},get audio(){return x.current}}),[A,L]),Ht(()=>k,[k]),Gt(De,{ref:x,session:n,stream:s,onTrack:f,onUnlockChange:P})});import{sessionFailureFromMediaError as Cr}from"@urun-sh/core";import{forwardRef as Xt,useCallback as F,useEffect as Zt,useImperativeHandle as Kt,useRef as V,useState as Yt}from"react";import{jsx as en,jsxs as rn}from"react/jsx-runtime";var Rr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Tr(...r){console.debug("[urun-camera]",...r)}var Qt=Xt(function(e,t){let{session:n,stream:s="video",constraints:a,facingMode:i="environment",mirror:d="auto",connectTimeoutMs:u,preview:c=!0,className:h,videoClassName:l,onActiveChange:f,onError:P,onStream:x,onTrack:T,children:y}=e,g=V(null),v=V(null),S=V(null),w=V(!1),k=V(i),[L,A]=Yt(i),o=V(f);o.current=f;let p=V(P);p.current=P;let b=V(x);b.current=x;let C=V(T);C.current=T;let m=F(E=>{w.current!==E&&(w.current=E,o.current?.(E))},[]),U=F(E=>{let N=g.current;N&&(N.muted=!0,N.srcObject=E,E&&N.play()?.catch?.(j=>Tr("preview play() failed",j)))},[]),R=F(()=>{S.current?.(),S.current=null;let E=v.current;if(E){for(let N of E.getTracks())N.stop();v.current=null,b.current?.(null),C.current?.(null)}U(null)},[U]),q=F(async E=>{let N=v.current,j=S.current,_;try{_=await navigator.mediaDevices.getUserMedia({video:{...Rr,...a,facingMode:E},audio:!1})}catch(O){let B=Cr(O,n.status);throw p.current?.(B),B}let M=_.getVideoTracks()[0];if(!M){for(let B of _.getTracks())B.stop();let O=Cr(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw p.current?.(O),O}v.current=_,k.current=E,A(E),U(_),b.current?.(_);let I=()=>{v.current===_&&(Tr("camera track ended (device removed or permission revoked)"),R(),m(!1))};M.addEventListener("ended",I),S.current=()=>M.removeEventListener("ended",I);try{n.connect?.(),await n.whenLive(u!==void 0?{timeout:u}:void 0),await n.stream(s).attachVideo(M)}catch(O){M.removeEventListener("ended",I);for(let Mr of _.getTracks())Mr.stop();v.current===_&&(v.current=N,S.current=j,U(N),b.current?.(N));let B=O instanceof Error?O:new Error(String(O));throw p.current?.(B),B}if(N&&N!==_){j?.();for(let O of N.getTracks())O.stop()}C.current?.(M),m(!0)},[n,s,a,u,U,R,m]),Se=F(E=>q(E?.facingMode??k.current),[q]),be=F(async E=>{w.current&&k.current===E||await q(E)},[q]),ye=F(()=>q(k.current==="environment"?"user":"environment"),[q]),ke=F(async()=>{R(),m(!1),await n.stream(s).detachVideo().catch(()=>{})},[n,s,R,m]);return Kt(t,()=>({start:Se,stop:ke,flip:ye,setFacingMode:be,get active(){return w.current},get facingMode(){return k.current},get stream(){return v.current},get element(){return g.current}}),[Se,ke,ye,be]),Zt(()=>R,[R]),c?rn("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":L,children:[en("video",{ref:g,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(d==="auto"?L==="user":d)?{transform:"scaleX(-1)"}:{}}}),y]}):null});import{useEffect as tn,useState as nn}from"react";var Fe={level:0,speaking:!1};function on(r,e={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:s=.02}=e,[a,i]=nn(Fe);return tn(()=>{if(!r){i(Fe);return}let d=pe();if(!d||typeof MediaStream>"u")return;let u;r instanceof MediaStream?u=r:(u=new MediaStream,u.addTrack(r));let c,h;try{c=d.createMediaStreamSource(u),h=d.createAnalyser(),h.fftSize=t,c.connect(h)}catch{return}let l=new Uint8Array(h.fftSize),P=setInterval(()=>{h.getByteTimeDomainData(l);let x=0;for(let y=0;y<l.length;y++){let g=(l[y]-128)/128;x+=g*g}let T=Math.sqrt(x/l.length);i(y=>{let g=T>s;return Math.abs(y.level-T)<.005&&y.speaking===g?y:{level:T,speaking:g}})},n);return()=>{clearInterval(P),c.disconnect(),i(Fe)}},[r,t,n,s]),a}import{useEffect as sn,useState as an}from"react";function un(r,e){let[t,n]=an(null);return sn(()=>{if(!r||!e){n(null);return}let s=r.stream(e);return n(s.track),s.on("track",n)},[r,e]),t}import{useCallback as cn,useEffect as ln,useState as Pr}from"react";function ze(r,e){let[t,n]=Pr(null),[s,a]=Pr(!1);ln(()=>{if(!r||!e){n(null),a(!1);return}let d=r.doc(e);n(d.get()??{}),a(d.synced);let u=d.on("change",h=>n(h)),c=d.onSynced(()=>a(!0));return()=>{u(),c()}},[r,e]);let i=cn(d=>{r&&e&&r.doc(e).set(d)},[r,e]);return{snapshot:t,synced:s,set:i}}import{useEffect as dn,useState as pn}from"react";var $=200;function z(r,e,t=200){let n=[...r,e];return n.length>t?n.slice(n.length-t):n}function te(r){if(typeof r=="string")return r;try{return JSON.stringify(r)}catch{return String(r)}}function Be(r){let e=r.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(e)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function He(r,e,t={}){let n=t.cap??200,[s,a]=pn([]);return dn(()=>{if(a([]),!r||!e)return;let i=!0,d=r.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await d.next();if(!i||u.done)break;a(c=>z(c,{at:Date.now(),payload:u.value},n))}})(),()=>{i=!1,d.return?.()}},[r,e,n]),s}import{jsx as fe,jsxs as ne}from"react/jsx-runtime";function mn({session:r,name:e,cap:t,className:n}){let s=He(r,e,{cap:t});return ne("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[ne("div",{className:"urun-stream-tail-meta",children:[fe("code",{children:e}),ne("span",{className:"urun-stream-tail-count",children:[s.length," messages"]})]}),fe("div",{className:"urun-stream-tail-log",children:s.length===0?ne("span",{className:"urun-stream-tail-empty",children:["Waiting for ",fe("code",{children:e})," messages\u2026"]}):s.map((a,i)=>ne("div",{className:"urun-stream-tail-line",children:[fe("span",{className:"urun-stream-tail-time",children:new Date(a.at).toLocaleTimeString()})," ",te(a.payload)]},`${a.at}-${i}`))})]})}import{useCallback as fn,useState as wr}from"react";import{jsx as W,jsxs as ge}from"react/jsx-runtime";function he({placeholder:r,buttonLabel:e,disabled:t,onApply:n}){let[s,a]=wr(""),[i,d]=wr(null),u=fn(()=>{let c=Be(s);if(!c.ok){d(c.error);return}d(null),n(c.value,s.trim()),a("")},[s,n]);return ge("div",{className:"urun-doc-patch",children:[W("textarea",{className:"urun-doc-patch-input",value:s,onChange:c=>a(c.target.value),placeholder:r,rows:3}),ge("div",{className:"urun-doc-patch-actions",children:[W("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!s.trim(),onClick:u,children:e}),i?W("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function gn({session:r,docKey:e,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:s}){let{snapshot:a,synced:i,set:d}=ze(r,e);return ge("div",{className:["urun-doc-panel",s].filter(Boolean).join(" "),children:[ge("div",{className:"urun-doc-panel-meta",children:[W("code",{children:e}),W("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),W("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?W(he,{placeholder:n,buttonLabel:"Apply patch",disabled:!r,onApply:u=>d(u)}):null]})}import{useEffect as hn,useState as vn}from"react";import{jsx as oe,jsxs as Er}from"react/jsx-runtime";function Ur(r,e=600){return r.length>e?`${r.slice(0,e)}\u2026`:r}function Sn({session:r,docKey:e="control",cap:t=200,className:n}){let[s,a]=vn([]);return hn(()=>(a([]),r?r.doc(e).on("change",d=>{a(u=>z(u,{at:Date.now(),direction:"in",text:Ur(te(d))},t))}):void 0),[r,e,t]),Er("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[oe(he,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!r,onApply:(i,d)=>{r?.doc(e).set(i),a(u=>z(u,{at:Date.now(),direction:"out",text:Ur(d)},t))}}),oe("div",{className:"urun-control-sender-log",children:s.length===0?oe("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...s].reverse().map((i,d)=>Er("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[oe("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",oe("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${d}`))})]})}import{useEffect as bn,useState as yn}from"react";import{jsx as ve,jsxs as xn}from"react/jsx-runtime";function kn({session:r,trackNames:e=["video","audio"],docKeys:t=["control"],cap:n=200,className:s}){let[a,i]=yn([]),d=e.join(","),u=t.join(",");return bn(()=>{if(i([]),!r)return;let c=(l,f)=>i(P=>z(P,{at:Date.now(),kind:l,text:f},n)),h=[];h.push(r.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of e){let f=r.stream(l);h.push(f.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of t){let f=r.doc(l);h.push(f.on("change",()=>c("doc",`${l} changed`)))}return()=>h.forEach(l=>l())},[r,d,u,n]),ve("div",{className:["urun-event-spine",s].filter(Boolean).join(" "),children:a.length===0?ve("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...a].reverse().map((c,h)=>xn("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[ve("span",{className:"urun-event-spine-kind",children:c.kind})," ",ve("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${h}`))})}import{useEffect as Cn,useState as Tn}from"react";import{jsx as Y,jsxs as Un}from"react/jsx-runtime";var Rn={idle:"idle",queued:"queued",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function $e(r){let[e,t]=Tn(r?.phase??null);return Cn(()=>{if(!r){t(null);return}return r.onPhase(t)},[r]),e}function Pn({session:r,className:e}){let t=$e(r),n=t?.name??"idle",s=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:null;return Un("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":n,children:[Y("span",{className:"urun-session-status-dot","data-phase":n}),Y("span",{className:"urun-session-status-label",children:Rn[n]}),s?Y("span",{className:"urun-session-status-detail",children:s}):null]})}function wn({session:r,children:e,fallback:t,className:n}){let s=$e(r);if(s?.name==="live")return Y("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:e});let a=t?t(s):Y("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":"Waiting for a live session\u2026"});return Y("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:a})}export{it as ComponentRenderer,Rr as DEFAULT_CAMERA_CONSTRAINTS,$ as DEFAULT_LOG_CAP,xr as DEFAULT_VOICE_CONSTRAINTS,he as DocPatchForm,yt as ImageFrame,bt as ImageFrameSchema,Ct as MetricsPanel,xt as MetricsPanelSchema,lt as ProgressCard,ct as ProgressCardSchema,mt as StatusBadge,dt as StatusBadgeSchema,vt as TextStream,ht as TextStreamSchema,De as UrunAudio,_r as UrunAuthProvider,Qt as UrunCamera,Sn as UrunControlSender,gn as UrunDocPanel,ee as UrunErrorBoundary,kn as UrunEventSpine,Or as UrunJwtProvider,Fr as UrunProvider,wn as UrunSessionGate,Pn as UrunSessionStatus,mn as UrunStreamTail,qt as UrunVideo,Jt as UrunVoice,xe as authMode,te as formatPayload,pe as getUrunAudioContext,Be as parseJsonObject,z as pushCapped,at as registerComponent,Ve as resumeUrunAudioContext,Q as urunPublicEnv,Jr as useApp,st as useChat,rt as useCompletion,cr as useImageFrame,lr as useMetricsPanel,tr as useProgressCard,Kr as useRequest,ze as useSessionDoc,$e as useSessionPhase,un as useSessionTrack,or as useStatusBadge,He as useStreamMessages,ir as useTextStream,on as useUrunAudioLevel,Ce as useUrunAuth,Nr as usesWorkOSAuth};
1
+ "use client"
2
+ import{a as Tt,b as bt,c as Re}from"./chunk-WF2OBDSX.mjs";import{useEffect as Et,useMemo as wt,useState as At}from"react";import{Component as Rt}from"react";import{jsx as je,jsxs as Ut}from"react/jsx-runtime";var ee=class extends Rt{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||Ut("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:[je("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),je("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as xt}from"react";var ae=xt(null);function j(e){return e&&e.trim()?e.trim():void 0}function B(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return j(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return j(typeof process<"u"?process.env?.[e]:void 0)}}function ie(){let e=B("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||B("VERCEL_ENV")==="production"?"workos":B("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Pt(){return ie()==="workos"}import{jsx as Ue}from"react/jsx-runtime";function _t({baseUrl:e,orgId:t,appId:r,jwt:n,authProvider:o,fallback:s,children:i}){let[l,c]=At(),a=Re(),m=B("NEXT_PUBLIC_SESSION_TOKEN")??B("NEXT_PUBLIC_URUN_JWT"),d=ie(),p=d==="workos"&&!n,R=n??(d==="jwt"?m:void 0)??l,k=o??B("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=p&&!R,y=wt(()=>({appId:r,baseUrl:e,orgId:t,jwt:R,getAccessToken:p?a?.getAccessToken:void 0,authProvider:k}),[r,a,e,k,R,t,p]);return Et(()=>{if(!p||!a)return;let f=!1,g=a;async function h(){try{let U=await g.getAccessToken();f||c(U??void 0)}catch{f||c(void 0)}}h();let T=window.setInterval(()=>{h()},6e4);return()=>{f=!0,window.clearInterval(T)}},[a,p]),Ue(ee,{fallback:s,children:C?Ue("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ue(ae.Provider,{value:y,children:i})})}import{useContext as Mt,useMemo as Je,useReducer as Nt,useRef as Dt}from"react";import{App as Ot}from"@urun-sh/core";function It(e,t){return`${e}:${JSON.stringify(t??{})}`}var xe=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,n=>r(n))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),n=this._notify;return{append(o){r.append(o),n()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),n()})}}dispose(){this._unsubscribeChange()}},Pe=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()}},Ee=class{constructor(t,r){this._session=t;this._notify=r;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(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}doc(t){let r=this._docs.get(t);return r||(r=new xe(this._session.doc(t),this._notify),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Pe(this._session.stream(t),this._notify),this._streams.set(t,r)),r}disconnect(){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._session.disconnect(),this._notify()}};function qt(){let e=Mt(ae);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Nt(o=>o+1,0),r=Dt(new Map),n=Je(()=>Ot(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return Je(()=>new Proxy({},{get(o,s){if(typeof s=="string")return i=>{let l=It(s,i),c=r.current.get(l);if(c&&!c.disposed)return c;let a=new Ee(n[s](i),t);return r.current.set(l,a),a}}}),[n])}import{useCallback as we,useEffect as Lt,useMemo as Ft,useRef as ue,useState as Ae}from"react";function X(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 Bt(e){return e instanceof Error?e:new Error(String(e))}function Vt(e,t){let r=Ft(()=>X(e),[e]),[n,o]=Ae(void 0),[s,i]=Ae(null),[l,c]=Ae(!1),a=ue(t);a.current=t;let m=ue(0),d=ue(null),p=ue(!0);Lt(()=>(p.current=!0,()=>{p.current=!1,d.current?.abort()}),[]);let R=we(async y=>{d.current?.abort();let f=new AbortController;d.current=f;let g=++m.current,h=()=>p.current&&m.current===g;h()&&(c(!0),i(null));try{let T=await r.request(y,{...a.current,signal:f.signal});return h()&&(o(T),c(!1),a.current?.onSuccess?.(T)),T}catch(T){let U=Bt(T);throw h()&&(i(U),c(!1),a.current?.onError?.(U)),U}},[r]),k=we(y=>{R(y).catch(()=>{})},[R]),C=we(()=>{m.current++,d.current?.abort(),d.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:k,mutateAsync:R,data:n,error:s,isPending:l,reset:C}}import{useCallback as ze,useEffect as Wt,useMemo as Ht,useRef as ce,useState as _e}from"react";function Xe(e){return e instanceof Error?e:new Error(String(e))}var $t=e=>typeof e=="string"?e:String(e);function jt(e,t){let r=Ht(()=>X(e),[e]),[n,o]=_e(""),[s,i]=_e(!1),[l,c]=_e(null),a=ce(t);a.current=t;let m=ce(0),d=ce(null),p=ce(!0);Wt(()=>(p.current=!0,()=>{p.current=!1,d.current?.cancel(),d.current=null}),[]);let R=ze(()=>{m.current++,d.current?.cancel(),d.current=null,p.current&&i(!1)},[]),k=ze(async C=>{d.current?.cancel();let y=++m.current,f=()=>p.current&&m.current===y,g=a.current,h=g?.parseChunk??$t,T=g?.buildPayload??(S=>({prompt:S}));f()&&(o(""),c(null),i(!0));let{parseChunk:U,buildPayload:q,onFinish:D,onError:u,...v}=g??{},x="",P;try{P=r.requestStream(T(C),v),d.current=P}catch(S){let E=Xe(S);f()&&(c(E),i(!1),g?.onError?.(E));return}try{for await(let S of P){if(m.current!==y)break;x+=h(S),f()&&o(x)}f()&&(i(!1),g?.onFinish?.(x))}catch(S){let E=Xe(S);f()&&(c(E),i(!1),g?.onError?.(E))}finally{d.current===P&&(d.current=null)}},[r]);return{completion:n,complete:k,stop:R,isStreaming:s,error:l}}import{useCallback as Ge,useEffect as Jt,useMemo as zt,useRef as G,useState as le}from"react";function Ke(e){return e instanceof Error?e:new Error(String(e))}var Xt=e=>typeof e=="string"?e:String(e),Ze=0;function Me(e){return Ze+=1,`${e}-${Ze}`}function Gt(e,t){let r=zt(()=>X(e),[e]),[n,o]=le(()=>(t?.initialMessages??[]).map(h=>({id:h.id??Me("msg"),role:h.role,content:h.content}))),[s,i]=le(""),[l,c]=le(!1),[a,m]=le(null),d=G(t);d.current=t;let p=G(n);p.current=n;let R=G(s);R.current=s;let k=G(0),C=G(null),y=G(!0);Jt(()=>(y.current=!0,()=>{y.current=!1,C.current?.cancel(),C.current=null}),[]);let f=Ge(()=>{k.current++,C.current?.cancel(),C.current=null,y.current&&c(!1)},[]),g=Ge(async h=>{let T=h===void 0,U=(T?R.current:h)??"";if(!U.trim())return;C.current?.cancel();let D=++k.current,u=()=>y.current&&k.current===D,v=d.current,x=v?.parseChunk??Xt,P={id:Me("msg"),role:"user",content:U},S={id:Me("msg"),role:"assistant",content:""},E=[...p.current,P].map(A=>({role:A.role,content:A.content})),b=[...p.current,P,S];p.current=b,o(b),T&&i(""),m(null),c(!0);let I=v?.buildPayload??(A=>({messages:A})),{initialMessages:ke,parseChunk:Ce,buildPayload:Te,onFinish:be,onError:kt,...w}=v??{},_=A=>{o(O=>O.map(N=>N.id===S.id?{...N,content:A}:N))},F="",M;try{M=r.requestStream(I(E),w),C.current=M}catch(A){let O=Ke(A);u()&&(m(O),c(!1),v?.onError?.(O));return}try{for await(let A of M){if(k.current!==D)break;F+=x(A),u()&&_(F)}u()&&(c(!1),v?.onFinish?.({...S,content:F}))}catch(A){let O=Ke(A);u()&&(m(O),c(!1),v?.onError?.(O))}finally{C.current===M&&(C.current=null)}},[r]);return{messages:n,input:s,setInput:i,sendMessage:g,stop:f,isStreaming:l,error:a}}var Ye=new Map;function Kt(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Ye.set(e,{component:t,schema:r})}function Qe(e,t){let r=Ye.get(e);if(!r)return{error:`Unknown component: "${e}"`};let n=r.schema.safeParse(t);return n.success?{Component:r.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}import{Fragment as Yt,jsx as de}from"react/jsx-runtime";function Zt({name:e,props:t,fallback:r}){let n=Qe(e,t);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),r?de(Yt,{children:r}):de("div",{className:"urun-component-error",role:"alert",children:de("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return de(o,{...n.validatedProps})}import{z as te}from"zod";import{jsx as Ne,jsxs as et}from"react/jsx-runtime";var Qt=te.object({step:te.number().min(0),total:te.number().min(1),label:te.string().optional(),variant:te.enum(["default","success","error"]).default("default")});function tt(e){let{step:t,total:r,label:n,variant:o="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:n,variant:o,percentage:s,isComplete:i}}function er(e){let{step:t,total:r,label:n,variant:o,percentage:s}=tt(e);return et("div",{className:"urun-progress-card","data-variant":o,children:[n&&Ne("div",{className:"urun-progress-label",children:n}),Ne("div",{className:"urun-progress-bar",children:Ne("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),et("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as De}from"zod";import{jsx as rt,jsxs as or}from"react/jsx-runtime";var tr=De.object({state:De.enum(["thinking","generating","idle","error"]),message:De.string().optional()}),rr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function nt(e){let{state:t,message:r}=e,n=t==="thinking"||t==="generating",o=r??rr[t]??t;return{state:t,message:o,isActive:n}}function nr(e){let{state:t,message:r,isActive:n}=nt(e);return or("span",{className:"urun-status-badge","data-state":t,children:[rt("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),rt("span",{className:"urun-status-message",children:r})]})}import{useRef as ot,useEffect as sr}from"react";import{z as Oe}from"zod";import{jsx as st,jsxs as ur}from"react/jsx-runtime";var ar=Oe.object({text:Oe.string(),streaming:Oe.boolean().default(!1)});function at(e){let{text:t,streaming:r=!1}=e,n=t.length===0;return{text:t,streaming:r,isEmpty:n}}function ir(e){let{text:t,streaming:r}=at(e),n=ot(null),o=ot(0);return sr(()=>{let s=n.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),ur("div",{className:"urun-text-stream",children:[st("span",{ref:n,className:"urun-text-content"}),r&&st("span",{className:"urun-text-cursor"})]})}import{z as pe}from"zod";import{jsx as it,jsxs as dr}from"react/jsx-runtime";var cr=pe.object({src:pe.string().url(),alt:pe.string().optional(),caption:pe.string().optional()});function ut(e){let{src:t,alt:r,caption:n}=e;return{src:t,alt:r??"",caption:n}}function lr(e){let{src:t,alt:r,caption:n}=ut(e);return dr("figure",{className:"urun-image-frame",children:[it("img",{className:"urun-image",src:t,alt:r}),n&&it("figcaption",{className:"urun-image-caption",children:n})]})}import{z as V}from"zod";import{jsx as Ie,jsxs as fr}from"react/jsx-runtime";var pr=V.object({metrics:V.array(V.object({label:V.string(),value:V.union([V.string(),V.number()]),unit:V.string().optional()}))});function ct(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function mr(e){let{metrics:t}=ct(e);return Ie("div",{className:"urun-metrics-panel",children:t.map((r,n)=>fr("div",{className:"urun-metric-card",children:[Ie("div",{className:"urun-metric-label",children:r.label}),Ie("div",{className:"urun-metric-value",children:r.displayValue})]},n))})}import{forwardRef as Sr,useCallback as K,useEffect as lt,useImperativeHandle as hr,useRef as Z}from"react";var me=null;function gr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function fe(){if(me)return me;let e=gr();return e?(me=new e,me):null}function qe(){let e=fe();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as yr}from"react/jsx-runtime";var vr=1e3,dt=200;function Le(...e){console.debug("[urun-audio]",...e)}var Fe=Sr(function(t,r){let{session:n,stream:o="audio",track:s,controls:i=!1,className:l,onTrack:c,onUnlockChange:a,onAudioElement:m}=t,d=Z(null),p=Z(null),R=Z(null),k=Z(null),C=Z(c);C.current=c;let y=Z(a);y.current=a;let f=K(u=>{R.current!==u&&(R.current=u,y.current?.(u))},[]),g=K(()=>{if(typeof MediaStream>"u")return null;p.current||(p.current=new MediaStream);let u=d.current;return u&&u.srcObject!==p.current&&(u.srcObject=p.current),p.current},[]),h=K(u=>{let v=d.current;if(!v)return;let x=v.play();!x||typeof x.then!="function"||x.then(()=>{v.muted||f(!0)}).catch(P=>{let S=P instanceof Error?P.name:String(P);if(S==="AbortError"){Le(`play() aborted (${u}); retrying in ${dt}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,h(`${u}:retry`)},dt);return}if(S==="NotAllowedError"){Le(`play() blocked pending a user gesture (${u})`),f(!1);return}Le(`play() failed (${u})`,P)})},[f]),T=K(u=>{let v=g();if(v){for(let x of v.getAudioTracks())x!==u&&v.removeTrack(x);u&&!v.getAudioTracks().includes(u)&&v.addTrack(u),u&&h("track-attach"),C.current?.(u)}},[g,h]),U=K(()=>{let u=d.current;u&&(g(),u.muted=!1,h("gesture"),qe(),f(!0))},[g,h,f]);hr(r,()=>({unlock:U,get unlocked(){return R.current===!0},get element(){return d.current}}),[U]);let q=K(u=>{d.current=u,u&&(u.setAttribute("playsinline",""),u.setAttribute("webkit-playsinline",""),g()),m?.(u)},[g,m]),D=s!==void 0;return lt(()=>{if(D){T(s??null);return}if(!n)return;let u=n.stream(o),v=()=>{let b=p.current;return b?b.getAudioTracks()[0]??null:null},x=b=>{if(b!==v()&&(T(b),b)){let I=()=>{v()===b&&T(null)};b.addEventListener("ended",I)}},P=u.track;P&&P.readyState==="live"&&x(P);let S=u.on("track",b=>{b&&b.readyState!=="live"||x(b)}),E=setInterval(()=>{let b=u.track;b&&b.readyState==="live"&&x(b)},vr);return()=>{S(),clearInterval(E)}},[n,o,D,s,T]),lt(()=>()=>{k.current&&clearTimeout(k.current)},[]),yr("audio",{ref:q,className:l,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as kr,useCallback as ge,useEffect as Cr,useImperativeHandle as Tr,useRef as Y}from"react";import{sessionFailureFromMediaError as pt}from"@urun-sh/core";import{jsx as Ur}from"react/jsx-runtime";var mt={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function br(...e){console.debug("[urun-voice]",...e)}var Rr=kr(function(t,r){let{session:n,stream:o="audio",constraints:s=mt,connectTimeoutMs:i,attempts:l=3,retryDelayMs:c=1500,onActiveChange:a,onError:m,onMicStream:d,onTrack:p,onUnlockChange:R}=t,k=Y(null),C=Y(null),y=Y(!1),f=Y(a);f.current=a;let g=Y(m);g.current=m;let h=Y(d);h.current=d;let T=ge(u=>{y.current!==u&&(y.current=u,f.current?.(u))},[]),U=ge(()=>{let u=C.current;if(u){for(let v of u.getTracks())v.stop();C.current=null,h.current?.(null)}},[]),q=ge(async()=>{U(),T(!1),await n.stream(o).detach().catch(()=>{})},[n,o,U,T]),D=ge(async()=>{k.current?.unlock();let u;try{u=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(S){let E=pt(S,n.status);throw g.current?.(E),E}U(),C.current=u,h.current?.(u);let v=u.getAudioTracks()[0];if(!v){U();let S=pt(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw g.current?.(S),S}n.connect?.();let x;for(let S=1;S<=l;S++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(o).attach(v),T(!0);return}catch(E){x=E,br(`start attempt ${S}/${l} failed`,E),S<l&&await new Promise(b=>setTimeout(b,c))}U(),T(!1);let P=x instanceof Error?x:new Error(String(x??"voice start failed"));throw g.current?.(P),P},[n,o,s,i,l,c,U,T]);return Tr(r,()=>({start:D,stop:q,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return k.current}}),[D,q]),Cr(()=>U,[U]),Ur(Fe,{ref:k,session:n,stream:o,onTrack:p,onUnlockChange:R})});import{sessionFailureFromMediaError as ft}from"@urun-sh/core";import{forwardRef as xr,useCallback as W,useEffect as Pr,useImperativeHandle as Er,useRef as L,useState as wr}from"react";import{jsx as _r,jsxs as Mr}from"react/jsx-runtime";var St={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function gt(...e){console.debug("[urun-camera]",...e)}var Ar=xr(function(t,r){let{session:n,stream:o="video",constraints:s,facingMode:i="environment",mirror:l="auto",connectTimeoutMs:c,preview:a=!0,className:m,videoClassName:d,onActiveChange:p,onError:R,onStream:k,onTrack:C,children:y}=t,f=L(null),g=L(null),h=L(null),T=L(!1),U=L(i),[q,D]=wr(i),u=L(p);u.current=p;let v=L(R);v.current=R;let x=L(k);x.current=k;let P=L(C);P.current=C;let S=W(w=>{T.current!==w&&(T.current=w,u.current?.(w))},[]),E=W(w=>{let _=f.current;_&&(_.muted=!0,_.srcObject=w,w&&_.play()?.catch?.(F=>gt("preview play() failed",F)))},[]),b=W(()=>{h.current?.(),h.current=null;let w=g.current;if(w){for(let _ of w.getTracks())_.stop();g.current=null,x.current?.(null),P.current?.(null)}E(null)},[E]),I=W(async w=>{let _=g.current,F=h.current,M;try{M=await navigator.mediaDevices.getUserMedia({video:{...St,...s,facingMode:w},audio:!1})}catch(N){let $=ft(N,n.status);throw v.current?.($),$}let A=M.getVideoTracks()[0];if(!A){for(let $ of M.getTracks())$.stop();let N=ft(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw v.current?.(N),N}g.current=M,U.current=w,D(w),E(M),x.current?.(M);let O=()=>{g.current===M&&(gt("camera track ended (device removed or permission revoked)"),b(),S(!1))};A.addEventListener("ended",O),h.current=()=>A.removeEventListener("ended",O);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(A)}catch(N){A.removeEventListener("ended",O);for(let Ct of M.getTracks())Ct.stop();g.current===M&&(g.current=_,h.current=F,E(_),x.current?.(_));let $=N instanceof Error?N:new Error(String(N));throw v.current?.($),$}if(_&&_!==M){F?.();for(let N of _.getTracks())N.stop()}P.current?.(A),S(!0)},[n,o,s,c,E,b,S]),ke=W(w=>I(w?.facingMode??U.current),[I]),Ce=W(async w=>{T.current&&U.current===w||await I(w)},[I]),Te=W(()=>I(U.current==="environment"?"user":"environment"),[I]),be=W(async()=>{b(),S(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,b,S]);return Er(r,()=>({start:ke,stop:be,flip:Te,setFacingMode:Ce,get active(){return T.current},get facingMode(){return U.current},get stream(){return g.current},get element(){return f.current}}),[ke,be,Te,Ce]),Pr(()=>b,[b]),a?Mr("div",{className:m,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[_r("video",{ref:f,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(l==="auto"?q==="user":l)?{transform:"scaleX(-1)"}:{}}}),y]}):null});import{useEffect as Nr,useState as Dr}from"react";var Be={level:0,speaking:!1};function Or(e,t={}){let{fftSize:r=512,intervalMs:n=100,speakingThreshold:o=.02}=t,[s,i]=Dr(Be);return Nr(()=>{if(!e){i(Be);return}let l=fe();if(!l||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let a,m;try{a=l.createMediaStreamSource(c),m=l.createAnalyser(),m.fftSize=r,a.connect(m)}catch{return}let d=new Uint8Array(m.fftSize),R=setInterval(()=>{m.getByteTimeDomainData(d);let k=0;for(let y=0;y<d.length;y++){let f=(d[y]-128)/128;k+=f*f}let C=Math.sqrt(k/d.length);i(y=>{let f=C>o;return Math.abs(y.level-C)<.005&&y.speaking===f?y:{level:C,speaking:f}})},n);return()=>{clearInterval(R),a.disconnect(),i(Be)}},[e,r,n,o]),s}import{useEffect as Ir,useState as qr}from"react";function Lr(e,t){let[r,n]=qr(null);return Ir(()=>{if(!e||!t){n(null);return}let o=e.stream(t);return n(o.track),o.on("track",n)},[e,t]),r}import{useCallback as $r}from"react";import{useEffect as Wr,useMemo as Hr}from"react";import{createStore as Fr}from"zustand/vanilla";import{useStore as Br}from"zustand";var Vr=()=>{};function Ve(e,t={}){let r=a=>{e?.set(a)},n=()=>e?e.get()??{}:{},o=Fr(()=>({doc:n(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let a of s)a();s=null}},l=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",a=>o.setState({doc:a})),e.onSynced(()=>o.setState({synced:!0}))]),i):Vr,c=(a=>Br(o,a));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:l,unbind:i}),t.bind!==!1&&l(),c}function re(e,t){let r=Hr(()=>Ve(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Wr(()=>r.bind(),[r]),r}function jr(e,t,r){let o=re(e,t)(r??(l=>l)),s=$r(l=>{e&&t&&e.doc(t).set(l)},[e,t]);if(r)return o;let i=o;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as Jr,useState as zr}from"react";var J=200;function H(e,t,r=200){let n=[...e,t];return n.length>r?n.slice(n.length-r):n}function ne(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function We(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(n){return{ok:!1,error:n instanceof Error?n.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 He(e,t,r={}){let n=r.cap??200,[o,s]=zr([]);return Jr(()=>{if(s([]),!e||!t)return;let i=!0,l=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await l.next();if(!i||c.done)break;s(a=>H(a,{at:Date.now(),payload:c.value},n))}})(),()=>{i=!1,l.return?.()}},[e,t,n]),o}import{jsx as Se,jsxs as oe}from"react/jsx-runtime";function Xr({session:e,name:t,cap:r,className:n}){let o=He(e,t,{cap:r});return oe("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[oe("div",{className:"urun-stream-tail-meta",children:[Se("code",{children:t}),oe("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Se("div",{className:"urun-stream-tail-log",children:o.length===0?oe("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Se("code",{children:t})," messages\u2026"]}):o.map((s,i)=>oe("div",{className:"urun-stream-tail-line",children:[Se("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ne(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Gr,useState as ht}from"react";import{jsx as z,jsxs as he}from"react/jsx-runtime";function ve({placeholder:e,buttonLabel:t,disabled:r,onApply:n}){let[o,s]=ht(""),[i,l]=ht(null),c=Gr(()=>{let a=We(o);if(!a.ok){l(a.error);return}l(null),n(a.value,o.trim()),s("")},[o,n]);return he("div",{className:"urun-doc-patch",children:[z("textarea",{className:"urun-doc-patch-input",value:o,onChange:a=>s(a.target.value),placeholder:e,rows:3}),he("div",{className:"urun-doc-patch-actions",children:[z("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:c,children:t}),i?z("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Kr({session:e,docKey:t,editable:r=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=re(e,t),i=s(a=>a.doc),l=s(a=>a.synced),c=s(a=>a.set);return he("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[he("div",{className:"urun-doc-panel-meta",children:[z("code",{children:t}),z("span",{className:"urun-doc-panel-synced","data-synced":l?"true":"false",children:l?"synced":"syncing\u2026"})]}),z("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?z(ve,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:a=>c(a)}):null]})}import{useEffect as Zr,useState as Yr}from"react";import{jsx as se,jsxs as yt}from"react/jsx-runtime";function vt(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Qr({session:e,docKey:t="control",cap:r=200,className:n}){let[o,s]=Yr([]);return Zr(()=>(s([]),e?e.doc(t).on("change",l=>{s(c=>H(c,{at:Date.now(),direction:"in",text:vt(ne(l))},r))}):void 0),[e,t,r]),yt("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[se(ve,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,l)=>{e?.doc(t).set(i),s(c=>H(c,{at:Date.now(),direction:"out",text:vt(l)},r))}}),se("div",{className:"urun-control-sender-log",children:o.length===0?se("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,l)=>yt("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[se("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",se("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${l}`))})]})}import{useEffect as en,useState as tn}from"react";import{jsx as ye,jsxs as nn}from"react/jsx-runtime";function rn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:n=200,className:o}){let[s,i]=tn([]),l=t.join(","),c=r.join(",");return en(()=>{if(i([]),!e)return;let a=(d,p)=>i(R=>H(R,{at:Date.now(),kind:d,text:p},n)),m=[];m.push(e.onPhase(d=>a("phase",`phase \u2192 ${d.name}`)));for(let d of t){let p=e.stream(d);m.push(p.on("track",R=>a("track",`${d}: ${R?"track arrived":"track ended"}`)))}for(let d of r){let p=e.doc(d);m.push(p.on("change",()=>a("doc",`${d} changed`)))}return()=>m.forEach(d=>d())},[e,l,c,n]),ye("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?ye("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((a,m)=>nn("div",{className:"urun-event-spine-line","data-kind":a.kind,children:[ye("span",{className:"urun-event-spine-kind",children:a.kind})," ",ye("span",{className:"urun-event-spine-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${m}`))})}import{useEffect as on,useState as sn}from"react";import{describeSessionPhase as an}from"@urun-sh/core";import{jsx as Q,jsxs as dn}from"react/jsx-runtime";var un={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function $e(e){let[t,r]=sn(e?.phase??null);return on(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}function cn({session:e,className:t}){let r=$e(e),n=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.runtime?.reason??null;return dn("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":n,children:[Q("span",{className:"urun-session-status-dot","data-phase":n}),Q("span",{className:"urun-session-status-label",children:un[n]}),o?Q("span",{className:"urun-session-status-detail",children:o}):null]})}function ln({session:e,children:t,fallback:r,className:n}){let o=$e(e);if(o?.name==="live")return Q("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:t});let s=r?r(o):Q("span",{className:"urun-session-gate-fallback",children:o?.name==="error"?`Session ${o.error?.reason??"failed"}.`:o?.name==="ended"?"Session ended.":o&&o.name!=="idle"?an(o):"Waiting for a live session\u2026"});return Q("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:s})}import{describeSessionPhase as Fs}from"@urun-sh/core";export{Zt as ComponentRenderer,St as DEFAULT_CAMERA_CONSTRAINTS,J as DEFAULT_LOG_CAP,mt as DEFAULT_VOICE_CONSTRAINTS,ve as DocPatchForm,lr as ImageFrame,cr as ImageFrameSchema,mr as MetricsPanel,pr as MetricsPanelSchema,er as ProgressCard,Qt as ProgressCardSchema,nr as StatusBadge,tr as StatusBadgeSchema,ir as TextStream,ar as TextStreamSchema,Fe as UrunAudio,Tt as UrunAuthProvider,Ar as UrunCamera,Qr as UrunControlSender,Kr as UrunDocPanel,ee as UrunErrorBoundary,rn as UrunEventSpine,bt as UrunJwtProvider,_t as UrunProvider,ln as UrunSessionGate,cn as UrunSessionStatus,Xr as UrunStreamTail,Rr as UrunVoice,ie as authMode,Ve as createDocStore,Fs as describeSessionPhase,ne as formatPayload,fe as getUrunAudioContext,We as parseJsonObject,H as pushCapped,Kt as registerComponent,qe as resumeUrunAudioContext,B as urunPublicEnv,qt as useApp,Gt as useChat,jt as useCompletion,re as useDocStore,ut as useImageFrame,ct as useMetricsPanel,tt as useProgressCard,Vt as useRequest,jr as useSessionDoc,$e as useSessionPhase,Lr as useSessionTrack,nt as useStatusBadge,He as useStreamMessages,at as useTextStream,Or as useUrunAudioLevel,Re as useUrunAuth,Pt as usesWorkOSAuth};
@@ -1 +1,2 @@
1
+ "use client"
1
2
  "use strict";var i=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var o in e)i(r,o,{get:e[o],enumerable:!0})},v=(r,e,o,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!k.call(r,t)&&t!==o&&i(r,t,{get:()=>e[t],enumerable:!(u=P(e,t))||u.enumerable});return r};var U=r=>v(i({},"__esModule",{value:!0}),r);var x={};f(x,{UrunWorkOSProvider:()=>T});module.exports=U(x);var d=require("react"),c=require("@workos-inc/authkit-nextjs/components");var n=require("react"),A=require("react/jsx-runtime"),a=(0,n.createContext)(null);function p({getAccessToken:r,children:e}){let o=(0,n.useMemo)(()=>({getAccessToken:r}),[r]);return(0,A.jsx)(a.Provider,{value:o,children:e})}var s=require("react/jsx-runtime");function l({children:r}){let e=(0,c.useAccessToken)(),o=(0,d.useCallback)(u=>u?.forceRefresh&&e.refresh?e.refresh():e.getAccessToken(),[e]);return(0,s.jsx)(p,{getAccessToken:o,children:r})}function T({children:r,...e}){return(0,s.jsx)(c.AuthKitProvider,{...e,children:(0,s.jsx)(l,{children:r})})}0&&(module.exports={UrunWorkOSProvider});
@@ -1 +1,2 @@
1
- import{a as t}from"./chunk-QAEWAWV4.mjs";import{useCallback as c}from"react";import{AuthKitProvider as i,useAccessToken as u}from"@workos-inc/authkit-nextjs/components";import{jsx as o}from"react/jsx-runtime";function p({children:r}){let e=u(),s=c(n=>n?.forceRefresh&&e.refresh?e.refresh():e.getAccessToken(),[e]);return o(t,{getAccessToken:s,children:r})}function A({children:r,...e}){return o(i,{...e,children:o(p,{children:r})})}export{A as UrunWorkOSProvider};
1
+ "use client"
2
+ import{a as t}from"./chunk-WF2OBDSX.mjs";import{useCallback as c}from"react";import{AuthKitProvider as i,useAccessToken as u}from"@workos-inc/authkit-nextjs/components";import{jsx as o}from"react/jsx-runtime";function p({children:r}){let e=u(),s=c(n=>n?.forceRefresh&&e.refresh?e.refresh():e.getAccessToken(),[e]);return o(t,{getAccessToken:s,children:r})}function A({children:r,...e}){return o(i,{...e,children:o(p,{children:r})})}export{A as UrunWorkOSProvider};
@@ -0,0 +1,38 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import Player from 'video.js/dist/types/player';
4
+
5
+ interface UrunVideoProps {
6
+
7
+ track?: MediaStreamTrack | null;
8
+
9
+ stream?: MediaStream | null;
10
+
11
+ name?: string;
12
+
13
+ src?: string;
14
+
15
+ type?: string;
16
+
17
+ className?: string;
18
+
19
+ videoClassName?: string;
20
+
21
+ poster?: string;
22
+
23
+ controls?: boolean;
24
+
25
+ autoPlay?: boolean;
26
+
27
+ muted?: boolean;
28
+
29
+ onVideoElement?: (el: HTMLVideoElement | null) => void;
30
+
31
+ onPlayerReady?: (player: Player | null) => void;
32
+
33
+ children?: ReactNode;
34
+ }
35
+
36
+ declare const UrunVideo: react.ForwardRefExoticComponent<UrunVideoProps & react.RefAttributes<HTMLVideoElement>>;
37
+
38
+ export { UrunVideo, type UrunVideoProps };
@@ -0,0 +1,38 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import Player from 'video.js/dist/types/player';
4
+
5
+ interface UrunVideoProps {
6
+
7
+ track?: MediaStreamTrack | null;
8
+
9
+ stream?: MediaStream | null;
10
+
11
+ name?: string;
12
+
13
+ src?: string;
14
+
15
+ type?: string;
16
+
17
+ className?: string;
18
+
19
+ videoClassName?: string;
20
+
21
+ poster?: string;
22
+
23
+ controls?: boolean;
24
+
25
+ autoPlay?: boolean;
26
+
27
+ muted?: boolean;
28
+
29
+ onVideoElement?: (el: HTMLVideoElement | null) => void;
30
+
31
+ onPlayerReady?: (player: Player | null) => void;
32
+
33
+ children?: ReactNode;
34
+ }
35
+
36
+ declare const UrunVideo: react.ForwardRefExoticComponent<UrunVideoProps & react.RefAttributes<HTMLVideoElement>>;
37
+
38
+ export { UrunVideo, type UrunVideoProps };
package/dist/video.js ADDED
@@ -0,0 +1,10 @@
1
+ "use client"
2
+ "use strict";var q=Object.create;var E=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},z=(t,r,n,u)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of G(r))!J.call(t,s)&&s!==n&&E(t,s,{get:()=>r[s],enumerable:!(u=W(r,s))||u.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?q(Y(t)):{},z(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>z(E({},"__esModule",{value:!0}),t);var ae={};K(ae,{UrunVideo:()=>H});module.exports=X(ae);var o=require("react"),O=Q(require("video.js")),pe=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core/internal");var $=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,u]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let s=r.getState()._transport;if(!s)return;let m=s.getTrackByName?.bind(s),g=m?.(t);g&&g.readyState!=="ended"&&u(g);let j=s.on("track",h=>{let w=m?.(t);w&&w.id!==h.id||(u(h),h.addEventListener("ended",()=>{u(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var ee=`
3
+ [data-urun-video]{width:100%;height:100%}
4
+ [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
+ [data-urun-video] .vjs-tech{object-fit:contain}
6
+ .urun-video-live.vjs-has-started .vjs-poster,
7
+ .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
+ .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
+ .urun-video-live .vjs-poster{background-color:transparent}
10
+ `,U="urun-video-critical-css";function re(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=ee,document.head.appendChild(t)}var te=["playToggle","volumePanel","fullscreenToggle"],ne=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:u,stream:s,src:m,type:g="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:L,onPlayerReady:V,children:_}=r,P=typeof m=="string"&&m.length>0,c=!P,y=(0,o.useRef)(null),f=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),L?.(e)},[n,L]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let v=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;re(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?te:ne}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},i=()=>{c&&v()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",i),c&&e.addEventListener("pause",i),f.current=a,V?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",i),e.removeEventListener("pause",i),V?.(null),f.current&&(f.current.dispose(),f.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=f.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:m,type:g}),S&&v()},[P,m,g,S,v]),(0,o.useEffect)(()=>{if(!c)return;let e=f.current;if(!e)return;let a=u??null,d=s??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,v();let i=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),v()},M=()=>{p.srcObject=null,x(!1)};return i&&(i.addEventListener("unmute",C),i.addEventListener("ended",M),i.muted||C()),()=>{i&&(i.removeEventListener("unmute",C),i.removeEventListener("ended",M))}},[c,u,s,v]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:v,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,l.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),oe=(0,o.forwardRef)(function({name:r,...n},u){let s=R(r);return(0,l.jsx)(A,{ref:u,...n,track:s})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(oe,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
package/dist/video.mjs ADDED
@@ -0,0 +1,10 @@
1
+ "use client"
2
+ import{forwardRef as j,useCallback as z,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as q,useEffect as W}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as se}from"react";import{TransportSession as ie}from"@urun-sh/core/internal";import{jsx as le}from"react/jsx-runtime";var V=B(null);function M(o){let r=F(V);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,u]=q(null);return W(()=>{let i=r.getState()._transport;if(!i)return;let c=i.getTrackByName?.bind(i),v=c?.(o);v&&v.readyState!=="ended"&&u(v);let w=i.on("track",f=>{let y=c?.(o);y&&y.id!==f.id||(u(f),f.addEventListener("ended",()=>{u(null)}))});return()=>{w()}},[o,r]),n}import{jsx as m,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
3
+ [data-urun-video]{width:100%;height:100%}
4
+ [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
+ [data-urun-video] .vjs-tech{object-fit:contain}
6
+ .urun-video-live.vjs-has-started .vjs-poster,
7
+ .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
+ .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
+ .urun-video-live .vjs-poster{background-color:transparent}
10
+ `,I="urun-video-critical-css";function Q(){if(typeof document>"u"||document.getElementById(I))return;let o=document.createElement("style");o.id=I,o.textContent=K,document.head.appendChild(o)}var X=["playToggle","volumePanel","fullscreenToggle"],Z=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],O=j(function(r,n){let{track:u,stream:i,src:c,type:v="video/mp4",className:w,videoClassName:f,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),g=N(null),[D,h]=Y(!1),_=z(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=z(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(s=>{(s instanceof Error?s.name:String(s))!=="AbortError"&&h(!0)})},[k]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;Q(),k&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=J(e,{controls:A,autoplay:x,muted:k,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?X:Z}});d&&t.addClass("urun-video-live");let s=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),s()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),g.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),g.current&&(g.current.dispose(),g.current=null)}},[d]),E(()=>{if(!S)return;let e=g.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:v}),x&&p()},[S,c,v,x,p]),E(()=>{if(!d)return;let e=g.current;if(!e)return;let t=u??null,s=i??null;!s&&t&&(s=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!s){l.srcObject=null,h(!1);return}l.srcObject=s,p();let a=s.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},L=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",L),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",L))}},[d,u,i,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[m("video",{ref:_,className:["video-js","vjs-default-skin",f].filter(Boolean).join(" "),playsInline:!0}),D&&m("button",{type:"button",onClick:p,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:U("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[m("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:m("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},u){let i=M(r);return m(O,{ref:u,...n,track:i})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?m($,{ref:n,...r,name:r.name}):m(O,{ref:n,...r})});export{ee as UrunVideo};
package/dist/workos.js CHANGED
@@ -1 +1,2 @@
1
+ "use client"
1
2
  "use strict";var c=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var v=(r,e)=>{for(var o in e)c(r,o,{get:e[o],enumerable:!0})},U=(r,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!k.call(r,t)&&t!==o&&c(r,t,{get:()=>e[t],enumerable:!(i=P(e,t))||i.enumerable});return r};var a=r=>U(c({},"__esModule",{value:!0}),r);var T={};v(T,{UrunWorkOSProvider:()=>x});module.exports=a(T);var d=require("react"),s=require("@workos-inc/authkit-react");var n=require("react"),A=require("react/jsx-runtime"),l=(0,n.createContext)(null);function p({getAccessToken:r,children:e}){let o=(0,n.useMemo)(()=>({getAccessToken:r}),[r]);return(0,A.jsx)(l.Provider,{value:o,children:e})}var u=require("react/jsx-runtime");function f({children:r}){let e=(0,s.useAuth)(),o=(0,d.useCallback)(()=>e.getAccessToken(),[e]);return(0,u.jsx)(p,{getAccessToken:o,children:r})}function x({children:r,...e}){return(0,u.jsx)(s.AuthKitProvider,{...e,children:(0,u.jsx)(f,{children:r})})}0&&(module.exports={UrunWorkOSProvider});
package/dist/workos.mjs CHANGED
@@ -1 +1,2 @@
1
- import{a as t}from"./chunk-QAEWAWV4.mjs";import{useCallback as n}from"react";import{AuthKitProvider as c,useAuth as s}from"@workos-inc/authkit-react";import{jsx as e}from"react/jsx-runtime";function u({children:r}){let o=s(),i=n(()=>o.getAccessToken(),[o]);return e(t,{getAccessToken:i,children:r})}function A({children:r,...o}){return e(c,{...o,children:e(u,{children:r})})}export{A as UrunWorkOSProvider};
1
+ "use client"
2
+ import{a as t}from"./chunk-WF2OBDSX.mjs";import{useCallback as n}from"react";import{AuthKitProvider as c,useAuth as s}from"@workos-inc/authkit-react";import{jsx as e}from"react/jsx-runtime";function u({children:r}){let o=s(),i=n(()=>o.getAccessToken(),[o]);return e(t,{getAccessToken:i,children:r})}function A({children:r,...o}){return e(c,{...o,children:e(u,{children:r})})}export{A as UrunWorkOSProvider};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "React bindings for the urun TypeScript SDK",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,6 +35,11 @@
35
35
  "import": "./dist/next-workos.mjs",
36
36
  "require": "./dist/next-workos.js"
37
37
  },
38
+ "./video": {
39
+ "types": "./dist/video.d.ts",
40
+ "import": "./dist/video.mjs",
41
+ "require": "./dist/video.js"
42
+ },
38
43
  "./styles.css": "./dist/styles.css",
39
44
  "./package.json": "./package.json"
40
45
  },
@@ -48,7 +53,7 @@
48
53
  "dev": "tsup --watch"
49
54
  },
50
55
  "peerDependencies": {
51
- "@urun-sh/core": "^0.2.5",
56
+ "@urun-sh/core": "^0.2.7",
52
57
  "@workos-inc/authkit-nextjs": "^3.0.0",
53
58
  "@workos-inc/authkit-react": "^0.15.0 || ^0.16.0",
54
59
  "next": "^15.0.0 || ^16.0.0",
@@ -56,7 +61,7 @@
56
61
  "video.js": "^8.0.0"
57
62
  },
58
63
  "dependencies": {
59
- "yjs": "^13.6.0",
64
+ "yjs": "^13.6.31",
60
65
  "zod": "^3.24.0",
61
66
  "zustand": "^5.0.0"
62
67
  },
@@ -1 +0,0 @@
1
- function n(e){return e&&e.trim()?e.trim():void 0}function r(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return n(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return n(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return n(typeof process<"u"?process.env?.[e]:void 0)}}function s(){let e=r("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||r("VERCEL_ENV")==="production"?"workos":r("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function t(){return s()==="workos"}export{r as a,s as b,t as c};
File without changes