@urun-sh/react 0.2.10 → 0.2.13

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.12
4
+
5
+ - Version-lockstep release with `@urun-sh/core@0.2.12` (legacy `stream.subscribe`
6
+ handshake deleted in core; no react surface change — `UrunStreamTail` et al.
7
+ ride the same `stream.messages()` API, now fed exclusively by the §5
8
+ server-push DataConsumer path).
9
+
3
10
  ## Unreleased
4
11
 
5
12
  - **BREAKING**: `UrunVideo` moved from the root entry to the `./video` subpath
package/dist/index.d.mts CHANGED
@@ -199,6 +199,42 @@ interface UseChatResult {
199
199
 
200
200
  declare function useChat<TChunk = string>(session: RequestCapableSession, options?: UseChatOptions<TChunk>): UseChatResult;
201
201
 
202
+ interface InputPresenceSession {
203
+ presence: {
204
+ setField(field: string, value: unknown): void;
205
+ };
206
+ }
207
+ interface UseInputPresenceOptions {
208
+
209
+ field?: string;
210
+
211
+ hz?: number;
212
+
213
+ documentTarget?: Document | null;
214
+
215
+ windowTarget?: Window | null;
216
+ }
217
+ interface InputPresenceControls {
218
+
219
+ engage(surface: HTMLElement): void;
220
+
221
+ engageTouch(): void;
222
+
223
+ release(): void;
224
+
225
+ engaged: boolean;
226
+
227
+ heldKeys: string[];
228
+
229
+ pressKey(key: string): void;
230
+
231
+ releaseKey(key: string): void;
232
+
233
+ movePointer(dx: number, dy: number): void;
234
+ }
235
+
236
+ declare function useInputPresence(session: InputPresenceSession | null | undefined, options?: UseInputPresenceOptions): InputPresenceControls;
237
+
202
238
  interface RegisteredComponent {
203
239
  component: ComponentType<any>;
204
240
  schema: ZodSchema;
@@ -755,6 +791,29 @@ interface UrunSessionEndedProps {
755
791
 
756
792
  declare function UrunSessionEnded({ session, onNewSession, children, className }: UrunSessionEndedProps): react_jsx_runtime.JSX.Element | null;
757
793
 
794
+ interface SessionIdleState {
795
+
796
+ warning: boolean;
797
+
798
+ deadlineEpochS: number | null;
799
+
800
+ idleSinceEpochS: number | null;
801
+ }
802
+
803
+ type TouchableSession = WorkbenchSession & {
804
+ touch?: () => void;
805
+ };
806
+
807
+ declare function useSessionIdle(session: TouchableSession | null): SessionIdleState | null;
808
+ interface UrunIdleWarningProps {
809
+ session: TouchableSession | null;
810
+
811
+ onStillHere?: () => void;
812
+ className?: string;
813
+ }
814
+
815
+ declare function UrunIdleWarning({ session, onStillHere, className }: UrunIdleWarningProps): react_jsx_runtime.JSX.Element | null;
816
+
758
817
  interface UseUrunPrewakeOptions {
759
818
 
760
819
  app?: string;
@@ -792,4 +851,4 @@ interface UrunSessionWakingProps {
792
851
 
793
852
  declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
794
853
 
795
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
854
+ 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 InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionIdleState, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunIdleWarning, type UrunIdleWarningProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
package/dist/index.d.ts CHANGED
@@ -199,6 +199,42 @@ interface UseChatResult {
199
199
 
200
200
  declare function useChat<TChunk = string>(session: RequestCapableSession, options?: UseChatOptions<TChunk>): UseChatResult;
201
201
 
202
+ interface InputPresenceSession {
203
+ presence: {
204
+ setField(field: string, value: unknown): void;
205
+ };
206
+ }
207
+ interface UseInputPresenceOptions {
208
+
209
+ field?: string;
210
+
211
+ hz?: number;
212
+
213
+ documentTarget?: Document | null;
214
+
215
+ windowTarget?: Window | null;
216
+ }
217
+ interface InputPresenceControls {
218
+
219
+ engage(surface: HTMLElement): void;
220
+
221
+ engageTouch(): void;
222
+
223
+ release(): void;
224
+
225
+ engaged: boolean;
226
+
227
+ heldKeys: string[];
228
+
229
+ pressKey(key: string): void;
230
+
231
+ releaseKey(key: string): void;
232
+
233
+ movePointer(dx: number, dy: number): void;
234
+ }
235
+
236
+ declare function useInputPresence(session: InputPresenceSession | null | undefined, options?: UseInputPresenceOptions): InputPresenceControls;
237
+
202
238
  interface RegisteredComponent {
203
239
  component: ComponentType<any>;
204
240
  schema: ZodSchema;
@@ -755,6 +791,29 @@ interface UrunSessionEndedProps {
755
791
 
756
792
  declare function UrunSessionEnded({ session, onNewSession, children, className }: UrunSessionEndedProps): react_jsx_runtime.JSX.Element | null;
757
793
 
794
+ interface SessionIdleState {
795
+
796
+ warning: boolean;
797
+
798
+ deadlineEpochS: number | null;
799
+
800
+ idleSinceEpochS: number | null;
801
+ }
802
+
803
+ type TouchableSession = WorkbenchSession & {
804
+ touch?: () => void;
805
+ };
806
+
807
+ declare function useSessionIdle(session: TouchableSession | null): SessionIdleState | null;
808
+ interface UrunIdleWarningProps {
809
+ session: TouchableSession | null;
810
+
811
+ onStillHere?: () => void;
812
+ className?: string;
813
+ }
814
+
815
+ declare function UrunIdleWarning({ session, onStillHere, className }: UrunIdleWarningProps): react_jsx_runtime.JSX.Element | null;
816
+
758
817
  interface UseUrunPrewakeOptions {
759
818
 
760
819
  app?: string;
@@ -792,4 +851,4 @@ interface UrunSessionWakingProps {
792
851
 
793
852
  declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
794
853
 
795
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
854
+ 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 InputPresenceControls, type InputPresenceSession, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionIdleState, type SessionRequestOptions, type SessionWake, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunIdleWarning, type UrunIdleWarningProps, UrunJwtProvider, UrunProvider, UrunSessionClock, type UrunSessionClockProps, UrunSessionEnded, type UrunSessionEndedProps, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunSessionWaking, type UrunSessionWakingProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseInputPresenceOptions, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type UseUrunPrewakeOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useInputPresence, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionEndsAt, useSessionIdle, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, useUrunPrewake, usesWorkOSAuth };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var cr=Object.defineProperty;var At=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Mt=Object.prototype.hasOwnProperty;var Nt=(e,r)=>{for(var t in r)cr(e,t,{get:r[t],enumerable:!0})},_t=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Et(r))!Mt.call(e,o)&&o!==t&&cr(e,o,{get:()=>r[o],enumerable:!(n=At(r,o))||n.enumerable});return e};var Dt=e=>_t(cr({},"__esModule",{value:!0}),e);var Jt={};Nt(Jt,{ComponentRenderer:()=>Hr,DEFAULT_CAMERA_CONSTRAINTS:()=>xr,DEFAULT_LOG_CAP:()=>re,DEFAULT_VOICE_CONSTRAINTS:()=>br,DocPatchForm:()=>Oe,ImageFrame:()=>Yr,ImageFrameSchema:()=>Zr,MetricsPanel:()=>et,MetricsPanelSchema:()=>Qr,ProgressCard:()=>Jr,ProgressCardSchema:()=>jr,StatusBadge:()=>Xr,StatusBadgeSchema:()=>zr,TextStream:()=>Kr,TextStreamSchema:()=>Gr,UrunAudio:()=>He,UrunAuthProvider:()=>lr,UrunCamera:()=>at,UrunControlSender:()=>St,UrunDocPanel:()=>ft,UrunErrorBoundary:()=>ce,UrunEventSpine:()=>ht,UrunJwtProvider:()=>Er,UrunProvider:()=>Nr,UrunSessionClock:()=>Ct,UrunSessionEnded:()=>Ut,UrunSessionGate:()=>bt,UrunSessionStatus:()=>yt,UrunSessionWaking:()=>sr,UrunStreamTail:()=>mt,UrunVoice:()=>ot,authMode:()=>Pe,createDocStore:()=>Ke,describeSessionPhase:()=>ur.describeSessionPhase,formatPayload:()=>ve,getUrunAudioContext:()=>Ne,isWakingPhase:()=>ur.isWakingPhase,parseJsonObject:()=>Ye,pushCapped:()=>Y,registerComponent:()=>Vr,resumeUrunAudioContext:()=>_e,urunPublicEnv:()=>G,useApp:()=>Dr,useChat:()=>Fr,useCompletion:()=>qr,useDocStore:()=>he,useImageFrame:()=>vr,useMetricsPanel:()=>kr,useProgressCard:()=>gr,useRequest:()=>Or,useSessionDoc:()=>pt,useSessionEndsAt:()=>Tr,useSessionPhase:()=>J,useSessionTrack:()=>ut,useSessionWake:()=>or,useStatusBadge:()=>Sr,useStreamMessages:()=>er,useTextStream:()=>hr,useUrunAudioLevel:()=>it,useUrunAuth:()=>We,useUrunPrewake:()=>Pt,usesWorkOSAuth:()=>wr});module.exports=Dt(Jt);var pe=require("react");var Pr=require("react"),Te=require("react/jsx-runtime"),ce=class extends Pr.Component{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||(0,Te.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Te.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Te.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Rr=require("react"),le=(0,Rr.createContext)(null);function ne(e){return e&&e.trim()?e.trim():void 0}function G(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ne(typeof process<"u"?process.env?.[e]:void 0)}}function Pe(){let e=G("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||G("VERCEL_ENV")==="production"?"workos":G("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function wr(){return Pe()==="workos"}var de=require("react"),Mr=require("react/jsx-runtime"),Ar=(0,de.createContext)(null);function lr({getAccessToken:e,children:r}){let t=(0,de.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Mr.jsx)(Ar.Provider,{value:t,children:r})}var Er=lr;function We(){return(0,de.useContext)(Ar)}var Fe=require("react/jsx-runtime");function Nr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=(0,pe.useState)(),i=We(),f=G("NEXT_PUBLIC_SESSION_TOKEN")??G("NEXT_PUBLIC_URUN_JWT"),d=Pe(),m=d==="workos"&&!n,k=n??(d==="jwt"?f:void 0)??u,C=o??G("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),y=m&&!k,g=(0,pe.useMemo)(()=>({appId:t,baseUrl:e,orgId:r,jwt:k,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,k,r,m]);return(0,pe.useEffect)(()=>{if(!m||!i)return;let S=!1,U=i;async function h(){try{let A=await U.getAccessToken();S||c(A??void 0)}catch{S||c(void 0)}}h();let T=window.setInterval(()=>{h()},6e4);return()=>{S=!0,window.clearInterval(T)}},[i,m]),(0,Fe.jsx)(ce,{fallback:s,children:y?(0,Fe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Fe.jsx)(le.Provider,{value:g,children:a})})}var K=require("react"),_r=require("@urun-sh/core");function Ot(e,r){return`${e}:${JSON.stringify(r??{})}`}var dr=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},pr=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},mr=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new dr(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new pr(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Dr(){let e=(0,K.useContext)(le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=(0,K.useReducer)(o=>o+1,0),t=(0,K.useRef)(new Map),n=(0,K.useMemo)(()=>(0,_r.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,K.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Ot(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new mr(n[s](a),r);return t.current.set(u,i),i}}}),[n])}var L=require("react");function me(e){let r=e;if(!r||typeof r.request!="function"||typeof r.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return r}function It(e){return e instanceof Error?e:new Error(String(e))}function Or(e,r){let t=(0,L.useMemo)(()=>me(e),[e]),[n,o]=(0,L.useState)(void 0),[s,a]=(0,L.useState)(null),[u,c]=(0,L.useState)(!1),i=(0,L.useRef)(r);i.current=r;let f=(0,L.useRef)(0),d=(0,L.useRef)(null),m=(0,L.useRef)(!0);(0,L.useEffect)(()=>(m.current=!0,()=>{m.current=!1,d.current?.abort()}),[]);let k=(0,L.useCallback)(async g=>{d.current?.abort();let S=new AbortController;d.current=S;let U=++f.current,h=()=>m.current&&f.current===U;h()&&(c(!0),a(null));try{let T=await t.request(g,{...i.current,signal:S.signal});return h()&&(o(T),c(!1),i.current?.onSuccess?.(T)),T}catch(T){let A=It(T);throw h()&&(a(A),c(!1),i.current?.onError?.(A)),A}},[t]),C=(0,L.useCallback)(g=>{k(g).catch(()=>{})},[k]),y=(0,L.useCallback)(()=>{f.current++,d.current?.abort(),d.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:k,data:n,error:s,isPending:u,reset:y}}var B=require("react");function Ir(e){return e instanceof Error?e:new Error(String(e))}var qt=e=>typeof e=="string"?e:String(e);function qr(e,r){let t=(0,B.useMemo)(()=>me(e),[e]),[n,o]=(0,B.useState)(""),[s,a]=(0,B.useState)(!1),[u,c]=(0,B.useState)(null),i=(0,B.useRef)(r);i.current=r;let f=(0,B.useRef)(0),d=(0,B.useRef)(null),m=(0,B.useRef)(!0);(0,B.useEffect)(()=>(m.current=!0,()=>{m.current=!1,d.current?.cancel(),d.current=null}),[]);let k=(0,B.useCallback)(()=>{f.current++,d.current?.cancel(),d.current=null,m.current&&a(!1)},[]),C=(0,B.useCallback)(async y=>{d.current?.cancel();let g=++f.current,S=()=>m.current&&f.current===g,U=i.current,h=U?.parseChunk??qt,T=U?.buildPayload??(R=>({prompt:R}));S()&&(o(""),c(null),a(!0));let{parseChunk:A,buildPayload:V,onFinish:_,onError:l,...x}=U??{},N="",E;try{E=t.requestStream(T(y),x),d.current=E}catch(R){let W=Ir(R);S()&&(c(W),a(!1),U?.onError?.(W));return}try{for await(let R of E){if(f.current!==g)break;N+=h(R),S()&&o(N)}S()&&(a(!1),U?.onFinish?.(N))}catch(R){let W=Ir(R);S()&&(c(W),a(!1),U?.onError?.(W))}finally{d.current===E&&(d.current=null)}},[t]);return{completion:n,complete:C,stop:k,isStreaming:s,error:u}}var I=require("react");function Lr(e){return e instanceof Error?e:new Error(String(e))}var Lt=e=>typeof e=="string"?e:String(e),Wr=0;function fr(e){return Wr+=1,`${e}-${Wr}`}function Fr(e,r){let t=(0,I.useMemo)(()=>me(e),[e]),[n,o]=(0,I.useState)(()=>(r?.initialMessages??[]).map(h=>({id:h.id??fr("msg"),role:h.role,content:h.content}))),[s,a]=(0,I.useState)(""),[u,c]=(0,I.useState)(!1),[i,f]=(0,I.useState)(null),d=(0,I.useRef)(r);d.current=r;let m=(0,I.useRef)(n);m.current=n;let k=(0,I.useRef)(s);k.current=s;let C=(0,I.useRef)(0),y=(0,I.useRef)(null),g=(0,I.useRef)(!0);(0,I.useEffect)(()=>(g.current=!0,()=>{g.current=!1,y.current?.cancel(),y.current=null}),[]);let S=(0,I.useCallback)(()=>{C.current++,y.current?.cancel(),y.current=null,g.current&&c(!1)},[]),U=(0,I.useCallback)(async h=>{let T=h===void 0,A=(T?k.current:h)??"";if(!A.trim())return;y.current?.cancel();let _=++C.current,l=()=>g.current&&C.current===_,x=d.current,N=x?.parseChunk??Lt,E={id:fr("msg"),role:"user",content:A},R={id:fr("msg"),role:"assistant",content:""},W=[...m.current,E].map(v=>({role:v.role,content:v.content})),p=[...m.current,E,R];m.current=p,o(p),T&&a(""),f(null),c(!0);let P=x?.buildPayload??(v=>({messages:v})),{initialMessages:q,parseChunk:D,buildPayload:F,onFinish:j,onError:be,...qe}=x??{},Le=v=>{o(O=>O.map($=>$.id===R.id?{...$,content:v}:$))},ie="",Ce;try{Ce=t.requestStream(P(W),qe),y.current=Ce}catch(v){let O=Lr(v);l()&&(f(O),c(!1),x?.onError?.(O));return}try{for await(let v of Ce){if(C.current!==_)break;ie+=N(v),l()&&Le(ie)}l()&&(c(!1),x?.onFinish?.({...R,content:ie}))}catch(v){let O=Lr(v);l()&&(f(O),c(!1),x?.onError?.(O))}finally{y.current===Ce&&(y.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:U,stop:S,isStreaming:u,error:i}}var Br=new Map;function Vr(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Br.set(e,{component:r,schema:t})}function $r(e,r){let t=Br.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var oe=require("react/jsx-runtime");function Hr({name:e,props:r,fallback:t}){let n=$r(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?(0,oe.jsx)(oe.Fragment,{children:t}):(0,oe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,oe.jsx)("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return(0,oe.jsx)(o,{...n.validatedProps})}var fe=require("zod"),se=require("react/jsx-runtime"),jr=fe.z.object({step:fe.z.number().min(0),total:fe.z.number().min(1),label:fe.z.string().optional(),variant:fe.z.enum(["default","success","error"]).default("default")});function gr(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function Jr(e){let{step:r,total:t,label:n,variant:o,percentage:s}=gr(e);return(0,se.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,se.jsx)("div",{className:"urun-progress-label",children:n}),(0,se.jsx)("div",{className:"urun-progress-bar",children:(0,se.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,se.jsxs)("div",{className:"urun-progress-text",children:[r,"/",t]})]})}var Be=require("zod"),Re=require("react/jsx-runtime"),zr=Be.z.object({state:Be.z.enum(["thinking","generating","idle","error"]),message:Be.z.string().optional()}),Wt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Sr(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??Wt[r]??r;return{state:r,message:o,isActive:n}}function Xr(e){let{state:r,message:t,isActive:n}=Sr(e);return(0,Re.jsxs)("span",{className:"urun-status-badge","data-state":r,children:[(0,Re.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,Re.jsx)("span",{className:"urun-status-message",children:t})]})}var we=require("react"),Ve=require("zod"),Ae=require("react/jsx-runtime"),Gr=Ve.z.object({text:Ve.z.string(),streaming:Ve.z.boolean().default(!1)});function hr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function Kr(e){let{text:r,streaming:t}=hr(e),n=(0,we.useRef)(null),o=(0,we.useRef)(0);return(0,we.useEffect)(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),(0,Ae.jsxs)("div",{className:"urun-text-stream",children:[(0,Ae.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,Ae.jsx)("span",{className:"urun-text-cursor"})]})}var Ee=require("zod"),Me=require("react/jsx-runtime"),Zr=Ee.z.object({src:Ee.z.string().url(),alt:Ee.z.string().optional(),caption:Ee.z.string().optional()});function vr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function Yr(e){let{src:r,alt:t,caption:n}=vr(e);return(0,Me.jsxs)("figure",{className:"urun-image-frame",children:[(0,Me.jsx)("img",{className:"urun-image",src:r,alt:t}),n&&(0,Me.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var Z=require("zod"),ge=require("react/jsx-runtime"),Qr=Z.z.object({metrics:Z.z.array(Z.z.object({label:Z.z.string(),value:Z.z.union([Z.z.string(),Z.z.number()]),unit:Z.z.string().optional()}))});function kr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function et(e){let{metrics:r}=kr(e);return(0,ge.jsx)("div",{className:"urun-metrics-panel",children:r.map((t,n)=>(0,ge.jsxs)("div",{className:"urun-metric-card",children:[(0,ge.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,ge.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var M=require("react"),tt=require("@urun-sh/core");var $e=null;function Ft(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ne(){if($e)return $e;let e=Ft();return e?($e=new e,$e):null}function _e(){let e=Ne();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var nt=require("react/jsx-runtime"),Bt=1e3,rt=200;function yr(...e){console.debug("[urun-audio]",...e)}var He=(0,M.forwardRef)(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:f}=r,d=(0,M.useRef)(null),m=(0,M.useRef)(null),k=(0,M.useRef)(null),C=(0,M.useRef)(null),y=(0,M.useRef)(c);y.current=c;let g=(0,M.useRef)(i);g.current=i;let S=(0,M.useCallback)(l=>{k.current!==l&&(k.current=l,g.current?.(l))},[]),U=(0,M.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let l=d.current;return l&&l.srcObject!==m.current&&(l.srcObject=m.current),m.current},[]),h=(0,M.useCallback)(l=>{let x=d.current;if(!x)return;let N=x.play();!N||typeof N.then!="function"||N.then(()=>{x.muted||S(!0)}).catch(E=>{let R=E instanceof Error?E.name:String(E);if(R==="AbortError"){yr(`play() aborted (${l}); retrying in ${rt}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,h(`${l}:retry`)},rt);return}if(R==="NotAllowedError"){yr(`play() blocked pending a user gesture (${l})`),S(!1);return}yr(`play() failed (${l})`,E)})},[S]),T=(0,M.useCallback)(l=>{let x=U();if(x){for(let N of x.getAudioTracks())N!==l&&x.removeTrack(N);l&&!x.getAudioTracks().includes(l)&&x.addTrack(l),l&&h("track-attach"),y.current?.(l)}},[U,h]),A=(0,M.useCallback)(()=>{let l=d.current;l&&(U(),l.muted=!1,h("gesture"),_e(),S(!0))},[U,h,S]);(0,M.useImperativeHandle)(t,()=>({unlock:A,get unlocked(){return k.current===!0},get element(){return d.current}}),[A]);let V=(0,M.useCallback)(l=>{d.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),U()),f?.(l)},[U,f]),_=s!==void 0;return(0,M.useEffect)(()=>{if(_){T(s??null);return}if(!n)return;let l=n.stream(o),x=()=>{let p=m.current;return p?p.getAudioTracks()[0]??null:null},N=p=>{if(p!==x()&&(T(p),p)){let P=()=>{x()===p&&T(null)};p.addEventListener("ended",P)}},E=l.track;E&&E.readyState==="live"&&N(E);let R=l.on("track",p=>{p&&p.readyState!=="live"||N(p)}),W=setInterval(()=>{let p=l.track;p&&p.readyState==="live"&&N(p)},Bt);return()=>{R(),clearInterval(W)}},[n,o,_,s,T]),(0,M.useEffect)(()=>(0,tt.observePageLifecycle)(()=>{_e(),k.current===!0&&h("foreground")}),[h]),(0,M.useEffect)(()=>()=>{C.current&&clearTimeout(C.current)},[]),(0,nt.jsx)("audio",{ref:V,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});var w=require("react"),Se=require("@urun-sh/core");var st=require("react/jsx-runtime"),br={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function je(...e){console.debug("[urun-voice]",...e)}var ot=(0,w.forwardRef)(function(r,t){let{session:n,stream:o="audio",constraints:s=br,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:f,onMicStream:d,onTrack:m,onUnlockChange:k,capture:C}=r,y=(0,w.useRef)(null),g=(0,w.useRef)(null),S=(0,w.useRef)(null),U=(0,w.useRef)([]),h=(0,w.useRef)(!1),T=(0,w.useRef)(i);T.current=i;let A=(0,w.useRef)(f);A.current=f;let V=(0,w.useRef)(d);V.current=d;let _=(0,w.useCallback)(p=>{h.current!==p&&(h.current=p,T.current?.(p))},[]),l=(0,w.useCallback)(()=>{for(let p of U.current)p();U.current=[],S.current?.release(),S.current=null,g.current&&(g.current=null,V.current?.(null))},[]),x=(0,w.useCallback)(async()=>{let p=S.current;if(p){let F=await p.update(s);return g.current=p.stream,V.current?.(p.stream),F}let q=await(C??(0,Se.sharedCaptureController)()).claim("audio",s);S.current=q,U.current=[q.onTrack((F,j)=>{g.current=j,V.current?.(j),h.current&&n.stream(o).attach(F).catch(be=>je("mic re-attach after one-capture re-acquire failed",be))}),q.onLost(F=>{S.current=null,U.current=[],g.current=null,V.current?.(null),_(!1),A.current?.(F)})],g.current=q.stream,V.current?.(q.stream);let D=q.track;if(!D)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return D},[C,s,n,o,_]),N=(0,w.useCallback)(async()=>{l(),_(!1),await n.stream(o).detach().catch(()=>{})},[n,o,l,_]),E=(0,w.useCallback)(async()=>{y.current?.unlock();let p;try{p=await x()}catch(D){l();let F=(0,Se.sessionFailureFromMediaError)(D,n.status);throw A.current?.(F),F}n.connect?.();let P;for(let D=1;D<=u;D++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(p),_(!0);return}catch(F){P=F,je(`start attempt ${D}/${u} failed`,F),D<u&&await new Promise(j=>setTimeout(j,c))}l(),_(!1);let q=P instanceof Error?P:new Error(String(P??"voice start failed"));throw A.current?.(q),q},[n,o,a,u,c,x,l,_]);(0,w.useImperativeHandle)(t,()=>({start:E,stop:N,unlock:()=>y.current?.unlock(),get active(){return h.current},get micStream(){return g.current},get audio(){return y.current}}),[E,N]);let R=(0,w.useRef)(!1),W=(0,w.useCallback)(async()=>{if(!h.current||R.current)return;let p=g.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(P){je("foreground mic re-assert failed (will retry on next pass)",P)}return}R.current=!0;try{let P=await x();await n.stream(o).attach(P)}catch(P){let q=P instanceof Error?P:new Error(String(P));je("foreground mic re-acquire failed",q),A.current?.(q)}finally{R.current=!1}},[n,o,x]);return(0,w.useEffect)(()=>{let p=()=>{W()};return typeof n.onRecovery=="function"?n.onRecovery(p):(0,Se.observePageLifecycle)(p)},[n,W]),(0,w.useEffect)(()=>l,[l]),(0,st.jsx)(He,{ref:y,session:n,stream:o,onTrack:m,onUnlockChange:k})});var Je=require("@urun-sh/core"),b=require("react"),ze=require("react/jsx-runtime"),xr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Cr(...e){console.debug("[urun-camera]",...e)}var at=(0,b.forwardRef)(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:f,videoClassName:d,onActiveChange:m,onError:k,onStream:C,onTrack:y,children:g,capture:S}=r,U=(0,b.useRef)(null),h=(0,b.useRef)(null),T=(0,b.useRef)(null),A=(0,b.useRef)([]),V=(0,b.useRef)(null),_=(0,b.useRef)(!1),l=(0,b.useRef)(a),[x,N]=(0,b.useState)(a),E=(0,b.useRef)(m);E.current=m;let R=(0,b.useRef)(k);R.current=k;let W=(0,b.useRef)(C);W.current=C;let p=(0,b.useRef)(y);p.current=y;let P=(0,b.useCallback)(v=>{_.current!==v&&(_.current=v,E.current?.(v))},[]),q=(0,b.useCallback)(v=>{let O=U.current;O&&(O.muted=!0,O.srcObject=v,v&&O.play()?.catch?.($=>Cr("preview play() failed",$)))},[]),D=(0,b.useCallback)(()=>{V.current?.(),V.current=null;for(let v of A.current)v();A.current=[],T.current?.release(),T.current=null,h.current&&(h.current=null,W.current?.(null),p.current?.(null)),q(null)},[q]),F=(0,b.useCallback)((v,O)=>{V.current?.(),h.current=O,q(O),W.current?.(O);let $=()=>{h.current===O&&(Cr("camera track ended (device removed or permission revoked)"),D(),P(!1))};v.addEventListener("ended",$),V.current=()=>v.removeEventListener("ended",$)},[q,D,P]),j=(0,b.useCallback)(async v=>{let O={...xr,...s,facingMode:v},$;try{let ee=T.current;if(ee)$=await ee.update(O);else{let xe=await(S??(0,Je.sharedCaptureController)()).claim("video",O);if(T.current=xe,A.current=[xe.onTrack((Ue,Rt)=>{F(Ue,Rt),_.current&&n.stream(o).attachVideo(Ue).then(()=>p.current?.(Ue)).catch(wt=>Cr("camera re-publish after one-capture re-acquire failed",wt))}),xe.onLost(Ue=>{T.current=null,A.current=[],D(),P(!1),R.current?.(Ue)})],!xe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=xe.track}}catch(ee){let ue=(0,Je.sessionFailureFromMediaError)(ee,n.status);throw R.current?.(ue),ue}l.current=v,N(v),F($,T.current?.stream??new MediaStream([$]));try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo($)}catch(ee){D(),P(!1);let ue=ee instanceof Error?ee:new Error(String(ee));throw R.current?.(ue),ue}p.current?.($),P(!0)},[n,o,s,c,S,F,D,P]),be=(0,b.useCallback)(v=>j(v?.facingMode??l.current),[j]),qe=(0,b.useCallback)(async v=>{_.current&&l.current===v||await j(v)},[j]),Le=(0,b.useCallback)(()=>j(l.current==="environment"?"user":"environment"),[j]),ie=(0,b.useCallback)(async()=>{D(),P(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,D,P]);return(0,b.useImperativeHandle)(t,()=>({start:be,stop:ie,flip:Le,setFacingMode:qe,get active(){return _.current},get facingMode(){return l.current},get stream(){return h.current},get element(){return U.current}}),[be,ie,Le,qe]),(0,b.useEffect)(()=>D,[D]),i?(0,ze.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":x,children:[(0,ze.jsx)("video",{ref:U,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?x==="user":u)?{transform:"scaleX(-1)"}:{}}}),g]}):null});var Xe=require("react");var Ur={level:0,speaking:!1};function it(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=(0,Xe.useState)(Ur);return(0,Xe.useEffect)(()=>{if(!e){a(Ur);return}let u=Ne();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,f;try{i=u.createMediaStreamSource(c),f=u.createAnalyser(),f.fftSize=t,i.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),k=setInterval(()=>{f.getByteTimeDomainData(d);let C=0;for(let g=0;g<d.length;g++){let S=(d[g]-128)/128;C+=S*S}let y=Math.sqrt(C/d.length);a(g=>{let S=y>o;return Math.abs(g.level-y)<.005&&g.speaking===S?g:{level:y,speaking:S}})},n);return()=>{clearInterval(k),i.disconnect(),a(Ur)}},[e,t,n,o]),s}var Ge=require("react");function ut(e,r){let[t,n]=(0,Ge.useState)(null);return(0,Ge.useEffect)(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}var dt=require("react");var Ze=require("react");var ct=require("zustand/vanilla"),lt=require("zustand"),Vt=()=>{};function Ke(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=(0,ct.createStore)(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):Vt,c=(i=>(0,lt.useStore)(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function he(e,r){let t=(0,Ze.useMemo)(()=>Ke(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return(0,Ze.useEffect)(()=>t.bind(),[t]),t}function pt(e,r,t){let o=he(e,r)(t??(u=>u)),s=(0,dt.useCallback)(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}var Qe=require("react");var re=200;function Y(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function ve(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ye(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function er(e,r,t={}){let n=t.cap??200,[o,s]=(0,Qe.useState)([]);return(0,Qe.useEffect)(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>Y(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}var z=require("react/jsx-runtime");function mt({session:e,name:r,cap:t,className:n}){let o=er(e,r,{cap:t});return(0,z.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,z.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,z.jsx)("code",{children:r}),(0,z.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,z.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,z.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,z.jsx)("code",{children:r})," messages\u2026"]}):o.map((s,a)=>(0,z.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,z.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ve(s.payload)]},`${s.at}-${a}`))})]})}var De=require("react");var H=require("react/jsx-runtime");function Oe({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=(0,De.useState)(""),[a,u]=(0,De.useState)(null),c=(0,De.useCallback)(()=>{let i=Ye(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return(0,H.jsxs)("div",{className:"urun-doc-patch",children:[(0,H.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),(0,H.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,H.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?(0,H.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function ft({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=he(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return(0,H.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,H.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,H.jsx)("code",{children:r}),(0,H.jsx)("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),(0,H.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?(0,H.jsx)(Oe,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}var rr=require("react");var Q=require("react/jsx-runtime");function gt(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function St({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=(0,rr.useState)([]);return(0,rr.useEffect)(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>Y(c,{at:Date.now(),direction:"in",text:gt(ve(u))},t))}):void 0),[e,r,t]),(0,Q.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,Q.jsx)(Oe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>Y(c,{at:Date.now(),direction:"out",text:gt(u)},t))}}),(0,Q.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,Q.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>(0,Q.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,Q.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,Q.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}var tr=require("react");var ae=require("react/jsx-runtime");function ht({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=(0,tr.useState)([]),u=r.join(","),c=t.join(",");return(0,tr.useEffect)(()=>{if(a([]),!e)return;let i=(d,m)=>a(k=>Y(k,{at:Date.now(),kind:d,text:m},n)),f=[];f.push(e.onPhase(d=>i("phase",`phase \u2192 ${d.name}`)));for(let d of r){let m=e.stream(d);f.push(m.on("track",k=>i("track",`${d}: ${k?"track arrived":"track ended"}`)))}for(let d of t){let m=e.doc(d);f.push(m.on("change",()=>i("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,u,c,n]),(0,ae.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ae.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((i,f)=>(0,ae.jsxs)("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[(0,ae.jsx)("span",{className:"urun-event-spine-kind",children:i.kind})," ",(0,ae.jsx)("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${f}`))})}var ar=require("@urun-sh/core");var nr=require("react");function J(e){let[r,t]=(0,nr.useState)(e?.phase??null);return(0,nr.useEffect)(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}var kt=require("@urun-sh/core");var ke=require("react"),vt=require("@urun-sh/core");function or(e){let r=J(e),t=(0,vt.isWakingPhase)(r?.name),n=(0,ke.useRef)(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=(0,ke.useState)(s);return(0,ke.useEffect)(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}var te=require("react/jsx-runtime");function sr({session:e,render:r,className:t}){let n=or(e);return!n.waking||!n.phase?null:(0,te.jsx)("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):(0,te.jsxs)(te.Fragment,{children:[(0,te.jsx)("span",{className:"urun-session-waking-label",children:(0,kt.describeSessionPhase)(n.phase)})," ",(0,te.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}var X=require("react/jsx-runtime"),$t={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function yt({session:e,className:r}){let t=J(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return(0,X.jsxs)("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[(0,X.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,X.jsx)("span",{className:"urun-session-status-label",children:$t[n]}),o?(0,X.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function bt({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=J(e);if(s?.name==="live")return(0,X.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):(0,X.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,ar.isWakingPhase)(s.name)?(0,X.jsx)(sr,{session:e}):s&&s.name!=="idle"?(0,ar.describeSessionPhase)(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,X.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?(0,X.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}var ir=require("react");var xt=require("react/jsx-runtime");function Tr(e){return J(e)?.endsAt??null}function Ht(e){let r=Math.max(0,Math.floor(e/1e3)),t=Math.floor(r/60),n=r%60;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}`}function Ct({session:e,urgentMs:r=6e4,className:t}){let o=Tr(e)?.getTime()??null,[s,a]=(0,ir.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,ir.useEffect)(()=>{if(o===null){a(null);return}let c=()=>a(Math.max(0,o-Date.now()));c();let i=setInterval(c,1e3);return()=>clearInterval(i)},[o]),s===null)return null;let u=Ht(s);return(0,xt.jsx)("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${u}`,"data-urgent":s<r?"":void 0,"data-expired":s<=0?"":void 0,children:u})}var Ie=require("react/jsx-runtime"),jt=new Set(["expired","ended","error"]);function Ut({session:e,onNewSession:r,children:t,className:n}){let o=J(e);if(!o||!jt.has(o.name))return null;let s=t?t(o):(0,Ie.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Ie.jsxs)("div",{className:["urun-session-ended",n].filter(Boolean).join(" "),"data-phase":o.name,children:[s,r?(0,Ie.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:r,children:"New session"}):null]})}var ye=require("react"),Tt=require("@urun-sh/core");function Pt(e){let r=(0,ye.useContext)(le),[t,n]=(0,ye.useState)(null),o=e.app??r?.appId,s=e.function,a=e.intervalS??60,u=r?.baseUrl,c=r?.orgId,i=r?.jwt,f=r?.getAccessToken,d=r?.authProvider;return(0,ye.useEffect)(()=>{if(!u||!c||!o||!s)return;let m=!1,k=()=>{(0,Tt.prewake)({baseUrl:u,app:o,functionName:s,orgId:c,jwt:i,getAccessToken:f,authProvider:d}).then(y=>{m||n(y)}).catch(()=>{})};k();let C=setInterval(k,Math.max(1,a)*1e3);return()=>{m=!0,clearInterval(C)}},[o,s,a,u,c,i,f,d]),t}var ur=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var gn=Object.defineProperty;var Fr=Object.getOwnPropertyDescriptor;var Br=Object.getOwnPropertyNames;var Vr=Object.prototype.hasOwnProperty;var Hr=(n,e)=>{for(var r in e)gn(n,r,{get:e[r],enumerable:!0})},$r=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Br(e))!Vr.call(n,o)&&o!==r&&gn(n,o,{get:()=>e[o],enumerable:!(t=Fr(e,o))||t.enumerable});return n};var jr=n=>$r(gn({},"__esModule",{value:!0}),n);var st={};Hr(st,{ComponentRenderer:()=>er,DEFAULT_CAMERA_CONSTRAINTS:()=>An,DEFAULT_LOG_CAP:()=>re,DEFAULT_VOICE_CONSTRAINTS:()=>wn,DocPatchForm:()=>Fe,ImageFrame:()=>ur,ImageFrameSchema:()=>ar,MetricsPanel:()=>lr,MetricsPanelSchema:()=>cr,ProgressCard:()=>rr,ProgressCardSchema:()=>nr,StatusBadge:()=>or,StatusBadgeSchema:()=>tr,TextStream:()=>ir,TextStreamSchema:()=>sr,UrunAudio:()=>Xe,UrunAuthProvider:()=>Sn,UrunCamera:()=>Sr,UrunControlSender:()=>Ur,UrunDocPanel:()=>Pr,UrunErrorBoundary:()=>pe,UrunEventSpine:()=>Rr,UrunIdleWarning:()=>Lr,UrunJwtProvider:()=>Wn,UrunProvider:()=>Bn,UrunSessionClock:()=>Mr,UrunSessionEnded:()=>Ir,UrunSessionGate:()=>_r,UrunSessionStatus:()=>Ar,UrunSessionWaking:()=>dn,UrunStreamTail:()=>Tr,UrunVoice:()=>fr,authMode:()=>_e,createDocStore:()=>nn,describeSessionPhase:()=>fn.describeSessionPhase,formatPayload:()=>Te,getUrunAudioContext:()=>Oe,isWakingPhase:()=>fn.isWakingPhase,parseJsonObject:()=>tn,pushCapped:()=>Q,registerComponent:()=>Yn,resumeUrunAudioContext:()=>qe,urunPublicEnv:()=>Z,useApp:()=>Hn,useChat:()=>Xn,useCompletion:()=>Kn,useDocStore:()=>Ce,useImageFrame:()=>xn,useInputPresence:()=>Gn,useMetricsPanel:()=>Un,useProgressCard:()=>Cn,useRequest:()=>$n,useSessionDoc:()=>Cr,useSessionEndsAt:()=>Mn,useSessionIdle:()=>In,useSessionPhase:()=>z,useSessionTrack:()=>vr,useSessionWake:()=>ln,useStatusBadge:()=>Tn,useStreamMessages:()=>sn,useTextStream:()=>Pn,useUrunAudioLevel:()=>hr,useUrunAuth:()=>$e,useUrunPrewake:()=>Or,usesWorkOSAuth:()=>On});module.exports=jr(st);var ge=require("react");var Ln=require("react"),Ae=require("react/jsx-runtime"),pe=class extends Ln.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,Ae.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,Ae.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Ae.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Dn=require("react"),me=(0,Dn.createContext)(null);function se(n){return n&&n.trim()?n.trim():void 0}function Z(n){switch(n){case"NEXT_PUBLIC_AUTH_MODE":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return se(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return se(typeof process<"u"?process.env?.[n]:void 0)}}function _e(){let n=Z("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return n==="jwt"||n==="customer-jwt"||n==="test-jwt"?"jwt":n==="workos"||Z("VERCEL_ENV")==="production"?"workos":Z("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function On(){return _e()==="workos"}var fe=require("react"),Fn=require("react/jsx-runtime"),qn=(0,fe.createContext)(null);function Sn({getAccessToken:n,children:e}){let r=(0,fe.useMemo)(()=>({getAccessToken:n}),[n]);return(0,Fn.jsx)(qn.Provider,{value:r,children:e})}var Wn=Sn;function $e(){return(0,fe.useContext)(qn)}var je=require("react/jsx-runtime");function Bn({baseUrl:n,orgId:e,appId:r,jwt:t,authProvider:o,fallback:s,children:i}){let[a,l]=(0,ge.useState)(),u=$e(),p=Z("NEXT_PUBLIC_SESSION_TOKEN")??Z("NEXT_PUBLIC_URUN_JWT"),c=_e(),m=c==="workos"&&!t,S=t??(c==="jwt"?p:void 0)??a,k=o??Z("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!S,h=(0,ge.useMemo)(()=>({appId:r,baseUrl:n,orgId:e,jwt:S,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[r,u,n,k,S,e,m]);return(0,ge.useEffect)(()=>{if(!m||!u)return;let v=!1,x=u;async function y(){try{let g=await x.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}y();let R=window.setInterval(()=>{y()},6e4);return()=>{v=!0,window.clearInterval(R)}},[u,m]),(0,je.jsx)(pe,{fallback:s,children:C?(0,je.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,je.jsx)(me.Provider,{value:h,children:i})})}var J=require("react"),Vn=require("@urun-sh/core");function Kr(n,e){return`${n}:${JSON.stringify(e??{})}`}function Jr(n,e,r){return JSON.stringify({appId:n.appId,baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,authProvider:n.authProvider,fnName:e,args:r??{}})}var Se=new Map;var hn=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,t=>r(t))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),t=this._notify;return{append(o){r.append(o),t()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),t()})}}dispose(){this._unsubscribeChange()}},vn=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},yn=class{constructor(e,r){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new hn(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new vn(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}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._notifyAll(),this._notifiers.clear()}};function Hn(){let n=(0,J.useContext)(me);if(!n)throw new Error("useApp must be used within <UrunProvider>");if(!n.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,J.useReducer)(s=>s+1,0),r=(0,J.useRef)(new Map),t=(0,J.useRef)(new Map),o=(0,J.useMemo)(()=>(0,Vn.App)(n.appId,{baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,getAccessToken:n.getAccessToken,authProvider:n.authProvider}),[n.appId,n.baseUrl,n.orgId,n.jwt,n.getAccessToken,n.authProvider]);return(0,J.useEffect)(()=>()=>{for(let[s,i]of t.current){let a=Se.get(s);a===i&&(a.handle.removeNotifier(e),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=Se.get(s);!l||l.refCount!==0||(Se.delete(s),l.handle.disconnect())},0)))}t.current.clear(),r.current.clear()},[]),(0,J.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=Kr(i,a),u=r.current.get(l);if(u&&!u.disposed)return u;let p=Jr(n,i,a),c=Se.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),Se.delete(p),t.current.get(p)===c&&t.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new yn(o[i](a),e),refCount:0,disposeTimer:null},Se.set(p,c)),t.current.get(p)!==c&&(t.current.set(p,c),c.handle.addNotifier(e),c.refCount+=1),r.current.set(l,c.handle),c.handle}}}),[n,o])}var F=require("react");function he(n){let e=n;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(n){return n instanceof Error?n:new Error(String(n))}function $n(n,e){let r=(0,F.useMemo)(()=>he(n),[n]),[t,o]=(0,F.useState)(void 0),[s,i]=(0,F.useState)(null),[a,l]=(0,F.useState)(!1),u=(0,F.useRef)(e);u.current=e;let p=(0,F.useRef)(0),c=(0,F.useRef)(null),m=(0,F.useRef)(!0);(0,F.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let S=(0,F.useCallback)(async h=>{c.current?.abort();let v=new AbortController;c.current=v;let x=++p.current,y=()=>m.current&&p.current===x;y()&&(l(!0),i(null));try{let R=await r.request(h,{...u.current,signal:v.signal});return y()&&(o(R),l(!1),u.current?.onSuccess?.(R)),R}catch(R){let g=zr(R);throw y()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[r]),k=(0,F.useCallback)(h=>{S(h).catch(()=>{})},[S]),C=(0,F.useCallback)(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:k,mutateAsync:S,data:t,error:s,isPending:a,reset:C}}var H=require("react");function jn(n){return n instanceof Error?n:new Error(String(n))}var Xr=n=>typeof n=="string"?n:String(n);function Kn(n,e){let r=(0,H.useMemo)(()=>he(n),[n]),[t,o]=(0,H.useState)(""),[s,i]=(0,H.useState)(!1),[a,l]=(0,H.useState)(null),u=(0,H.useRef)(e);u.current=e;let p=(0,H.useRef)(0),c=(0,H.useRef)(null),m=(0,H.useRef)(!0);(0,H.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let S=(0,H.useCallback)(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),k=(0,H.useCallback)(async C=>{c.current?.cancel();let h=++p.current,v=()=>m.current&&p.current===h,x=u.current,y=x?.parseChunk??Xr,R=x?.buildPayload??(b=>({prompt:b}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:N,onFinish:M,onError:d,...P}=x??{},w="",A;try{A=r.requestStream(R(C),P),c.current=A}catch(b){let B=jn(b);v()&&(l(B),i(!1),x?.onError?.(B));return}try{for await(let b of A){if(p.current!==h)break;w+=y(b),v()&&o(w)}v()&&(i(!1),x?.onFinish?.(w))}catch(b){let B=jn(b);v()&&(l(B),i(!1),x?.onError?.(B))}finally{c.current===A&&(c.current=null)}},[r]);return{completion:t,complete:k,stop:S,isStreaming:s,error:a}}var q=require("react");function Jn(n){return n instanceof Error?n:new Error(String(n))}var Gr=n=>typeof n=="string"?n:String(n),zn=0;function kn(n){return zn+=1,`${n}-${zn}`}function Xn(n,e){let r=(0,q.useMemo)(()=>he(n),[n]),[t,o]=(0,q.useState)(()=>(e?.initialMessages??[]).map(y=>({id:y.id??kn("msg"),role:y.role,content:y.content}))),[s,i]=(0,q.useState)(""),[a,l]=(0,q.useState)(!1),[u,p]=(0,q.useState)(null),c=(0,q.useRef)(e);c.current=e;let m=(0,q.useRef)(t);m.current=t;let S=(0,q.useRef)(s);S.current=s;let k=(0,q.useRef)(0),C=(0,q.useRef)(null),h=(0,q.useRef)(!0);(0,q.useEffect)(()=>(h.current=!0,()=>{h.current=!1,C.current?.cancel(),C.current=null}),[]);let v=(0,q.useCallback)(()=>{k.current++,C.current?.cancel(),C.current=null,h.current&&l(!1)},[]),x=(0,q.useCallback)(async y=>{let R=y===void 0,g=(R?S.current:y)??"";if(!g.trim())return;C.current?.cancel();let M=++k.current,d=()=>h.current&&k.current===M,P=c.current,w=P?.parseChunk??Gr,A={id:kn("msg"),role:"user",content:g},b={id:kn("msg"),role:"assistant",content:""},B=[...m.current,A].map(T=>({role:T.role,content:T.content})),f=[...m.current,A,b];m.current=f,o(f),R&&i(""),p(null),l(!0);let E=P?.buildPayload??(T=>({messages:T})),{initialMessages:W,parseChunk:L,buildPayload:V,onFinish:K,onError:Ue,...Ve}=P??{},He=T=>{o(D=>D.map($=>$.id===b.id?{...$,content:T}:$))},le="",Re;try{Re=r.requestStream(E(B),Ve),C.current=Re}catch(T){let D=Jn(T);d()&&(p(D),l(!1),P?.onError?.(D));return}try{for await(let T of Re){if(k.current!==M)break;le+=w(T),d()&&He(le)}d()&&(l(!1),P?.onFinish?.({...b,content:le}))}catch(T){let D=Jn(T);d()&&(p(D),l(!1),P?.onError?.(D))}finally{C.current===Re&&(C.current=null)}},[r]);return{messages:t,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}var O=require("react"),ve=require("@urun-sh/core"),bn=[];function Gn(n,e={}){let{field:r=ve.INPUT_PRESENCE_FIELD,hz:t=ve.INPUT_PRESENCE_DEFAULT_HZ}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=n?.presence??null,i=(0,O.useMemo)(()=>s?(0,ve.createInputPresencePublisher)({awareness:{setLocalStateField:(g,N)=>s.setField(g,N)},field:r,hz:t}):null,[s,r,t]),a=(0,O.useRef)(null);a.current=i;let[l,u]=(0,O.useState)(!1),[p,c]=(0,O.useState)(bn),m=(0,O.useRef)(!1);(0,O.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let S=(0,O.useCallback)(()=>{let g=a.current;c(g?g.heldKeys():bn)},[]),k=(0,O.useCallback)(()=>{a.current?.clear(),c(bn)},[]);(0,O.useEffect)(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,N=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},M=b=>{g()&&(a.current?.keyDown(b.key),S())},d=b=>{a.current?.keyUp(b.key),S()},P=b=>{g()&&a.current?.movePointer(b.movementX,b.movementY)},w=b=>{g()&&a.current?.setButtons(b.buttons)},A=()=>{k()};return o.addEventListener("pointerlockchange",N),o.addEventListener("keydown",M),o.addEventListener("keyup",d),o.addEventListener("mousemove",P),o.addEventListener("mousedown",w),o.addEventListener("mouseup",w),o.defaultView?.addEventListener("blur",A),()=>{o.removeEventListener("pointerlockchange",N),o.removeEventListener("keydown",M),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",P),o.removeEventListener("mousedown",w),o.removeEventListener("mouseup",w),o.defaultView?.removeEventListener("blur",A)}},[o,k,S]);let C=(0,O.useCallback)(g=>{g.requestPointerLock?.()},[]),h=(0,O.useCallback)(()=>{m.current=!0,u(!0)},[]),v=(0,O.useCallback)(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),x=(0,O.useCallback)(g=>{a.current?.keyDown(g),S()},[S]),y=(0,O.useCallback)(g=>{a.current?.keyUp(g),S()},[S]),R=(0,O.useCallback)((g,N)=>{a.current?.movePointer(g,N)},[]);return{engage:C,engageTouch:h,release:v,engaged:l,heldKeys:p,pressKey:x,releaseKey:y,movePointer:R}}var Zn=new Map;function Yn(n,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${n}"): schema must be a valid Zod schema`);Zn.set(n,{component:e,schema:r})}function Qn(n,e){let r=Zn.get(n);if(!r)return{error:`Unknown component: "${n}"`};let t=r.schema.safeParse(e);return t.success?{Component:r.component,validatedProps:t.data}:{error:`Validation failed for "${n}": ${t.error.message}`}}var ie=require("react/jsx-runtime");function er({name:n,props:e,fallback:r}){let t=Qn(n,e);if(t.error)return console.warn(`[urun] ComponentRenderer: ${t.error}`),r?(0,ie.jsx)(ie.Fragment,{children:r}):(0,ie.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,ie.jsx)("span",{className:"urun-component-error-text",children:t.error})});let o=t.Component;return(0,ie.jsx)(o,{...t.validatedProps})}var ye=require("zod"),ae=require("react/jsx-runtime"),nr=ye.z.object({step:ye.z.number().min(0),total:ye.z.number().min(1),label:ye.z.string().optional(),variant:ye.z.enum(["default","success","error"]).default("default")});function Cn(n){let{step:e,total:r,label:t,variant:o="default"}=n,s=Math.min(e/r*100,100),i=e>=r;return{step:e,total:r,label:t,variant:o,percentage:s,isComplete:i}}function rr(n){let{step:e,total:r,label:t,variant:o,percentage:s}=Cn(n);return(0,ae.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[t&&(0,ae.jsx)("div",{className:"urun-progress-label",children:t}),(0,ae.jsx)("div",{className:"urun-progress-bar",children:(0,ae.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ae.jsxs)("div",{className:"urun-progress-text",children:[e,"/",r]})]})}var Ke=require("zod"),Me=require("react/jsx-runtime"),tr=Ke.z.object({state:Ke.z.enum(["thinking","generating","idle","error"]),message:Ke.z.string().optional()}),Zr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Tn(n){let{state:e,message:r}=n,t=e==="thinking"||e==="generating",o=r??Zr[e]??e;return{state:e,message:o,isActive:t}}function or(n){let{state:e,message:r,isActive:t}=Tn(n);return(0,Me.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,Me.jsx)("span",{className:`urun-status-indicator${t?" urun-status-pulse":""}`}),(0,Me.jsx)("span",{className:"urun-status-message",children:r})]})}var Ne=require("react"),Je=require("zod"),Ie=require("react/jsx-runtime"),sr=Je.z.object({text:Je.z.string(),streaming:Je.z.boolean().default(!1)});function Pn(n){let{text:e,streaming:r=!1}=n,t=e.length===0;return{text:e,streaming:r,isEmpty:t}}function ir(n){let{text:e,streaming:r}=Pn(n),t=(0,Ne.useRef)(null),o=(0,Ne.useRef)(0);return(0,Ne.useEffect)(()=>{let s=t.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),(0,Ie.jsxs)("div",{className:"urun-text-stream",children:[(0,Ie.jsx)("span",{ref:t,className:"urun-text-content"}),r&&(0,Ie.jsx)("span",{className:"urun-text-cursor"})]})}var Le=require("zod"),De=require("react/jsx-runtime"),ar=Le.z.object({src:Le.z.string().url(),alt:Le.z.string().optional(),caption:Le.z.string().optional()});function xn(n){let{src:e,alt:r,caption:t}=n;return{src:e,alt:r??"",caption:t}}function ur(n){let{src:e,alt:r,caption:t}=xn(n);return(0,De.jsxs)("figure",{className:"urun-image-frame",children:[(0,De.jsx)("img",{className:"urun-image",src:e,alt:r}),t&&(0,De.jsx)("figcaption",{className:"urun-image-caption",children:t})]})}var Y=require("zod"),ke=require("react/jsx-runtime"),cr=Y.z.object({metrics:Y.z.array(Y.z.object({label:Y.z.string(),value:Y.z.union([Y.z.string(),Y.z.number()]),unit:Y.z.string().optional()}))});function Un(n){return{metrics:n.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function lr(n){let{metrics:e}=Un(n);return(0,ke.jsx)("div",{className:"urun-metrics-panel",children:e.map((r,t)=>(0,ke.jsxs)("div",{className:"urun-metric-card",children:[(0,ke.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ke.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},t))})}var I=require("react"),pr=require("@urun-sh/core");var ze=null;function Yr(){if(typeof window>"u")return null;let n=window;return n.AudioContext??n.webkitAudioContext??null}function Oe(){if(ze)return ze;let n=Yr();return n?(ze=new n,ze):null}function qe(){let n=Oe();n&&n.state==="suspended"&&n.resume().catch(()=>{})}var mr=require("react/jsx-runtime"),Qr=1e3,dr=200;function Rn(...n){console.debug("[urun-audio]",...n)}var Xe=(0,I.forwardRef)(function(e,r){let{session:t,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=e,c=(0,I.useRef)(null),m=(0,I.useRef)(null),S=(0,I.useRef)(null),k=(0,I.useRef)(null),C=(0,I.useRef)(l);C.current=l;let h=(0,I.useRef)(u);h.current=u;let v=(0,I.useCallback)(d=>{S.current!==d&&(S.current=d,h.current?.(d))},[]),x=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),y=(0,I.useCallback)(d=>{let P=c.current;if(!P)return;let w=P.play();!w||typeof w.then!="function"||w.then(()=>{P.muted||v(!0)}).catch(A=>{let b=A instanceof Error?A.name:String(A);if(b==="AbortError"){Rn(`play() aborted (${d}); retrying in ${dr}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,y(`${d}:retry`)},dr);return}if(b==="NotAllowedError"){Rn(`play() blocked pending a user gesture (${d})`),v(!1);return}Rn(`play() failed (${d})`,A)})},[v]),R=(0,I.useCallback)(d=>{let P=x();if(P){for(let w of P.getAudioTracks())w!==d&&P.removeTrack(w);d&&!P.getAudioTracks().includes(d)&&P.addTrack(d),d&&y("track-attach"),C.current?.(d)}},[x,y]),g=(0,I.useCallback)(()=>{let d=c.current;d&&(x(),d.muted=!1,y("gesture"),qe(),v(!0))},[x,y,v]);(0,I.useImperativeHandle)(r,()=>({unlock:g,get unlocked(){return S.current===!0},get element(){return c.current}}),[g]);let N=(0,I.useCallback)(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),M=s!==void 0;return(0,I.useEffect)(()=>{if(M){R(s??null);return}if(!t)return;let d=t.stream(o),P=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},w=f=>{if(f!==P()&&(R(f),f)){let E=()=>{P()===f&&R(null)};f.addEventListener("ended",E)}},A=d.track;A&&A.readyState==="live"&&w(A);let b=d.on("track",f=>{f&&f.readyState!=="live"||w(f)}),B=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&w(f)},Qr);return()=>{b(),clearInterval(B)}},[t,o,M,s,R]),(0,I.useEffect)(()=>(0,pr.observePageLifecycle)(()=>{qe(),S.current===!0&&y("foreground")}),[y]),(0,I.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,mr.jsx)("audio",{ref:N,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var _=require("react"),be=require("@urun-sh/core");var gr=require("react/jsx-runtime"),wn={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ge(...n){console.debug("[urun-voice]",...n)}var fr=(0,_.forwardRef)(function(e,r){let{session:t,stream:o="audio",constraints:s=wn,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:S,capture:k}=e,C=(0,_.useRef)(null),h=(0,_.useRef)(null),v=(0,_.useRef)(null),x=(0,_.useRef)([]),y=(0,_.useRef)(!1),R=(0,_.useRef)(u);R.current=u;let g=(0,_.useRef)(p);g.current=p;let N=(0,_.useRef)(c);N.current=c;let M=(0,_.useCallback)(f=>{y.current!==f&&(y.current=f,R.current?.(f))},[]),d=(0,_.useCallback)(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,h.current&&(h.current=null,N.current?.(null))},[]),P=(0,_.useCallback)(async()=>{let f=v.current;if(f){let V=await f.update(s);return h.current=f.stream,N.current?.(f.stream),V}let W=await(k??(0,be.sharedCaptureController)()).claim("audio",s);v.current=W,x.current=[W.onTrack((V,K)=>{h.current=K,N.current?.(K),y.current&&t.stream(o).attach(V).catch(Ue=>Ge("mic re-attach after one-capture re-acquire failed",Ue))}),W.onLost(V=>{v.current=null,x.current=[],h.current=null,N.current?.(null),M(!1),g.current?.(V)})],h.current=W.stream,N.current?.(W.stream);let L=W.track;if(!L)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return L},[k,s,t,o,M]),w=(0,_.useCallback)(async()=>{d(),M(!1),await t.stream(o).detach().catch(()=>{})},[t,o,d,M]),A=(0,_.useCallback)(async()=>{C.current?.unlock();let f;try{f=await P()}catch(L){d();let V=(0,be.sessionFailureFromMediaError)(L,t.status);throw g.current?.(V),V}t.connect?.();let E;for(let L=1;L<=a;L++)try{await t.whenLive(i!==void 0?{timeout:i}:void 0),await t.stream(o).attach(f),M(!0);return}catch(V){E=V,Ge(`start attempt ${L}/${a} failed`,V),L<a&&await new Promise(K=>setTimeout(K,l))}d(),M(!1);let W=E instanceof Error?E:new Error(String(E??"voice start failed"));throw g.current?.(W),W},[t,o,i,a,l,P,d,M]);(0,_.useImperativeHandle)(r,()=>({start:A,stop:w,unlock:()=>C.current?.unlock(),get active(){return y.current},get micStream(){return h.current},get audio(){return C.current}}),[A,w]);let b=(0,_.useRef)(!1),B=(0,_.useCallback)(async()=>{if(!y.current||b.current)return;let f=h.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await t.stream(o).attach(f)}catch(E){Ge("foreground mic re-assert failed (will retry on next pass)",E)}return}b.current=!0;try{let E=await P();await t.stream(o).attach(E)}catch(E){let W=E instanceof Error?E:new Error(String(E));Ge("foreground mic re-acquire failed",W),g.current?.(W)}finally{b.current=!1}},[t,o,P]);return(0,_.useEffect)(()=>{let f=()=>{B()};return typeof t.onRecovery=="function"?t.onRecovery(f):(0,be.observePageLifecycle)(f)},[t,B]),(0,_.useEffect)(()=>d,[d]),(0,gr.jsx)(Xe,{ref:C,session:t,stream:o,onTrack:m,onUnlockChange:S})});var Ze=require("@urun-sh/core"),U=require("react"),Ye=require("react/jsx-runtime"),An={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function En(...n){console.debug("[urun-camera]",...n)}var Sr=(0,U.forwardRef)(function(e,r){let{session:t,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:S,onStream:k,onTrack:C,children:h,capture:v}=e,x=(0,U.useRef)(null),y=(0,U.useRef)(null),R=(0,U.useRef)(null),g=(0,U.useRef)([]),N=(0,U.useRef)(null),M=(0,U.useRef)(!1),d=(0,U.useRef)(i),[P,w]=(0,U.useState)(i),A=(0,U.useRef)(m);A.current=m;let b=(0,U.useRef)(S);b.current=S;let B=(0,U.useRef)(k);B.current=k;let f=(0,U.useRef)(C);f.current=C;let E=(0,U.useCallback)(T=>{M.current!==T&&(M.current=T,A.current?.(T))},[]),W=(0,U.useCallback)(T=>{let D=x.current;D&&(D.muted=!0,D.srcObject=T,T&&D.play()?.catch?.($=>En("preview play() failed",$)))},[]),L=(0,U.useCallback)(()=>{N.current?.(),N.current=null;for(let T of g.current)T();g.current=[],R.current?.release(),R.current=null,y.current&&(y.current=null,B.current?.(null),f.current?.(null)),W(null)},[W]),V=(0,U.useCallback)((T,D)=>{N.current?.(),y.current=D,W(D),B.current?.(D);let $=()=>{y.current===D&&(En("camera track ended (device removed or permission revoked)"),L(),E(!1))};T.addEventListener("ended",$),N.current=()=>T.removeEventListener("ended",$)},[W,L,E]),K=(0,U.useCallback)(async T=>{let D={...An,...s,facingMode:T},$;try{let ne=R.current;if(ne)$=await ne.update(D);else{let we=await(v??(0,Ze.sharedCaptureController)()).claim("video",D);if(R.current=we,g.current=[we.onTrack((Ee,qr)=>{V(Ee,qr),M.current&&t.stream(o).attachVideo(Ee).then(()=>f.current?.(Ee)).catch(Wr=>En("camera re-publish after one-capture re-acquire failed",Wr))}),we.onLost(Ee=>{R.current=null,g.current=[],L(),E(!1),b.current?.(Ee)})],!we.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=we.track}}catch(ne){let de=(0,Ze.sessionFailureFromMediaError)(ne,t.status);throw b.current?.(de),de}d.current=T,w(T),V($,R.current?.stream??new MediaStream([$]));try{t.connect?.(),await t.whenLive(l!==void 0?{timeout:l}:void 0),await t.stream(o).attachVideo($)}catch(ne){L(),E(!1);let de=ne instanceof Error?ne:new Error(String(ne));throw b.current?.(de),de}f.current?.($),E(!0)},[t,o,s,l,v,V,L,E]),Ue=(0,U.useCallback)(T=>K(T?.facingMode??d.current),[K]),Ve=(0,U.useCallback)(async T=>{M.current&&d.current===T||await K(T)},[K]),He=(0,U.useCallback)(()=>K(d.current==="environment"?"user":"environment"),[K]),le=(0,U.useCallback)(async()=>{L(),E(!1),await t.stream(o).detachVideo().catch(()=>{})},[t,o,L,E]);return(0,U.useImperativeHandle)(r,()=>({start:Ue,stop:le,flip:He,setFacingMode:Ve,get active(){return M.current},get facingMode(){return d.current},get stream(){return y.current},get element(){return x.current}}),[Ue,le,He,Ve]),(0,U.useEffect)(()=>L,[L]),u?(0,Ye.jsxs)("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[(0,Ye.jsx)("video",{ref:x,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(a==="auto"?P==="user":a)?{transform:"scaleX(-1)"}:{}}}),h]}):null});var Qe=require("react");var _n={level:0,speaking:!1};function hr(n,e={}){let{fftSize:r=512,intervalMs:t=100,speakingThreshold:o=.02}=e,[s,i]=(0,Qe.useState)(_n);return(0,Qe.useEffect)(()=>{if(!n){i(_n);return}let a=Oe();if(!a||typeof MediaStream>"u")return;let l;n instanceof MediaStream?l=n:(l=new MediaStream,l.addTrack(n));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=r,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),S=setInterval(()=>{p.getByteTimeDomainData(c);let k=0;for(let h=0;h<c.length;h++){let v=(c[h]-128)/128;k+=v*v}let C=Math.sqrt(k/c.length);i(h=>{let v=C>o;return Math.abs(h.level-C)<.005&&h.speaking===v?h:{level:C,speaking:v}})},t);return()=>{clearInterval(S),u.disconnect(),i(_n)}},[n,r,t,o]),s}var en=require("react");function vr(n,e){let[r,t]=(0,en.useState)(null);return(0,en.useEffect)(()=>{if(!n||!e){t(null);return}let o=n.stream(e);return t(o.track),o.on("track",t)},[n,e]),r}var br=require("react");var rn=require("react");var yr=require("zustand/vanilla"),kr=require("zustand"),et=()=>{};function nn(n,e={}){let r=u=>{n?.set(u)},t=()=>n?n.get()??{}:{},o=(0,yr.createStore)(()=>({doc:t(),synced:n?n.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>n?(s||(o.setState({doc:t(),synced:n.synced}),s=[n.on("change",u=>o.setState({doc:u})),n.onSynced(()=>o.setState({synced:!0}))]),i):et,l=(u=>(0,kr.useStore)(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:a,unbind:i}),e.bind!==!1&&a(),l}function Ce(n,e){let r=(0,rn.useMemo)(()=>nn(n&&e?n.doc(e):null,{bind:!1}),[n,e]);return(0,rn.useEffect)(()=>r.bind(),[r]),r}function Cr(n,e,r){let o=Ce(n,e)(r??(a=>a)),s=(0,br.useCallback)(a=>{n&&e&&n.doc(e).set(a)},[n,e]);if(r)return o;let i=o;return{snapshot:n&&e?i.doc:null,synced:i.synced,set:s}}var on=require("react");var re=200;function Q(n,e,r=200){let t=[...n,e];return t.length>r?t.slice(t.length-r):t}function Te(n){if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return String(n)}}function tn(n){let e=n.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(t){return{ok:!1,error:t instanceof Error?t.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 sn(n,e,r={}){let t=r.cap??200,[o,s]=(0,on.useState)([]);return(0,on.useEffect)(()=>{if(s([]),!n||!e)return;let i=!0,a=n.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>Q(u,{at:Date.now(),payload:l.value},t))}})(),()=>{i=!1,a.return?.()}},[n,e,t]),o}var X=require("react/jsx-runtime");function Tr({session:n,name:e,cap:r,className:t}){let o=sn(n,e,{cap:r});return(0,X.jsxs)("div",{className:["urun-stream-tail",t].filter(Boolean).join(" "),children:[(0,X.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,X.jsx)("code",{children:e}),(0,X.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,X.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,X.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,X.jsx)("code",{children:e})," messages\u2026"]}):o.map((s,i)=>(0,X.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,X.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Te(s.payload)]},`${s.at}-${i}`))})]})}var We=require("react");var j=require("react/jsx-runtime");function Fe({placeholder:n,buttonLabel:e,disabled:r,onApply:t}){let[o,s]=(0,We.useState)(""),[i,a]=(0,We.useState)(null),l=(0,We.useCallback)(()=>{let u=tn(o);if(!u.ok){a(u.error);return}a(null),t(u.value,o.trim()),s("")},[o,t]);return(0,j.jsxs)("div",{className:"urun-doc-patch",children:[(0,j.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:n,rows:3}),(0,j.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,j.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:l,children:e}),i?(0,j.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Pr({session:n,docKey:e,editable:r=!0,patchPlaceholder:t='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=Ce(n,e),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return(0,j.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,j.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,j.jsx)("code",{children:e}),(0,j.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,j.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,j.jsx)(Fe,{placeholder:t,buttonLabel:"Apply patch",disabled:!n,onApply:u=>l(u)}):null]})}var an=require("react");var ee=require("react/jsx-runtime");function xr(n,e=600){return n.length>e?`${n.slice(0,e)}\u2026`:n}function Ur({session:n,docKey:e="control",cap:r=200,className:t}){let[o,s]=(0,an.useState)([]);return(0,an.useEffect)(()=>(s([]),n?n.doc(e).on("change",a=>{s(l=>Q(l,{at:Date.now(),direction:"in",text:xr(Te(a))},r))}):void 0),[n,e,r]),(0,ee.jsxs)("div",{className:["urun-control-sender",t].filter(Boolean).join(" "),children:[(0,ee.jsx)(Fe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!n,onApply:(i,a)=>{n?.doc(e).set(i),s(l=>Q(l,{at:Date.now(),direction:"out",text:xr(a)},r))}}),(0,ee.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,ee.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>(0,ee.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,ee.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,ee.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var un=require("react");var ue=require("react/jsx-runtime");function Rr({session:n,trackNames:e=["video","audio"],docKeys:r=["control"],cap:t=200,className:o}){let[s,i]=(0,un.useState)([]),a=e.join(","),l=r.join(",");return(0,un.useEffect)(()=>{if(i([]),!n)return;let u=(c,m)=>i(S=>Q(S,{at:Date.now(),kind:c,text:m},t)),p=[];p.push(n.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of e){let m=n.stream(c);p.push(m.on("track",S=>u("track",`${c}: ${S?"track arrived":"track ended"}`)))}for(let c of r){let m=n.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[n,a,l,t]),(0,ue.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ue.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>(0,ue.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,ue.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,ue.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}var pn=require("@urun-sh/core");var cn=require("react");function z(n){let[e,r]=(0,cn.useState)(n?.phase??null);return(0,cn.useEffect)(()=>{if(!n){r(null);return}return n.onPhase(r)},[n]),e}var Er=require("@urun-sh/core");var Pe=require("react"),wr=require("@urun-sh/core");function ln(n){let e=z(n),r=(0,wr.isWakingPhase)(e?.name),t=(0,Pe.useRef)(void 0);r?t.current??=Date.now():t.current=void 0;let o=r?e?.wakingSince??t.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=(0,Pe.useState)(s);return(0,Pe.useEffect)(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:o,seconds:r?i:0}}var te=require("react/jsx-runtime");function dn({session:n,render:e,className:r}){let t=ln(n);return!t.waking||!t.phase?null:(0,te.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":t.phase.name,"data-runtime-state":t.state,children:e?e(t):(0,te.jsxs)(te.Fragment,{children:[(0,te.jsx)("span",{className:"urun-session-waking-label",children:(0,Er.describeSessionPhase)(t.phase)})," ",(0,te.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",t.seconds,"s)"]})]})})}var G=require("react/jsx-runtime"),nt={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ar({session:n,className:e}){let r=z(n),t=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,G.jsxs)("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":t,children:[(0,G.jsx)("span",{className:"urun-session-status-dot","data-phase":t}),(0,G.jsx)("span",{className:"urun-session-status-label",children:nt[t]}),o?(0,G.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function _r({session:n,children:e,fallback:r,onStartOver:t,className:o}){let s=z(n);if(s?.name==="live")return(0,G.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:e});let i=r?r(s):(0,G.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,pn.isWakingPhase)(s.name)?(0,G.jsx)(dn,{session:n}):s&&s.name!=="idle"?(0,pn.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=t!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,G.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?(0,G.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:t,children:"Start over"}):null]})}var mn=require("react");var Nr=require("react/jsx-runtime");function Mn(n){return z(n)?.endsAt??null}function rt(n){let e=Math.max(0,Math.floor(n/1e3)),r=Math.floor(e/60),t=e%60;return`${String(r).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function Mr({session:n,urgentMs:e=6e4,className:r}){let o=Mn(n)?.getTime()??null,[s,i]=(0,mn.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,mn.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=rt(s);return(0,Nr.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Be=require("react/jsx-runtime"),tt=new Set(["expired","ended","error"]);function Ir({session:n,onNewSession:e,children:r,className:t}){let o=z(n);if(!o||!tt.has(o.name))return null;let s=r?r(o):(0,Be.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Be.jsxs)("div",{className:["urun-session-ended",t].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?(0,Be.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}var oe=require("react"),ce=require("react/jsx-runtime");function Nn(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function In(n){let e=(0,oe.useMemo)(()=>n?n.doc("control"):null,[n]),[r,t]=(0,oe.useState)(()=>e?Nn(e.get("idle")):null);return(0,oe.useEffect)(()=>{if(!e){t(null);return}return t(Nn(e.get("idle"))),e.on("change",()=>t(Nn(e.get("idle"))))},[e]),r}function ot(n){let e=Math.max(0,Math.floor(n));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function Lr({session:n,onStillHere:e,className:r}){let t=In(n),o=t?.deadlineEpochS??null,[s,i]=(0,oe.useState)(null);if((0,oe.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!t||!n)return null;let a=()=>{n.touch?.(),e?.()};return(0,ce.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,ce.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,ce.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,ce.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ot(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,ce.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var xe=require("react"),Dr=require("@urun-sh/core");function Or(n){let e=(0,xe.useContext)(me),[r,t]=(0,xe.useState)(null),o=n.app??e?.appId,s=n.function,i=n.intervalS??60,a=e?.baseUrl,l=e?.orgId,u=e?.jwt,p=e?.getAccessToken,c=e?.authProvider;return(0,xe.useEffect)(()=>{if(!a||!l||!o||!s)return;let m=!1,S=()=>{(0,Dr.prewake)({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(C=>{m||t(C)}).catch(()=>{})};S();let k=setInterval(S,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,l,u,p,c]),r}var fn=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,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as Nr,b as Dr,c as Me}from"./chunk-WF2OBDSX.mjs";import{useEffect as Wr,useMemo as Fr,useState as Br}from"react";import{Component as Or}from"react";import{jsx as er,jsxs as Ir}from"react/jsx-runtime";var ce=class extends Or{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||Ir("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[er("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),er("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as qr}from"react";var Q=qr(null);function z(e){return e&&e.trim()?e.trim():void 0}function H(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return z(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return z(typeof process<"u"?process.env?.[e]:void 0)}}function he(){let e=H("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||H("VERCEL_ENV")==="production"?"workos":H("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Lr(){return he()==="workos"}import{jsx as _e}from"react/jsx-runtime";function Vr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=Br(),i=Me(),f=H("NEXT_PUBLIC_SESSION_TOKEN")??H("NEXT_PUBLIC_URUN_JWT"),d=he(),m=d==="workos"&&!n,k=n??(d==="jwt"?f:void 0)??u,b=o??H("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),y=m&&!k,g=Fr(()=>({appId:t,baseUrl:e,orgId:r,jwt:k,getAccessToken:m?i?.getAccessToken:void 0,authProvider:b}),[t,i,e,b,k,r,m]);return Wr(()=>{if(!m||!i)return;let S=!1,T=i;async function h(){try{let U=await T.getAccessToken();S||c(U??void 0)}catch{S||c(void 0)}}h();let x=window.setInterval(()=>{h()},6e4);return()=>{S=!0,window.clearInterval(x)}},[i,m]),_e(ce,{fallback:s,children:y?_e("div",{role:"status","aria-live":"polite",children:"Signing in..."}):_e(Q.Provider,{value:g,children:a})})}import{useContext as $r,useMemo as rr,useReducer as Hr,useRef as jr}from"react";import{App as Jr}from"@urun-sh/core";function zr(e,r){return`${e}:${JSON.stringify(r??{})}`}var Ne=class{constructor(r,t){this._doc=r;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(r,t){return this._doc.get(r,t)}set(r){this._doc.set(r),this._notify()}on(r,t){return this._doc.on(r,n=>t(n))}get synced(){return this._doc.synced}onSynced(r){return this._doc.onSynced(()=>{r(),this._notify()})}text(r){let t=this._doc.text(r),n=this._notify;return{append(o){t.append(o),n()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,a=>{s(a),n()})}}dispose(){this._unsubscribeChange()}},De=class{constructor(r,t){this._stream=r;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(r){return this._stream.attach(r)}attachVideo(r){return this._stream.attachVideo(r)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(r){return this._stream.seek(r)}chunks(r){return this._stream.chunks(r)}onSeeked(r){return this._stream.onSeeked(r)}on(r,t){return this._stream.on(r,t)}messages(){return this._stream.messages()}emit(r,t){return this._stream.emit(r,t)}dispose(){this._unsubscribeTrack()}},Oe=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}recover(){this._session.recover()}onRecovery(r){return this._session.onRecovery(r)}request(r,t){return this._session.request(r,t)}requestStream(r,t){return this._session.requestStream(r,t)}complete(r,t){return this._session.complete(r,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(r){let t=this._docs.get(r);return t||(t=new Ne(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new De(this._session.stream(r),this._notify),this._streams.set(r,t)),t}disconnect(){this._disposed=!0;for(let r of this._docs.values())r.dispose();for(let r of this._streams.values())r.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function Xr(){let e=$r(Q);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=Hr(o=>o+1,0),t=jr(new Map),n=rr(()=>Jr(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return rr(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=zr(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new Oe(n[s](a),r);return t.current.set(u,i),i}}}),[n])}import{useCallback as Ie,useEffect as Gr,useMemo as Kr,useRef as ve,useState as qe}from"react";function ee(e){let r=e;if(!r||typeof r.request!="function"||typeof r.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return r}function Zr(e){return e instanceof Error?e:new Error(String(e))}function Yr(e,r){let t=Kr(()=>ee(e),[e]),[n,o]=qe(void 0),[s,a]=qe(null),[u,c]=qe(!1),i=ve(r);i.current=r;let f=ve(0),d=ve(null),m=ve(!0);Gr(()=>(m.current=!0,()=>{m.current=!1,d.current?.abort()}),[]);let k=Ie(async g=>{d.current?.abort();let S=new AbortController;d.current=S;let T=++f.current,h=()=>m.current&&f.current===T;h()&&(c(!0),a(null));try{let x=await t.request(g,{...i.current,signal:S.signal});return h()&&(o(x),c(!1),i.current?.onSuccess?.(x)),x}catch(x){let U=Zr(x);throw h()&&(a(U),c(!1),i.current?.onError?.(U)),U}},[t]),b=Ie(g=>{k(g).catch(()=>{})},[k]),y=Ie(()=>{f.current++,d.current?.abort(),d.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:b,mutateAsync:k,data:n,error:s,isPending:u,reset:y}}import{useCallback as tr,useEffect as Qr,useMemo as et,useRef as ke,useState as Le}from"react";function nr(e){return e instanceof Error?e:new Error(String(e))}var rt=e=>typeof e=="string"?e:String(e);function tt(e,r){let t=et(()=>ee(e),[e]),[n,o]=Le(""),[s,a]=Le(!1),[u,c]=Le(null),i=ke(r);i.current=r;let f=ke(0),d=ke(null),m=ke(!0);Qr(()=>(m.current=!0,()=>{m.current=!1,d.current?.cancel(),d.current=null}),[]);let k=tr(()=>{f.current++,d.current?.cancel(),d.current=null,m.current&&a(!1)},[]),b=tr(async y=>{d.current?.cancel();let g=++f.current,S=()=>m.current&&f.current===g,T=i.current,h=T?.parseChunk??rt,x=T?.buildPayload??(P=>({prompt:P}));S()&&(o(""),c(null),a(!0));let{parseChunk:U,buildPayload:I,onFinish:A,onError:l,...C}=T??{},E="",w;try{w=t.requestStream(x(y),C),d.current=w}catch(P){let D=nr(P);S()&&(c(D),a(!1),T?.onError?.(D));return}try{for await(let P of w){if(f.current!==g)break;E+=h(P),S()&&o(E)}S()&&(a(!1),T?.onFinish?.(E))}catch(P){let D=nr(P);S()&&(c(D),a(!1),T?.onError?.(D))}finally{d.current===w&&(d.current=null)}},[t]);return{completion:n,complete:b,stop:k,isStreaming:s,error:u}}import{useCallback as or,useEffect as nt,useMemo as ot,useRef as re,useState as ye}from"react";function sr(e){return e instanceof Error?e:new Error(String(e))}var st=e=>typeof e=="string"?e:String(e),ar=0;function We(e){return ar+=1,`${e}-${ar}`}function at(e,r){let t=ot(()=>ee(e),[e]),[n,o]=ye(()=>(r?.initialMessages??[]).map(h=>({id:h.id??We("msg"),role:h.role,content:h.content}))),[s,a]=ye(""),[u,c]=ye(!1),[i,f]=ye(null),d=re(r);d.current=r;let m=re(n);m.current=n;let k=re(s);k.current=s;let b=re(0),y=re(null),g=re(!0);nt(()=>(g.current=!0,()=>{g.current=!1,y.current?.cancel(),y.current=null}),[]);let S=or(()=>{b.current++,y.current?.cancel(),y.current=null,g.current&&c(!1)},[]),T=or(async h=>{let x=h===void 0,U=(x?k.current:h)??"";if(!U.trim())return;y.current?.cancel();let A=++b.current,l=()=>g.current&&b.current===A,C=d.current,E=C?.parseChunk??st,w={id:We("msg"),role:"user",content:U},P={id:We("msg"),role:"assistant",content:""},D=[...m.current,w].map(v=>({role:v.role,content:v.content})),p=[...m.current,w,P];m.current=p,o(p),x&&a(""),f(null),c(!0);let R=C?.buildPayload??(v=>({messages:v})),{initialMessages:N,parseChunk:M,buildPayload:O,onFinish:L,onError:se,...ge}=C??{},Se=v=>{o(_=>_.map(q=>q.id===P.id?{...q,content:v}:q))},Z="",ae;try{ae=t.requestStream(R(D),ge),y.current=ae}catch(v){let _=sr(v);l()&&(f(_),c(!1),C?.onError?.(_));return}try{for await(let v of ae){if(b.current!==A)break;Z+=E(v),l()&&Se(Z)}l()&&(c(!1),C?.onFinish?.({...P,content:Z}))}catch(v){let _=sr(v);l()&&(f(_),c(!1),C?.onError?.(_))}finally{y.current===ae&&(y.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:T,stop:S,isStreaming:u,error:i}}var ir=new Map;function it(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);ir.set(e,{component:r,schema:t})}function ur(e,r){let t=ir.get(e);if(!t)return{error:`Unknown component: "${e}"`};let n=t.schema.safeParse(r);return n.success?{Component:t.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}import{Fragment as ct,jsx as be}from"react/jsx-runtime";function ut({name:e,props:r,fallback:t}){let n=ur(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?be(ct,{children:t}):be("div",{className:"urun-component-error",role:"alert",children:be("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return be(o,{...n.validatedProps})}import{z as le}from"zod";import{jsx as Fe,jsxs as cr}from"react/jsx-runtime";var lt=le.object({step:le.number().min(0),total:le.number().min(1),label:le.string().optional(),variant:le.enum(["default","success","error"]).default("default")});function lr(e){let{step:r,total:t,label:n,variant:o="default"}=e,s=Math.min(r/t*100,100),a=r>=t;return{step:r,total:t,label:n,variant:o,percentage:s,isComplete:a}}function dt(e){let{step:r,total:t,label:n,variant:o,percentage:s}=lr(e);return cr("div",{className:"urun-progress-card","data-variant":o,children:[n&&Fe("div",{className:"urun-progress-label",children:n}),Fe("div",{className:"urun-progress-bar",children:Fe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),cr("div",{className:"urun-progress-text",children:[r,"/",t]})]})}import{z as Be}from"zod";import{jsx as dr,jsxs as gt}from"react/jsx-runtime";var pt=Be.object({state:Be.enum(["thinking","generating","idle","error"]),message:Be.string().optional()}),mt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function pr(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??mt[r]??r;return{state:r,message:o,isActive:n}}function ft(e){let{state:r,message:t,isActive:n}=pr(e);return gt("span",{className:"urun-status-badge","data-state":r,children:[dr("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),dr("span",{className:"urun-status-message",children:t})]})}import{useRef as mr,useEffect as St}from"react";import{z as Ve}from"zod";import{jsx as fr,jsxs as kt}from"react/jsx-runtime";var ht=Ve.object({text:Ve.string(),streaming:Ve.boolean().default(!1)});function gr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function vt(e){let{text:r,streaming:t}=gr(e),n=mr(null),o=mr(0);return St(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),kt("div",{className:"urun-text-stream",children:[fr("span",{ref:n,className:"urun-text-content"}),t&&fr("span",{className:"urun-text-cursor"})]})}import{z as Ce}from"zod";import{jsx as Sr,jsxs as Ct}from"react/jsx-runtime";var yt=Ce.object({src:Ce.string().url(),alt:Ce.string().optional(),caption:Ce.string().optional()});function hr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function bt(e){let{src:r,alt:t,caption:n}=hr(e);return Ct("figure",{className:"urun-image-frame",children:[Sr("img",{className:"urun-image",src:r,alt:t}),n&&Sr("figcaption",{className:"urun-image-caption",children:n})]})}import{z as j}from"zod";import{jsx as $e,jsxs as Rt}from"react/jsx-runtime";var Tt=j.object({metrics:j.array(j.object({label:j.string(),value:j.union([j.string(),j.number()]),unit:j.string().optional()}))});function vr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function xt(e){let{metrics:r}=vr(e);return $e("div",{className:"urun-metrics-panel",children:r.map((t,n)=>Rt("div",{className:"urun-metric-card",children:[$e("div",{className:"urun-metric-label",children:t.label}),$e("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as Ut,useCallback as te,useEffect as He,useImperativeHandle as wt,useRef as ne}from"react";import{observePageLifecycle as Et}from"@urun-sh/core";var Te=null;function Pt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function xe(){if(Te)return Te;let e=Pt();return e?(Te=new e,Te):null}function Re(){let e=xe();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Mt}from"react/jsx-runtime";var At=1e3,kr=200;function je(...e){console.debug("[urun-audio]",...e)}var Je=Ut(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:f}=r,d=ne(null),m=ne(null),k=ne(null),b=ne(null),y=ne(c);y.current=c;let g=ne(i);g.current=i;let S=te(l=>{k.current!==l&&(k.current=l,g.current?.(l))},[]),T=te(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let l=d.current;return l&&l.srcObject!==m.current&&(l.srcObject=m.current),m.current},[]),h=te(l=>{let C=d.current;if(!C)return;let E=C.play();!E||typeof E.then!="function"||E.then(()=>{C.muted||S(!0)}).catch(w=>{let P=w instanceof Error?w.name:String(w);if(P==="AbortError"){je(`play() aborted (${l}); retrying in ${kr}ms`),b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{b.current=null,h(`${l}:retry`)},kr);return}if(P==="NotAllowedError"){je(`play() blocked pending a user gesture (${l})`),S(!1);return}je(`play() failed (${l})`,w)})},[S]),x=te(l=>{let C=T();if(C){for(let E of C.getAudioTracks())E!==l&&C.removeTrack(E);l&&!C.getAudioTracks().includes(l)&&C.addTrack(l),l&&h("track-attach"),y.current?.(l)}},[T,h]),U=te(()=>{let l=d.current;l&&(T(),l.muted=!1,h("gesture"),Re(),S(!0))},[T,h,S]);wt(t,()=>({unlock:U,get unlocked(){return k.current===!0},get element(){return d.current}}),[U]);let I=te(l=>{d.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),T()),f?.(l)},[T,f]),A=s!==void 0;return He(()=>{if(A){x(s??null);return}if(!n)return;let l=n.stream(o),C=()=>{let p=m.current;return p?p.getAudioTracks()[0]??null:null},E=p=>{if(p!==C()&&(x(p),p)){let R=()=>{C()===p&&x(null)};p.addEventListener("ended",R)}},w=l.track;w&&w.readyState==="live"&&E(w);let P=l.on("track",p=>{p&&p.readyState!=="live"||E(p)}),D=setInterval(()=>{let p=l.track;p&&p.readyState==="live"&&E(p)},At);return()=>{P(),clearInterval(D)}},[n,o,A,s,x]),He(()=>Et(()=>{Re(),k.current===!0&&h("foreground")}),[h]),He(()=>()=>{b.current&&clearTimeout(b.current)},[]),Mt("audio",{ref:I,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});import{forwardRef as _t,useCallback as oe,useEffect as yr,useImperativeHandle as Nt,useRef as B}from"react";import{observePageLifecycle as Dt,sessionFailureFromMediaError as Ot,sharedCaptureController as It}from"@urun-sh/core";import{jsx as Lt}from"react/jsx-runtime";var br={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Pe(...e){console.debug("[urun-voice]",...e)}var qt=_t(function(r,t){let{session:n,stream:o="audio",constraints:s=br,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:f,onMicStream:d,onTrack:m,onUnlockChange:k,capture:b}=r,y=B(null),g=B(null),S=B(null),T=B([]),h=B(!1),x=B(i);x.current=i;let U=B(f);U.current=f;let I=B(d);I.current=d;let A=oe(p=>{h.current!==p&&(h.current=p,x.current?.(p))},[]),l=oe(()=>{for(let p of T.current)p();T.current=[],S.current?.release(),S.current=null,g.current&&(g.current=null,I.current?.(null))},[]),C=oe(async()=>{let p=S.current;if(p){let O=await p.update(s);return g.current=p.stream,I.current?.(p.stream),O}let N=await(b??It()).claim("audio",s);S.current=N,T.current=[N.onTrack((O,L)=>{g.current=L,I.current?.(L),h.current&&n.stream(o).attach(O).catch(se=>Pe("mic re-attach after one-capture re-acquire failed",se))}),N.onLost(O=>{S.current=null,T.current=[],g.current=null,I.current?.(null),A(!1),U.current?.(O)})],g.current=N.stream,I.current?.(N.stream);let M=N.track;if(!M)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return M},[b,s,n,o,A]),E=oe(async()=>{l(),A(!1),await n.stream(o).detach().catch(()=>{})},[n,o,l,A]),w=oe(async()=>{y.current?.unlock();let p;try{p=await C()}catch(M){l();let O=Ot(M,n.status);throw U.current?.(O),O}n.connect?.();let R;for(let M=1;M<=u;M++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(p),A(!0);return}catch(O){R=O,Pe(`start attempt ${M}/${u} failed`,O),M<u&&await new Promise(L=>setTimeout(L,c))}l(),A(!1);let N=R instanceof Error?R:new Error(String(R??"voice start failed"));throw U.current?.(N),N},[n,o,a,u,c,C,l,A]);Nt(t,()=>({start:w,stop:E,unlock:()=>y.current?.unlock(),get active(){return h.current},get micStream(){return g.current},get audio(){return y.current}}),[w,E]);let P=B(!1),D=oe(async()=>{if(!h.current||P.current)return;let p=g.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(R){Pe("foreground mic re-assert failed (will retry on next pass)",R)}return}P.current=!0;try{let R=await C();await n.stream(o).attach(R)}catch(R){let N=R instanceof Error?R:new Error(String(R));Pe("foreground mic re-acquire failed",N),U.current?.(N)}finally{P.current=!1}},[n,o,C]);return yr(()=>{let p=()=>{D()};return typeof n.onRecovery=="function"?n.onRecovery(p):Dt(p)},[n,D]),yr(()=>l,[l]),Lt(Je,{ref:y,session:n,stream:o,onTrack:m,onUnlockChange:k})});import{sessionFailureFromMediaError as Wt,sharedCaptureController as Ft}from"@urun-sh/core";import{forwardRef as Bt,useCallback as V,useEffect as Vt,useImperativeHandle as $t,useRef as W,useState as Ht}from"react";import{jsx as Jt,jsxs as zt}from"react/jsx-runtime";var Cr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ze(...e){console.debug("[urun-camera]",...e)}var jt=Bt(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:f,videoClassName:d,onActiveChange:m,onError:k,onStream:b,onTrack:y,children:g,capture:S}=r,T=W(null),h=W(null),x=W(null),U=W([]),I=W(null),A=W(!1),l=W(a),[C,E]=Ht(a),w=W(m);w.current=m;let P=W(k);P.current=k;let D=W(b);D.current=b;let p=W(y);p.current=y;let R=V(v=>{A.current!==v&&(A.current=v,w.current?.(v))},[]),N=V(v=>{let _=T.current;_&&(_.muted=!0,_.srcObject=v,v&&_.play()?.catch?.(q=>ze("preview play() failed",q)))},[]),M=V(()=>{I.current?.(),I.current=null;for(let v of U.current)v();U.current=[],x.current?.release(),x.current=null,h.current&&(h.current=null,D.current?.(null),p.current?.(null)),N(null)},[N]),O=V((v,_)=>{I.current?.(),h.current=_,N(_),D.current?.(_);let q=()=>{h.current===_&&(ze("camera track ended (device removed or permission revoked)"),M(),R(!1))};v.addEventListener("ended",q),I.current=()=>v.removeEventListener("ended",q)},[N,M,R]),L=V(async v=>{let _={...Cr,...s,facingMode:v},q;try{let $=x.current;if($)q=await $.update(_);else{let ie=await(S??Ft()).claim("video",_);if(x.current=ie,U.current=[ie.onTrack((ue,Mr)=>{O(ue,Mr),A.current&&n.stream(o).attachVideo(ue).then(()=>p.current?.(ue)).catch(_r=>ze("camera re-publish after one-capture re-acquire failed",_r))}),ie.onLost(ue=>{x.current=null,U.current=[],M(),R(!1),P.current?.(ue)})],!ie.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});q=ie.track}}catch($){let Y=Wt($,n.status);throw P.current?.(Y),Y}l.current=v,E(v),O(q,x.current?.stream??new MediaStream([q]));try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(q)}catch($){M(),R(!1);let Y=$ instanceof Error?$:new Error(String($));throw P.current?.(Y),Y}p.current?.(q),R(!0)},[n,o,s,c,S,O,M,R]),se=V(v=>L(v?.facingMode??l.current),[L]),ge=V(async v=>{A.current&&l.current===v||await L(v)},[L]),Se=V(()=>L(l.current==="environment"?"user":"environment"),[L]),Z=V(async()=>{M(),R(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,M,R]);return $t(t,()=>({start:se,stop:Z,flip:Se,setFacingMode:ge,get active(){return A.current},get facingMode(){return l.current},get stream(){return h.current},get element(){return T.current}}),[se,Z,Se,ge]),Vt(()=>M,[M]),i?zt("div",{className:f,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":C,children:[Jt("video",{ref:T,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?C==="user":u)?{transform:"scaleX(-1)"}:{}}}),g]}):null});import{useEffect as Xt,useState as Gt}from"react";var Xe={level:0,speaking:!1};function Kt(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=Gt(Xe);return Xt(()=>{if(!e){a(Xe);return}let u=xe();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,f;try{i=u.createMediaStreamSource(c),f=u.createAnalyser(),f.fftSize=t,i.connect(f)}catch{return}let d=new Uint8Array(f.fftSize),k=setInterval(()=>{f.getByteTimeDomainData(d);let b=0;for(let g=0;g<d.length;g++){let S=(d[g]-128)/128;b+=S*S}let y=Math.sqrt(b/d.length);a(g=>{let S=y>o;return Math.abs(g.level-y)<.005&&g.speaking===S?g:{level:y,speaking:S}})},n);return()=>{clearInterval(k),i.disconnect(),a(Xe)}},[e,t,n,o]),s}import{useEffect as Zt,useState as Yt}from"react";function Qt(e,r){let[t,n]=Yt(null);return Zt(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}import{useCallback as sn}from"react";import{useEffect as nn,useMemo as on}from"react";import{createStore as en}from"zustand/vanilla";import{useStore as rn}from"zustand";var tn=()=>{};function Ge(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=en(()=>({doc:n(),synced:e?e.synced:!1,set:t})),s=null,a=()=>{if(s){for(let i of s)i();s=null}},u=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",i=>o.setState({doc:i})),e.onSynced(()=>o.setState({synced:!0}))]),a):tn,c=(i=>rn(o,i));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:u,unbind:a}),r.bind!==!1&&u(),c}function de(e,r){let t=on(()=>Ge(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return nn(()=>t.bind(),[t]),t}function an(e,r,t){let o=de(e,r)(t??(u=>u)),s=sn(u=>{e&&r&&e.doc(r).set(u)},[e,r]);if(t)return o;let a=o;return{snapshot:e&&r?a.doc:null,synced:a.synced,set:s}}import{useEffect as un,useState as cn}from"react";var X=200;function J(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function pe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ke(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function Ze(e,r,t={}){let n=t.cap??200,[o,s]=cn([]);return un(()=>{if(s([]),!e||!r)return;let a=!0,u=e.stream(r).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await u.next();if(!a||c.done)break;s(i=>J(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}import{jsx as Ue,jsxs as me}from"react/jsx-runtime";function ln({session:e,name:r,cap:t,className:n}){let o=Ze(e,r,{cap:t});return me("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[me("div",{className:"urun-stream-tail-meta",children:[Ue("code",{children:r}),me("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Ue("div",{className:"urun-stream-tail-log",children:o.length===0?me("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ue("code",{children:r})," messages\u2026"]}):o.map((s,a)=>me("div",{className:"urun-stream-tail-line",children:[Ue("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pe(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as dn,useState as Tr}from"react";import{jsx as G,jsxs as we}from"react/jsx-runtime";function Ee({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=Tr(""),[a,u]=Tr(null),c=dn(()=>{let i=Ke(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return we("div",{className:"urun-doc-patch",children:[G("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),we("div",{className:"urun-doc-patch-actions",children:[G("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?G("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function pn({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=de(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return we("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[we("div",{className:"urun-doc-panel-meta",children:[G("code",{children:r}),G("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),G("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?G(Ee,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}import{useEffect as mn,useState as fn}from"react";import{jsx as fe,jsxs as Rr}from"react/jsx-runtime";function xr(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function gn({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=fn([]);return mn(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>J(c,{at:Date.now(),direction:"in",text:xr(pe(u))},t))}):void 0),[e,r,t]),Rr("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[fe(Ee,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>J(c,{at:Date.now(),direction:"out",text:xr(u)},t))}}),fe("div",{className:"urun-control-sender-log",children:o.length===0?fe("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>Rr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[fe("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",fe("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}import{useEffect as Sn,useState as hn}from"react";import{jsx as Ae,jsxs as kn}from"react/jsx-runtime";function vn({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=hn([]),u=r.join(","),c=t.join(",");return Sn(()=>{if(a([]),!e)return;let i=(d,m)=>a(k=>J(k,{at:Date.now(),kind:d,text:m},n)),f=[];f.push(e.onPhase(d=>i("phase",`phase \u2192 ${d.name}`)));for(let d of r){let m=e.stream(d);f.push(m.on("track",k=>i("track",`${d}: ${k?"track arrived":"track ended"}`)))}for(let d of t){let m=e.doc(d);f.push(m.on("change",()=>i("doc",`${d} changed`)))}return()=>f.forEach(d=>d())},[e,u,c,n]),Ae("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Ae("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((i,f)=>kn("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[Ae("span",{className:"urun-event-spine-kind",children:i.kind})," ",Ae("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${f}`))})}import{describeSessionPhase as wn,isWakingPhase as En}from"@urun-sh/core";import{useEffect as yn,useState as bn}from"react";function F(e){let[r,t]=bn(e?.phase??null);return yn(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}import{describeSessionPhase as Pn}from"@urun-sh/core";import{useEffect as Cn,useRef as Tn,useState as xn}from"react";import{isWakingPhase as Rn}from"@urun-sh/core";function Ye(e){let r=F(e),t=Rn(r?.name),n=Tn(void 0);t?n.current??=Date.now():n.current=void 0;let o=t?r?.wakingSince??n.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,u]=xn(s);return Cn(()=>{if(o===void 0){u(0);return}u(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{u(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:t,phase:r,state:t?r?.runtime?.state:void 0,reason:t?r?.runtime?.reason:void 0,since:o,seconds:t?a:0}}import{Fragment as Un,jsx as Pr,jsxs as Ur}from"react/jsx-runtime";function Qe({session:e,render:r,className:t}){let n=Ye(e);return!n.waking||!n.phase?null:Pr("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):Ur(Un,{children:[Pr("span",{className:"urun-session-waking-label",children:Pn(n.phase)})," ",Ur("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}import{jsx as K,jsxs as wr}from"react/jsx-runtime";var An={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Mn({session:e,className:r}){let t=F(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return wr("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[K("span",{className:"urun-session-status-dot","data-phase":n}),K("span",{className:"urun-session-status-label",children:An[n]}),o?K("span",{className:"urun-session-status-detail",children:o}):null]})}function _n({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=F(e);if(s?.name==="live")return K("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):K("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&En(s.name)?K(Qe,{session:e}):s&&s.name!=="idle"?wn(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return wr("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?K("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}import{useEffect as Nn,useState as Dn}from"react";import{jsx as qn}from"react/jsx-runtime";function Er(e){return F(e)?.endsAt??null}function On(e){let r=Math.max(0,Math.floor(e/1e3)),t=Math.floor(r/60),n=r%60;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}`}function In({session:e,urgentMs:r=6e4,className:t}){let o=Er(e)?.getTime()??null,[s,a]=Dn(()=>o===null?null:Math.max(0,o-Date.now()));if(Nn(()=>{if(o===null){a(null);return}let c=()=>a(Math.max(0,o-Date.now()));c();let i=setInterval(c,1e3);return()=>clearInterval(i)},[o]),s===null)return null;let u=On(s);return qn("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${u}`,"data-urgent":s<r?"":void 0,"data-expired":s<=0?"":void 0,children:u})}import{jsx as Ar,jsxs as Fn}from"react/jsx-runtime";var Ln=new Set(["expired","ended","error"]);function Wn({session:e,onNewSession:r,children:t,className:n}){let o=F(e);if(!o||!Ln.has(o.name))return null;let s=t?t(o):Ar("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return Fn("div",{className:["urun-session-ended",n].filter(Boolean).join(" "),"data-phase":o.name,children:[s,r?Ar("button",{type:"button",className:"urun-session-ended-new",onClick:r,children:"New session"}):null]})}import{useContext as Bn,useEffect as Vn,useState as $n}from"react";import{prewake as Hn}from"@urun-sh/core";function jn(e){let r=Bn(Q),[t,n]=$n(null),o=e.app??r?.appId,s=e.function,a=e.intervalS??60,u=r?.baseUrl,c=r?.orgId,i=r?.jwt,f=r?.getAccessToken,d=r?.authProvider;return Vn(()=>{if(!u||!c||!o||!s)return;let m=!1,k=()=>{Hn({baseUrl:u,app:o,functionName:s,orgId:c,jwt:i,getAccessToken:f,authProvider:d}).then(y=>{m||n(y)}).catch(()=>{})};k();let b=setInterval(k,Math.max(1,a)*1e3);return()=>{m=!0,clearInterval(b)}},[o,s,a,u,c,i,f,d]),t}import{describeSessionPhase as Xa,isWakingPhase as Ga}from"@urun-sh/core";export{ut as ComponentRenderer,Cr as DEFAULT_CAMERA_CONSTRAINTS,X as DEFAULT_LOG_CAP,br as DEFAULT_VOICE_CONSTRAINTS,Ee as DocPatchForm,bt as ImageFrame,yt as ImageFrameSchema,xt as MetricsPanel,Tt as MetricsPanelSchema,dt as ProgressCard,lt as ProgressCardSchema,ft as StatusBadge,pt as StatusBadgeSchema,vt as TextStream,ht as TextStreamSchema,Je as UrunAudio,Nr as UrunAuthProvider,jt as UrunCamera,gn as UrunControlSender,pn as UrunDocPanel,ce as UrunErrorBoundary,vn as UrunEventSpine,Dr as UrunJwtProvider,Vr as UrunProvider,In as UrunSessionClock,Wn as UrunSessionEnded,_n as UrunSessionGate,Mn as UrunSessionStatus,Qe as UrunSessionWaking,ln as UrunStreamTail,qt as UrunVoice,he as authMode,Ge as createDocStore,Xa as describeSessionPhase,pe as formatPayload,xe as getUrunAudioContext,Ga as isWakingPhase,Ke as parseJsonObject,J as pushCapped,it as registerComponent,Re as resumeUrunAudioContext,H as urunPublicEnv,Xr as useApp,at as useChat,tt as useCompletion,de as useDocStore,hr as useImageFrame,vr as useMetricsPanel,lr as useProgressCard,Yr as useRequest,an as useSessionDoc,Er as useSessionEndsAt,F as useSessionPhase,Qt as useSessionTrack,Ye as useSessionWake,pr as useStatusBadge,Ze as useStreamMessages,gr as useTextStream,Kt as useUrunAudioLevel,Me as useUrunAuth,jn as useUrunPrewake,Lr as usesWorkOSAuth};
2
+ import{a as Kn,b as Jn,c as Ie}from"./chunk-WF2OBDSX.mjs";import{useEffect as Yn,useMemo as Qn,useState as er}from"react";import{Component as zn}from"react";import{jsx as sn,jsxs as Xn}from"react/jsx-runtime";var de=class extends zn{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Xn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[sn("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),sn("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Gn}from"react";var ee=Gn(null);function z(n){return n&&n.trim()?n.trim():void 0}function $(n){switch(n){case"NEXT_PUBLIC_AUTH_MODE":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return z(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return z(typeof process<"u"?process.env?.[n]:void 0)}}function ye(){let n=$("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return n==="jwt"||n==="customer-jwt"||n==="test-jwt"?"jwt":n==="workos"||$("VERCEL_ENV")==="production"?"workos":$("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Zn(){return ye()==="workos"}import{jsx as Le}from"react/jsx-runtime";function nr({baseUrl:n,orgId:e,appId:r,jwt:t,authProvider:o,fallback:s,children:i}){let[a,l]=er(),u=Ie(),p=$("NEXT_PUBLIC_SESSION_TOKEN")??$("NEXT_PUBLIC_URUN_JWT"),c=ye(),m=c==="workos"&&!t,S=t??(c==="jwt"?p:void 0)??a,k=o??$("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!S,h=Qn(()=>({appId:r,baseUrl:n,orgId:e,jwt:S,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[r,u,n,k,S,e,m]);return Yn(()=>{if(!m||!u)return;let v=!1,x=u;async function y(){try{let g=await x.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}y();let R=window.setInterval(()=>{y()},6e4);return()=>{v=!0,window.clearInterval(R)}},[u,m]),Le(de,{fallback:s,children:C?Le("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Le(ee.Provider,{value:h,children:i})})}import{useContext as rr,useEffect as tr,useMemo as an,useReducer as or,useRef as un}from"react";import{App as sr}from"@urun-sh/core";function ir(n,e){return`${n}:${JSON.stringify(e??{})}`}function ar(n,e,r){return JSON.stringify({appId:n.appId,baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,authProvider:n.authProvider,fnName:e,args:r??{}})}var ne=new Map;var De=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,t=>r(t))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),t=this._notify;return{append(o){r.append(o),t()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),t()})}}dispose(){this._unsubscribeChange()}},Oe=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},qe=class{constructor(e,r){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new De(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new Oe(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}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._notifyAll(),this._notifiers.clear()}};function ur(){let n=rr(ee);if(!n)throw new Error("useApp must be used within <UrunProvider>");if(!n.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=or(s=>s+1,0),r=un(new Map),t=un(new Map),o=an(()=>sr(n.appId,{baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,getAccessToken:n.getAccessToken,authProvider:n.authProvider}),[n.appId,n.baseUrl,n.orgId,n.jwt,n.getAccessToken,n.authProvider]);return tr(()=>()=>{for(let[s,i]of t.current){let a=ne.get(s);a===i&&(a.handle.removeNotifier(e),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=ne.get(s);!l||l.refCount!==0||(ne.delete(s),l.handle.disconnect())},0)))}t.current.clear(),r.current.clear()},[]),an(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=ir(i,a),u=r.current.get(l);if(u&&!u.disposed)return u;let p=ar(n,i,a),c=ne.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),ne.delete(p),t.current.get(p)===c&&t.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new qe(o[i](a),e),refCount:0,disposeTimer:null},ne.set(p,c)),t.current.get(p)!==c&&(t.current.set(p,c),c.handle.addNotifier(e),c.refCount+=1),r.current.set(l,c.handle),c.handle}}}),[n,o])}import{useCallback as We,useEffect as cr,useMemo as lr,useRef as ke,useState as Fe}from"react";function re(n){let e=n;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 dr(n){return n instanceof Error?n:new Error(String(n))}function pr(n,e){let r=lr(()=>re(n),[n]),[t,o]=Fe(void 0),[s,i]=Fe(null),[a,l]=Fe(!1),u=ke(e);u.current=e;let p=ke(0),c=ke(null),m=ke(!0);cr(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let S=We(async h=>{c.current?.abort();let v=new AbortController;c.current=v;let x=++p.current,y=()=>m.current&&p.current===x;y()&&(l(!0),i(null));try{let R=await r.request(h,{...u.current,signal:v.signal});return y()&&(o(R),l(!1),u.current?.onSuccess?.(R)),R}catch(R){let g=dr(R);throw y()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[r]),k=We(h=>{S(h).catch(()=>{})},[S]),C=We(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:k,mutateAsync:S,data:t,error:s,isPending:a,reset:C}}import{useCallback as cn,useEffect as mr,useMemo as fr,useRef as be,useState as Be}from"react";function ln(n){return n instanceof Error?n:new Error(String(n))}var gr=n=>typeof n=="string"?n:String(n);function Sr(n,e){let r=fr(()=>re(n),[n]),[t,o]=Be(""),[s,i]=Be(!1),[a,l]=Be(null),u=be(e);u.current=e;let p=be(0),c=be(null),m=be(!0);mr(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let S=cn(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),k=cn(async C=>{c.current?.cancel();let h=++p.current,v=()=>m.current&&p.current===h,x=u.current,y=x?.parseChunk??gr,R=x?.buildPayload??(b=>({prompt:b}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:_,onFinish:A,onError:d,...P}=x??{},U="",E;try{E=r.requestStream(R(C),P),c.current=E}catch(b){let L=ln(b);v()&&(l(L),i(!1),x?.onError?.(L));return}try{for await(let b of E){if(p.current!==h)break;U+=y(b),v()&&o(U)}v()&&(i(!1),x?.onFinish?.(U))}catch(b){let L=ln(b);v()&&(l(L),i(!1),x?.onError?.(L))}finally{c.current===E&&(c.current=null)}},[r]);return{completion:t,complete:k,stop:S,isStreaming:s,error:a}}import{useCallback as dn,useEffect as hr,useMemo as vr,useRef as te,useState as Ce}from"react";function pn(n){return n instanceof Error?n:new Error(String(n))}var yr=n=>typeof n=="string"?n:String(n),mn=0;function Ve(n){return mn+=1,`${n}-${mn}`}function kr(n,e){let r=vr(()=>re(n),[n]),[t,o]=Ce(()=>(e?.initialMessages??[]).map(y=>({id:y.id??Ve("msg"),role:y.role,content:y.content}))),[s,i]=Ce(""),[a,l]=Ce(!1),[u,p]=Ce(null),c=te(e);c.current=e;let m=te(t);m.current=t;let S=te(s);S.current=s;let k=te(0),C=te(null),h=te(!0);hr(()=>(h.current=!0,()=>{h.current=!1,C.current?.cancel(),C.current=null}),[]);let v=dn(()=>{k.current++,C.current?.cancel(),C.current=null,h.current&&l(!1)},[]),x=dn(async y=>{let R=y===void 0,g=(R?S.current:y)??"";if(!g.trim())return;C.current?.cancel();let A=++k.current,d=()=>h.current&&k.current===A,P=c.current,U=P?.parseChunk??yr,E={id:Ve("msg"),role:"user",content:g},b={id:Ve("msg"),role:"assistant",content:""},L=[...m.current,E].map(T=>({role:T.role,content:T.content})),f=[...m.current,E,b];m.current=f,o(f),R&&i(""),p(null),l(!0);let w=P?.buildPayload??(T=>({messages:T})),{initialMessages:I,parseChunk:M,buildPayload:D,onFinish:q,onError:ae,...he}=P??{},ve=T=>{o(N=>N.map(O=>O.id===b.id?{...O,content:T}:O))},Y="",ue;try{ue=r.requestStream(w(L),he),C.current=ue}catch(T){let N=pn(T);d()&&(p(N),l(!1),P?.onError?.(N));return}try{for await(let T of ue){if(k.current!==A)break;Y+=U(T),d()&&ve(Y)}d()&&(l(!1),P?.onFinish?.({...b,content:Y}))}catch(T){let N=pn(T);d()&&(p(N),l(!1),P?.onError?.(N))}finally{C.current===ue&&(C.current=null)}},[r]);return{messages:t,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}import{useCallback as j,useEffect as fn,useMemo as br,useRef as gn,useState as Sn}from"react";import{createInputPresencePublisher as Cr,INPUT_PRESENCE_DEFAULT_HZ as Tr,INPUT_PRESENCE_FIELD as Pr}from"@urun-sh/core";var He=[];function xr(n,e={}){let{field:r=Pr,hz:t=Tr}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=n?.presence??null,i=br(()=>s?Cr({awareness:{setLocalStateField:(g,_)=>s.setField(g,_)},field:r,hz:t}):null,[s,r,t]),a=gn(null);a.current=i;let[l,u]=Sn(!1),[p,c]=Sn(He),m=gn(!1);fn(()=>{if(i)return()=>i.dispose()},[i]);let S=j(()=>{let g=a.current;c(g?g.heldKeys():He)},[]),k=j(()=>{a.current?.clear(),c(He)},[]);fn(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,_=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},A=b=>{g()&&(a.current?.keyDown(b.key),S())},d=b=>{a.current?.keyUp(b.key),S()},P=b=>{g()&&a.current?.movePointer(b.movementX,b.movementY)},U=b=>{g()&&a.current?.setButtons(b.buttons)},E=()=>{k()};return o.addEventListener("pointerlockchange",_),o.addEventListener("keydown",A),o.addEventListener("keyup",d),o.addEventListener("mousemove",P),o.addEventListener("mousedown",U),o.addEventListener("mouseup",U),o.defaultView?.addEventListener("blur",E),()=>{o.removeEventListener("pointerlockchange",_),o.removeEventListener("keydown",A),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",P),o.removeEventListener("mousedown",U),o.removeEventListener("mouseup",U),o.defaultView?.removeEventListener("blur",E)}},[o,k,S]);let C=j(g=>{g.requestPointerLock?.()},[]),h=j(()=>{m.current=!0,u(!0)},[]),v=j(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),x=j(g=>{a.current?.keyDown(g),S()},[S]),y=j(g=>{a.current?.keyUp(g),S()},[S]),R=j((g,_)=>{a.current?.movePointer(g,_)},[]);return{engage:C,engageTouch:h,release:v,engaged:l,heldKeys:p,pressKey:x,releaseKey:y,movePointer:R}}var hn=new Map;function Rr(n,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${n}"): schema must be a valid Zod schema`);hn.set(n,{component:e,schema:r})}function vn(n,e){let r=hn.get(n);if(!r)return{error:`Unknown component: "${n}"`};let t=r.schema.safeParse(e);return t.success?{Component:r.component,validatedProps:t.data}:{error:`Validation failed for "${n}": ${t.error.message}`}}import{Fragment as wr,jsx as Te}from"react/jsx-runtime";function Ur({name:n,props:e,fallback:r}){let t=vn(n,e);if(t.error)return console.warn(`[urun] ComponentRenderer: ${t.error}`),r?Te(wr,{children:r}):Te("div",{className:"urun-component-error",role:"alert",children:Te("span",{className:"urun-component-error-text",children:t.error})});let o=t.Component;return Te(o,{...t.validatedProps})}import{z as pe}from"zod";import{jsx as $e,jsxs as yn}from"react/jsx-runtime";var Er=pe.object({step:pe.number().min(0),total:pe.number().min(1),label:pe.string().optional(),variant:pe.enum(["default","success","error"]).default("default")});function kn(n){let{step:e,total:r,label:t,variant:o="default"}=n,s=Math.min(e/r*100,100),i=e>=r;return{step:e,total:r,label:t,variant:o,percentage:s,isComplete:i}}function Ar(n){let{step:e,total:r,label:t,variant:o,percentage:s}=kn(n);return yn("div",{className:"urun-progress-card","data-variant":o,children:[t&&$e("div",{className:"urun-progress-label",children:t}),$e("div",{className:"urun-progress-bar",children:$e("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),yn("div",{className:"urun-progress-text",children:[e,"/",r]})]})}import{z as je}from"zod";import{jsx as bn,jsxs as Ir}from"react/jsx-runtime";var _r=je.object({state:je.enum(["thinking","generating","idle","error"]),message:je.string().optional()}),Mr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Cn(n){let{state:e,message:r}=n,t=e==="thinking"||e==="generating",o=r??Mr[e]??e;return{state:e,message:o,isActive:t}}function Nr(n){let{state:e,message:r,isActive:t}=Cn(n);return Ir("span",{className:"urun-status-badge","data-state":e,children:[bn("span",{className:`urun-status-indicator${t?" urun-status-pulse":""}`}),bn("span",{className:"urun-status-message",children:r})]})}import{useRef as Tn,useEffect as Lr}from"react";import{z as Ke}from"zod";import{jsx as Pn,jsxs as qr}from"react/jsx-runtime";var Dr=Ke.object({text:Ke.string(),streaming:Ke.boolean().default(!1)});function xn(n){let{text:e,streaming:r=!1}=n,t=e.length===0;return{text:e,streaming:r,isEmpty:t}}function Or(n){let{text:e,streaming:r}=xn(n),t=Tn(null),o=Tn(0);return Lr(()=>{let s=t.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),qr("div",{className:"urun-text-stream",children:[Pn("span",{ref:t,className:"urun-text-content"}),r&&Pn("span",{className:"urun-text-cursor"})]})}import{z as Pe}from"zod";import{jsx as Rn,jsxs as Br}from"react/jsx-runtime";var Wr=Pe.object({src:Pe.string().url(),alt:Pe.string().optional(),caption:Pe.string().optional()});function Un(n){let{src:e,alt:r,caption:t}=n;return{src:e,alt:r??"",caption:t}}function Fr(n){let{src:e,alt:r,caption:t}=Un(n);return Br("figure",{className:"urun-image-frame",children:[Rn("img",{className:"urun-image",src:e,alt:r}),t&&Rn("figcaption",{className:"urun-image-caption",children:t})]})}import{z as K}from"zod";import{jsx as Je,jsxs as $r}from"react/jsx-runtime";var Vr=K.object({metrics:K.array(K.object({label:K.string(),value:K.union([K.string(),K.number()]),unit:K.string().optional()}))});function wn(n){return{metrics:n.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Hr(n){let{metrics:e}=wn(n);return Je("div",{className:"urun-metrics-panel",children:e.map((r,t)=>$r("div",{className:"urun-metric-card",children:[Je("div",{className:"urun-metric-label",children:r.label}),Je("div",{className:"urun-metric-value",children:r.displayValue})]},t))})}import{forwardRef as Kr,useCallback as oe,useEffect as ze,useImperativeHandle as Jr,useRef as se}from"react";import{observePageLifecycle as zr}from"@urun-sh/core";var xe=null;function jr(){if(typeof window>"u")return null;let n=window;return n.AudioContext??n.webkitAudioContext??null}function Re(){if(xe)return xe;let n=jr();return n?(xe=new n,xe):null}function Ue(){let n=Re();n&&n.state==="suspended"&&n.resume().catch(()=>{})}import{jsx as Gr}from"react/jsx-runtime";var Xr=1e3,En=200;function Xe(...n){console.debug("[urun-audio]",...n)}var Ge=Kr(function(e,r){let{session:t,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=e,c=se(null),m=se(null),S=se(null),k=se(null),C=se(l);C.current=l;let h=se(u);h.current=u;let v=oe(d=>{S.current!==d&&(S.current=d,h.current?.(d))},[]),x=oe(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),y=oe(d=>{let P=c.current;if(!P)return;let U=P.play();!U||typeof U.then!="function"||U.then(()=>{P.muted||v(!0)}).catch(E=>{let b=E instanceof Error?E.name:String(E);if(b==="AbortError"){Xe(`play() aborted (${d}); retrying in ${En}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,y(`${d}:retry`)},En);return}if(b==="NotAllowedError"){Xe(`play() blocked pending a user gesture (${d})`),v(!1);return}Xe(`play() failed (${d})`,E)})},[v]),R=oe(d=>{let P=x();if(P){for(let U of P.getAudioTracks())U!==d&&P.removeTrack(U);d&&!P.getAudioTracks().includes(d)&&P.addTrack(d),d&&y("track-attach"),C.current?.(d)}},[x,y]),g=oe(()=>{let d=c.current;d&&(x(),d.muted=!1,y("gesture"),Ue(),v(!0))},[x,y,v]);Jr(r,()=>({unlock:g,get unlocked(){return S.current===!0},get element(){return c.current}}),[g]);let _=oe(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),A=s!==void 0;return ze(()=>{if(A){R(s??null);return}if(!t)return;let d=t.stream(o),P=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},U=f=>{if(f!==P()&&(R(f),f)){let w=()=>{P()===f&&R(null)};f.addEventListener("ended",w)}},E=d.track;E&&E.readyState==="live"&&U(E);let b=d.on("track",f=>{f&&f.readyState!=="live"||U(f)}),L=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&U(f)},Xr);return()=>{b(),clearInterval(L)}},[t,o,A,s,R]),ze(()=>zr(()=>{Ue(),S.current===!0&&y("foreground")}),[y]),ze(()=>()=>{k.current&&clearTimeout(k.current)},[]),Gr("audio",{ref:_,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as Zr,useCallback as ie,useEffect as An,useImperativeHandle as Yr,useRef as B}from"react";import{observePageLifecycle as Qr,sessionFailureFromMediaError as et,sharedCaptureController as nt}from"@urun-sh/core";import{jsx as tt}from"react/jsx-runtime";var _n={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function we(...n){console.debug("[urun-voice]",...n)}var rt=Zr(function(e,r){let{session:t,stream:o="audio",constraints:s=_n,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:S,capture:k}=e,C=B(null),h=B(null),v=B(null),x=B([]),y=B(!1),R=B(u);R.current=u;let g=B(p);g.current=p;let _=B(c);_.current=c;let A=ie(f=>{y.current!==f&&(y.current=f,R.current?.(f))},[]),d=ie(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,h.current&&(h.current=null,_.current?.(null))},[]),P=ie(async()=>{let f=v.current;if(f){let D=await f.update(s);return h.current=f.stream,_.current?.(f.stream),D}let I=await(k??nt()).claim("audio",s);v.current=I,x.current=[I.onTrack((D,q)=>{h.current=q,_.current?.(q),y.current&&t.stream(o).attach(D).catch(ae=>we("mic re-attach after one-capture re-acquire failed",ae))}),I.onLost(D=>{v.current=null,x.current=[],h.current=null,_.current?.(null),A(!1),g.current?.(D)})],h.current=I.stream,_.current?.(I.stream);let M=I.track;if(!M)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return M},[k,s,t,o,A]),U=ie(async()=>{d(),A(!1),await t.stream(o).detach().catch(()=>{})},[t,o,d,A]),E=ie(async()=>{C.current?.unlock();let f;try{f=await P()}catch(M){d();let D=et(M,t.status);throw g.current?.(D),D}t.connect?.();let w;for(let M=1;M<=a;M++)try{await t.whenLive(i!==void 0?{timeout:i}:void 0),await t.stream(o).attach(f),A(!0);return}catch(D){w=D,we(`start attempt ${M}/${a} failed`,D),M<a&&await new Promise(q=>setTimeout(q,l))}d(),A(!1);let I=w instanceof Error?w:new Error(String(w??"voice start failed"));throw g.current?.(I),I},[t,o,i,a,l,P,d,A]);Yr(r,()=>({start:E,stop:U,unlock:()=>C.current?.unlock(),get active(){return y.current},get micStream(){return h.current},get audio(){return C.current}}),[E,U]);let b=B(!1),L=ie(async()=>{if(!y.current||b.current)return;let f=h.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await t.stream(o).attach(f)}catch(w){we("foreground mic re-assert failed (will retry on next pass)",w)}return}b.current=!0;try{let w=await P();await t.stream(o).attach(w)}catch(w){let I=w instanceof Error?w:new Error(String(w));we("foreground mic re-acquire failed",I),g.current?.(I)}finally{b.current=!1}},[t,o,P]);return An(()=>{let f=()=>{L()};return typeof t.onRecovery=="function"?t.onRecovery(f):Qr(f)},[t,L]),An(()=>d,[d]),tt(Ge,{ref:C,session:t,stream:o,onTrack:m,onUnlockChange:S})});import{sessionFailureFromMediaError as ot,sharedCaptureController as st}from"@urun-sh/core";import{forwardRef as it,useCallback as V,useEffect as at,useImperativeHandle as ut,useRef as W,useState as ct}from"react";import{jsx as dt,jsxs as pt}from"react/jsx-runtime";var Mn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ze(...n){console.debug("[urun-camera]",...n)}var lt=it(function(e,r){let{session:t,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:S,onStream:k,onTrack:C,children:h,capture:v}=e,x=W(null),y=W(null),R=W(null),g=W([]),_=W(null),A=W(!1),d=W(i),[P,U]=ct(i),E=W(m);E.current=m;let b=W(S);b.current=S;let L=W(k);L.current=k;let f=W(C);f.current=C;let w=V(T=>{A.current!==T&&(A.current=T,E.current?.(T))},[]),I=V(T=>{let N=x.current;N&&(N.muted=!0,N.srcObject=T,T&&N.play()?.catch?.(O=>Ze("preview play() failed",O)))},[]),M=V(()=>{_.current?.(),_.current=null;for(let T of g.current)T();g.current=[],R.current?.release(),R.current=null,y.current&&(y.current=null,L.current?.(null),f.current?.(null)),I(null)},[I]),D=V((T,N)=>{_.current?.(),y.current=N,I(N),L.current?.(N);let O=()=>{y.current===N&&(Ze("camera track ended (device removed or permission revoked)"),M(),w(!1))};T.addEventListener("ended",O),_.current=()=>T.removeEventListener("ended",O)},[I,M,w]),q=V(async T=>{let N={...Mn,...s,facingMode:T},O;try{let H=R.current;if(H)O=await H.update(N);else{let ce=await(v??st()).claim("video",N);if(R.current=ce,g.current=[ce.onTrack((le,$n)=>{D(le,$n),A.current&&t.stream(o).attachVideo(le).then(()=>f.current?.(le)).catch(jn=>Ze("camera re-publish after one-capture re-acquire failed",jn))}),ce.onLost(le=>{R.current=null,g.current=[],M(),w(!1),b.current?.(le)})],!ce.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});O=ce.track}}catch(H){let Q=ot(H,t.status);throw b.current?.(Q),Q}d.current=T,U(T),D(O,R.current?.stream??new MediaStream([O]));try{t.connect?.(),await t.whenLive(l!==void 0?{timeout:l}:void 0),await t.stream(o).attachVideo(O)}catch(H){M(),w(!1);let Q=H instanceof Error?H:new Error(String(H));throw b.current?.(Q),Q}f.current?.(O),w(!0)},[t,o,s,l,v,D,M,w]),ae=V(T=>q(T?.facingMode??d.current),[q]),he=V(async T=>{A.current&&d.current===T||await q(T)},[q]),ve=V(()=>q(d.current==="environment"?"user":"environment"),[q]),Y=V(async()=>{M(),w(!1),await t.stream(o).detachVideo().catch(()=>{})},[t,o,M,w]);return ut(r,()=>({start:ae,stop:Y,flip:ve,setFacingMode:he,get active(){return A.current},get facingMode(){return d.current},get stream(){return y.current},get element(){return x.current}}),[ae,Y,ve,he]),at(()=>M,[M]),u?pt("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[dt("video",{ref:x,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(a==="auto"?P==="user":a)?{transform:"scaleX(-1)"}:{}}}),h]}):null});import{useEffect as mt,useState as ft}from"react";var Ye={level:0,speaking:!1};function gt(n,e={}){let{fftSize:r=512,intervalMs:t=100,speakingThreshold:o=.02}=e,[s,i]=ft(Ye);return mt(()=>{if(!n){i(Ye);return}let a=Re();if(!a||typeof MediaStream>"u")return;let l;n instanceof MediaStream?l=n:(l=new MediaStream,l.addTrack(n));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=r,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),S=setInterval(()=>{p.getByteTimeDomainData(c);let k=0;for(let h=0;h<c.length;h++){let v=(c[h]-128)/128;k+=v*v}let C=Math.sqrt(k/c.length);i(h=>{let v=C>o;return Math.abs(h.level-C)<.005&&h.speaking===v?h:{level:C,speaking:v}})},t);return()=>{clearInterval(S),u.disconnect(),i(Ye)}},[n,r,t,o]),s}import{useEffect as St,useState as ht}from"react";function vt(n,e){let[r,t]=ht(null);return St(()=>{if(!n||!e){t(null);return}let o=n.stream(e);return t(o.track),o.on("track",t)},[n,e]),r}import{useCallback as Pt}from"react";import{useEffect as Ct,useMemo as Tt}from"react";import{createStore as yt}from"zustand/vanilla";import{useStore as kt}from"zustand";var bt=()=>{};function Qe(n,e={}){let r=u=>{n?.set(u)},t=()=>n?n.get()??{}:{},o=yt(()=>({doc:t(),synced:n?n.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>n?(s||(o.setState({doc:t(),synced:n.synced}),s=[n.on("change",u=>o.setState({doc:u})),n.onSynced(()=>o.setState({synced:!0}))]),i):bt,l=(u=>kt(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:a,unbind:i}),e.bind!==!1&&a(),l}function me(n,e){let r=Tt(()=>Qe(n&&e?n.doc(e):null,{bind:!1}),[n,e]);return Ct(()=>r.bind(),[r]),r}function xt(n,e,r){let o=me(n,e)(r??(a=>a)),s=Pt(a=>{n&&e&&n.doc(e).set(a)},[n,e]);if(r)return o;let i=o;return{snapshot:n&&e?i.doc:null,synced:i.synced,set:s}}import{useEffect as Rt,useState as Ut}from"react";var X=200;function J(n,e,r=200){let t=[...n,e];return t.length>r?t.slice(t.length-r):t}function fe(n){if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return String(n)}}function en(n){let e=n.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(t){return{ok:!1,error:t instanceof Error?t.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 nn(n,e,r={}){let t=r.cap??200,[o,s]=Ut([]);return Rt(()=>{if(s([]),!n||!e)return;let i=!0,a=n.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>J(u,{at:Date.now(),payload:l.value},t))}})(),()=>{i=!1,a.return?.()}},[n,e,t]),o}import{jsx as Ee,jsxs as ge}from"react/jsx-runtime";function wt({session:n,name:e,cap:r,className:t}){let o=nn(n,e,{cap:r});return ge("div",{className:["urun-stream-tail",t].filter(Boolean).join(" "),children:[ge("div",{className:"urun-stream-tail-meta",children:[Ee("code",{children:e}),ge("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Ee("div",{className:"urun-stream-tail-log",children:o.length===0?ge("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ee("code",{children:e})," messages\u2026"]}):o.map((s,i)=>ge("div",{className:"urun-stream-tail-line",children:[Ee("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",fe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Et,useState as Nn}from"react";import{jsx as G,jsxs as Ae}from"react/jsx-runtime";function _e({placeholder:n,buttonLabel:e,disabled:r,onApply:t}){let[o,s]=Nn(""),[i,a]=Nn(null),l=Et(()=>{let u=en(o);if(!u.ok){a(u.error);return}a(null),t(u.value,o.trim()),s("")},[o,t]);return Ae("div",{className:"urun-doc-patch",children:[G("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:n,rows:3}),Ae("div",{className:"urun-doc-patch-actions",children:[G("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:l,children:e}),i?G("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function At({session:n,docKey:e,editable:r=!0,patchPlaceholder:t='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=me(n,e),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return Ae("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[Ae("div",{className:"urun-doc-panel-meta",children:[G("code",{children:e}),G("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),G("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?G(_e,{placeholder:t,buttonLabel:"Apply patch",disabled:!n,onApply:u=>l(u)}):null]})}import{useEffect as _t,useState as Mt}from"react";import{jsx as Se,jsxs as Ln}from"react/jsx-runtime";function In(n,e=600){return n.length>e?`${n.slice(0,e)}\u2026`:n}function Nt({session:n,docKey:e="control",cap:r=200,className:t}){let[o,s]=Mt([]);return _t(()=>(s([]),n?n.doc(e).on("change",a=>{s(l=>J(l,{at:Date.now(),direction:"in",text:In(fe(a))},r))}):void 0),[n,e,r]),Ln("div",{className:["urun-control-sender",t].filter(Boolean).join(" "),children:[Se(_e,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!n,onApply:(i,a)=>{n?.doc(e).set(i),s(l=>J(l,{at:Date.now(),direction:"out",text:In(a)},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,a)=>Ln("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}-${a}`))})]})}import{useEffect as It,useState as Lt}from"react";import{jsx as Me,jsxs as Ot}from"react/jsx-runtime";function Dt({session:n,trackNames:e=["video","audio"],docKeys:r=["control"],cap:t=200,className:o}){let[s,i]=Lt([]),a=e.join(","),l=r.join(",");return It(()=>{if(i([]),!n)return;let u=(c,m)=>i(S=>J(S,{at:Date.now(),kind:c,text:m},t)),p=[];p.push(n.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of e){let m=n.stream(c);p.push(m.on("track",S=>u("track",`${c}: ${S?"track arrived":"track ended"}`)))}for(let c of r){let m=n.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[n,a,l,t]),Me("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Me("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>Ot("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[Me("span",{className:"urun-event-spine-kind",children:u.kind})," ",Me("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}import{describeSessionPhase as Kt,isWakingPhase as Jt}from"@urun-sh/core";import{useEffect as qt,useState as Wt}from"react";function F(n){let[e,r]=Wt(n?.phase??null);return qt(()=>{if(!n){r(null);return}return n.onPhase(r)},[n]),e}import{describeSessionPhase as $t}from"@urun-sh/core";import{useEffect as Ft,useRef as Bt,useState as Vt}from"react";import{isWakingPhase as Ht}from"@urun-sh/core";function rn(n){let e=F(n),r=Ht(e?.name),t=Bt(void 0);r?t.current??=Date.now():t.current=void 0;let o=r?e?.wakingSince??t.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=Vt(s);return Ft(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:o,seconds:r?i:0}}import{Fragment as jt,jsx as Dn,jsxs as On}from"react/jsx-runtime";function tn({session:n,render:e,className:r}){let t=rn(n);return!t.waking||!t.phase?null:Dn("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":t.phase.name,"data-runtime-state":t.state,children:e?e(t):On(jt,{children:[Dn("span",{className:"urun-session-waking-label",children:$t(t.phase)})," ",On("span",{className:"urun-session-waking-elapsed",children:["(",t.seconds,"s)"]})]})})}import{jsx as Z,jsxs as qn}from"react/jsx-runtime";var zt={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Xt({session:n,className:e}){let r=F(n),t=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return qn("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":t,children:[Z("span",{className:"urun-session-status-dot","data-phase":t}),Z("span",{className:"urun-session-status-label",children:zt[t]}),o?Z("span",{className:"urun-session-status-detail",children:o}):null]})}function Gt({session:n,children:e,fallback:r,onStartOver:t,className:o}){let s=F(n);if(s?.name==="live")return Z("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:e});let i=r?r(s):Z("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Jt(s.name)?Z(tn,{session:n}):s&&s.name!=="idle"?Kt(s):"Waiting for a live session\u2026"}),a=t!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return qn("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?Z("button",{type:"button",className:"urun-session-gate-start-over",onClick:t,children:"Start over"}):null]})}import{useEffect as Zt,useState as Yt}from"react";import{jsx as no}from"react/jsx-runtime";function Wn(n){return F(n)?.endsAt??null}function Qt(n){let e=Math.max(0,Math.floor(n/1e3)),r=Math.floor(e/60),t=e%60;return`${String(r).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function eo({session:n,urgentMs:e=6e4,className:r}){let o=Wn(n)?.getTime()??null,[s,i]=Yt(()=>o===null?null:Math.max(0,o-Date.now()));if(Zt(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=Qt(s);return no("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Fn,jsxs as oo}from"react/jsx-runtime";var ro=new Set(["expired","ended","error"]);function to({session:n,onNewSession:e,children:r,className:t}){let o=F(n);if(!o||!ro.has(o.name))return null;let s=r?r(o):Fn("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return oo("div",{className:["urun-session-ended",t].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?Fn("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}import{useEffect as Bn,useMemo as so,useState as Vn}from"react";import{jsx as Ne,jsxs as uo}from"react/jsx-runtime";function on(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function Hn(n){let e=so(()=>n?n.doc("control"):null,[n]),[r,t]=Vn(()=>e?on(e.get("idle")):null);return Bn(()=>{if(!e){t(null);return}return t(on(e.get("idle"))),e.on("change",()=>t(on(e.get("idle"))))},[e]),r}function io(n){let e=Math.max(0,Math.floor(n));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function ao({session:n,onStillHere:e,className:r}){let t=Hn(n),o=t?.deadlineEpochS??null,[s,i]=Vn(null);if(Bn(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!t||!n)return null;let a=()=>{n.touch?.(),e?.()};return Ne("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:uo("div",{className:"urun-idle-warning-card",children:[Ne("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Ne("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${io(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Ne("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as co,useEffect as lo,useState as po}from"react";import{prewake as mo}from"@urun-sh/core";function fo(n){let e=co(ee),[r,t]=po(null),o=n.app??e?.appId,s=n.function,i=n.intervalS??60,a=e?.baseUrl,l=e?.orgId,u=e?.jwt,p=e?.getAccessToken,c=e?.authProvider;return lo(()=>{if(!a||!l||!o||!s)return;let m=!1,S=()=>{mo({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(C=>{m||t(C)}).catch(()=>{})};S();let k=setInterval(S,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,l,u,p,c]),r}import{describeSessionPhase as Pa,isWakingPhase as xa}from"@urun-sh/core";export{Ur as ComponentRenderer,Mn as DEFAULT_CAMERA_CONSTRAINTS,X as DEFAULT_LOG_CAP,_n as DEFAULT_VOICE_CONSTRAINTS,_e as DocPatchForm,Fr as ImageFrame,Wr as ImageFrameSchema,Hr as MetricsPanel,Vr as MetricsPanelSchema,Ar as ProgressCard,Er as ProgressCardSchema,Nr as StatusBadge,_r as StatusBadgeSchema,Or as TextStream,Dr as TextStreamSchema,Ge as UrunAudio,Kn as UrunAuthProvider,lt as UrunCamera,Nt as UrunControlSender,At as UrunDocPanel,de as UrunErrorBoundary,Dt as UrunEventSpine,ao as UrunIdleWarning,Jn as UrunJwtProvider,nr as UrunProvider,eo as UrunSessionClock,to as UrunSessionEnded,Gt as UrunSessionGate,Xt as UrunSessionStatus,tn as UrunSessionWaking,wt as UrunStreamTail,rt as UrunVoice,ye as authMode,Qe as createDocStore,Pa as describeSessionPhase,fe as formatPayload,Re as getUrunAudioContext,xa as isWakingPhase,en as parseJsonObject,J as pushCapped,Rr as registerComponent,Ue as resumeUrunAudioContext,$ as urunPublicEnv,ur as useApp,kr as useChat,Sr as useCompletion,me as useDocStore,Un as useImageFrame,xr as useInputPresence,wn as useMetricsPanel,kn as useProgressCard,pr as useRequest,xt as useSessionDoc,Wn as useSessionEndsAt,Hn as useSessionIdle,F as useSessionPhase,vt as useSessionTrack,rn as useSessionWake,Cn as useStatusBadge,nn as useStreamMessages,xn as useTextStream,gt as useUrunAudioLevel,Ie as useUrunAuth,fo as useUrunPrewake,Zn as usesWorkOSAuth};
package/dist/styles.css CHANGED
@@ -452,3 +452,52 @@
452
452
  color: var(--urun-wb-muted, #8a8a8a);
453
453
  font-variant-numeric: tabular-nums;
454
454
  }
455
+
456
+ /* ── UrunIdleWarning (attached-but-inert idle primitive) ─────────────────── */
457
+ .urun-idle-warning {
458
+ position: fixed;
459
+ inset: 0;
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: center;
463
+ background: rgba(0, 0, 0, 0.55);
464
+ z-index: 1000;
465
+ }
466
+ .urun-idle-warning-card {
467
+ display: flex;
468
+ flex-direction: column;
469
+ gap: 0.75rem;
470
+ align-items: center;
471
+ padding: 1.5rem 2rem;
472
+ border-radius: 12px;
473
+ background: #111;
474
+ color: #fff;
475
+ border: 1px solid rgba(255, 255, 255, 0.15);
476
+ max-width: 90vw;
477
+ text-align: center;
478
+ }
479
+ .urun-idle-warning-title {
480
+ font-size: 1.1rem;
481
+ font-weight: 600;
482
+ }
483
+ .urun-idle-warning-copy {
484
+ font-size: 0.9rem;
485
+ opacity: 0.8;
486
+ font-variant-numeric: tabular-nums;
487
+ }
488
+ .urun-idle-warning[data-urgent] .urun-idle-warning-copy {
489
+ color: #ff6b6b;
490
+ opacity: 1;
491
+ }
492
+ .urun-idle-warning-confirm {
493
+ padding: 0.5rem 1.25rem;
494
+ border-radius: 8px;
495
+ border: none;
496
+ background: #24db49;
497
+ color: #000;
498
+ font-weight: 600;
499
+ cursor: pointer;
500
+ }
501
+ .urun-idle-warning-confirm:hover {
502
+ filter: brightness(1.1);
503
+ }
package/dist/video.css CHANGED
@@ -1 +1 @@
1
- :root{--urun-bg: #ffffff;--urun-text: #1a1a2e;--urun-border: #e2e8f0;--urun-radius: 8px;--urun-font: system-ui, -apple-system, sans-serif;--urun-progress-bg: #e2e8f0;--urun-progress-fill: #3b82f6;--urun-progress-success: #22c55e;--urun-progress-error: #ef4444;--urun-progress-height: 8px;--urun-status-thinking: #f59e0b;--urun-status-generating: #3b82f6;--urun-status-idle: #94a3b8;--urun-status-error: #ef4444;--urun-status-indicator-size: 8px;--urun-cursor-color: #3b82f6;--urun-cursor-width: 2px;--urun-metric-bg: #f8fafc;--urun-metric-label-color: #64748b;--urun-metric-value-color: #1a1a2e}.urun-progress-card{font-family:var(--urun-font);color:var(--urun-text);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px 16px;background:var(--urun-bg)}.urun-progress-label{font-size:.875rem;font-weight:500;margin-bottom:8px}.urun-progress-bar{height:var(--urun-progress-height);background:var(--urun-progress-bg);border-radius:calc(var(--urun-progress-height) / 2);overflow:hidden}.urun-progress-fill{height:100%;background:var(--urun-progress-fill);border-radius:inherit;transition:width .3s ease}.urun-progress-card[data-variant=success] .urun-progress-fill{background:var(--urun-progress-success)}.urun-progress-card[data-variant=error] .urun-progress-fill{background:var(--urun-progress-error)}.urun-progress-text{font-size:.75rem;color:var(--urun-metric-label-color);margin-top:4px;text-align:right}.urun-status-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-text)}.urun-status-indicator{display:inline-block;width:var(--urun-status-indicator-size);height:var(--urun-status-indicator-size);border-radius:50%;background:var(--urun-status-idle);flex-shrink:0}.urun-status-badge[data-state=thinking] .urun-status-indicator{background:var(--urun-status-thinking)}.urun-status-badge[data-state=generating] .urun-status-indicator{background:var(--urun-status-generating)}.urun-status-badge[data-state=error] .urun-status-indicator{background:var(--urun-status-error)}.urun-status-pulse{animation:urun-pulse 1.5s ease-in-out infinite}.urun-text-stream{font-family:var(--urun-font);color:var(--urun-text);white-space:pre-wrap;word-break:break-word}.urun-text-cursor{display:inline-block;width:var(--urun-cursor-width);height:1em;background:var(--urun-cursor-color);vertical-align:text-bottom;animation:urun-blink 1s step-end infinite}.urun-image-frame{margin:0;border:1px solid var(--urun-border);border-radius:var(--urun-radius);overflow:hidden;background:var(--urun-bg)}.urun-image{display:block;width:100%;height:auto}.urun-image-caption{padding:8px 12px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-metric-label-color);text-align:center}.urun-metrics-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;font-family:var(--urun-font)}.urun-metric-card{background:var(--urun-metric-bg);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px;text-align:center}.urun-metric-label{font-size:.75rem;color:var(--urun-metric-label-color);margin-bottom:4px}.urun-metric-value{font-size:1.25rem;font-weight:600;color:var(--urun-metric-value-color)}.urun-component-error{font-family:var(--urun-font);padding:8px 12px;border:1px solid var(--urun-status-error);border-radius:var(--urun-radius);background:#fef2f2;color:var(--urun-status-error);font-size:.875rem}@keyframes urun-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes urun-blink{0%,to{opacity:1}50%{opacity:0}}[data-urun-video],[data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}[data-urun-video] .vjs-tech{object-fit:contain}.urun-video-live.vjs-has-started .vjs-poster,.urun-video-live.vjs-has-started .vjs-loading-spinner,.urun-video-live.vjs-has-started .vjs-big-play-button{display:none!important}.urun-video-live .vjs-poster{background-color:transparent}.urun-stream-tail,.urun-doc-panel,.urun-control-sender,.urun-event-spine{display:flex;flex-direction:column;gap:6px;font-size:12px}.urun-stream-tail-meta,.urun-doc-panel-meta{display:flex;align-items:center;gap:8px;color:var(--urun-wb-muted, #8a8a8a)}.urun-stream-tail-log,.urun-control-sender-log{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow:auto;padding:6px;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-stream-tail-time,.urun-control-sender-time,.urun-event-spine-time{color:var(--urun-wb-muted, #8a8a8a)}.urun-doc-panel-snapshot{margin:0;padding:8px;max-height:220px;overflow:auto;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-doc-patch,.urun-control-sender{display:flex;flex-direction:column;gap:6px}.urun-doc-patch-input{width:100%;resize:vertical;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-input-bg, transparent);color:inherit;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.urun-doc-patch-actions{display:flex;align-items:center;gap:8px}.urun-doc-patch-button,.urun-mic-button{cursor:pointer;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-accent, #24db49);color:var(--urun-wb-accent-fg, #04120a);padding:4px 12px;font-size:12px;font-weight:600}.urun-doc-patch-button:disabled{cursor:default;opacity:.5}.urun-doc-patch-error,.urun-mic-error{color:var(--urun-wb-danger, #e5484d)}.urun-event-spine{max-height:260px;overflow:auto}.urun-event-spine-line,.urun-control-sender-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-event-spine-kind,.urun-control-sender-dir{display:inline-block;min-width:3.5em;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-status{display:inline-flex;align-items:center;gap:6px;font-size:12px}.urun-session-status-dot{width:8px;height:8px;border-radius:50%;background:var(--urun-wb-muted, #8a8a8a)}.urun-session-status-dot[data-phase=live]{background:var(--urun-wb-accent, #24db49)}.urun-session-status-dot[data-phase=connecting],.urun-session-status-dot[data-phase=provisioning],.urun-session-status-dot[data-phase=queued]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-dot[data-phase=error]{background:var(--urun-wb-danger, #e5484d)}.urun-session-status-dot[data-phase=expired]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-detail{color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock{display:inline-flex;align-items:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-variant-numeric:tabular-nums;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock[data-urgent]{color:var(--urun-wb-danger, #e5484d)}.urun-session-ended{display:flex;align-items:center;gap:10px;font-size:13px}.urun-session-ended-new{appearance:none;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));border-radius:6px;background:var(--urun-wb-accent, #24db49);color:#000;font-size:12px;font-weight:600;padding:4px 10px;cursor:pointer}.urun-session-ended-new:hover{filter:brightness(1.1)}.urun-session-waking{display:inline-flex;align-items:baseline;gap:6px;font-size:12px}.urun-session-waking-elapsed{color:var(--urun-wb-muted, #8a8a8a);font-variant-numeric:tabular-nums}
1
+ :root{--urun-bg: #ffffff;--urun-text: #1a1a2e;--urun-border: #e2e8f0;--urun-radius: 8px;--urun-font: system-ui, -apple-system, sans-serif;--urun-progress-bg: #e2e8f0;--urun-progress-fill: #3b82f6;--urun-progress-success: #22c55e;--urun-progress-error: #ef4444;--urun-progress-height: 8px;--urun-status-thinking: #f59e0b;--urun-status-generating: #3b82f6;--urun-status-idle: #94a3b8;--urun-status-error: #ef4444;--urun-status-indicator-size: 8px;--urun-cursor-color: #3b82f6;--urun-cursor-width: 2px;--urun-metric-bg: #f8fafc;--urun-metric-label-color: #64748b;--urun-metric-value-color: #1a1a2e}.urun-progress-card{font-family:var(--urun-font);color:var(--urun-text);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px 16px;background:var(--urun-bg)}.urun-progress-label{font-size:.875rem;font-weight:500;margin-bottom:8px}.urun-progress-bar{height:var(--urun-progress-height);background:var(--urun-progress-bg);border-radius:calc(var(--urun-progress-height) / 2);overflow:hidden}.urun-progress-fill{height:100%;background:var(--urun-progress-fill);border-radius:inherit;transition:width .3s ease}.urun-progress-card[data-variant=success] .urun-progress-fill{background:var(--urun-progress-success)}.urun-progress-card[data-variant=error] .urun-progress-fill{background:var(--urun-progress-error)}.urun-progress-text{font-size:.75rem;color:var(--urun-metric-label-color);margin-top:4px;text-align:right}.urun-status-badge{display:inline-flex;align-items:center;gap:6px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-text)}.urun-status-indicator{display:inline-block;width:var(--urun-status-indicator-size);height:var(--urun-status-indicator-size);border-radius:50%;background:var(--urun-status-idle);flex-shrink:0}.urun-status-badge[data-state=thinking] .urun-status-indicator{background:var(--urun-status-thinking)}.urun-status-badge[data-state=generating] .urun-status-indicator{background:var(--urun-status-generating)}.urun-status-badge[data-state=error] .urun-status-indicator{background:var(--urun-status-error)}.urun-status-pulse{animation:urun-pulse 1.5s ease-in-out infinite}.urun-text-stream{font-family:var(--urun-font);color:var(--urun-text);white-space:pre-wrap;word-break:break-word}.urun-text-cursor{display:inline-block;width:var(--urun-cursor-width);height:1em;background:var(--urun-cursor-color);vertical-align:text-bottom;animation:urun-blink 1s step-end infinite}.urun-image-frame{margin:0;border:1px solid var(--urun-border);border-radius:var(--urun-radius);overflow:hidden;background:var(--urun-bg)}.urun-image{display:block;width:100%;height:auto}.urun-image-caption{padding:8px 12px;font-family:var(--urun-font);font-size:.875rem;color:var(--urun-metric-label-color);text-align:center}.urun-metrics-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;font-family:var(--urun-font)}.urun-metric-card{background:var(--urun-metric-bg);border:1px solid var(--urun-border);border-radius:var(--urun-radius);padding:12px;text-align:center}.urun-metric-label{font-size:.75rem;color:var(--urun-metric-label-color);margin-bottom:4px}.urun-metric-value{font-size:1.25rem;font-weight:600;color:var(--urun-metric-value-color)}.urun-component-error{font-family:var(--urun-font);padding:8px 12px;border:1px solid var(--urun-status-error);border-radius:var(--urun-radius);background:#fef2f2;color:var(--urun-status-error);font-size:.875rem}@keyframes urun-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes urun-blink{0%,to{opacity:1}50%{opacity:0}}[data-urun-video],[data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}[data-urun-video] .vjs-tech{object-fit:contain}.urun-video-live.vjs-has-started .vjs-poster,.urun-video-live.vjs-has-started .vjs-loading-spinner,.urun-video-live.vjs-has-started .vjs-big-play-button{display:none!important}.urun-video-live .vjs-poster{background-color:transparent}.urun-stream-tail,.urun-doc-panel,.urun-control-sender,.urun-event-spine{display:flex;flex-direction:column;gap:6px;font-size:12px}.urun-stream-tail-meta,.urun-doc-panel-meta{display:flex;align-items:center;gap:8px;color:var(--urun-wb-muted, #8a8a8a)}.urun-stream-tail-log,.urun-control-sender-log{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow:auto;padding:6px;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-stream-tail-time,.urun-control-sender-time,.urun-event-spine-time{color:var(--urun-wb-muted, #8a8a8a)}.urun-doc-panel-snapshot{margin:0;padding:8px;max-height:220px;overflow:auto;border-radius:6px;background:var(--urun-wb-log-bg, rgba(0, 0, 0, .25));font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-doc-patch,.urun-control-sender{display:flex;flex-direction:column;gap:6px}.urun-doc-patch-input{width:100%;resize:vertical;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-input-bg, transparent);color:inherit;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.urun-doc-patch-actions{display:flex;align-items:center;gap:8px}.urun-doc-patch-button,.urun-mic-button{cursor:pointer;border-radius:6px;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));background:var(--urun-wb-accent, #24db49);color:var(--urun-wb-accent-fg, #04120a);padding:4px 12px;font-size:12px;font-weight:600}.urun-doc-patch-button:disabled{cursor:default;opacity:.5}.urun-doc-patch-error,.urun-mic-error{color:var(--urun-wb-danger, #e5484d)}.urun-event-spine{max-height:260px;overflow:auto}.urun-event-spine-line,.urun-control-sender-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.urun-event-spine-kind,.urun-control-sender-dir{display:inline-block;min-width:3.5em;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-status{display:inline-flex;align-items:center;gap:6px;font-size:12px}.urun-session-status-dot{width:8px;height:8px;border-radius:50%;background:var(--urun-wb-muted, #8a8a8a)}.urun-session-status-dot[data-phase=live]{background:var(--urun-wb-accent, #24db49)}.urun-session-status-dot[data-phase=connecting],.urun-session-status-dot[data-phase=provisioning],.urun-session-status-dot[data-phase=queued]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-dot[data-phase=error]{background:var(--urun-wb-danger, #e5484d)}.urun-session-status-dot[data-phase=expired]{background:var(--urun-wb-warn, #ffb224)}.urun-session-status-detail{color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock{display:inline-flex;align-items:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-variant-numeric:tabular-nums;color:var(--urun-wb-muted, #8a8a8a)}.urun-session-clock[data-urgent]{color:var(--urun-wb-danger, #e5484d)}.urun-session-ended{display:flex;align-items:center;gap:10px;font-size:13px}.urun-session-ended-new{appearance:none;border:1px solid var(--urun-wb-border, rgba(128, 128, 128, .4));border-radius:6px;background:var(--urun-wb-accent, #24db49);color:#000;font-size:12px;font-weight:600;padding:4px 10px;cursor:pointer}.urun-session-ended-new:hover{filter:brightness(1.1)}.urun-session-waking{display:inline-flex;align-items:baseline;gap:6px;font-size:12px}.urun-session-waking-elapsed{color:var(--urun-wb-muted, #8a8a8a);font-variant-numeric:tabular-nums}.urun-idle-warning{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0000008c;z-index:1000}.urun-idle-warning-card{display:flex;flex-direction:column;gap:.75rem;align-items:center;padding:1.5rem 2rem;border-radius:12px;background:#111;color:#fff;border:1px solid rgba(255,255,255,.15);max-width:90vw;text-align:center}.urun-idle-warning-title{font-size:1.1rem;font-weight:600}.urun-idle-warning-copy{font-size:.9rem;opacity:.8;font-variant-numeric:tabular-nums}.urun-idle-warning[data-urgent] .urun-idle-warning-copy{color:#ff6b6b;opacity:1}.urun-idle-warning-confirm{padding:.5rem 1.25rem;border-radius:8px;border:none;background:#24db49;color:#000;font-weight:600;cursor:pointer}.urun-idle-warning-confirm:hover{filter:brightness(1.1)}
package/dist/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- "use strict";var q=Object.create;var E=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},V=(t,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of G(r))!J.call(t,s)&&s!==n&&E(t,s,{get:()=>r[s],enumerable:!(i=W(r,s))||i.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?q(Y(t)):{},V(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>V(E({},"__esModule",{value:!0}),t);var se={};K(se,{UrunVideo:()=>H});module.exports=X(se);var o=require("react"),O=Q(require("video.js")),ge=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core"),$=require("@urun-sh/core/internal");var ee=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let s=r.getState()._transport;if(!s)return;let g=s.getTrackByName?.bind(s),f=g?.(t);f&&f.readyState!=="ended"&&i(f);let j=s.on("track",h=>{let w=g?.(t);w&&w.id!==h.id||(i(h),h.addEventListener("ended",()=>{i(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var re=`
2
+ "use strict";var W=Object.create;var E=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var K=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},V=(t,r,n,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of G(r))!J.call(t,i)&&i!==n&&E(t,i,{get:()=>r[i],enumerable:!(s=q(r,i))||s.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?W(Y(t)):{},V(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>V(E({},"__esModule",{value:!0}),t);var ie={};K(ie,{UrunVideo:()=>H});module.exports=X(ie);var o=require("react"),O=Q(require("video.js")),ge=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core"),$=require("@urun-sh/core/internal");var ee=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,s]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let i=r.getState()._transport;if(!i)return;let g=i.getTrackByName?.bind(i),f=g?.(t);f&&f.readyState!=="ended"&&s(f);let j=i.on("track",h=>{let w=g?.(t);w&&w.id!==h.id||(s(h),h.addEventListener("ended",()=>{s(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var re=`
3
3
  [data-urun-video]{width:100%;height:100%}
4
4
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
5
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -7,4 +7,4 @@
7
7
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
8
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
9
  .urun-video-live .vjs-poster{background-color:transparent}
10
- `,U="urun-video-critical-css";function te(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=re,document.head.appendChild(t)}var ne=["playToggle","volumePanel","fullscreenToggle"],oe=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:i,stream:s,src:g,type:f="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:z,onPlayerReady:L,children:_}=r,P=typeof g=="string"&&g.length>0,c=!P,y=(0,o.useRef)(null),v=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),z?.(e)},[n,z]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let m=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;te(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?ne:oe}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},u=()=>{c&&m()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),v.current=a,L?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),L?.(null),v.current&&(v.current.dispose(),v.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=v.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:g,type:f}),S&&m()},[P,g,f,S,m]),(0,o.useEffect)(()=>{if(!c)return;let e=v.current;if(!e)return;let a=i??null,d=s??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,m();let u=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),m()},M=()=>{p.srcObject=null,x(!1)};return u&&(u.addEventListener("unmute",C),u.addEventListener("ended",M),u.muted||C()),()=>{u&&(u.removeEventListener("unmute",C),u.removeEventListener("ended",M))}},[c,i,s,m]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:m,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,l.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),ae=(0,o.forwardRef)(function({name:r,...n},i){let s=R(r);return(0,l.jsx)(A,{ref:i,...n,track:s})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(ae,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
10
+ `,U="urun-video-critical-css";function te(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=re,document.head.appendChild(t)}var ne=["playToggle","volumePanel","fullscreenToggle"],oe=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:s,stream:i,src:g,type:f="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:z,onPlayerReady:L,children:_}=r,P=typeof g=="string"&&g.length>0,c=!P,y=(0,o.useRef)(null),v=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),z?.(e)},[n,z]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let m=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;te(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?ne:oe}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},u=()=>{c&&m()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),v.current=a,L?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),L?.(null),v.current&&(v.current.dispose(),v.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=v.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:g,type:f}),S&&m()},[P,g,f,S,m]),(0,o.useEffect)(()=>{if(!c)return;let e=v.current;if(!e)return;let a=s??null,d=i??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,m();let u=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),m()},M=()=>{p.srcObject=null,x(!1)};return u&&(u.addEventListener("unmute",C),u.addEventListener("ended",M),u.muted||C()),()=>{u&&(u.removeEventListener("unmute",C),u.removeEventListener("ended",M))}},[c,s,i,m]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:m,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,l.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),ae=(0,o.forwardRef)(function({name:r,...n},s){let i=R(r);return(0,l.jsx)(A,{ref:s,...n,track:i})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(ae,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
package/dist/video.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- import{forwardRef as j,useCallback as V,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as q,useEffect as W}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as se}from"react";import{observePageLifecycle as ue}from"@urun-sh/core";import{TransportSession as le}from"@urun-sh/core/internal";import{jsx as pe}from"react/jsx-runtime";var L=B(null);function M(o){let r=F(L);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,i]=q(null);return W(()=>{let u=r.getState()._transport;if(!u)return;let c=u.getTrackByName?.bind(u),m=c?.(o);m&&m.readyState!=="ended"&&i(m);let w=u.on("track",v=>{let y=c?.(o);y&&y.id!==v.id||(i(v),v.addEventListener("ended",()=>{i(null)}))});return()=>{w()}},[o,r]),n}import{jsx as g,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
2
+ import{forwardRef as j,useCallback as V,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as W,useEffect as q}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as ie}from"react";import{observePageLifecycle as ue}from"@urun-sh/core";import{TransportSession as le}from"@urun-sh/core/internal";import{jsx as pe}from"react/jsx-runtime";var L=B(null);function M(o){let r=F(L);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,s]=W(null);return q(()=>{let u=r.getState()._transport;if(!u)return;let c=u.getTrackByName?.bind(u),m=c?.(o);m&&m.readyState!=="ended"&&s(m);let w=u.on("track",v=>{let y=c?.(o);y&&y.id!==v.id||(s(v),v.addEventListener("ended",()=>{s(null)}))});return()=>{w()}},[o,r]),n}import{jsx as g,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
3
3
  [data-urun-video]{width:100%;height:100%}
4
4
  [data-urun-video] .video-js,[data-urun-video] .vjs-tech{width:100%;height:100%}
5
5
  [data-urun-video] .vjs-tech{object-fit:contain}
@@ -7,4 +7,4 @@ import{forwardRef as j,useCallback as V,useEffect as E,useImperativeHandle as G,
7
7
  .urun-video-live.vjs-has-started .vjs-loading-spinner,
8
8
  .urun-video-live.vjs-has-started .vjs-big-play-button{display:none !important}
9
9
  .urun-video-live .vjs-poster{background-color:transparent}
10
- `,I="urun-video-critical-css";function Q(){if(typeof document>"u"||document.getElementById(I))return;let o=document.createElement("style");o.id=I,o.textContent=K,document.head.appendChild(o)}var X=["playToggle","volumePanel","fullscreenToggle"],Z=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],O=j(function(r,n){let{track:i,stream:u,src:c,type:m="video/mp4",className:w,videoClassName:v,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),f=N(null),[D,h]=Y(!1),_=V(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=V(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(s=>{(s instanceof Error?s.name:String(s))!=="AbortError"&&h(!0)})},[k]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;Q(),k&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=J(e,{controls:A,autoplay:x,muted:k,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?X:Z}});d&&t.addClass("urun-video-live");let s=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),s()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),f.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),f.current&&(f.current.dispose(),f.current=null)}},[d]),E(()=>{if(!S)return;let e=f.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:m}),x&&p()},[S,c,m,x,p]),E(()=>{if(!d)return;let e=f.current;if(!e)return;let t=i??null,s=u??null;!s&&t&&(s=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!s){l.srcObject=null,h(!1);return}l.srcObject=s,p();let a=s.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},z=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",z),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",z))}},[d,i,u,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[g("video",{ref:_,className:["video-js","vjs-default-skin",v].filter(Boolean).join(" "),playsInline:!0}),D&&g("button",{type:"button",onClick:p,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:U("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[g("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:g("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},i){let u=M(r);return g(O,{ref:i,...n,track:u})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?g($,{ref:n,...r,name:r.name}):g(O,{ref:n,...r})});export{ee as UrunVideo};
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:s,stream:u,src:c,type:m="video/mp4",className:w,videoClassName:v,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),f=N(null),[D,h]=Y(!1),_=V(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=V(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(i=>{(i instanceof Error?i.name:String(i))!=="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 i=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),i()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),f.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),f.current&&(f.current.dispose(),f.current=null)}},[d]),E(()=>{if(!S)return;let e=f.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:m}),x&&p()},[S,c,m,x,p]),E(()=>{if(!d)return;let e=f.current;if(!e)return;let t=s??null,i=u??null;!i&&t&&(i=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!i){l.srcObject=null,h(!1);return}l.srcObject=i,p();let a=i.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},z=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",z),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",z))}},[d,s,u,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[g("video",{ref:_,className:["video-js","vjs-default-skin",v].filter(Boolean).join(" "),playsInline:!0}),D&&g("button",{type:"button",onClick:p,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:U("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[g("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:g("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},s){let u=M(r);return g(O,{ref:s,...n,track:u})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?g($,{ref:n,...r,name:r.name}):g(O,{ref:n,...r})});export{ee as UrunVideo};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.10",
3
+ "version": "0.2.13",
4
4
  "description": "React bindings for the urun TypeScript SDK",
5
5
  "repository": {
6
6
  "type": "git",
@@ -53,7 +53,7 @@
53
53
  "dev": "tsup --watch"
54
54
  },
55
55
  "peerDependencies": {
56
- "@urun-sh/core": "^0.2.10",
56
+ "@urun-sh/core": "^0.2.13",
57
57
  "@workos-inc/authkit-nextjs": "^3.0.0",
58
58
  "@workos-inc/authkit-react": "^0.15.0 || ^0.16.0",
59
59
  "next": "^15.0.0 || ^16.0.0",