@urun-sh/react 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus } from '@urun-sh/core';
5
- export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase } from '@urun-sh/core';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, RuntimeAvailability } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
8
8
 
@@ -390,6 +390,8 @@ interface UrunVoiceSessionSource {
390
390
  }): Promise<void>;
391
391
 
392
392
  readonly status?: SessionStatus;
393
+
394
+ onRecovery?(hook: () => void): () => void;
393
395
  }
394
396
 
395
397
  interface UrunVoiceHandle {
@@ -708,6 +710,7 @@ interface UrunEventSpineProps {
708
710
  declare function UrunEventSpine({ session, trackNames, docKeys, cap, className, }: UrunEventSpineProps): react_jsx_runtime.JSX.Element;
709
711
 
710
712
  declare function useSessionPhase(session: WorkbenchSession | null): SessionPhase | null;
713
+
711
714
  interface UrunSessionStatusProps {
712
715
  session: WorkbenchSession | null;
713
716
  className?: string;
@@ -720,9 +723,37 @@ interface UrunSessionGateProps {
720
723
  children: ReactNode;
721
724
 
722
725
  fallback?: (phase: SessionPhase | null) => ReactNode;
726
+
727
+ onStartOver?: () => void;
728
+ className?: string;
729
+ }
730
+
731
+ declare function UrunSessionGate({ session, children, fallback, onStartOver, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
732
+
733
+ interface SessionWake {
734
+
735
+ waking: boolean;
736
+
737
+ phase: SessionPhase | null;
738
+
739
+ state?: RuntimeAvailability['state'];
740
+
741
+ reason?: string;
742
+
743
+ since?: number;
744
+
745
+ seconds: number;
746
+ }
747
+
748
+ declare function useSessionWake(session: WorkbenchSession | null): SessionWake;
749
+
750
+ interface UrunSessionWakingProps {
751
+ session: WorkbenchSession | null;
752
+
753
+ render?: (wake: SessionWake) => ReactNode;
723
754
  className?: string;
724
755
  }
725
756
 
726
- declare function UrunSessionGate({ session, children, fallback, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
757
+ declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
727
758
 
728
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
759
+ 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, 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 WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
4
- import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus } from '@urun-sh/core';
5
- export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase } from '@urun-sh/core';
4
+ import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, RuntimeAvailability } from '@urun-sh/core';
5
+ export { App as AppInterface, AppOptions, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
6
6
  import { ZodSchema, z } from 'zod';
7
7
  import { StoreApi } from 'zustand/vanilla';
8
8
 
@@ -390,6 +390,8 @@ interface UrunVoiceSessionSource {
390
390
  }): Promise<void>;
391
391
 
392
392
  readonly status?: SessionStatus;
393
+
394
+ onRecovery?(hook: () => void): () => void;
393
395
  }
394
396
 
395
397
  interface UrunVoiceHandle {
@@ -708,6 +710,7 @@ interface UrunEventSpineProps {
708
710
  declare function UrunEventSpine({ session, trackNames, docKeys, cap, className, }: UrunEventSpineProps): react_jsx_runtime.JSX.Element;
709
711
 
710
712
  declare function useSessionPhase(session: WorkbenchSession | null): SessionPhase | null;
713
+
711
714
  interface UrunSessionStatusProps {
712
715
  session: WorkbenchSession | null;
713
716
  className?: string;
@@ -720,9 +723,37 @@ interface UrunSessionGateProps {
720
723
  children: ReactNode;
721
724
 
722
725
  fallback?: (phase: SessionPhase | null) => ReactNode;
726
+
727
+ onStartOver?: () => void;
728
+ className?: string;
729
+ }
730
+
731
+ declare function UrunSessionGate({ session, children, fallback, onStartOver, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
732
+
733
+ interface SessionWake {
734
+
735
+ waking: boolean;
736
+
737
+ phase: SessionPhase | null;
738
+
739
+ state?: RuntimeAvailability['state'];
740
+
741
+ reason?: string;
742
+
743
+ since?: number;
744
+
745
+ seconds: number;
746
+ }
747
+
748
+ declare function useSessionWake(session: WorkbenchSession | null): SessionWake;
749
+
750
+ interface UrunSessionWakingProps {
751
+ session: WorkbenchSession | null;
752
+
753
+ render?: (wake: SessionWake) => ReactNode;
723
754
  className?: string;
724
755
  }
725
756
 
726
- declare function UrunSessionGate({ session, children, fallback, className, }: UrunSessionGateProps): react_jsx_runtime.JSX.Element;
757
+ declare function UrunSessionWaking({ session, render, className }: UrunSessionWakingProps): react_jsx_runtime.JSX.Element | null;
727
758
 
728
- export { type ChatMessage, type ChatRole, ComponentRenderer, type CreateDocStoreOptions, DEFAULT_CAMERA_CONSTRAINTS, DEFAULT_LOG_CAP, DEFAULT_VOICE_CONSTRAINTS, type DeepPartial, type DocPatch, DocPatchForm, type DocState, type DocStore, ImageFrame, ImageFrameSchema, type JsonObjectParse, MetricsPanel, MetricsPanelSchema, ProgressCard, ProgressCardSchema, type ReactApp, type ReactSession, type ReactSessionDocument, type ReactSessionStream, type RegisteredComponent, type RequestCapableSession, type RequestStream, type SessionRequestOptions, type SpineEntry, StatusBadge, StatusBadgeSchema, type StreamMessageEntry, TextStream, TextStreamSchema, type UrunAccessToken, type UrunAccessTokenProvider, UrunAudio, type UrunAudioHandle, type UrunAudioLevel, type UrunAudioProps, type UrunAudioSessionSource, type UrunAudioStreamSource, type UrunAuthContextValue, type UrunAuthMode, UrunAuthProvider, type UrunAuthProviderProps, UrunCamera, type UrunCameraFacing, type UrunCameraHandle, type UrunCameraProps, type UrunCameraSessionSource, type UrunCameraStreamSource, UrunControlSender, type UrunControlSenderProps, UrunDocPanel, type UrunDocPanelProps, UrunErrorBoundary, UrunEventSpine, type UrunEventSpineProps, UrunJwtProvider, UrunProvider, UrunSessionGate, type UrunSessionGateProps, UrunSessionStatus, type UrunSessionStatusProps, UrunStreamTail, type UrunStreamTailProps, UrunVoice, type UrunVoiceHandle, type UrunVoiceProps, type UrunVoiceSessionSource, type UrunVoiceStreamSource, type UseChatOptions, type UseChatResult, type UseCompletionOptions, type UseCompletionResult, type UseRequestOptions, type UseRequestResult, type UseSessionDocResult, type UseStreamMessagesOptions, type UseUrunAudioLevelOptions, type WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
759
+ 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, 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 WorkbenchDocSource, type WorkbenchSession, type WorkbenchStreamSource, authMode, createDocStore, formatPayload, getUrunAudioContext, parseJsonObject, pushCapped, registerComponent, resumeUrunAudioContext, urunPublicEnv, useApp, useChat, useCompletion, useDocStore, useImageFrame, useMetricsPanel, useProgressCard, useRequest, useSessionDoc, useSessionPhase, useSessionTrack, useSessionWake, useStatusBadge, useStreamMessages, useTextStream, useUrunAudioLevel, useUrunAuth, usesWorkOSAuth };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var ze=Object.defineProperty;var ur=Object.getOwnPropertyDescriptor;var cr=Object.getOwnPropertyNames;var lr=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var r in t)ze(e,r,{get:t[r],enumerable:!0})},pr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of cr(t))!lr.call(e,o)&&o!==r&&ze(e,o,{get:()=>t[o],enumerable:!(n=ur(t,o))||n.enumerable});return e};var mr=e=>pr(ze({},"__esModule",{value:!0}),e);var Ur={};dr(Ur,{ComponentRenderer:()=>At,DEFAULT_CAMERA_CONSTRAINTS:()=>ut,DEFAULT_LOG_CAP:()=>Q,DEFAULT_VOICE_CONSTRAINTS:()=>at,DocPatchForm:()=>Ce,ImageFrame:()=>It,ImageFrameSchema:()=>Ot,MetricsPanel:()=>Lt,MetricsPanelSchema:()=>qt,ProgressCard:()=>wt,ProgressCardSchema:()=>Et,StatusBadge:()=>Mt,StatusBadgeSchema:()=>_t,TextStream:()=>Dt,TextStreamSchema:()=>Nt,UrunAudio:()=>we,UrunAuthProvider:()=>Xe,UrunCamera:()=>$t,UrunControlSender:()=>er,UrunDocPanel:()=>Yt,UrunErrorBoundary:()=>se,UrunEventSpine:()=>tr,UrunJwtProvider:()=>ft,UrunProvider:()=>St,UrunSessionGate:()=>or,UrunSessionStatus:()=>nr,UrunStreamTail:()=>Zt,UrunVoice:()=>Vt,authMode:()=>fe,createDocStore:()=>De,describeSessionPhase:()=>sr.describeSessionPhase,formatPayload:()=>pe,getUrunAudioContext:()=>ke,parseJsonObject:()=>Ie,pushCapped:()=>G,registerComponent:()=>Rt,resumeUrunAudioContext:()=>Ee,urunPublicEnv:()=>J,useApp:()=>vt,useChat:()=>Ut,useCompletion:()=>Tt,useDocStore:()=>de,useImageFrame:()=>rt,useMetricsPanel:()=>nt,useProgressCard:()=>Qe,useRequest:()=>yt,useSessionDoc:()=>Kt,useSessionPhase:()=>We,useSessionTrack:()=>Jt,useStatusBadge:()=>et,useStreamMessages:()=>Le,useTextStream:()=>tt,useUrunAudioLevel:()=>jt,useUrunAuth:()=>Ue,usesWorkOSAuth:()=>pt});module.exports=mr(Ur);var ie=require("react");var lt=require("react"),me=require("react/jsx-runtime"),se=class extends lt.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,me.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,me.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,me.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var dt=require("react"),be=(0,dt.createContext)(null);function te(e){return e&&e.trim()?e.trim():void 0}function J(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return te(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return te(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return te(typeof process<"u"?process.env?.[e]:void 0)}}function fe(){let e=J("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||J("VERCEL_ENV")==="production"?"workos":J("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function pt(){return fe()==="workos"}var ae=require("react"),gt=require("react/jsx-runtime"),mt=(0,ae.createContext)(null);function Xe({getAccessToken:e,children:t}){let r=(0,ae.useMemo)(()=>({getAccessToken:e}),[e]);return(0,gt.jsx)(mt.Provider,{value:r,children:t})}var ft=Xe;function Ue(){return(0,ae.useContext)(mt)}var xe=require("react/jsx-runtime");function St({baseUrl:e,orgId:t,appId:r,jwt:n,authProvider:o,fallback:s,children:i}){let[l,c]=(0,ie.useState)(),a=Ue(),m=J("NEXT_PUBLIC_SESSION_TOKEN")??J("NEXT_PUBLIC_URUN_JWT"),d=fe(),p=d==="workos"&&!n,U=n??(d==="jwt"?m:void 0)??l,k=o??J("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),T=p&&!U,y=(0,ie.useMemo)(()=>({appId:r,baseUrl:e,orgId:t,jwt:U,getAccessToken:p?a?.getAccessToken:void 0,authProvider:k}),[r,a,e,k,U,t,p]);return(0,ie.useEffect)(()=>{if(!p||!a)return;let f=!1,g=a;async function h(){try{let x=await g.getAccessToken();f||c(x??void 0)}catch{f||c(void 0)}}h();let C=window.setInterval(()=>{h()},6e4);return()=>{f=!0,window.clearInterval(C)}},[a,p]),(0,xe.jsx)(se,{fallback:s,children:T?(0,xe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,xe.jsx)(be.Provider,{value:y,children:i})})}var z=require("react"),ht=require("@urun-sh/core");function fr(e,t){return`${e}:${JSON.stringify(t??{})}`}var Ge=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,n=>r(n))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),n=this._notify;return{append(o){r.append(o),n()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),n()})}}dispose(){this._unsubscribeChange()}},Ke=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Ze=class{constructor(t,r){this._session=t;this._notify=r;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(t){let r=this._docs.get(t);return r||(r=new Ge(this._session.doc(t),this._notify),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ke(this._session.stream(t),this._notify),this._streams.set(t,r)),r}disconnect(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function vt(){let e=(0,z.useContext)(be);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,z.useReducer)(o=>o+1,0),r=(0,z.useRef)(new Map),n=(0,z.useMemo)(()=>(0,ht.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return(0,z.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return i=>{let l=fr(s,i),c=r.current.get(l);if(c&&!c.disposed)return c;let a=new Ze(n[s](i),t);return r.current.set(l,a),a}}}),[n])}var O=require("react");function ue(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function gr(e){return e instanceof Error?e:new Error(String(e))}function yt(e,t){let r=(0,O.useMemo)(()=>ue(e),[e]),[n,o]=(0,O.useState)(void 0),[s,i]=(0,O.useState)(null),[l,c]=(0,O.useState)(!1),a=(0,O.useRef)(t);a.current=t;let m=(0,O.useRef)(0),d=(0,O.useRef)(null),p=(0,O.useRef)(!0);(0,O.useEffect)(()=>(p.current=!0,()=>{p.current=!1,d.current?.abort()}),[]);let U=(0,O.useCallback)(async y=>{d.current?.abort();let f=new AbortController;d.current=f;let g=++m.current,h=()=>p.current&&m.current===g;h()&&(c(!0),i(null));try{let C=await r.request(y,{...a.current,signal:f.signal});return h()&&(o(C),c(!1),a.current?.onSuccess?.(C)),C}catch(C){let x=gr(C);throw h()&&(i(x),c(!1),a.current?.onError?.(x)),x}},[r]),k=(0,O.useCallback)(y=>{U(y).catch(()=>{})},[U]),T=(0,O.useCallback)(()=>{m.current++,d.current?.abort(),d.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:k,mutateAsync:U,data:n,error:s,isPending:l,reset:T}}var I=require("react");function kt(e){return e instanceof Error?e:new Error(String(e))}var Sr=e=>typeof e=="string"?e:String(e);function Tt(e,t){let r=(0,I.useMemo)(()=>ue(e),[e]),[n,o]=(0,I.useState)(""),[s,i]=(0,I.useState)(!1),[l,c]=(0,I.useState)(null),a=(0,I.useRef)(t);a.current=t;let m=(0,I.useRef)(0),d=(0,I.useRef)(null),p=(0,I.useRef)(!0);(0,I.useEffect)(()=>(p.current=!0,()=>{p.current=!1,d.current?.cancel(),d.current=null}),[]);let U=(0,I.useCallback)(()=>{m.current++,d.current?.cancel(),d.current=null,p.current&&i(!1)},[]),k=(0,I.useCallback)(async T=>{d.current?.cancel();let y=++m.current,f=()=>p.current&&m.current===y,g=a.current,h=g?.parseChunk??Sr,C=g?.buildPayload??(S=>({prompt:S}));f()&&(o(""),c(null),i(!0));let{parseChunk:x,buildPayload:j,onFinish:V,onError:u,...v}=g??{},P="",A;try{A=r.requestStream(C(T),v),d.current=A}catch(S){let E=kt(S);f()&&(c(E),i(!1),g?.onError?.(E));return}try{for await(let S of A){if(m.current!==y)break;P+=h(S),f()&&o(P)}f()&&(i(!1),g?.onFinish?.(P))}catch(S){let E=kt(S);f()&&(c(E),i(!1),g?.onError?.(E))}finally{d.current===A&&(d.current=null)}},[r]);return{completion:n,complete:k,stop:U,isStreaming:s,error:l}}var N=require("react");function Ct(e){return e instanceof Error?e:new Error(String(e))}var hr=e=>typeof e=="string"?e:String(e),bt=0;function Ye(e){return bt+=1,`${e}-${bt}`}function Ut(e,t){let r=(0,N.useMemo)(()=>ue(e),[e]),[n,o]=(0,N.useState)(()=>(t?.initialMessages??[]).map(h=>({id:h.id??Ye("msg"),role:h.role,content:h.content}))),[s,i]=(0,N.useState)(""),[l,c]=(0,N.useState)(!1),[a,m]=(0,N.useState)(null),d=(0,N.useRef)(t);d.current=t;let p=(0,N.useRef)(n);p.current=n;let U=(0,N.useRef)(s);U.current=s;let k=(0,N.useRef)(0),T=(0,N.useRef)(null),y=(0,N.useRef)(!0);(0,N.useEffect)(()=>(y.current=!0,()=>{y.current=!1,T.current?.cancel(),T.current=null}),[]);let f=(0,N.useCallback)(()=>{k.current++,T.current?.cancel(),T.current=null,y.current&&c(!1)},[]),g=(0,N.useCallback)(async h=>{let C=h===void 0,x=(C?U.current:h)??"";if(!x.trim())return;T.current?.cancel();let V=++k.current,u=()=>y.current&&k.current===V,v=d.current,P=v?.parseChunk??hr,A={id:Ye("msg"),role:"user",content:x},S={id:Ye("msg"),role:"assistant",content:""},E=[...p.current,A].map(M=>({role:M.role,content:M.content})),b=[...p.current,A,S];p.current=b,o(b),C&&i(""),m(null),c(!0);let $=v?.buildPayload??(M=>({messages:M})),{initialMessages:He,parseChunk:$e,buildPayload:je,onFinish:Je,onError:ar,..._}=v??{},q=M=>{o(W=>W.map(F=>F.id===S.id?{...F,content:M}:F))},Y="",L;try{L=r.requestStream($(E),_),T.current=L}catch(M){let W=Ct(M);u()&&(m(W),c(!1),v?.onError?.(W));return}try{for await(let M of L){if(k.current!==V)break;Y+=P(M),u()&&q(Y)}u()&&(c(!1),v?.onFinish?.({...S,content:Y}))}catch(M){let W=Ct(M);u()&&(m(W),c(!1),v?.onError?.(W))}finally{T.current===L&&(T.current=null)}},[r]);return{messages:n,input:s,setInput:i,sendMessage:g,stop:f,isStreaming:l,error:a}}var xt=new Map;function Rt(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);xt.set(e,{component:t,schema:r})}function Pt(e,t){let r=xt.get(e);if(!r)return{error:`Unknown component: "${e}"`};let n=r.schema.safeParse(t);return n.success?{Component:r.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}var re=require("react/jsx-runtime");function At({name:e,props:t,fallback:r}){let n=Pt(e,t);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),r?(0,re.jsx)(re.Fragment,{children:r}):(0,re.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,re.jsx)("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return(0,re.jsx)(o,{...n.validatedProps})}var ce=require("zod"),ne=require("react/jsx-runtime"),Et=ce.z.object({step:ce.z.number().min(0),total:ce.z.number().min(1),label:ce.z.string().optional(),variant:ce.z.enum(["default","success","error"]).default("default")});function Qe(e){let{step:t,total:r,label:n,variant:o="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:n,variant:o,percentage:s,isComplete:i}}function wt(e){let{step:t,total:r,label:n,variant:o,percentage:s}=Qe(e);return(0,ne.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[n&&(0,ne.jsx)("div",{className:"urun-progress-label",children:n}),(0,ne.jsx)("div",{className:"urun-progress-bar",children:(0,ne.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ne.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Re=require("zod"),ge=require("react/jsx-runtime"),_t=Re.z.object({state:Re.z.enum(["thinking","generating","idle","error"]),message:Re.z.string().optional()}),vr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function et(e){let{state:t,message:r}=e,n=t==="thinking"||t==="generating",o=r??vr[t]??t;return{state:t,message:o,isActive:n}}function Mt(e){let{state:t,message:r,isActive:n}=et(e);return(0,ge.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,ge.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,ge.jsx)("span",{className:"urun-status-message",children:r})]})}var Se=require("react"),Pe=require("zod"),he=require("react/jsx-runtime"),Nt=Pe.z.object({text:Pe.z.string(),streaming:Pe.z.boolean().default(!1)});function tt(e){let{text:t,streaming:r=!1}=e,n=t.length===0;return{text:t,streaming:r,isEmpty:n}}function Dt(e){let{text:t,streaming:r}=tt(e),n=(0,Se.useRef)(null),o=(0,Se.useRef)(0);return(0,Se.useEffect)(()=>{let s=n.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),(0,he.jsxs)("div",{className:"urun-text-stream",children:[(0,he.jsx)("span",{ref:n,className:"urun-text-content"}),r&&(0,he.jsx)("span",{className:"urun-text-cursor"})]})}var ve=require("zod"),ye=require("react/jsx-runtime"),Ot=ve.z.object({src:ve.z.string().url(),alt:ve.z.string().optional(),caption:ve.z.string().optional()});function rt(e){let{src:t,alt:r,caption:n}=e;return{src:t,alt:r??"",caption:n}}function It(e){let{src:t,alt:r,caption:n}=rt(e);return(0,ye.jsxs)("figure",{className:"urun-image-frame",children:[(0,ye.jsx)("img",{className:"urun-image",src:t,alt:r}),n&&(0,ye.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var X=require("zod"),le=require("react/jsx-runtime"),qt=X.z.object({metrics:X.z.array(X.z.object({label:X.z.string(),value:X.z.union([X.z.string(),X.z.number()]),unit:X.z.string().optional()}))});function nt(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Lt(e){let{metrics:t}=nt(e);return(0,le.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,n)=>(0,le.jsxs)("div",{className:"urun-metric-card",children:[(0,le.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,le.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},n))})}var w=require("react");var Ae=null;function yr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ke(){if(Ae)return Ae;let e=yr();return e?(Ae=new e,Ae):null}function Ee(){let e=ke();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Bt=require("react/jsx-runtime"),kr=1e3,Ft=200;function ot(...e){console.debug("[urun-audio]",...e)}var we=(0,w.forwardRef)(function(t,r){let{session:n,stream:o="audio",track:s,controls:i=!1,className:l,onTrack:c,onUnlockChange:a,onAudioElement:m}=t,d=(0,w.useRef)(null),p=(0,w.useRef)(null),U=(0,w.useRef)(null),k=(0,w.useRef)(null),T=(0,w.useRef)(c);T.current=c;let y=(0,w.useRef)(a);y.current=a;let f=(0,w.useCallback)(u=>{U.current!==u&&(U.current=u,y.current?.(u))},[]),g=(0,w.useCallback)(()=>{if(typeof MediaStream>"u")return null;p.current||(p.current=new MediaStream);let u=d.current;return u&&u.srcObject!==p.current&&(u.srcObject=p.current),p.current},[]),h=(0,w.useCallback)(u=>{let v=d.current;if(!v)return;let P=v.play();!P||typeof P.then!="function"||P.then(()=>{v.muted||f(!0)}).catch(A=>{let S=A instanceof Error?A.name:String(A);if(S==="AbortError"){ot(`play() aborted (${u}); retrying in ${Ft}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,h(`${u}:retry`)},Ft);return}if(S==="NotAllowedError"){ot(`play() blocked pending a user gesture (${u})`),f(!1);return}ot(`play() failed (${u})`,A)})},[f]),C=(0,w.useCallback)(u=>{let v=g();if(v){for(let P of v.getAudioTracks())P!==u&&v.removeTrack(P);u&&!v.getAudioTracks().includes(u)&&v.addTrack(u),u&&h("track-attach"),T.current?.(u)}},[g,h]),x=(0,w.useCallback)(()=>{let u=d.current;u&&(g(),u.muted=!1,h("gesture"),Ee(),f(!0))},[g,h,f]);(0,w.useImperativeHandle)(r,()=>({unlock:x,get unlocked(){return U.current===!0},get element(){return d.current}}),[x]);let j=(0,w.useCallback)(u=>{d.current=u,u&&(u.setAttribute("playsinline",""),u.setAttribute("webkit-playsinline",""),g()),m?.(u)},[g,m]),V=s!==void 0;return(0,w.useEffect)(()=>{if(V){C(s??null);return}if(!n)return;let u=n.stream(o),v=()=>{let b=p.current;return b?b.getAudioTracks()[0]??null:null},P=b=>{if(b!==v()&&(C(b),b)){let $=()=>{v()===b&&C(null)};b.addEventListener("ended",$)}},A=u.track;A&&A.readyState==="live"&&P(A);let S=u.on("track",b=>{b&&b.readyState!=="live"||P(b)}),E=setInterval(()=>{let b=u.track;b&&b.readyState==="live"&&P(b)},kr);return()=>{S(),clearInterval(E)}},[n,o,V,s,C]),(0,w.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,Bt.jsx)("audio",{ref:j,className:l,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var D=require("react"),st=require("@urun-sh/core");var Wt=require("react/jsx-runtime"),at={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Tr(...e){console.debug("[urun-voice]",...e)}var Vt=(0,D.forwardRef)(function(t,r){let{session:n,stream:o="audio",constraints:s=at,connectTimeoutMs:i,attempts:l=3,retryDelayMs:c=1500,onActiveChange:a,onError:m,onMicStream:d,onTrack:p,onUnlockChange:U}=t,k=(0,D.useRef)(null),T=(0,D.useRef)(null),y=(0,D.useRef)(!1),f=(0,D.useRef)(a);f.current=a;let g=(0,D.useRef)(m);g.current=m;let h=(0,D.useRef)(d);h.current=d;let C=(0,D.useCallback)(u=>{y.current!==u&&(y.current=u,f.current?.(u))},[]),x=(0,D.useCallback)(()=>{let u=T.current;if(u){for(let v of u.getTracks())v.stop();T.current=null,h.current?.(null)}},[]),j=(0,D.useCallback)(async()=>{x(),C(!1),await n.stream(o).detach().catch(()=>{})},[n,o,x,C]),V=(0,D.useCallback)(async()=>{k.current?.unlock();let u;try{u=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(S){let E=(0,st.sessionFailureFromMediaError)(S,n.status);throw g.current?.(E),E}x(),T.current=u,h.current?.(u);let v=u.getAudioTracks()[0];if(!v){x();let S=(0,st.sessionFailureFromMediaError)(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw g.current?.(S),S}n.connect?.();let P;for(let S=1;S<=l;S++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(o).attach(v),C(!0);return}catch(E){P=E,Tr(`start attempt ${S}/${l} failed`,E),S<l&&await new Promise(b=>setTimeout(b,c))}x(),C(!1);let A=P instanceof Error?P:new Error(String(P??"voice start failed"));throw g.current?.(A),A},[n,o,s,i,l,c,x,C]);return(0,D.useImperativeHandle)(r,()=>({start:V,stop:j,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return T.current},get audio(){return k.current}}),[V,j]),(0,D.useEffect)(()=>x,[x]),(0,Wt.jsx)(we,{ref:k,session:n,stream:o,onTrack:p,onUnlockChange:U})});var it=require("@urun-sh/core"),R=require("react"),_e=require("react/jsx-runtime"),ut={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ht(...e){console.debug("[urun-camera]",...e)}var $t=(0,R.forwardRef)(function(t,r){let{session:n,stream:o="video",constraints:s,facingMode:i="environment",mirror:l="auto",connectTimeoutMs:c,preview:a=!0,className:m,videoClassName:d,onActiveChange:p,onError:U,onStream:k,onTrack:T,children:y}=t,f=(0,R.useRef)(null),g=(0,R.useRef)(null),h=(0,R.useRef)(null),C=(0,R.useRef)(!1),x=(0,R.useRef)(i),[j,V]=(0,R.useState)(i),u=(0,R.useRef)(p);u.current=p;let v=(0,R.useRef)(U);v.current=U;let P=(0,R.useRef)(k);P.current=k;let A=(0,R.useRef)(T);A.current=T;let S=(0,R.useCallback)(_=>{C.current!==_&&(C.current=_,u.current?.(_))},[]),E=(0,R.useCallback)(_=>{let q=f.current;q&&(q.muted=!0,q.srcObject=_,_&&q.play()?.catch?.(Y=>Ht("preview play() failed",Y)))},[]),b=(0,R.useCallback)(()=>{h.current?.(),h.current=null;let _=g.current;if(_){for(let q of _.getTracks())q.stop();g.current=null,P.current?.(null),A.current?.(null)}E(null)},[E]),$=(0,R.useCallback)(async _=>{let q=g.current,Y=h.current,L;try{L=await navigator.mediaDevices.getUserMedia({video:{...ut,...s,facingMode:_},audio:!1})}catch(F){let ee=(0,it.sessionFailureFromMediaError)(F,n.status);throw v.current?.(ee),ee}let M=L.getVideoTracks()[0];if(!M){for(let ee of L.getTracks())ee.stop();let F=(0,it.sessionFailureFromMediaError)(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw v.current?.(F),F}g.current=L,x.current=_,V(_),E(L),P.current?.(L);let W=()=>{g.current===L&&(Ht("camera track ended (device removed or permission revoked)"),b(),S(!1))};M.addEventListener("ended",W),h.current=()=>M.removeEventListener("ended",W);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(M)}catch(F){M.removeEventListener("ended",W);for(let ir of L.getTracks())ir.stop();g.current===L&&(g.current=q,h.current=Y,E(q),P.current?.(q));let ee=F instanceof Error?F:new Error(String(F));throw v.current?.(ee),ee}if(q&&q!==L){Y?.();for(let F of q.getTracks())F.stop()}A.current?.(M),S(!0)},[n,o,s,c,E,b,S]),He=(0,R.useCallback)(_=>$(_?.facingMode??x.current),[$]),$e=(0,R.useCallback)(async _=>{C.current&&x.current===_||await $(_)},[$]),je=(0,R.useCallback)(()=>$(x.current==="environment"?"user":"environment"),[$]),Je=(0,R.useCallback)(async()=>{b(),S(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,b,S]);return(0,R.useImperativeHandle)(r,()=>({start:He,stop:Je,flip:je,setFacingMode:$e,get active(){return C.current},get facingMode(){return x.current},get stream(){return g.current},get element(){return f.current}}),[He,Je,je,$e]),(0,R.useEffect)(()=>b,[b]),a?(0,_e.jsxs)("div",{className:m,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[(0,_e.jsx)("video",{ref:f,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(l==="auto"?j==="user":l)?{transform:"scaleX(-1)"}:{}}}),y]}):null});var Me=require("react");var ct={level:0,speaking:!1};function jt(e,t={}){let{fftSize:r=512,intervalMs:n=100,speakingThreshold:o=.02}=t,[s,i]=(0,Me.useState)(ct);return(0,Me.useEffect)(()=>{if(!e){i(ct);return}let l=ke();if(!l||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let a,m;try{a=l.createMediaStreamSource(c),m=l.createAnalyser(),m.fftSize=r,a.connect(m)}catch{return}let d=new Uint8Array(m.fftSize),U=setInterval(()=>{m.getByteTimeDomainData(d);let k=0;for(let y=0;y<d.length;y++){let f=(d[y]-128)/128;k+=f*f}let T=Math.sqrt(k/d.length);i(y=>{let f=T>o;return Math.abs(y.level-T)<.005&&y.speaking===f?y:{level:T,speaking:f}})},n);return()=>{clearInterval(U),a.disconnect(),i(ct)}},[e,r,n,o]),s}var Ne=require("react");function Jt(e,t){let[r,n]=(0,Ne.useState)(null);return(0,Ne.useEffect)(()=>{if(!e||!t){n(null);return}let o=e.stream(t);return n(o.track),o.on("track",n)},[e,t]),r}var Gt=require("react");var Oe=require("react");var zt=require("zustand/vanilla"),Xt=require("zustand"),Cr=()=>{};function De(e,t={}){let r=a=>{e?.set(a)},n=()=>e?e.get()??{}:{},o=(0,zt.createStore)(()=>({doc:n(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let a of s)a();s=null}},l=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",a=>o.setState({doc:a})),e.onSynced(()=>o.setState({synced:!0}))]),i):Cr,c=(a=>(0,Xt.useStore)(o,a));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:l,unbind:i}),t.bind!==!1&&l(),c}function de(e,t){let r=(0,Oe.useMemo)(()=>De(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Oe.useEffect)(()=>r.bind(),[r]),r}function Kt(e,t,r){let o=de(e,t)(r??(l=>l)),s=(0,Gt.useCallback)(l=>{e&&t&&e.doc(t).set(l)},[e,t]);if(r)return o;let i=o;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var qe=require("react");var Q=200;function G(e,t,r=200){let n=[...e,t];return n.length>r?n.slice(n.length-r):n}function pe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ie(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Le(e,t,r={}){let n=r.cap??200,[o,s]=(0,qe.useState)([]);return(0,qe.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,l=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await l.next();if(!i||c.done)break;s(a=>G(a,{at:Date.now(),payload:c.value},n))}})(),()=>{i=!1,l.return?.()}},[e,t,n]),o}var H=require("react/jsx-runtime");function Zt({session:e,name:t,cap:r,className:n}){let o=Le(e,t,{cap:r});return(0,H.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,H.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,H.jsx)("code",{children:t}),(0,H.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,H.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,H.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,H.jsx)("code",{children:t})," messages\u2026"]}):o.map((s,i)=>(0,H.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,H.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pe(s.payload)]},`${s.at}-${i}`))})]})}var Te=require("react");var B=require("react/jsx-runtime");function Ce({placeholder:e,buttonLabel:t,disabled:r,onApply:n}){let[o,s]=(0,Te.useState)(""),[i,l]=(0,Te.useState)(null),c=(0,Te.useCallback)(()=>{let a=Ie(o);if(!a.ok){l(a.error);return}l(null),n(a.value,o.trim()),s("")},[o,n]);return(0,B.jsxs)("div",{className:"urun-doc-patch",children:[(0,B.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:a=>s(a.target.value),placeholder:e,rows:3}),(0,B.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,B.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:c,children:t}),i?(0,B.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Yt({session:e,docKey:t,editable:r=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=de(e,t),i=s(a=>a.doc),l=s(a=>a.synced),c=s(a=>a.set);return(0,B.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,B.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,B.jsx)("code",{children:t}),(0,B.jsx)("span",{className:"urun-doc-panel-synced","data-synced":l?"true":"false",children:l?"synced":"syncing\u2026"})]}),(0,B.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,B.jsx)(Ce,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:a=>c(a)}):null]})}var Fe=require("react");var K=require("react/jsx-runtime");function Qt(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function er({session:e,docKey:t="control",cap:r=200,className:n}){let[o,s]=(0,Fe.useState)([]);return(0,Fe.useEffect)(()=>(s([]),e?e.doc(t).on("change",l=>{s(c=>G(c,{at:Date.now(),direction:"in",text:Qt(pe(l))},r))}):void 0),[e,t,r]),(0,K.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,K.jsx)(Ce,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,l)=>{e?.doc(t).set(i),s(c=>G(c,{at:Date.now(),direction:"out",text:Qt(l)},r))}}),(0,K.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,K.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,l)=>(0,K.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,K.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,K.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${l}`))})]})}var Be=require("react");var oe=require("react/jsx-runtime");function tr({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:n=200,className:o}){let[s,i]=(0,Be.useState)([]),l=t.join(","),c=r.join(",");return(0,Be.useEffect)(()=>{if(i([]),!e)return;let a=(d,p)=>i(U=>G(U,{at:Date.now(),kind:d,text:p},n)),m=[];m.push(e.onPhase(d=>a("phase",`phase \u2192 ${d.name}`)));for(let d of t){let p=e.stream(d);m.push(p.on("track",U=>a("track",`${d}: ${U?"track arrived":"track ended"}`)))}for(let d of r){let p=e.doc(d);m.push(p.on("change",()=>a("doc",`${d} changed`)))}return()=>m.forEach(d=>d())},[e,l,c,n]),(0,oe.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,oe.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((a,m)=>(0,oe.jsxs)("div",{className:"urun-event-spine-line","data-kind":a.kind,children:[(0,oe.jsx)("span",{className:"urun-event-spine-kind",children:a.kind})," ",(0,oe.jsx)("span",{className:"urun-event-spine-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${m}`))})}var Ve=require("react"),rr=require("@urun-sh/core"),Z=require("react/jsx-runtime"),br={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function We(e){let[t,r]=(0,Ve.useState)(e?.phase??null);return(0,Ve.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}function nr({session:e,className:t}){let r=We(e),n=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,Z.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":n,children:[(0,Z.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,Z.jsx)("span",{className:"urun-session-status-label",children:br[n]}),o?(0,Z.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function or({session:e,children:t,fallback:r,className:n}){let o=We(e);if(o?.name==="live")return(0,Z.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:t});let s=r?r(o):(0,Z.jsx)("span",{className:"urun-session-gate-fallback",children:o?.name==="error"?`Session ${o.error?.reason??"failed"}.`:o?.name==="ended"?"Session ended.":o&&o.name!=="idle"?(0,rr.describeSessionPhase)(o):"Waiting for a live session\u2026"});return(0,Z.jsx)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:s})}var sr=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionGate,UrunSessionStatus,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionPhase,useSessionTrack,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,usesWorkOSAuth});
2
+ "use strict";var er=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var vt=Object.prototype.hasOwnProperty;var kt=(e,r)=>{for(var t in r)er(e,t,{get:r[t],enumerable:!0})},yt=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of ht(r))!vt.call(e,o)&&o!==t&&er(e,o,{get:()=>r[o],enumerable:!(n=St(r,o))||n.enumerable});return e};var bt=e=>yt(er({},"__esModule",{value:!0}),e);var _t={};kt(_t,{ComponentRenderer:()=>Or,DEFAULT_CAMERA_CONSTRAINTS:()=>gr,DEFAULT_LOG_CAP:()=>Q,DEFAULT_VOICE_CONSTRAINTS:()=>mr,DocPatchForm:()=>we,ImageFrame:()=>Hr,ImageFrameSchema:()=>Vr,MetricsPanel:()=>jr,MetricsPanelSchema:()=>$r,ProgressCard:()=>qr,ProgressCardSchema:()=>Ir,StatusBadge:()=>Wr,StatusBadgeSchema:()=>Lr,TextStream:()=>Br,TextStreamSchema:()=>Fr,UrunAudio:()=>Oe,UrunAuthProvider:()=>rr,UrunCamera:()=>Yr,UrunControlSender:()=>ut,UrunDocPanel:()=>at,UrunErrorBoundary:()=>ie,UrunEventSpine:()=>ct,UrunJwtProvider:()=>br,UrunProvider:()=>Cr,UrunSessionGate:()=>mt,UrunSessionStatus:()=>pt,UrunSessionWaking:()=>Xe,UrunStreamTail:()=>st,UrunVoice:()=>Gr,authMode:()=>ve,createDocStore:()=>We,describeSessionPhase:()=>Ke.describeSessionPhase,formatPayload:()=>fe,getUrunAudioContext:()=>Ue,isWakingPhase:()=>Ke.isWakingPhase,parseJsonObject:()=>Be,pushCapped:()=>K,registerComponent:()=>Nr,resumeUrunAudioContext:()=>Re,urunPublicEnv:()=>z,useApp:()=>Rr,useChat:()=>_r,useCompletion:()=>wr,useDocStore:()=>me,useImageFrame:()=>cr,useMetricsPanel:()=>lr,useProgressCard:()=>ar,useRequest:()=>xr,useSessionDoc:()=>ot,useSessionPhase:()=>ee,useSessionTrack:()=>et,useSessionWake:()=>ze,useStatusBadge:()=>ir,useStreamMessages:()=>He,useTextStream:()=>ur,useUrunAudioLevel:()=>Qr,useUrunAuth:()=>Ee,usesWorkOSAuth:()=>kr});module.exports=bt(_t);var ce=require("react");var hr=require("react"),he=require("react/jsx-runtime"),ie=class extends hr.Component{constructor(r){super(r),this.state={error:null}}static getDerivedStateFromError(r){return{error:r}}componentDidCatch(r,t){console.error("[urun] Error caught by UrunErrorBoundary:",r,t)}render(){if(this.state.error){let{fallback:r}=this.props;return typeof r=="function"?r(this.state.error):r||(0,he.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,he.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,he.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var vr=require("react"),Ae=(0,vr.createContext)(null);function ne(e){return e&&e.trim()?e.trim():void 0}function z(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ne(typeof process<"u"?process.env?.[e]:void 0)}}function ve(){let e=z("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||z("VERCEL_ENV")==="production"?"workos":z("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function kr(){return ve()==="workos"}var ue=require("react"),Tr=require("react/jsx-runtime"),yr=(0,ue.createContext)(null);function rr({getAccessToken:e,children:r}){let t=(0,ue.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Tr.jsx)(yr.Provider,{value:t,children:r})}var br=rr;function Ee(){return(0,ue.useContext)(yr)}var _e=require("react/jsx-runtime");function Cr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=(0,ce.useState)(),i=Ee(),S=z("NEXT_PUBLIC_SESSION_TOKEN")??z("NEXT_PUBLIC_URUN_JWT"),l=ve(),m=l==="workos"&&!n,x=n??(l==="jwt"?S:void 0)??u,C=o??z("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),b=m&&!x,T=(0,ce.useMemo)(()=>({appId:t,baseUrl:e,orgId:r,jwt:x,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,x,r,m]);return(0,ce.useEffect)(()=>{if(!m||!i)return;let k=!1,h=i;async function v(){try{let U=await h.getAccessToken();k||c(U??void 0)}catch{k||c(void 0)}}v();let P=window.setInterval(()=>{v()},6e4);return()=>{k=!0,window.clearInterval(P)}},[i,m]),(0,_e.jsx)(ie,{fallback:s,children:b?(0,_e.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,_e.jsx)(Ae.Provider,{value:T,children:a})})}var X=require("react"),Ur=require("@urun-sh/core");function Tt(e,r){return`${e}:${JSON.stringify(r??{})}`}var tr=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()}},nr=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()}},or=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}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 tr(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new nr(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 Rr(){let e=(0,X.useContext)(Ae);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=(0,X.useReducer)(o=>o+1,0),t=(0,X.useRef)(new Map),n=(0,X.useMemo)(()=>(0,Ur.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,X.useMemo)(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Tt(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new or(n[s](a),r);return t.current.set(u,i),i}}}),[n])}var O=require("react");function le(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 Ct(e){return e instanceof Error?e:new Error(String(e))}function xr(e,r){let t=(0,O.useMemo)(()=>le(e),[e]),[n,o]=(0,O.useState)(void 0),[s,a]=(0,O.useState)(null),[u,c]=(0,O.useState)(!1),i=(0,O.useRef)(r);i.current=r;let S=(0,O.useRef)(0),l=(0,O.useRef)(null),m=(0,O.useRef)(!0);(0,O.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let x=(0,O.useCallback)(async T=>{l.current?.abort();let k=new AbortController;l.current=k;let h=++S.current,v=()=>m.current&&S.current===h;v()&&(c(!0),a(null));try{let P=await t.request(T,{...i.current,signal:k.signal});return v()&&(o(P),c(!1),i.current?.onSuccess?.(P)),P}catch(P){let U=Ct(P);throw v()&&(a(U),c(!1),i.current?.onError?.(U)),U}},[t]),C=(0,O.useCallback)(T=>{x(T).catch(()=>{})},[x]),b=(0,O.useCallback)(()=>{S.current++,l.current?.abort(),l.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:x,data:n,error:s,isPending:u,reset:b}}var q=require("react");function Pr(e){return e instanceof Error?e:new Error(String(e))}var Ut=e=>typeof e=="string"?e:String(e);function wr(e,r){let t=(0,q.useMemo)(()=>le(e),[e]),[n,o]=(0,q.useState)(""),[s,a]=(0,q.useState)(!1),[u,c]=(0,q.useState)(null),i=(0,q.useRef)(r);i.current=r;let S=(0,q.useRef)(0),l=(0,q.useRef)(null),m=(0,q.useRef)(!0);(0,q.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let x=(0,q.useCallback)(()=>{S.current++,l.current?.cancel(),l.current=null,m.current&&a(!1)},[]),C=(0,q.useCallback)(async b=>{l.current?.cancel();let T=++S.current,k=()=>m.current&&S.current===T,h=i.current,v=h?.parseChunk??Ut,P=h?.buildPayload??(y=>({prompt:y}));k()&&(o(""),c(null),a(!0));let{parseChunk:U,buildPayload:J,onFinish:V,onError:d,...R}=h??{},p="",f;try{f=t.requestStream(P(b),R),l.current=f}catch(y){let _=Pr(y);k()&&(c(_),a(!1),h?.onError?.(_));return}try{for await(let y of f){if(S.current!==T)break;p+=v(y),k()&&o(p)}k()&&(a(!1),h?.onFinish?.(p))}catch(y){let _=Pr(y);k()&&(c(_),a(!1),h?.onError?.(_))}finally{l.current===f&&(l.current=null)}},[t]);return{completion:n,complete:C,stop:x,isStreaming:s,error:u}}var D=require("react");function Ar(e){return e instanceof Error?e:new Error(String(e))}var Rt=e=>typeof e=="string"?e:String(e),Er=0;function sr(e){return Er+=1,`${e}-${Er}`}function _r(e,r){let t=(0,D.useMemo)(()=>le(e),[e]),[n,o]=(0,D.useState)(()=>(r?.initialMessages??[]).map(v=>({id:v.id??sr("msg"),role:v.role,content:v.content}))),[s,a]=(0,D.useState)(""),[u,c]=(0,D.useState)(!1),[i,S]=(0,D.useState)(null),l=(0,D.useRef)(r);l.current=r;let m=(0,D.useRef)(n);m.current=n;let x=(0,D.useRef)(s);x.current=s;let C=(0,D.useRef)(0),b=(0,D.useRef)(null),T=(0,D.useRef)(!0);(0,D.useEffect)(()=>(T.current=!0,()=>{T.current=!1,b.current?.cancel(),b.current=null}),[]);let k=(0,D.useCallback)(()=>{C.current++,b.current?.cancel(),b.current=null,T.current&&c(!1)},[]),h=(0,D.useCallback)(async v=>{let P=v===void 0,U=(P?x.current:v)??"";if(!U.trim())return;b.current?.cancel();let V=++C.current,d=()=>T.current&&C.current===V,R=l.current,p=R?.parseChunk??Rt,f={id:sr("msg"),role:"user",content:U},y={id:sr("msg"),role:"assistant",content:""},_=[...m.current,f].map(N=>({role:N.role,content:N.content})),g=[...m.current,f,y];m.current=g,o(g),P&&a(""),S(null),c(!0);let I=R?.buildPayload??(N=>({messages:N})),{initialMessages:Se,parseChunk:Ze,buildPayload:Ye,onFinish:Qe,onError:ft,...M}=R??{},L=N=>{o(H=>H.map(F=>F.id===y.id?{...F,content:N}:F))},Y="",W;try{W=t.requestStream(I(_),M),b.current=W}catch(N){let H=Ar(N);d()&&(S(H),c(!1),R?.onError?.(H));return}try{for await(let N of W){if(C.current!==V)break;Y+=p(N),d()&&L(Y)}d()&&(c(!1),R?.onFinish?.({...y,content:Y}))}catch(N){let H=Ar(N);d()&&(S(H),c(!1),R?.onError?.(H))}finally{b.current===W&&(b.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:h,stop:k,isStreaming:u,error:i}}var Mr=new Map;function Nr(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Mr.set(e,{component:r,schema:t})}function Dr(e,r){let t=Mr.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 Or({name:e,props:r,fallback:t}){let n=Dr(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 de=require("zod"),se=require("react/jsx-runtime"),Ir=de.z.object({step:de.z.number().min(0),total:de.z.number().min(1),label:de.z.string().optional(),variant:de.z.enum(["default","success","error"]).default("default")});function ar(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 qr(e){let{step:r,total:t,label:n,variant:o,percentage:s}=ar(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 Me=require("zod"),ke=require("react/jsx-runtime"),Lr=Me.z.object({state:Me.z.enum(["thinking","generating","idle","error"]),message:Me.z.string().optional()}),xt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ir(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??xt[r]??r;return{state:r,message:o,isActive:n}}function Wr(e){let{state:r,message:t,isActive:n}=ir(e);return(0,ke.jsxs)("span",{className:"urun-status-badge","data-state":r,children:[(0,ke.jsx)("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),(0,ke.jsx)("span",{className:"urun-status-message",children:t})]})}var ye=require("react"),Ne=require("zod"),be=require("react/jsx-runtime"),Fr=Ne.z.object({text:Ne.z.string(),streaming:Ne.z.boolean().default(!1)});function ur(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function Br(e){let{text:r,streaming:t}=ur(e),n=(0,ye.useRef)(null),o=(0,ye.useRef)(0);return(0,ye.useEffect)(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),(0,be.jsxs)("div",{className:"urun-text-stream",children:[(0,be.jsx)("span",{ref:n,className:"urun-text-content"}),t&&(0,be.jsx)("span",{className:"urun-text-cursor"})]})}var Te=require("zod"),Ce=require("react/jsx-runtime"),Vr=Te.z.object({src:Te.z.string().url(),alt:Te.z.string().optional(),caption:Te.z.string().optional()});function cr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function Hr(e){let{src:r,alt:t,caption:n}=cr(e);return(0,Ce.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ce.jsx)("img",{className:"urun-image",src:r,alt:t}),n&&(0,Ce.jsx)("figcaption",{className:"urun-image-caption",children:n})]})}var G=require("zod"),pe=require("react/jsx-runtime"),$r=G.z.object({metrics:G.z.array(G.z.object({label:G.z.string(),value:G.z.union([G.z.string(),G.z.number()]),unit:G.z.string().optional()}))});function lr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function jr(e){let{metrics:r}=lr(e);return(0,pe.jsx)("div",{className:"urun-metrics-panel",children:r.map((t,n)=>(0,pe.jsxs)("div",{className:"urun-metric-card",children:[(0,pe.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,pe.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}var A=require("react"),zr=require("@urun-sh/core");var De=null;function Pt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ue(){if(De)return De;let e=Pt();return e?(De=new e,De):null}function Re(){let e=Ue();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Xr=require("react/jsx-runtime"),wt=1e3,Jr=200;function dr(...e){console.debug("[urun-audio]",...e)}var Oe=(0,A.forwardRef)(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:S}=r,l=(0,A.useRef)(null),m=(0,A.useRef)(null),x=(0,A.useRef)(null),C=(0,A.useRef)(null),b=(0,A.useRef)(c);b.current=c;let T=(0,A.useRef)(i);T.current=i;let k=(0,A.useCallback)(d=>{x.current!==d&&(x.current=d,T.current?.(d))},[]),h=(0,A.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=l.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),v=(0,A.useCallback)(d=>{let R=l.current;if(!R)return;let p=R.play();!p||typeof p.then!="function"||p.then(()=>{R.muted||k(!0)}).catch(f=>{let y=f instanceof Error?f.name:String(f);if(y==="AbortError"){dr(`play() aborted (${d}); retrying in ${Jr}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${d}:retry`)},Jr);return}if(y==="NotAllowedError"){dr(`play() blocked pending a user gesture (${d})`),k(!1);return}dr(`play() failed (${d})`,f)})},[k]),P=(0,A.useCallback)(d=>{let R=h();if(R){for(let p of R.getAudioTracks())p!==d&&R.removeTrack(p);d&&!R.getAudioTracks().includes(d)&&R.addTrack(d),d&&v("track-attach"),b.current?.(d)}},[h,v]),U=(0,A.useCallback)(()=>{let d=l.current;d&&(h(),d.muted=!1,v("gesture"),Re(),k(!0))},[h,v,k]);(0,A.useImperativeHandle)(t,()=>({unlock:U,get unlocked(){return x.current===!0},get element(){return l.current}}),[U]);let J=(0,A.useCallback)(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),h()),S?.(d)},[h,S]),V=s!==void 0;return(0,A.useEffect)(()=>{if(V){P(s??null);return}if(!n)return;let d=n.stream(o),R=()=>{let g=m.current;return g?g.getAudioTracks()[0]??null:null},p=g=>{if(g!==R()&&(P(g),g)){let I=()=>{R()===g&&P(null)};g.addEventListener("ended",I)}},f=d.track;f&&f.readyState==="live"&&p(f);let y=d.on("track",g=>{g&&g.readyState!=="live"||p(g)}),_=setInterval(()=>{let g=d.track;g&&g.readyState==="live"&&p(g)},wt);return()=>{y(),clearInterval(_)}},[n,o,V,s,P]),(0,A.useEffect)(()=>(0,zr.observePageLifecycle)(()=>{Re(),x.current===!0&&v("foreground")}),[v]),(0,A.useEffect)(()=>()=>{C.current&&clearTimeout(C.current)},[]),(0,Xr.jsx)("audio",{ref:J,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});var E=require("react"),xe=require("@urun-sh/core");var Kr=require("react/jsx-runtime"),mr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function pr(...e){console.debug("[urun-voice]",...e)}var Gr=(0,E.forwardRef)(function(r,t){let{session:n,stream:o="audio",constraints:s=mr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:S,onMicStream:l,onTrack:m,onUnlockChange:x}=r,C=(0,E.useRef)(null),b=(0,E.useRef)(null),T=(0,E.useRef)(!1),k=(0,E.useRef)(i);k.current=i;let h=(0,E.useRef)(S);h.current=S;let v=(0,E.useRef)(l);v.current=l;let P=(0,E.useCallback)(p=>{T.current!==p&&(T.current=p,k.current?.(p))},[]),U=(0,E.useCallback)(()=>{let p=b.current;if(p){for(let f of p.getTracks())f.stop();b.current=null,v.current?.(null)}},[]),J=(0,E.useCallback)(async()=>{U(),P(!1),await n.stream(o).detach().catch(()=>{})},[n,o,U,P]),V=(0,E.useCallback)(async()=>{C.current?.unlock();let p;try{p=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(g){let I=(0,xe.sessionFailureFromMediaError)(g,n.status);throw h.current?.(I),I}U(),b.current=p,v.current?.(p);let f=p.getAudioTracks()[0];if(!f){U();let g=(0,xe.sessionFailureFromMediaError)(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw h.current?.(g),g}n.connect?.();let y;for(let g=1;g<=u;g++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(f),P(!0);return}catch(I){y=I,pr(`start attempt ${g}/${u} failed`,I),g<u&&await new Promise(Se=>setTimeout(Se,c))}U(),P(!1);let _=y instanceof Error?y:new Error(String(y??"voice start failed"));throw h.current?.(_),_},[n,o,s,a,u,c,U,P]);(0,E.useImperativeHandle)(t,()=>({start:V,stop:J,unlock:()=>C.current?.unlock(),get active(){return T.current},get micStream(){return b.current},get audio(){return C.current}}),[V,J]);let d=(0,E.useRef)(!1),R=(0,E.useCallback)(async()=>{if(!T.current||d.current)return;let p=b.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(f){pr("foreground mic re-assert failed (will retry on next pass)",f)}return}d.current=!0;try{let f=await navigator.mediaDevices.getUserMedia({audio:s,video:!1}),y=f.getAudioTracks()[0];if(!y){for(let _ of f.getTracks())_.stop();throw new Error("no microphone audio track after foreground re-acquire")}U(),b.current=f,v.current?.(f),await n.stream(o).attach(y)}catch(f){let y=f instanceof Error?f:new Error(String(f));pr("foreground mic re-acquire failed",y),h.current?.(y)}finally{d.current=!1}},[n,o,s,U]);return(0,E.useEffect)(()=>{let p=()=>{R()};return typeof n.onRecovery=="function"?n.onRecovery(p):(0,xe.observePageLifecycle)(p)},[n,R]),(0,E.useEffect)(()=>U,[U]),(0,Kr.jsx)(Oe,{ref:C,session:n,stream:o,onTrack:m,onUnlockChange:x})});var fr=require("@urun-sh/core"),w=require("react"),Ie=require("react/jsx-runtime"),gr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Zr(...e){console.debug("[urun-camera]",...e)}var Yr=(0,w.forwardRef)(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:S,videoClassName:l,onActiveChange:m,onError:x,onStream:C,onTrack:b,children:T}=r,k=(0,w.useRef)(null),h=(0,w.useRef)(null),v=(0,w.useRef)(null),P=(0,w.useRef)(!1),U=(0,w.useRef)(a),[J,V]=(0,w.useState)(a),d=(0,w.useRef)(m);d.current=m;let R=(0,w.useRef)(x);R.current=x;let p=(0,w.useRef)(C);p.current=C;let f=(0,w.useRef)(b);f.current=b;let y=(0,w.useCallback)(M=>{P.current!==M&&(P.current=M,d.current?.(M))},[]),_=(0,w.useCallback)(M=>{let L=k.current;L&&(L.muted=!0,L.srcObject=M,M&&L.play()?.catch?.(Y=>Zr("preview play() failed",Y)))},[]),g=(0,w.useCallback)(()=>{v.current?.(),v.current=null;let M=h.current;if(M){for(let L of M.getTracks())L.stop();h.current=null,p.current?.(null),f.current?.(null)}_(null)},[_]),I=(0,w.useCallback)(async M=>{let L=h.current,Y=v.current,W;try{W=await navigator.mediaDevices.getUserMedia({video:{...gr,...s,facingMode:M},audio:!1})}catch(F){let te=(0,fr.sessionFailureFromMediaError)(F,n.status);throw R.current?.(te),te}let N=W.getVideoTracks()[0];if(!N){for(let te of W.getTracks())te.stop();let F=(0,fr.sessionFailureFromMediaError)(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw R.current?.(F),F}h.current=W,U.current=M,V(M),_(W),p.current?.(W);let H=()=>{h.current===W&&(Zr("camera track ended (device removed or permission revoked)"),g(),y(!1))};N.addEventListener("ended",H),v.current=()=>N.removeEventListener("ended",H);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(N)}catch(F){N.removeEventListener("ended",H);for(let gt of W.getTracks())gt.stop();h.current===W&&(h.current=L,v.current=Y,_(L),p.current?.(L));let te=F instanceof Error?F:new Error(String(F));throw R.current?.(te),te}if(L&&L!==W){Y?.();for(let F of L.getTracks())F.stop()}f.current?.(N),y(!0)},[n,o,s,c,_,g,y]),Se=(0,w.useCallback)(M=>I(M?.facingMode??U.current),[I]),Ze=(0,w.useCallback)(async M=>{P.current&&U.current===M||await I(M)},[I]),Ye=(0,w.useCallback)(()=>I(U.current==="environment"?"user":"environment"),[I]),Qe=(0,w.useCallback)(async()=>{g(),y(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,g,y]);return(0,w.useImperativeHandle)(t,()=>({start:Se,stop:Qe,flip:Ye,setFacingMode:Ze,get active(){return P.current},get facingMode(){return U.current},get stream(){return h.current},get element(){return k.current}}),[Se,Qe,Ye,Ze]),(0,w.useEffect)(()=>g,[g]),i?(0,Ie.jsxs)("div",{className:S,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":J,children:[(0,Ie.jsx)("video",{ref:k,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?J==="user":u)?{transform:"scaleX(-1)"}:{}}}),T]}):null});var qe=require("react");var Sr={level:0,speaking:!1};function Qr(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=(0,qe.useState)(Sr);return(0,qe.useEffect)(()=>{if(!e){a(Sr);return}let u=Ue();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,S;try{i=u.createMediaStreamSource(c),S=u.createAnalyser(),S.fftSize=t,i.connect(S)}catch{return}let l=new Uint8Array(S.fftSize),x=setInterval(()=>{S.getByteTimeDomainData(l);let C=0;for(let T=0;T<l.length;T++){let k=(l[T]-128)/128;C+=k*k}let b=Math.sqrt(C/l.length);a(T=>{let k=b>o;return Math.abs(T.level-b)<.005&&T.speaking===k?T:{level:b,speaking:k}})},n);return()=>{clearInterval(x),i.disconnect(),a(Sr)}},[e,t,n,o]),s}var Le=require("react");function et(e,r){let[t,n]=(0,Le.useState)(null);return(0,Le.useEffect)(()=>{if(!e||!r){n(null);return}let o=e.stream(r);return n(o.track),o.on("track",n)},[e,r]),t}var nt=require("react");var Fe=require("react");var rt=require("zustand/vanilla"),tt=require("zustand"),At=()=>{};function We(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=(0,rt.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):At,c=(i=>(0,tt.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 me(e,r){let t=(0,Fe.useMemo)(()=>We(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return(0,Fe.useEffect)(()=>t.bind(),[t]),t}function ot(e,r,t){let o=me(e,r)(t??(u=>u)),s=(0,nt.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 Ve=require("react");var Q=200;function K(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function fe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Be(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 He(e,r,t={}){let n=t.cap??200,[o,s]=(0,Ve.useState)([]);return(0,Ve.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=>K(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}var $=require("react/jsx-runtime");function st({session:e,name:r,cap:t,className:n}){let o=He(e,r,{cap:t});return(0,$.jsxs)("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[(0,$.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,$.jsx)("code",{children:r}),(0,$.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,$.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,$.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,$.jsx)("code",{children:r})," messages\u2026"]}):o.map((s,a)=>(0,$.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,$.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",fe(s.payload)]},`${s.at}-${a}`))})]})}var Pe=require("react");var B=require("react/jsx-runtime");function we({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=(0,Pe.useState)(""),[a,u]=(0,Pe.useState)(null),c=(0,Pe.useCallback)(()=>{let i=Be(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return(0,B.jsxs)("div",{className:"urun-doc-patch",children:[(0,B.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),(0,B.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,B.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?(0,B.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function at({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=me(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return(0,B.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,B.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,B.jsx)("code",{children:r}),(0,B.jsx)("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),(0,B.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?(0,B.jsx)(we,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}var $e=require("react");var Z=require("react/jsx-runtime");function it(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function ut({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=(0,$e.useState)([]);return(0,$e.useEffect)(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>K(c,{at:Date.now(),direction:"in",text:it(fe(u))},t))}):void 0),[e,r,t]),(0,Z.jsxs)("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[(0,Z.jsx)(we,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>K(c,{at:Date.now(),direction:"out",text:it(u)},t))}}),(0,Z.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,Z.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>(0,Z.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,Z.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,Z.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}var je=require("react");var ae=require("react/jsx-runtime");function ct({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=(0,je.useState)([]),u=r.join(","),c=t.join(",");return(0,je.useEffect)(()=>{if(a([]),!e)return;let i=(l,m)=>a(x=>K(x,{at:Date.now(),kind:l,text:m},n)),S=[];S.push(e.onPhase(l=>i("phase",`phase \u2192 ${l.name}`)));for(let l of r){let m=e.stream(l);S.push(m.on("track",x=>i("track",`${l}: ${x?"track arrived":"track ended"}`)))}for(let l of t){let m=e.doc(l);S.push(m.on("change",()=>i("doc",`${l} changed`)))}return()=>S.forEach(l=>l())},[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,S)=>(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}-${S}`))})}var Ge=require("@urun-sh/core");var Je=require("react");function ee(e){let[r,t]=(0,Je.useState)(e?.phase??null);return(0,Je.useEffect)(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}var dt=require("@urun-sh/core");var ge=require("react"),lt=require("@urun-sh/core");function ze(e){let r=ee(e),t=(0,lt.isWakingPhase)(r?.name),n=(0,ge.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,ge.useState)(s);return(0,ge.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 re=require("react/jsx-runtime");function Xe({session:e,render:r,className:t}){let n=ze(e);return!n.waking||!n.phase?null:(0,re.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,re.jsxs)(re.Fragment,{children:[(0,re.jsx)("span",{className:"urun-session-waking-label",children:(0,dt.describeSessionPhase)(n.phase)})," ",(0,re.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}var j=require("react/jsx-runtime"),Et={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function pt({session:e,className:r}){let t=ee(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:t?.runtime?.reason??null;return(0,j.jsxs)("span",{className:["urun-session-status",r].filter(Boolean).join(" "),"data-phase":n,children:[(0,j.jsx)("span",{className:"urun-session-status-dot","data-phase":n}),(0,j.jsx)("span",{className:"urun-session-status-label",children:Et[n]}),o?(0,j.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function mt({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=ee(e);if(s?.name==="live")return(0,j.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:r});let a=t?t(s):(0,j.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Ge.isWakingPhase)(s.name)?(0,j.jsx)(Xe,{session:e}):s&&s.name!=="idle"?(0,Ge.describeSessionPhase)(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended");return(0,j.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,u?(0,j.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:n,children:"Start over"}):null]})}var Ke=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunJwtProvider,UrunProvider,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as Tt,b as bt,c as Re}from"./chunk-WF2OBDSX.mjs";import{useEffect as Et,useMemo as wt,useState as At}from"react";import{Component as Rt}from"react";import{jsx as je,jsxs as Ut}from"react/jsx-runtime";var ee=class extends Rt{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||Ut("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[je("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),je("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as xt}from"react";var ae=xt(null);function j(e){return e&&e.trim()?e.trim():void 0}function B(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return j(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return j(typeof process<"u"?process.env?.[e]:void 0)}}function ie(){let e=B("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||B("VERCEL_ENV")==="production"?"workos":B("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Pt(){return ie()==="workos"}import{jsx as Ue}from"react/jsx-runtime";function _t({baseUrl:e,orgId:t,appId:r,jwt:n,authProvider:o,fallback:s,children:i}){let[l,c]=At(),a=Re(),m=B("NEXT_PUBLIC_SESSION_TOKEN")??B("NEXT_PUBLIC_URUN_JWT"),d=ie(),p=d==="workos"&&!n,R=n??(d==="jwt"?m:void 0)??l,k=o??B("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=p&&!R,y=wt(()=>({appId:r,baseUrl:e,orgId:t,jwt:R,getAccessToken:p?a?.getAccessToken:void 0,authProvider:k}),[r,a,e,k,R,t,p]);return Et(()=>{if(!p||!a)return;let f=!1,g=a;async function h(){try{let U=await g.getAccessToken();f||c(U??void 0)}catch{f||c(void 0)}}h();let T=window.setInterval(()=>{h()},6e4);return()=>{f=!0,window.clearInterval(T)}},[a,p]),Ue(ee,{fallback:s,children:C?Ue("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ue(ae.Provider,{value:y,children:i})})}import{useContext as Mt,useMemo as Je,useReducer as Nt,useRef as Dt}from"react";import{App as Ot}from"@urun-sh/core";function It(e,t){return`${e}:${JSON.stringify(t??{})}`}var xe=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,n=>r(n))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),n=this._notify;return{append(o){r.append(o),n()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),n()})}}dispose(){this._unsubscribeChange()}},Pe=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Ee=class{constructor(t,r){this._session=t;this._notify=r;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}doc(t){let r=this._docs.get(t);return r||(r=new xe(this._session.doc(t),this._notify),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Pe(this._session.stream(t),this._notify),this._streams.set(t,r)),r}disconnect(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notify()}};function qt(){let e=Mt(ae);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Nt(o=>o+1,0),r=Dt(new Map),n=Je(()=>Ot(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return Je(()=>new Proxy({},{get(o,s){if(typeof s=="string")return i=>{let l=It(s,i),c=r.current.get(l);if(c&&!c.disposed)return c;let a=new Ee(n[s](i),t);return r.current.set(l,a),a}}}),[n])}import{useCallback as we,useEffect as Lt,useMemo as Ft,useRef as ue,useState as Ae}from"react";function X(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function Bt(e){return e instanceof Error?e:new Error(String(e))}function Vt(e,t){let r=Ft(()=>X(e),[e]),[n,o]=Ae(void 0),[s,i]=Ae(null),[l,c]=Ae(!1),a=ue(t);a.current=t;let m=ue(0),d=ue(null),p=ue(!0);Lt(()=>(p.current=!0,()=>{p.current=!1,d.current?.abort()}),[]);let R=we(async y=>{d.current?.abort();let f=new AbortController;d.current=f;let g=++m.current,h=()=>p.current&&m.current===g;h()&&(c(!0),i(null));try{let T=await r.request(y,{...a.current,signal:f.signal});return h()&&(o(T),c(!1),a.current?.onSuccess?.(T)),T}catch(T){let U=Bt(T);throw h()&&(i(U),c(!1),a.current?.onError?.(U)),U}},[r]),k=we(y=>{R(y).catch(()=>{})},[R]),C=we(()=>{m.current++,d.current?.abort(),d.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:k,mutateAsync:R,data:n,error:s,isPending:l,reset:C}}import{useCallback as ze,useEffect as Wt,useMemo as Ht,useRef as ce,useState as _e}from"react";function Xe(e){return e instanceof Error?e:new Error(String(e))}var $t=e=>typeof e=="string"?e:String(e);function jt(e,t){let r=Ht(()=>X(e),[e]),[n,o]=_e(""),[s,i]=_e(!1),[l,c]=_e(null),a=ce(t);a.current=t;let m=ce(0),d=ce(null),p=ce(!0);Wt(()=>(p.current=!0,()=>{p.current=!1,d.current?.cancel(),d.current=null}),[]);let R=ze(()=>{m.current++,d.current?.cancel(),d.current=null,p.current&&i(!1)},[]),k=ze(async C=>{d.current?.cancel();let y=++m.current,f=()=>p.current&&m.current===y,g=a.current,h=g?.parseChunk??$t,T=g?.buildPayload??(S=>({prompt:S}));f()&&(o(""),c(null),i(!0));let{parseChunk:U,buildPayload:q,onFinish:D,onError:u,...v}=g??{},x="",P;try{P=r.requestStream(T(C),v),d.current=P}catch(S){let E=Xe(S);f()&&(c(E),i(!1),g?.onError?.(E));return}try{for await(let S of P){if(m.current!==y)break;x+=h(S),f()&&o(x)}f()&&(i(!1),g?.onFinish?.(x))}catch(S){let E=Xe(S);f()&&(c(E),i(!1),g?.onError?.(E))}finally{d.current===P&&(d.current=null)}},[r]);return{completion:n,complete:k,stop:R,isStreaming:s,error:l}}import{useCallback as Ge,useEffect as Jt,useMemo as zt,useRef as G,useState as le}from"react";function Ke(e){return e instanceof Error?e:new Error(String(e))}var Xt=e=>typeof e=="string"?e:String(e),Ze=0;function Me(e){return Ze+=1,`${e}-${Ze}`}function Gt(e,t){let r=zt(()=>X(e),[e]),[n,o]=le(()=>(t?.initialMessages??[]).map(h=>({id:h.id??Me("msg"),role:h.role,content:h.content}))),[s,i]=le(""),[l,c]=le(!1),[a,m]=le(null),d=G(t);d.current=t;let p=G(n);p.current=n;let R=G(s);R.current=s;let k=G(0),C=G(null),y=G(!0);Jt(()=>(y.current=!0,()=>{y.current=!1,C.current?.cancel(),C.current=null}),[]);let f=Ge(()=>{k.current++,C.current?.cancel(),C.current=null,y.current&&c(!1)},[]),g=Ge(async h=>{let T=h===void 0,U=(T?R.current:h)??"";if(!U.trim())return;C.current?.cancel();let D=++k.current,u=()=>y.current&&k.current===D,v=d.current,x=v?.parseChunk??Xt,P={id:Me("msg"),role:"user",content:U},S={id:Me("msg"),role:"assistant",content:""},E=[...p.current,P].map(A=>({role:A.role,content:A.content})),b=[...p.current,P,S];p.current=b,o(b),T&&i(""),m(null),c(!0);let I=v?.buildPayload??(A=>({messages:A})),{initialMessages:ke,parseChunk:Ce,buildPayload:Te,onFinish:be,onError:kt,...w}=v??{},_=A=>{o(O=>O.map(N=>N.id===S.id?{...N,content:A}:N))},F="",M;try{M=r.requestStream(I(E),w),C.current=M}catch(A){let O=Ke(A);u()&&(m(O),c(!1),v?.onError?.(O));return}try{for await(let A of M){if(k.current!==D)break;F+=x(A),u()&&_(F)}u()&&(c(!1),v?.onFinish?.({...S,content:F}))}catch(A){let O=Ke(A);u()&&(m(O),c(!1),v?.onError?.(O))}finally{C.current===M&&(C.current=null)}},[r]);return{messages:n,input:s,setInput:i,sendMessage:g,stop:f,isStreaming:l,error:a}}var Ye=new Map;function Kt(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Ye.set(e,{component:t,schema:r})}function Qe(e,t){let r=Ye.get(e);if(!r)return{error:`Unknown component: "${e}"`};let n=r.schema.safeParse(t);return n.success?{Component:r.component,validatedProps:n.data}:{error:`Validation failed for "${e}": ${n.error.message}`}}import{Fragment as Yt,jsx as de}from"react/jsx-runtime";function Zt({name:e,props:t,fallback:r}){let n=Qe(e,t);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),r?de(Yt,{children:r}):de("div",{className:"urun-component-error",role:"alert",children:de("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return de(o,{...n.validatedProps})}import{z as te}from"zod";import{jsx as Ne,jsxs as et}from"react/jsx-runtime";var Qt=te.object({step:te.number().min(0),total:te.number().min(1),label:te.string().optional(),variant:te.enum(["default","success","error"]).default("default")});function tt(e){let{step:t,total:r,label:n,variant:o="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:n,variant:o,percentage:s,isComplete:i}}function er(e){let{step:t,total:r,label:n,variant:o,percentage:s}=tt(e);return et("div",{className:"urun-progress-card","data-variant":o,children:[n&&Ne("div",{className:"urun-progress-label",children:n}),Ne("div",{className:"urun-progress-bar",children:Ne("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),et("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as De}from"zod";import{jsx as rt,jsxs as or}from"react/jsx-runtime";var tr=De.object({state:De.enum(["thinking","generating","idle","error"]),message:De.string().optional()}),rr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function nt(e){let{state:t,message:r}=e,n=t==="thinking"||t==="generating",o=r??rr[t]??t;return{state:t,message:o,isActive:n}}function nr(e){let{state:t,message:r,isActive:n}=nt(e);return or("span",{className:"urun-status-badge","data-state":t,children:[rt("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),rt("span",{className:"urun-status-message",children:r})]})}import{useRef as ot,useEffect as sr}from"react";import{z as Oe}from"zod";import{jsx as st,jsxs as ur}from"react/jsx-runtime";var ar=Oe.object({text:Oe.string(),streaming:Oe.boolean().default(!1)});function at(e){let{text:t,streaming:r=!1}=e,n=t.length===0;return{text:t,streaming:r,isEmpty:n}}function ir(e){let{text:t,streaming:r}=at(e),n=ot(null),o=ot(0);return sr(()=>{let s=n.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),ur("div",{className:"urun-text-stream",children:[st("span",{ref:n,className:"urun-text-content"}),r&&st("span",{className:"urun-text-cursor"})]})}import{z as pe}from"zod";import{jsx as it,jsxs as dr}from"react/jsx-runtime";var cr=pe.object({src:pe.string().url(),alt:pe.string().optional(),caption:pe.string().optional()});function ut(e){let{src:t,alt:r,caption:n}=e;return{src:t,alt:r??"",caption:n}}function lr(e){let{src:t,alt:r,caption:n}=ut(e);return dr("figure",{className:"urun-image-frame",children:[it("img",{className:"urun-image",src:t,alt:r}),n&&it("figcaption",{className:"urun-image-caption",children:n})]})}import{z as V}from"zod";import{jsx as Ie,jsxs as fr}from"react/jsx-runtime";var pr=V.object({metrics:V.array(V.object({label:V.string(),value:V.union([V.string(),V.number()]),unit:V.string().optional()}))});function ct(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function mr(e){let{metrics:t}=ct(e);return Ie("div",{className:"urun-metrics-panel",children:t.map((r,n)=>fr("div",{className:"urun-metric-card",children:[Ie("div",{className:"urun-metric-label",children:r.label}),Ie("div",{className:"urun-metric-value",children:r.displayValue})]},n))})}import{forwardRef as Sr,useCallback as K,useEffect as lt,useImperativeHandle as hr,useRef as Z}from"react";var me=null;function gr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function fe(){if(me)return me;let e=gr();return e?(me=new e,me):null}function qe(){let e=fe();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as yr}from"react/jsx-runtime";var vr=1e3,dt=200;function Le(...e){console.debug("[urun-audio]",...e)}var Fe=Sr(function(t,r){let{session:n,stream:o="audio",track:s,controls:i=!1,className:l,onTrack:c,onUnlockChange:a,onAudioElement:m}=t,d=Z(null),p=Z(null),R=Z(null),k=Z(null),C=Z(c);C.current=c;let y=Z(a);y.current=a;let f=K(u=>{R.current!==u&&(R.current=u,y.current?.(u))},[]),g=K(()=>{if(typeof MediaStream>"u")return null;p.current||(p.current=new MediaStream);let u=d.current;return u&&u.srcObject!==p.current&&(u.srcObject=p.current),p.current},[]),h=K(u=>{let v=d.current;if(!v)return;let x=v.play();!x||typeof x.then!="function"||x.then(()=>{v.muted||f(!0)}).catch(P=>{let S=P instanceof Error?P.name:String(P);if(S==="AbortError"){Le(`play() aborted (${u}); retrying in ${dt}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,h(`${u}:retry`)},dt);return}if(S==="NotAllowedError"){Le(`play() blocked pending a user gesture (${u})`),f(!1);return}Le(`play() failed (${u})`,P)})},[f]),T=K(u=>{let v=g();if(v){for(let x of v.getAudioTracks())x!==u&&v.removeTrack(x);u&&!v.getAudioTracks().includes(u)&&v.addTrack(u),u&&h("track-attach"),C.current?.(u)}},[g,h]),U=K(()=>{let u=d.current;u&&(g(),u.muted=!1,h("gesture"),qe(),f(!0))},[g,h,f]);hr(r,()=>({unlock:U,get unlocked(){return R.current===!0},get element(){return d.current}}),[U]);let q=K(u=>{d.current=u,u&&(u.setAttribute("playsinline",""),u.setAttribute("webkit-playsinline",""),g()),m?.(u)},[g,m]),D=s!==void 0;return lt(()=>{if(D){T(s??null);return}if(!n)return;let u=n.stream(o),v=()=>{let b=p.current;return b?b.getAudioTracks()[0]??null:null},x=b=>{if(b!==v()&&(T(b),b)){let I=()=>{v()===b&&T(null)};b.addEventListener("ended",I)}},P=u.track;P&&P.readyState==="live"&&x(P);let S=u.on("track",b=>{b&&b.readyState!=="live"||x(b)}),E=setInterval(()=>{let b=u.track;b&&b.readyState==="live"&&x(b)},vr);return()=>{S(),clearInterval(E)}},[n,o,D,s,T]),lt(()=>()=>{k.current&&clearTimeout(k.current)},[]),yr("audio",{ref:q,className:l,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as kr,useCallback as ge,useEffect as Cr,useImperativeHandle as Tr,useRef as Y}from"react";import{sessionFailureFromMediaError as pt}from"@urun-sh/core";import{jsx as Ur}from"react/jsx-runtime";var mt={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function br(...e){console.debug("[urun-voice]",...e)}var Rr=kr(function(t,r){let{session:n,stream:o="audio",constraints:s=mt,connectTimeoutMs:i,attempts:l=3,retryDelayMs:c=1500,onActiveChange:a,onError:m,onMicStream:d,onTrack:p,onUnlockChange:R}=t,k=Y(null),C=Y(null),y=Y(!1),f=Y(a);f.current=a;let g=Y(m);g.current=m;let h=Y(d);h.current=d;let T=ge(u=>{y.current!==u&&(y.current=u,f.current?.(u))},[]),U=ge(()=>{let u=C.current;if(u){for(let v of u.getTracks())v.stop();C.current=null,h.current?.(null)}},[]),q=ge(async()=>{U(),T(!1),await n.stream(o).detach().catch(()=>{})},[n,o,U,T]),D=ge(async()=>{k.current?.unlock();let u;try{u=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(S){let E=pt(S,n.status);throw g.current?.(E),E}U(),C.current=u,h.current?.(u);let v=u.getAudioTracks()[0];if(!v){U();let S=pt(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw g.current?.(S),S}n.connect?.();let x;for(let S=1;S<=l;S++)try{await n.whenLive(i!==void 0?{timeout:i}:void 0),await n.stream(o).attach(v),T(!0);return}catch(E){x=E,br(`start attempt ${S}/${l} failed`,E),S<l&&await new Promise(b=>setTimeout(b,c))}U(),T(!1);let P=x instanceof Error?x:new Error(String(x??"voice start failed"));throw g.current?.(P),P},[n,o,s,i,l,c,U,T]);return Tr(r,()=>({start:D,stop:q,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return k.current}}),[D,q]),Cr(()=>U,[U]),Ur(Fe,{ref:k,session:n,stream:o,onTrack:p,onUnlockChange:R})});import{sessionFailureFromMediaError as ft}from"@urun-sh/core";import{forwardRef as xr,useCallback as W,useEffect as Pr,useImperativeHandle as Er,useRef as L,useState as wr}from"react";import{jsx as _r,jsxs as Mr}from"react/jsx-runtime";var St={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function gt(...e){console.debug("[urun-camera]",...e)}var Ar=xr(function(t,r){let{session:n,stream:o="video",constraints:s,facingMode:i="environment",mirror:l="auto",connectTimeoutMs:c,preview:a=!0,className:m,videoClassName:d,onActiveChange:p,onError:R,onStream:k,onTrack:C,children:y}=t,f=L(null),g=L(null),h=L(null),T=L(!1),U=L(i),[q,D]=wr(i),u=L(p);u.current=p;let v=L(R);v.current=R;let x=L(k);x.current=k;let P=L(C);P.current=C;let S=W(w=>{T.current!==w&&(T.current=w,u.current?.(w))},[]),E=W(w=>{let _=f.current;_&&(_.muted=!0,_.srcObject=w,w&&_.play()?.catch?.(F=>gt("preview play() failed",F)))},[]),b=W(()=>{h.current?.(),h.current=null;let w=g.current;if(w){for(let _ of w.getTracks())_.stop();g.current=null,x.current?.(null),P.current?.(null)}E(null)},[E]),I=W(async w=>{let _=g.current,F=h.current,M;try{M=await navigator.mediaDevices.getUserMedia({video:{...St,...s,facingMode:w},audio:!1})}catch(N){let $=ft(N,n.status);throw v.current?.($),$}let A=M.getVideoTracks()[0];if(!A){for(let $ of M.getTracks())$.stop();let N=ft(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw v.current?.(N),N}g.current=M,U.current=w,D(w),E(M),x.current?.(M);let O=()=>{g.current===M&&(gt("camera track ended (device removed or permission revoked)"),b(),S(!1))};A.addEventListener("ended",O),h.current=()=>A.removeEventListener("ended",O);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(A)}catch(N){A.removeEventListener("ended",O);for(let Ct of M.getTracks())Ct.stop();g.current===M&&(g.current=_,h.current=F,E(_),x.current?.(_));let $=N instanceof Error?N:new Error(String(N));throw v.current?.($),$}if(_&&_!==M){F?.();for(let N of _.getTracks())N.stop()}P.current?.(A),S(!0)},[n,o,s,c,E,b,S]),ke=W(w=>I(w?.facingMode??U.current),[I]),Ce=W(async w=>{T.current&&U.current===w||await I(w)},[I]),Te=W(()=>I(U.current==="environment"?"user":"environment"),[I]),be=W(async()=>{b(),S(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,b,S]);return Er(r,()=>({start:ke,stop:be,flip:Te,setFacingMode:Ce,get active(){return T.current},get facingMode(){return U.current},get stream(){return g.current},get element(){return f.current}}),[ke,be,Te,Ce]),Pr(()=>b,[b]),a?Mr("div",{className:m,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[_r("video",{ref:f,className:d,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(l==="auto"?q==="user":l)?{transform:"scaleX(-1)"}:{}}}),y]}):null});import{useEffect as Nr,useState as Dr}from"react";var Be={level:0,speaking:!1};function Or(e,t={}){let{fftSize:r=512,intervalMs:n=100,speakingThreshold:o=.02}=t,[s,i]=Dr(Be);return Nr(()=>{if(!e){i(Be);return}let l=fe();if(!l||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let a,m;try{a=l.createMediaStreamSource(c),m=l.createAnalyser(),m.fftSize=r,a.connect(m)}catch{return}let d=new Uint8Array(m.fftSize),R=setInterval(()=>{m.getByteTimeDomainData(d);let k=0;for(let y=0;y<d.length;y++){let f=(d[y]-128)/128;k+=f*f}let C=Math.sqrt(k/d.length);i(y=>{let f=C>o;return Math.abs(y.level-C)<.005&&y.speaking===f?y:{level:C,speaking:f}})},n);return()=>{clearInterval(R),a.disconnect(),i(Be)}},[e,r,n,o]),s}import{useEffect as Ir,useState as qr}from"react";function Lr(e,t){let[r,n]=qr(null);return Ir(()=>{if(!e||!t){n(null);return}let o=e.stream(t);return n(o.track),o.on("track",n)},[e,t]),r}import{useCallback as $r}from"react";import{useEffect as Wr,useMemo as Hr}from"react";import{createStore as Fr}from"zustand/vanilla";import{useStore as Br}from"zustand";var Vr=()=>{};function Ve(e,t={}){let r=a=>{e?.set(a)},n=()=>e?e.get()??{}:{},o=Fr(()=>({doc:n(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let a of s)a();s=null}},l=()=>e?(s||(o.setState({doc:n(),synced:e.synced}),s=[e.on("change",a=>o.setState({doc:a})),e.onSynced(()=>o.setState({synced:!0}))]),i):Vr,c=(a=>Br(o,a));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:l,unbind:i}),t.bind!==!1&&l(),c}function re(e,t){let r=Hr(()=>Ve(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Wr(()=>r.bind(),[r]),r}function jr(e,t,r){let o=re(e,t)(r??(l=>l)),s=$r(l=>{e&&t&&e.doc(t).set(l)},[e,t]);if(r)return o;let i=o;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as Jr,useState as zr}from"react";var J=200;function H(e,t,r=200){let n=[...e,t];return n.length>r?n.slice(n.length-r):n}function ne(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function We(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function He(e,t,r={}){let n=r.cap??200,[o,s]=zr([]);return Jr(()=>{if(s([]),!e||!t)return;let i=!0,l=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await l.next();if(!i||c.done)break;s(a=>H(a,{at:Date.now(),payload:c.value},n))}})(),()=>{i=!1,l.return?.()}},[e,t,n]),o}import{jsx as Se,jsxs as oe}from"react/jsx-runtime";function Xr({session:e,name:t,cap:r,className:n}){let o=He(e,t,{cap:r});return oe("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[oe("div",{className:"urun-stream-tail-meta",children:[Se("code",{children:t}),oe("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Se("div",{className:"urun-stream-tail-log",children:o.length===0?oe("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Se("code",{children:t})," messages\u2026"]}):o.map((s,i)=>oe("div",{className:"urun-stream-tail-line",children:[Se("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ne(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Gr,useState as ht}from"react";import{jsx as z,jsxs as he}from"react/jsx-runtime";function ve({placeholder:e,buttonLabel:t,disabled:r,onApply:n}){let[o,s]=ht(""),[i,l]=ht(null),c=Gr(()=>{let a=We(o);if(!a.ok){l(a.error);return}l(null),n(a.value,o.trim()),s("")},[o,n]);return he("div",{className:"urun-doc-patch",children:[z("textarea",{className:"urun-doc-patch-input",value:o,onChange:a=>s(a.target.value),placeholder:e,rows:3}),he("div",{className:"urun-doc-patch-actions",children:[z("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:c,children:t}),i?z("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Kr({session:e,docKey:t,editable:r=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=re(e,t),i=s(a=>a.doc),l=s(a=>a.synced),c=s(a=>a.set);return he("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[he("div",{className:"urun-doc-panel-meta",children:[z("code",{children:t}),z("span",{className:"urun-doc-panel-synced","data-synced":l?"true":"false",children:l?"synced":"syncing\u2026"})]}),z("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?z(ve,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:a=>c(a)}):null]})}import{useEffect as Zr,useState as Yr}from"react";import{jsx as se,jsxs as yt}from"react/jsx-runtime";function vt(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Qr({session:e,docKey:t="control",cap:r=200,className:n}){let[o,s]=Yr([]);return Zr(()=>(s([]),e?e.doc(t).on("change",l=>{s(c=>H(c,{at:Date.now(),direction:"in",text:vt(ne(l))},r))}):void 0),[e,t,r]),yt("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[se(ve,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,l)=>{e?.doc(t).set(i),s(c=>H(c,{at:Date.now(),direction:"out",text:vt(l)},r))}}),se("div",{className:"urun-control-sender-log",children:o.length===0?se("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,l)=>yt("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[se("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",se("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${l}`))})]})}import{useEffect as en,useState as tn}from"react";import{jsx as ye,jsxs as nn}from"react/jsx-runtime";function rn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:n=200,className:o}){let[s,i]=tn([]),l=t.join(","),c=r.join(",");return en(()=>{if(i([]),!e)return;let a=(d,p)=>i(R=>H(R,{at:Date.now(),kind:d,text:p},n)),m=[];m.push(e.onPhase(d=>a("phase",`phase \u2192 ${d.name}`)));for(let d of t){let p=e.stream(d);m.push(p.on("track",R=>a("track",`${d}: ${R?"track arrived":"track ended"}`)))}for(let d of r){let p=e.doc(d);m.push(p.on("change",()=>a("doc",`${d} changed`)))}return()=>m.forEach(d=>d())},[e,l,c,n]),ye("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?ye("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((a,m)=>nn("div",{className:"urun-event-spine-line","data-kind":a.kind,children:[ye("span",{className:"urun-event-spine-kind",children:a.kind})," ",ye("span",{className:"urun-event-spine-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${m}`))})}import{useEffect as on,useState as sn}from"react";import{describeSessionPhase as an}from"@urun-sh/core";import{jsx as Q,jsxs as dn}from"react/jsx-runtime";var un={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function $e(e){let[t,r]=sn(e?.phase??null);return on(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}function cn({session:e,className:t}){let r=$e(e),n=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.runtime?.reason??null;return dn("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":n,children:[Q("span",{className:"urun-session-status-dot","data-phase":n}),Q("span",{className:"urun-session-status-label",children:un[n]}),o?Q("span",{className:"urun-session-status-detail",children:o}):null]})}function ln({session:e,children:t,fallback:r,className:n}){let o=$e(e);if(o?.name==="live")return Q("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:t});let s=r?r(o):Q("span",{className:"urun-session-gate-fallback",children:o?.name==="error"?`Session ${o.error?.reason??"failed"}.`:o?.name==="ended"?"Session ended.":o&&o.name!=="idle"?an(o):"Waiting for a live session\u2026"});return Q("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:s})}import{describeSessionPhase as Fs}from"@urun-sh/core";export{Zt as ComponentRenderer,St as DEFAULT_CAMERA_CONSTRAINTS,J as DEFAULT_LOG_CAP,mt as DEFAULT_VOICE_CONSTRAINTS,ve as DocPatchForm,lr as ImageFrame,cr as ImageFrameSchema,mr as MetricsPanel,pr as MetricsPanelSchema,er as ProgressCard,Qt as ProgressCardSchema,nr as StatusBadge,tr as StatusBadgeSchema,ir as TextStream,ar as TextStreamSchema,Fe as UrunAudio,Tt as UrunAuthProvider,Ar as UrunCamera,Qr as UrunControlSender,Kr as UrunDocPanel,ee as UrunErrorBoundary,rn as UrunEventSpine,bt as UrunJwtProvider,_t as UrunProvider,ln as UrunSessionGate,cn as UrunSessionStatus,Xr as UrunStreamTail,Rr as UrunVoice,ie as authMode,Ve as createDocStore,Fs as describeSessionPhase,ne as formatPayload,fe as getUrunAudioContext,We as parseJsonObject,H as pushCapped,Kt as registerComponent,qe as resumeUrunAudioContext,B as urunPublicEnv,qt as useApp,Gt as useChat,jt as useCompletion,re as useDocStore,ut as useImageFrame,ct as useMetricsPanel,tt as useProgressCard,Vt as useRequest,jr as useSessionDoc,$e as useSessionPhase,Lr as useSessionTrack,nt as useStatusBadge,He as useStreamMessages,at as useTextStream,Or as useUrunAudioLevel,Re as useUrunAuth,Pt as usesWorkOSAuth};
2
+ import{a as Er,b as Ar,c as xe}from"./chunk-WF2OBDSX.mjs";import{useEffect as Or,useMemo as Ir,useState as qr}from"react";import{Component as _r}from"react";import{jsx as Ge,jsxs as Mr}from"react/jsx-runtime";var te=class extends _r{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||Mr("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:[Ge("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Ge("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Nr}from"react";var ce=Nr(null);function j(e){return e&&e.trim()?e.trim():void 0}function F(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return j(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return j(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return j(typeof process<"u"?process.env?.[e]:void 0)}}function le(){let e=F("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||F("VERCEL_ENV")==="production"?"workos":F("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Dr(){return le()==="workos"}import{jsx as Pe}from"react/jsx-runtime";function Lr({baseUrl:e,orgId:r,appId:t,jwt:n,authProvider:o,fallback:s,children:a}){let[u,c]=qr(),i=xe(),S=F("NEXT_PUBLIC_SESSION_TOKEN")??F("NEXT_PUBLIC_URUN_JWT"),l=le(),m=l==="workos"&&!n,x=n??(l==="jwt"?S:void 0)??u,C=o??F("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),b=m&&!x,T=Ir(()=>({appId:t,baseUrl:e,orgId:r,jwt:x,getAccessToken:m?i?.getAccessToken:void 0,authProvider:C}),[t,i,e,C,x,r,m]);return Or(()=>{if(!m||!i)return;let k=!1,h=i;async function v(){try{let R=await h.getAccessToken();k||c(R??void 0)}catch{k||c(void 0)}}v();let P=window.setInterval(()=>{v()},6e4);return()=>{k=!0,window.clearInterval(P)}},[i,m]),Pe(te,{fallback:s,children:b?Pe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Pe(ce.Provider,{value:T,children:a})})}import{useContext as Wr,useMemo as Ke,useReducer as Fr,useRef as Br}from"react";import{App as Vr}from"@urun-sh/core";function Hr(e,r){return`${e}:${JSON.stringify(r??{})}`}var we=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()}},Ee=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()}},Ae=class{constructor(r,t){this._session=r;this._notify=t;this._unsubscribePhase=this._session.onPhase(()=>this._notify())}_session;_notify;_docs=new Map;_streams=new Map;_unsubscribePhase;_disposed=!1;get disposed(){return this._disposed}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}onPhase(r){return this._session.onPhase(r)}whenLive(r){return this._session.whenLive(r)}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 we(this._session.doc(r),this._notify),this._docs.set(r,t)),t}stream(r){let t=this._streams.get(r);return t||(t=new Ee(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 $r(){let e=Wr(ce);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,r]=Fr(o=>o+1,0),t=Br(new Map),n=Ke(()=>Vr(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 Ke(()=>new Proxy({},{get(o,s){if(typeof s=="string")return a=>{let u=Hr(s,a),c=t.current.get(u);if(c&&!c.disposed)return c;let i=new Ae(n[s](a),r);return t.current.set(u,i),i}}}),[n])}import{useCallback as _e,useEffect as jr,useMemo as Jr,useRef as de,useState as Me}from"react";function Z(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 Xr(e,r){let t=Jr(()=>Z(e),[e]),[n,o]=Me(void 0),[s,a]=Me(null),[u,c]=Me(!1),i=de(r);i.current=r;let S=de(0),l=de(null),m=de(!0);jr(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let x=_e(async T=>{l.current?.abort();let k=new AbortController;l.current=k;let h=++S.current,v=()=>m.current&&S.current===h;v()&&(c(!0),a(null));try{let P=await t.request(T,{...i.current,signal:k.signal});return v()&&(o(P),c(!1),i.current?.onSuccess?.(P)),P}catch(P){let R=zr(P);throw v()&&(a(R),c(!1),i.current?.onError?.(R)),R}},[t]),C=_e(T=>{x(T).catch(()=>{})},[x]),b=_e(()=>{S.current++,l.current?.abort(),l.current=null,o(void 0),a(null),c(!1)},[]);return{mutate:C,mutateAsync:x,data:n,error:s,isPending:u,reset:b}}import{useCallback as Ze,useEffect as Gr,useMemo as Kr,useRef as pe,useState as Ne}from"react";function Ye(e){return e instanceof Error?e:new Error(String(e))}var Zr=e=>typeof e=="string"?e:String(e);function Yr(e,r){let t=Kr(()=>Z(e),[e]),[n,o]=Ne(""),[s,a]=Ne(!1),[u,c]=Ne(null),i=pe(r);i.current=r;let S=pe(0),l=pe(null),m=pe(!0);Gr(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let x=Ze(()=>{S.current++,l.current?.cancel(),l.current=null,m.current&&a(!1)},[]),C=Ze(async b=>{l.current?.cancel();let T=++S.current,k=()=>m.current&&S.current===T,h=i.current,v=h?.parseChunk??Zr,P=h?.buildPayload??(y=>({prompt:y}));k()&&(o(""),c(null),a(!0));let{parseChunk:R,buildPayload:q,onFinish:O,onError:d,...U}=h??{},p="",f;try{f=t.requestStream(P(b),U),l.current=f}catch(y){let w=Ye(y);k()&&(c(w),a(!1),h?.onError?.(w));return}try{for await(let y of f){if(S.current!==T)break;p+=v(y),k()&&o(p)}k()&&(a(!1),h?.onFinish?.(p))}catch(y){let w=Ye(y);k()&&(c(w),a(!1),h?.onError?.(w))}finally{l.current===f&&(l.current=null)}},[t]);return{completion:n,complete:C,stop:x,isStreaming:s,error:u}}import{useCallback as Qe,useEffect as Qr,useMemo as et,useRef as Y,useState as me}from"react";function er(e){return e instanceof Error?e:new Error(String(e))}var rt=e=>typeof e=="string"?e:String(e),rr=0;function De(e){return rr+=1,`${e}-${rr}`}function tt(e,r){let t=et(()=>Z(e),[e]),[n,o]=me(()=>(r?.initialMessages??[]).map(v=>({id:v.id??De("msg"),role:v.role,content:v.content}))),[s,a]=me(""),[u,c]=me(!1),[i,S]=me(null),l=Y(r);l.current=r;let m=Y(n);m.current=n;let x=Y(s);x.current=s;let C=Y(0),b=Y(null),T=Y(!0);Qr(()=>(T.current=!0,()=>{T.current=!1,b.current?.cancel(),b.current=null}),[]);let k=Qe(()=>{C.current++,b.current?.cancel(),b.current=null,T.current&&c(!1)},[]),h=Qe(async v=>{let P=v===void 0,R=(P?x.current:v)??"";if(!R.trim())return;b.current?.cancel();let O=++C.current,d=()=>T.current&&C.current===O,U=l.current,p=U?.parseChunk??rt,f={id:De("msg"),role:"user",content:R},y={id:De("msg"),role:"assistant",content:""},w=[...m.current,f].map(A=>({role:A.role,content:A.content})),g=[...m.current,f,y];m.current=g,o(g),P&&a(""),S(null),c(!0);let _=U?.buildPayload??(A=>({messages:A})),{initialMessages:re,parseChunk:Ce,buildPayload:Re,onFinish:Ue,onError:Pr,...E}=U??{},M=A=>{o(I=>I.map(D=>D.id===y.id?{...D,content:A}:D))},W="",N;try{N=t.requestStream(_(w),E),b.current=N}catch(A){let I=er(A);d()&&(S(I),c(!1),U?.onError?.(I));return}try{for await(let A of N){if(C.current!==O)break;W+=p(A),d()&&M(W)}d()&&(c(!1),U?.onFinish?.({...y,content:W}))}catch(A){let I=er(A);d()&&(S(I),c(!1),U?.onError?.(I))}finally{b.current===N&&(b.current=null)}},[t]);return{messages:n,input:s,setInput:a,sendMessage:h,stop:k,isStreaming:u,error:i}}var tr=new Map;function nt(e,r,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tr.set(e,{component:r,schema:t})}function nr(e,r){let t=tr.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 st,jsx as fe}from"react/jsx-runtime";function ot({name:e,props:r,fallback:t}){let n=nr(e,r);if(n.error)return console.warn(`[urun] ComponentRenderer: ${n.error}`),t?fe(st,{children:t}):fe("div",{className:"urun-component-error",role:"alert",children:fe("span",{className:"urun-component-error-text",children:n.error})});let o=n.Component;return fe(o,{...n.validatedProps})}import{z as ne}from"zod";import{jsx as Oe,jsxs as or}from"react/jsx-runtime";var at=ne.object({step:ne.number().min(0),total:ne.number().min(1),label:ne.string().optional(),variant:ne.enum(["default","success","error"]).default("default")});function sr(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 it(e){let{step:r,total:t,label:n,variant:o,percentage:s}=sr(e);return or("div",{className:"urun-progress-card","data-variant":o,children:[n&&Oe("div",{className:"urun-progress-label",children:n}),Oe("div",{className:"urun-progress-bar",children:Oe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),or("div",{className:"urun-progress-text",children:[r,"/",t]})]})}import{z as Ie}from"zod";import{jsx as ar,jsxs as dt}from"react/jsx-runtime";var ut=Ie.object({state:Ie.enum(["thinking","generating","idle","error"]),message:Ie.string().optional()}),ct={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ir(e){let{state:r,message:t}=e,n=r==="thinking"||r==="generating",o=t??ct[r]??r;return{state:r,message:o,isActive:n}}function lt(e){let{state:r,message:t,isActive:n}=ir(e);return dt("span",{className:"urun-status-badge","data-state":r,children:[ar("span",{className:`urun-status-indicator${n?" urun-status-pulse":""}`}),ar("span",{className:"urun-status-message",children:t})]})}import{useRef as ur,useEffect as pt}from"react";import{z as qe}from"zod";import{jsx as cr,jsxs as gt}from"react/jsx-runtime";var mt=qe.object({text:qe.string(),streaming:qe.boolean().default(!1)});function lr(e){let{text:r,streaming:t=!1}=e,n=r.length===0;return{text:r,streaming:t,isEmpty:n}}function ft(e){let{text:r,streaming:t}=lr(e),n=ur(null),o=ur(0);return pt(()=>{let s=n.current;s&&r.length!==o.current&&(s.textContent=r,o.current=r.length)},[r]),gt("div",{className:"urun-text-stream",children:[cr("span",{ref:n,className:"urun-text-content"}),t&&cr("span",{className:"urun-text-cursor"})]})}import{z as ge}from"zod";import{jsx as dr,jsxs as vt}from"react/jsx-runtime";var St=ge.object({src:ge.string().url(),alt:ge.string().optional(),caption:ge.string().optional()});function pr(e){let{src:r,alt:t,caption:n}=e;return{src:r,alt:t??"",caption:n}}function ht(e){let{src:r,alt:t,caption:n}=pr(e);return vt("figure",{className:"urun-image-frame",children:[dr("img",{className:"urun-image",src:r,alt:t}),n&&dr("figcaption",{className:"urun-image-caption",children:n})]})}import{z as B}from"zod";import{jsx as Le,jsxs as bt}from"react/jsx-runtime";var kt=B.object({metrics:B.array(B.object({label:B.string(),value:B.union([B.string(),B.number()]),unit:B.string().optional()}))});function mr(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function yt(e){let{metrics:r}=mr(e);return Le("div",{className:"urun-metrics-panel",children:r.map((t,n)=>bt("div",{className:"urun-metric-card",children:[Le("div",{className:"urun-metric-label",children:t.label}),Le("div",{className:"urun-metric-value",children:t.displayValue})]},n))})}import{forwardRef as Ct,useCallback as Q,useEffect as We,useImperativeHandle as Rt,useRef as ee}from"react";import{observePageLifecycle as Ut}from"@urun-sh/core";var Se=null;function Tt(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function he(){if(Se)return Se;let e=Tt();return e?(Se=new e,Se):null}function ve(){let e=he();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Pt}from"react/jsx-runtime";var xt=1e3,fr=200;function Fe(...e){console.debug("[urun-audio]",...e)}var Be=Ct(function(r,t){let{session:n,stream:o="audio",track:s,controls:a=!1,className:u,onTrack:c,onUnlockChange:i,onAudioElement:S}=r,l=ee(null),m=ee(null),x=ee(null),C=ee(null),b=ee(c);b.current=c;let T=ee(i);T.current=i;let k=Q(d=>{x.current!==d&&(x.current=d,T.current?.(d))},[]),h=Q(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=l.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),v=Q(d=>{let U=l.current;if(!U)return;let p=U.play();!p||typeof p.then!="function"||p.then(()=>{U.muted||k(!0)}).catch(f=>{let y=f instanceof Error?f.name:String(f);if(y==="AbortError"){Fe(`play() aborted (${d}); retrying in ${fr}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${d}:retry`)},fr);return}if(y==="NotAllowedError"){Fe(`play() blocked pending a user gesture (${d})`),k(!1);return}Fe(`play() failed (${d})`,f)})},[k]),P=Q(d=>{let U=h();if(U){for(let p of U.getAudioTracks())p!==d&&U.removeTrack(p);d&&!U.getAudioTracks().includes(d)&&U.addTrack(d),d&&v("track-attach"),b.current?.(d)}},[h,v]),R=Q(()=>{let d=l.current;d&&(h(),d.muted=!1,v("gesture"),ve(),k(!0))},[h,v,k]);Rt(t,()=>({unlock:R,get unlocked(){return x.current===!0},get element(){return l.current}}),[R]);let q=Q(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),h()),S?.(d)},[h,S]),O=s!==void 0;return We(()=>{if(O){P(s??null);return}if(!n)return;let d=n.stream(o),U=()=>{let g=m.current;return g?g.getAudioTracks()[0]??null:null},p=g=>{if(g!==U()&&(P(g),g)){let _=()=>{U()===g&&P(null)};g.addEventListener("ended",_)}},f=d.track;f&&f.readyState==="live"&&p(f);let y=d.on("track",g=>{g&&g.readyState!=="live"||p(g)}),w=setInterval(()=>{let g=d.track;g&&g.readyState==="live"&&p(g)},xt);return()=>{y(),clearInterval(w)}},[n,o,O,s,P]),We(()=>Ut(()=>{ve(),x.current===!0&&v("foreground")}),[v]),We(()=>()=>{C.current&&clearTimeout(C.current)},[]),Pt("audio",{ref:q,className:u,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});import{forwardRef as wt,useCallback as oe,useEffect as gr,useImperativeHandle as Et,useRef as J}from"react";import{observePageLifecycle as At,sessionFailureFromMediaError as Sr}from"@urun-sh/core";import{jsx as Mt}from"react/jsx-runtime";var hr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ve(...e){console.debug("[urun-voice]",...e)}var _t=wt(function(r,t){let{session:n,stream:o="audio",constraints:s=hr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:i,onError:S,onMicStream:l,onTrack:m,onUnlockChange:x}=r,C=J(null),b=J(null),T=J(!1),k=J(i);k.current=i;let h=J(S);h.current=S;let v=J(l);v.current=l;let P=oe(p=>{T.current!==p&&(T.current=p,k.current?.(p))},[]),R=oe(()=>{let p=b.current;if(p){for(let f of p.getTracks())f.stop();b.current=null,v.current?.(null)}},[]),q=oe(async()=>{R(),P(!1),await n.stream(o).detach().catch(()=>{})},[n,o,R,P]),O=oe(async()=>{C.current?.unlock();let p;try{p=await navigator.mediaDevices.getUserMedia({audio:s,video:!1})}catch(g){let _=Sr(g,n.status);throw h.current?.(_),_}R(),b.current=p,v.current?.(p);let f=p.getAudioTracks()[0];if(!f){R();let g=Sr(Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"}),n.status);throw h.current?.(g),g}n.connect?.();let y;for(let g=1;g<=u;g++)try{await n.whenLive(a!==void 0?{timeout:a}:void 0),await n.stream(o).attach(f),P(!0);return}catch(_){y=_,Ve(`start attempt ${g}/${u} failed`,_),g<u&&await new Promise(re=>setTimeout(re,c))}R(),P(!1);let w=y instanceof Error?y:new Error(String(y??"voice start failed"));throw h.current?.(w),w},[n,o,s,a,u,c,R,P]);Et(t,()=>({start:O,stop:q,unlock:()=>C.current?.unlock(),get active(){return T.current},get micStream(){return b.current},get audio(){return C.current}}),[O,q]);let d=J(!1),U=oe(async()=>{if(!T.current||d.current)return;let p=b.current?.getAudioTracks()[0]??null;if(p&&p.readyState==="live"){try{await n.stream(o).attach(p)}catch(f){Ve("foreground mic re-assert failed (will retry on next pass)",f)}return}d.current=!0;try{let f=await navigator.mediaDevices.getUserMedia({audio:s,video:!1}),y=f.getAudioTracks()[0];if(!y){for(let w of f.getTracks())w.stop();throw new Error("no microphone audio track after foreground re-acquire")}R(),b.current=f,v.current?.(f),await n.stream(o).attach(y)}catch(f){let y=f instanceof Error?f:new Error(String(f));Ve("foreground mic re-acquire failed",y),h.current?.(y)}finally{d.current=!1}},[n,o,s,R]);return gr(()=>{let p=()=>{U()};return typeof n.onRecovery=="function"?n.onRecovery(p):At(p)},[n,U]),gr(()=>R,[R]),Mt(Be,{ref:C,session:n,stream:o,onTrack:m,onUnlockChange:x})});import{sessionFailureFromMediaError as vr}from"@urun-sh/core";import{forwardRef as Nt,useCallback as V,useEffect as Dt,useImperativeHandle as Ot,useRef as L,useState as It}from"react";import{jsx as Lt,jsxs as Wt}from"react/jsx-runtime";var yr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[urun-camera]",...e)}var qt=Nt(function(r,t){let{session:n,stream:o="video",constraints:s,facingMode:a="environment",mirror:u="auto",connectTimeoutMs:c,preview:i=!0,className:S,videoClassName:l,onActiveChange:m,onError:x,onStream:C,onTrack:b,children:T}=r,k=L(null),h=L(null),v=L(null),P=L(!1),R=L(a),[q,O]=It(a),d=L(m);d.current=m;let U=L(x);U.current=x;let p=L(C);p.current=C;let f=L(b);f.current=b;let y=V(E=>{P.current!==E&&(P.current=E,d.current?.(E))},[]),w=V(E=>{let M=k.current;M&&(M.muted=!0,M.srcObject=E,E&&M.play()?.catch?.(W=>kr("preview play() failed",W)))},[]),g=V(()=>{v.current?.(),v.current=null;let E=h.current;if(E){for(let M of E.getTracks())M.stop();h.current=null,p.current?.(null),f.current?.(null)}w(null)},[w]),_=V(async E=>{let M=h.current,W=v.current,N;try{N=await navigator.mediaDevices.getUserMedia({video:{...yr,...s,facingMode:E},audio:!1})}catch(D){let $=vr(D,n.status);throw U.current?.($),$}let A=N.getVideoTracks()[0];if(!A){for(let $ of N.getTracks())$.stop();let D=vr(Object.assign(new Error("no camera video track"),{name:"NotFoundError"}),n.status);throw U.current?.(D),D}h.current=N,R.current=E,O(E),w(N),p.current?.(N);let I=()=>{h.current===N&&(kr("camera track ended (device removed or permission revoked)"),g(),y(!1))};A.addEventListener("ended",I),v.current=()=>A.removeEventListener("ended",I);try{n.connect?.(),await n.whenLive(c!==void 0?{timeout:c}:void 0),await n.stream(o).attachVideo(A)}catch(D){A.removeEventListener("ended",I);for(let wr of N.getTracks())wr.stop();h.current===N&&(h.current=M,v.current=W,w(M),p.current?.(M));let $=D instanceof Error?D:new Error(String(D));throw U.current?.($),$}if(M&&M!==N){W?.();for(let D of M.getTracks())D.stop()}f.current?.(A),y(!0)},[n,o,s,c,w,g,y]),re=V(E=>_(E?.facingMode??R.current),[_]),Ce=V(async E=>{P.current&&R.current===E||await _(E)},[_]),Re=V(()=>_(R.current==="environment"?"user":"environment"),[_]),Ue=V(async()=>{g(),y(!1),await n.stream(o).detachVideo().catch(()=>{})},[n,o,g,y]);return Ot(t,()=>({start:re,stop:Ue,flip:Re,setFacingMode:Ce,get active(){return P.current},get facingMode(){return R.current},get stream(){return h.current},get element(){return k.current}}),[re,Ue,Re,Ce]),Dt(()=>g,[g]),i?Wt("div",{className:S,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[Lt("video",{ref:k,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(u==="auto"?q==="user":u)?{transform:"scaleX(-1)"}:{}}}),T]}):null});import{useEffect as Ft,useState as Bt}from"react";var He={level:0,speaking:!1};function Vt(e,r={}){let{fftSize:t=512,intervalMs:n=100,speakingThreshold:o=.02}=r,[s,a]=Bt(He);return Ft(()=>{if(!e){a(He);return}let u=he();if(!u||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let i,S;try{i=u.createMediaStreamSource(c),S=u.createAnalyser(),S.fftSize=t,i.connect(S)}catch{return}let l=new Uint8Array(S.fftSize),x=setInterval(()=>{S.getByteTimeDomainData(l);let C=0;for(let T=0;T<l.length;T++){let k=(l[T]-128)/128;C+=k*k}let b=Math.sqrt(C/l.length);a(T=>{let k=b>o;return Math.abs(T.level-b)<.005&&T.speaking===k?T:{level:b,speaking:k}})},n);return()=>{clearInterval(x),i.disconnect(),a(He)}},[e,t,n,o]),s}import{useEffect as Ht,useState as $t}from"react";function jt(e,r){let[t,n]=$t(null);return Ht(()=>{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 Zt}from"react";import{useEffect as Gt,useMemo as Kt}from"react";import{createStore as Jt}from"zustand/vanilla";import{useStore as zt}from"zustand";var Xt=()=>{};function $e(e,r={}){let t=i=>{e?.set(i)},n=()=>e?e.get()??{}:{},o=Jt(()=>({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):Xt,c=(i=>zt(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 se(e,r){let t=Kt(()=>$e(e&&r?e.doc(r):null,{bind:!1}),[e,r]);return Gt(()=>t.bind(),[t]),t}function Yt(e,r,t){let o=se(e,r)(t??(u=>u)),s=Zt(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 Qt,useState as en}from"react";var z=200;function H(e,r,t=200){let n=[...e,r];return n.length>t?n.slice(n.length-t):n}function ae(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function je(e){let r=e.trim();if(!r)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(r)}catch(n){return{ok:!1,error:n instanceof Error?n.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function Je(e,r,t={}){let n=t.cap??200,[o,s]=en([]);return Qt(()=>{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=>H(i,{at:Date.now(),payload:c.value},n))}})(),()=>{a=!1,u.return?.()}},[e,r,n]),o}import{jsx as ke,jsxs as ie}from"react/jsx-runtime";function rn({session:e,name:r,cap:t,className:n}){let o=Je(e,r,{cap:t});return ie("div",{className:["urun-stream-tail",n].filter(Boolean).join(" "),children:[ie("div",{className:"urun-stream-tail-meta",children:[ke("code",{children:r}),ie("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),ke("div",{className:"urun-stream-tail-log",children:o.length===0?ie("span",{className:"urun-stream-tail-empty",children:["Waiting for ",ke("code",{children:r})," messages\u2026"]}):o.map((s,a)=>ie("div",{className:"urun-stream-tail-line",children:[ke("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ae(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as tn,useState as br}from"react";import{jsx as X,jsxs as ye}from"react/jsx-runtime";function be({placeholder:e,buttonLabel:r,disabled:t,onApply:n}){let[o,s]=br(""),[a,u]=br(null),c=tn(()=>{let i=je(o);if(!i.ok){u(i.error);return}u(null),n(i.value,o.trim()),s("")},[o,n]);return ye("div",{className:"urun-doc-patch",children:[X("textarea",{className:"urun-doc-patch-input",value:o,onChange:i=>s(i.target.value),placeholder:e,rows:3}),ye("div",{className:"urun-doc-patch-actions",children:[X("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:c,children:r}),a?X("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function nn({session:e,docKey:r,editable:t=!0,patchPlaceholder:n='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=se(e,r),a=s(i=>i.doc),u=s(i=>i.synced),c=s(i=>i.set);return ye("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[ye("div",{className:"urun-doc-panel-meta",children:[X("code",{children:r}),X("span",{className:"urun-doc-panel-synced","data-synced":u?"true":"false",children:u?"synced":"syncing\u2026"})]}),X("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),t?X(be,{placeholder:n,buttonLabel:"Apply patch",disabled:!e,onApply:i=>c(i)}):null]})}import{useEffect as on,useState as sn}from"react";import{jsx as ue,jsxs as Cr}from"react/jsx-runtime";function Tr(e,r=600){return e.length>r?`${e.slice(0,r)}\u2026`:e}function an({session:e,docKey:r="control",cap:t=200,className:n}){let[o,s]=sn([]);return on(()=>(s([]),e?e.doc(r).on("change",u=>{s(c=>H(c,{at:Date.now(),direction:"in",text:Tr(ae(u))},t))}):void 0),[e,r,t]),Cr("div",{className:["urun-control-sender",n].filter(Boolean).join(" "),children:[ue(be,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${r}`,disabled:!e,onApply:(a,u)=>{e?.doc(r).set(a),s(c=>H(c,{at:Date.now(),direction:"out",text:Tr(u)},t))}}),ue("div",{className:"urun-control-sender-log",children:o.length===0?ue("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,u)=>Cr("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[ue("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",ue("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${u}`))})]})}import{useEffect as un,useState as cn}from"react";import{jsx as Te,jsxs as dn}from"react/jsx-runtime";function ln({session:e,trackNames:r=["video","audio"],docKeys:t=["control"],cap:n=200,className:o}){let[s,a]=cn([]),u=r.join(","),c=t.join(",");return un(()=>{if(a([]),!e)return;let i=(l,m)=>a(x=>H(x,{at:Date.now(),kind:l,text:m},n)),S=[];S.push(e.onPhase(l=>i("phase",`phase \u2192 ${l.name}`)));for(let l of r){let m=e.stream(l);S.push(m.on("track",x=>i("track",`${l}: ${x?"track arrived":"track ended"}`)))}for(let l of t){let m=e.doc(l);S.push(m.on("change",()=>i("doc",`${l} changed`)))}return()=>S.forEach(l=>l())},[e,u,c,n]),Te("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Te("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,S)=>dn("div",{className:"urun-event-spine-line","data-kind":i.kind,children:[Te("span",{className:"urun-event-spine-kind",children:i.kind})," ",Te("span",{className:"urun-event-spine-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${S}`))})}import{describeSessionPhase as yn,isWakingPhase as bn}from"@urun-sh/core";import{useEffect as pn,useState as mn}from"react";function G(e){let[r,t]=mn(e?.phase??null);return pn(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),r}import{describeSessionPhase as vn}from"@urun-sh/core";import{useEffect as fn,useRef as gn,useState as Sn}from"react";import{isWakingPhase as hn}from"@urun-sh/core";function ze(e){let r=G(e),t=hn(r?.name),n=gn(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]=Sn(s);return fn(()=>{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 kn,jsx as Rr,jsxs as Ur}from"react/jsx-runtime";function Xe({session:e,render:r,className:t}){let n=ze(e);return!n.waking||!n.phase?null:Rr("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":n.phase.name,"data-runtime-state":n.state,children:r?r(n):Ur(kn,{children:[Rr("span",{className:"urun-session-waking-label",children:vn(n.phase)})," ",Ur("span",{className:"urun-session-waking-elapsed",children:["(",n.seconds,"s)"]})]})})}import{jsx as K,jsxs as xr}from"react/jsx-runtime";var Tn={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended"};function Cn({session:e,className:r}){let t=G(e),n=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:t?.name==="error"&&t.error?t.error.reason:t?.runtime?.reason??null;return xr("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:Tn[n]}),o?K("span",{className:"urun-session-status-detail",children:o}):null]})}function Rn({session:e,children:r,fallback:t,onStartOver:n,className:o}){let s=G(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&&bn(s.name)?K(Xe,{session:e}):s&&s.name!=="idle"?yn(s):"Waiting for a live session\u2026"}),u=n!==void 0&&(s?.name==="error"||s?.name==="ended");return xr("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{describeSessionPhase as ma,isWakingPhase as fa}from"@urun-sh/core";export{ot as ComponentRenderer,yr as DEFAULT_CAMERA_CONSTRAINTS,z as DEFAULT_LOG_CAP,hr as DEFAULT_VOICE_CONSTRAINTS,be as DocPatchForm,ht as ImageFrame,St as ImageFrameSchema,yt as MetricsPanel,kt as MetricsPanelSchema,it as ProgressCard,at as ProgressCardSchema,lt as StatusBadge,ut as StatusBadgeSchema,ft as TextStream,mt as TextStreamSchema,Be as UrunAudio,Er as UrunAuthProvider,qt as UrunCamera,an as UrunControlSender,nn as UrunDocPanel,te as UrunErrorBoundary,ln as UrunEventSpine,Ar as UrunJwtProvider,Lr as UrunProvider,Rn as UrunSessionGate,Cn as UrunSessionStatus,Xe as UrunSessionWaking,rn as UrunStreamTail,_t as UrunVoice,le as authMode,$e as createDocStore,ma as describeSessionPhase,ae as formatPayload,he as getUrunAudioContext,fa as isWakingPhase,je as parseJsonObject,H as pushCapped,nt as registerComponent,ve as resumeUrunAudioContext,F as urunPublicEnv,$r as useApp,tt as useChat,Yr as useCompletion,se as useDocStore,pr as useImageFrame,mr as useMetricsPanel,sr as useProgressCard,Xr as useRequest,Yt as useSessionDoc,G as useSessionPhase,jt as useSessionTrack,ze as useSessionWake,ir as useStatusBadge,Je as useStreamMessages,lr as useTextStream,Vt as useUrunAudioLevel,xe as useUrunAuth,Dr as usesWorkOSAuth};
package/dist/styles.css CHANGED
@@ -399,3 +399,16 @@
399
399
  .urun-session-status-detail {
400
400
  color: var(--urun-wb-muted, #8a8a8a);
401
401
  }
402
+
403
+ /* Scale-to-zero "waking (Ns)" building block (UrunSessionWaking) */
404
+ .urun-session-waking {
405
+ display: inline-flex;
406
+ align-items: baseline;
407
+ gap: 6px;
408
+ font-size: 12px;
409
+ }
410
+
411
+ .urun-session-waking-elapsed {
412
+ color: var(--urun-wb-muted, #8a8a8a);
413
+ font-variant-numeric: tabular-nums;
414
+ }
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-detail{color:var(--urun-wb-muted, #8a8a8a)}
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-detail{color:var(--urun-wb-muted, #8a8a8a)}.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}
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})},z=(t,r,n,u)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of G(r))!J.call(t,s)&&s!==n&&E(t,s,{get:()=>r[s],enumerable:!(u=W(r,s))||u.enumerable});return t};var Q=(t,r,n)=>(n=t!=null?q(Y(t)):{},z(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>z(E({},"__esModule",{value:!0}),t);var ae={};K(ae,{UrunVideo:()=>H});module.exports=X(ae);var o=require("react"),O=Q(require("video.js")),pe=require("video.js/dist/video-js.css");var b=require("react");var k=require("react"),Z=require("@urun-sh/core/internal");var $=require("react/jsx-runtime"),N=(0,k.createContext)(null);function R(t){let r=(0,b.useContext)(N);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,u]=(0,b.useState)(null);return(0,b.useEffect)(()=>{let s=r.getState()._transport;if(!s)return;let m=s.getTrackByName?.bind(s),g=m?.(t);g&&g.readyState!=="ended"&&u(g);let j=s.on("track",h=>{let w=m?.(t);w&&w.id!==h.id||(u(h),h.addEventListener("ended",()=>{u(null)}))});return()=>{j()}},[t,r]),n}var l=require("react/jsx-runtime");function I(t){t.posterImage?.hide?.()}var ee=`
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})},M=(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)):{},M(r||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),X=t=>M(E({},"__esModule",{value:!0}),t);var se={};K(se,{UrunVideo:()=>H});module.exports=X(se);var o=require("react"),O=Q(require("video.js")),me=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 m=s.getTrackByName?.bind(s),v=m?.(t);v&&v.readyState!=="ended"&&i(v);let j=s.on("track",h=>{let w=m?.(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=`
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 re(){if(typeof document>"u"||document.getElementById(U))return;let t=document.createElement("style");t.id=U,t.textContent=ee,document.head.appendChild(t)}var te=["playToggle","volumePanel","fullscreenToggle"],ne=["playToggle","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","remainingTimeDisplay","fullscreenToggle"],A=(0,o.forwardRef)(function(r,n){let{track:u,stream:s,src:m,type:g="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:L,onPlayerReady:V,children:_}=r,P=typeof m=="string"&&m.length>0,c=!P,y=(0,o.useRef)(null),f=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),L?.(e)},[n,L]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let v=(0,o.useCallback)(()=>{let e=y.current;if(!e||!e.srcObject&&!e.src)return;T&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=e.play();a&&typeof a.then=="function"&&a.then(()=>x(!1)).catch(d=>{(d instanceof Error?d.name:String(d))!=="AbortError"&&x(!0)})},[T]);return(0,o.useEffect)(()=>{if(typeof document>"u")return;let e=y.current;if(!e)return;re(),T&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=S,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let a=(0,O.default)(e,{controls:D,autoplay:S,muted:T,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:w,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:c?te:ne}});c&&a.addClass("urun-video-live");let d=()=>x(!1),p=()=>{a.hasStarted(!0),I(a),d()},i=()=>{c&&v()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",i),c&&e.addEventListener("pause",i),f.current=a,V?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",i),e.removeEventListener("pause",i),V?.(null),f.current&&(f.current.dispose(),f.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=f.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:m,type:g}),S&&v()},[P,m,g,S,v]),(0,o.useEffect)(()=>{if(!c)return;let e=f.current;if(!e)return;let a=u??null,d=s??null;!d&&a&&(d=new MediaStream([a]));let p=e.tech?.(!0)?.el?.()??y.current;if(!p)return;if(!d){p.srcObject=null,x(!1);return}p.srcObject=d,v();let i=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),v()},M=()=>{p.srcObject=null,x(!1)};return i&&(i.addEventListener("unmute",C),i.addEventListener("ended",M),i.muted||C()),()=>{i&&(i.removeEventListener("unmute",C),i.removeEventListener("ended",M))}},[c,u,s,v]),(0,l.jsxs)("div",{className:j,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":c?"live":"vod",children:[(0,l.jsx)("video",{ref:F,className:["video-js","vjs-default-skin",h].filter(Boolean).join(" "),playsInline:!0}),B&&(0,l.jsx)("button",{type:"button",onClick:v,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:(0,l.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[(0,l.jsx)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:(0,l.jsx)("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),_]})}),oe=(0,o.forwardRef)(function({name:r,...n},u){let s=R(r);return(0,l.jsx)(A,{ref:u,...n,track:s})}),H=(0,o.forwardRef)(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?(0,l.jsx)(oe,{ref:n,...r,name:r.name}):(0,l.jsx)(A,{ref:n,...r})});0&&(module.exports={UrunVideo});
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:m,type:v="video/mp4",className:j,videoClassName:h,poster:w,controls:D=!0,autoPlay:S=!0,muted:T=!0,onVideoElement:L,onPlayerReady:z,children:_}=r,P=typeof m=="string"&&m.length>0,c=!P,y=(0,o.useRef)(null),f=(0,o.useRef)(null),[B,x]=(0,o.useState)(!1),F=(0,o.useCallback)(e=>{y.current=e,typeof n=="function"?n(e):n&&(n.current=e),L?.(e)},[n,L]);(0,o.useImperativeHandle)(n,()=>y.current,[]);let g=(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&&g()};return e.addEventListener("playing",p),e.addEventListener("loadedmetadata",u),c&&e.addEventListener("pause",u),f.current=a,z?.(a),()=>{e.removeEventListener("playing",p),e.removeEventListener("loadedmetadata",u),e.removeEventListener("pause",u),z?.(null),f.current&&(f.current.dispose(),f.current=null)}},[c]),(0,o.useEffect)(()=>{if(!P)return;let e=f.current;if(!e)return;let a=e.tech?.(!0)?.el?.();a&&(a.srcObject=null),e.src({src:m,type:v}),S&&g()},[P,m,v,S,g]),(0,o.useEffect)(()=>{if(!c)return;let e=f.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,g();let u=d.getVideoTracks()[0]??a??null,C=()=>{e.hasStarted(!0),I(e),g()},V=()=>{p.srcObject=null,x(!1)};return u&&(u.addEventListener("unmute",C),u.addEventListener("ended",V),u.muted||C()),()=>{u&&(u.removeEventListener("unmute",C),u.removeEventListener("ended",V))}},[c,i,s,g]),(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:g,"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});
package/dist/video.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client"
2
- import{forwardRef as j,useCallback as z,useEffect as E,useImperativeHandle as G,useRef as N,useState as Y}from"react";import J from"video.js";import"video.js/dist/video-js.css";import{useContext as F,useState as q,useEffect as W}from"react";import{createContext as B,useState as oe,useEffect as ae,useRef as se}from"react";import{TransportSession as ie}from"@urun-sh/core/internal";import{jsx as le}from"react/jsx-runtime";var V=B(null);function M(o){let r=F(V);if(!r)throw new Error("useTrack must be used within <SessionProvider> or <UrunProvider>");let[n,u]=q(null);return W(()=>{let i=r.getState()._transport;if(!i)return;let c=i.getTrackByName?.bind(i),v=c?.(o);v&&v.readyState!=="ended"&&u(v);let w=i.on("track",f=>{let y=c?.(o);y&&y.id!==f.id||(u(f),f.addEventListener("ended",()=>{u(null)}))});return()=>{w()}},[o,r]),n}import{jsx as m,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
2
+ import{forwardRef as j,useCallback as M,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 z=B(null);function V(o){let r=F(z);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),g=c?.(o);g&&g.readyState!=="ended"&&i(g);let w=u.on("track",f=>{let y=c?.(o);y&&y.id!==f.id||(i(f),f.addEventListener("ended",()=>{i(null)}))});return()=>{w()}},[o,r]),n}import{jsx as m,jsxs as U}from"react/jsx-runtime";function R(o){o.posterImage?.hide?.()}var K=`
3
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 z,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:u,stream:i,src:c,type:v="video/mp4",className:w,videoClassName:f,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),g=N(null),[D,h]=Y(!1),_=z(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=z(()=>{let e=b.current;if(!e||!e.srcObject&&!e.src)return;k&&(e.muted=!0,e.defaultMuted=!0),e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=e.play();t&&typeof t.then=="function"&&t.then(()=>h(!1)).catch(s=>{(s instanceof Error?s.name:String(s))!=="AbortError"&&h(!0)})},[k]);return E(()=>{if(typeof document>"u")return;let e=b.current;if(!e)return;Q(),k&&(e.muted=!0,e.defaultMuted=!0,e.setAttribute("muted","")),e.autoplay=x,e.setAttribute("playsinline",""),e.setAttribute("webkit-playsinline","");let t=J(e,{controls:A,autoplay:x,muted:k,playsinline:!0,preload:"auto",fluid:!1,bigPlayButton:!0,poster:y,userActions:{click:!0,doubleClick:!1,hotkeys:!1},controlBar:{children:d?X:Z}});d&&t.addClass("urun-video-live");let s=()=>h(!1),l=()=>{t.hasStarted(!0),R(t),s()},a=()=>{d&&p()};return e.addEventListener("playing",l),e.addEventListener("loadedmetadata",a),d&&e.addEventListener("pause",a),g.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),g.current&&(g.current.dispose(),g.current=null)}},[d]),E(()=>{if(!S)return;let e=g.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:v}),x&&p()},[S,c,v,x,p]),E(()=>{if(!d)return;let e=g.current;if(!e)return;let t=u??null,s=i??null;!s&&t&&(s=new MediaStream([t]));let l=e.tech?.(!0)?.el?.()??b.current;if(!l)return;if(!s){l.srcObject=null,h(!1);return}l.srcObject=s,p();let a=s.getVideoTracks()[0]??t??null,T=()=>{e.hasStarted(!0),R(e),p()},L=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",L),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",L))}},[d,u,i,p]),U("div",{className:w,style:{position:"relative",width:"100%",height:"100%"},"data-urun-video":"","data-urun-video-mode":d?"live":"vod",children:[m("video",{ref:_,className:["video-js","vjs-default-skin",f].filter(Boolean).join(" "),playsInline:!0}),D&&m("button",{type:"button",onClick:p,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:U("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[m("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:m("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},u){let i=M(r);return m(O,{ref:u,...n,track:i})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?m($,{ref:n,...r,name:r.name}):m(O,{ref:n,...r})});export{ee as UrunVideo};
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:g="video/mp4",className:w,videoClassName:f,poster:y,controls:A=!0,autoPlay:x=!0,muted:k=!0,onVideoElement:P,onPlayerReady:C,children:H}=r,S=typeof c=="string"&&c.length>0,d=!S,b=N(null),v=N(null),[D,h]=Y(!1),_=M(e=>{b.current=e,typeof n=="function"?n(e):n&&(n.current=e),P?.(e)},[n,P]);G(n,()=>b.current,[]);let p=M(()=>{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),v.current=t,C?.(t),()=>{e.removeEventListener("playing",l),e.removeEventListener("loadedmetadata",a),e.removeEventListener("pause",a),C?.(null),v.current&&(v.current.dispose(),v.current=null)}},[d]),E(()=>{if(!S)return;let e=v.current;if(!e)return;let t=e.tech?.(!0)?.el?.();t&&(t.srcObject=null),e.src({src:c,type:g}),x&&p()},[S,c,g,x,p]),E(()=>{if(!d)return;let e=v.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()},L=()=>{l.srcObject=null,h(!1)};return a&&(a.addEventListener("unmute",T),a.addEventListener("ended",L),a.muted||T()),()=>{a&&(a.removeEventListener("unmute",T),a.removeEventListener("ended",L))}},[d,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:[m("video",{ref:_,className:["video-js","vjs-default-skin",f].filter(Boolean).join(" "),playsInline:!0}),D&&m("button",{type:"button",onClick:p,"aria-label":"Tap to play",style:{position:"absolute",inset:0,zIndex:30,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.6)",border:0,cursor:"pointer",color:"#fff"},children:U("span",{style:{display:"inline-flex",alignItems:"center",gap:8,borderRadius:999,border:"1px solid rgba(255,255,255,0.2)",background:"rgba(255,255,255,0.1)",padding:"10px 20px",fontSize:14,fontWeight:500},children:[m("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:16,height:16,"aria-hidden":!0,children:m("path",{d:"M8 5v14l11-7z"})}),"Tap to play"]})}),H]})}),$=j(function({name:r,...n},i){let u=V(r);return m(O,{ref:i,...n,track:u})}),ee=j(function(r,n){return!!r.name&&!r.track&&!r.stream&&!(typeof r.src=="string"&&r.src)?m($,{ref:n,...r,name:r.name}):m(O,{ref:n,...r})});export{ee as UrunVideo};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
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.7",
56
+ "@urun-sh/core": "^0.2.8",
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",