@urun-sh/react 0.2.18 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/index.d.mts +9 -5
- package/dist/index.d.ts +9 -5
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.19
|
|
4
|
+
|
|
5
|
+
- `UrunProvider` gains an optional `eventsUrl` prop: a trusted (typically
|
|
6
|
+
loopback) endpoint that receives session diagnostics (`media-stall`,
|
|
7
|
+
`decode-wall`), phase errors (raw reason/code/http status), and the
|
|
8
|
+
first-live event as JSON POSTs — the hook `urun demo` uses to mirror
|
|
9
|
+
browser-side media failures into the demo terminal. Never sends auth tokens
|
|
10
|
+
or function arguments. Reporting config is deliberately excluded from the
|
|
11
|
+
shared-session identity key (first-value-wins at handle creation), so
|
|
12
|
+
changing `eventsUrl` never redials a live session.
|
|
13
|
+
- Session handles expose `onDiagnostic` (delegates to
|
|
14
|
+
`@urun-sh/core`'s `Session.onDiagnostic`).
|
|
15
|
+
|
|
3
16
|
## 0.2.12
|
|
4
17
|
|
|
5
18
|
- Version-lockstep release with `@urun-sh/core@0.2.12` (legacy `stream.subscribe`
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
|
|
4
|
-
import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
4
|
+
import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
5
|
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
6
6
|
import { ZodSchema, z } from 'zod';
|
|
7
7
|
import { StoreApi } from 'zustand/vanilla';
|
|
@@ -13,6 +13,8 @@ interface UrunProviderProps {
|
|
|
13
13
|
jwt?: string;
|
|
14
14
|
authProvider?: string;
|
|
15
15
|
|
|
16
|
+
eventsUrl?: string;
|
|
17
|
+
|
|
16
18
|
sessionId?: string;
|
|
17
19
|
|
|
18
20
|
onConnected?: () => void;
|
|
@@ -27,7 +29,7 @@ interface UrunProviderProps {
|
|
|
27
29
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
28
30
|
children: ReactNode;
|
|
29
31
|
}
|
|
30
|
-
declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
32
|
+
declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, eventsUrl, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
31
33
|
|
|
32
34
|
interface UrunErrorBoundaryProps {
|
|
33
35
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
@@ -80,6 +82,8 @@ interface ReactSession extends Omit<SessionInterface, 'doc' | 'stream'> {
|
|
|
80
82
|
readonly phase: SessionPhase;
|
|
81
83
|
|
|
82
84
|
readonly status: SessionStatus;
|
|
85
|
+
|
|
86
|
+
onDiagnostic(handler: (diagnostic: SessionDiagnostic) => void): Unsubscribe;
|
|
83
87
|
}
|
|
84
88
|
type ReactApp = Record<string, (args?: Record<string, unknown>) => ReactSession>;
|
|
85
89
|
|
|
@@ -279,15 +283,15 @@ declare const StatusBadgeSchema: z.ZodObject<{
|
|
|
279
283
|
state: z.ZodEnum<["thinking", "generating", "idle", "error"]>;
|
|
280
284
|
message: z.ZodOptional<z.ZodString>;
|
|
281
285
|
}, "strip", z.ZodTypeAny, {
|
|
282
|
-
state: "error" | "
|
|
286
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
283
287
|
message?: string | undefined;
|
|
284
288
|
}, {
|
|
285
|
-
state: "error" | "
|
|
289
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
286
290
|
message?: string | undefined;
|
|
287
291
|
}>;
|
|
288
292
|
type StatusBadgeProps = z.infer<typeof StatusBadgeSchema>;
|
|
289
293
|
declare function useStatusBadge(props: StatusBadgeProps): {
|
|
290
|
-
state: "error" | "
|
|
294
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
291
295
|
message: string;
|
|
292
296
|
isActive: boolean;
|
|
293
297
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { RefObject, ReactNode, Component, ErrorInfo, ComponentType } from 'react';
|
|
4
|
-
import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
4
|
+
import { SessionInterface, SessionDocument, SessionStream, SessionPhase, SessionStatus, SessionDiagnostic, CaptureController, ActivationEvent, PrewakeResult, RuntimeAvailability } from '@urun-sh/core';
|
|
5
5
|
export { ActivationEvent, ActivationState, App as AppInterface, AppOptions, PrewakeResult, PrewakeStatus, RuntimeAvailability, SessionDocument, Session as SessionInterface, SessionPhase, SessionPhaseName, SessionStream, describeSessionPhase, isWakingPhase } from '@urun-sh/core';
|
|
6
6
|
import { ZodSchema, z } from 'zod';
|
|
7
7
|
import { StoreApi } from 'zustand/vanilla';
|
|
@@ -13,6 +13,8 @@ interface UrunProviderProps {
|
|
|
13
13
|
jwt?: string;
|
|
14
14
|
authProvider?: string;
|
|
15
15
|
|
|
16
|
+
eventsUrl?: string;
|
|
17
|
+
|
|
16
18
|
sessionId?: string;
|
|
17
19
|
|
|
18
20
|
onConnected?: () => void;
|
|
@@ -27,7 +29,7 @@ interface UrunProviderProps {
|
|
|
27
29
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
28
30
|
children: ReactNode;
|
|
29
31
|
}
|
|
30
|
-
declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
32
|
+
declare function UrunProvider({ baseUrl, orgId, appId, jwt, authProvider, eventsUrl, fallback, children, }: UrunProviderProps): react_jsx_runtime.JSX.Element;
|
|
31
33
|
|
|
32
34
|
interface UrunErrorBoundaryProps {
|
|
33
35
|
fallback?: ReactNode | ((error: Error) => ReactNode);
|
|
@@ -80,6 +82,8 @@ interface ReactSession extends Omit<SessionInterface, 'doc' | 'stream'> {
|
|
|
80
82
|
readonly phase: SessionPhase;
|
|
81
83
|
|
|
82
84
|
readonly status: SessionStatus;
|
|
85
|
+
|
|
86
|
+
onDiagnostic(handler: (diagnostic: SessionDiagnostic) => void): Unsubscribe;
|
|
83
87
|
}
|
|
84
88
|
type ReactApp = Record<string, (args?: Record<string, unknown>) => ReactSession>;
|
|
85
89
|
|
|
@@ -279,15 +283,15 @@ declare const StatusBadgeSchema: z.ZodObject<{
|
|
|
279
283
|
state: z.ZodEnum<["thinking", "generating", "idle", "error"]>;
|
|
280
284
|
message: z.ZodOptional<z.ZodString>;
|
|
281
285
|
}, "strip", z.ZodTypeAny, {
|
|
282
|
-
state: "error" | "
|
|
286
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
283
287
|
message?: string | undefined;
|
|
284
288
|
}, {
|
|
285
|
-
state: "error" | "
|
|
289
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
286
290
|
message?: string | undefined;
|
|
287
291
|
}>;
|
|
288
292
|
type StatusBadgeProps = z.infer<typeof StatusBadgeSchema>;
|
|
289
293
|
declare function useStatusBadge(props: StatusBadgeProps): {
|
|
290
|
-
state: "error" | "
|
|
294
|
+
state: "error" | "idle" | "thinking" | "generating";
|
|
291
295
|
message: string;
|
|
292
296
|
isActive: boolean;
|
|
293
297
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
"use strict";var Ut=Object.defineProperty;var or=Object.getOwnPropertyDescriptor;var sr=Object.getOwnPropertyNames;var ir=Object.prototype.hasOwnProperty;var ar=(e,t)=>{for(var n in t)Ut(e,n,{get:t[n],enumerable:!0})},ur=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of sr(t))!ir.call(e,o)&&o!==n&&Ut(e,o,{get:()=>t[o],enumerable:!(r=or(t,o))||r.enumerable});return e};var cr=e=>ur(Ut({},"__esModule",{value:!0}),e);var Er={};ar(Er,{ComponentRenderer:()=>gn,DEFAULT_CAMERA_CONSTRAINTS:()=>Vt,DEFAULT_LOG_CAP:()=>ue,DEFAULT_VOICE_CONSTRAINTS:()=>Ft,DocPatchForm:()=>ze,ImageFrame:()=>Pn,ImageFrameSchema:()=>Cn,MetricsPanel:()=>xn,MetricsPanelSchema:()=>Tn,ProgressCard:()=>Sn,ProgressCardSchema:()=>hn,StatusBadge:()=>yn,StatusBadgeSchema:()=>vn,TextStream:()=>bn,TextStreamSchema:()=>kn,UrunActivationOverlay:()=>kt,UrunAudio:()=>rt,UrunAuthProvider:()=>Rt,UrunCamera:()=>Mn,UrunControlSender:()=>Vn,UrunDocPanel:()=>Fn,UrunErrorBoundary:()=>be,UrunEventSpine:()=>Bn,UrunIdleWarning:()=>Gn,UrunJwtProvider:()=>Qt,UrunProvider:()=>tn,UrunSessionClock:()=>Jn,UrunSessionEnded:()=>Xn,UrunSessionGate:()=>Kn,UrunSessionStatus:()=>jn,UrunSessionWaking:()=>St,UrunStreamTail:()=>qn,UrunVoice:()=>wn,authMode:()=>Fe,createDocStore:()=>ut,describeSessionPhase:()=>Pt.describeSessionPhase,formatPayload:()=>_e,getUrunAudioContext:()=>je,isWakingPhase:()=>Pt.isWakingPhase,parseJsonObject:()=>lt,pushCapped:()=>oe,registerComponent:()=>mn,resumeUrunAudioContext:()=>Ke,urunPublicEnv:()=>ne,useActivation:()=>vt,useApp:()=>rn,useChat:()=>ln,useCompletion:()=>an,useDocStore:()=>Me,useImageFrame:()=>Lt,useInputPresence:()=>dn,useMetricsPanel:()=>Ot,useProgressCard:()=>Nt,useRequest:()=>on,useSessionDoc:()=>On,useSessionEndsAt:()=>Ht,useSessionIdle:()=>jt,useSessionPhase:()=>G,useSessionTrack:()=>Nn,useSessionWake:()=>ht,useStatusBadge:()=>It,useStreamMessages:()=>pt,useTextStream:()=>Dt,useUrunAudioLevel:()=>_n,useUrunAuth:()=>Ye,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Zt});module.exports=cr(Er);var Te=require("react");var Xt=require("react"),qe=require("react/jsx-runtime"),be=class extends Xt.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,n){console.error("[urun] Error caught by UrunErrorBoundary:",t,n)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,qe.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,qe.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,qe.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Gt=require("react"),Ce=(0,Gt.createContext)(null);function me(e){return e&&e.trim()?e.trim():void 0}function ne(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return me(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return me(typeof process<"u"?process.env?.[e]:void 0)}}function Fe(){let e=ne("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ne("VERCEL_ENV")==="production"?"workos":ne("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Zt(){return Fe()==="workos"}var Pe=require("react"),en=require("react/jsx-runtime"),Yt=(0,Pe.createContext)(null);function Rt({getAccessToken:e,children:t}){let n=(0,Pe.useMemo)(()=>({getAccessToken:e}),[e]);return(0,en.jsx)(Yt.Provider,{value:n,children:t})}var Qt=Rt;function Ye(){return(0,Pe.useContext)(Yt)}var Qe=require("react/jsx-runtime");function tn({baseUrl:e,orgId:t,appId:n,jwt:r,authProvider:o,fallback:s,children:i}){let[a,c]=(0,Te.useState)(),u=Ye(),p=ne("NEXT_PUBLIC_SESSION_TOKEN")??ne("NEXT_PUBLIC_URUN_JWT"),l=Fe(),m=l==="workos"&&!r,h=r??(l==="jwt"?p:void 0)??a,k=o??ne("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),P=m&&!h,S=(0,Te.useMemo)(()=>({appId:n,baseUrl:e,orgId:t,jwt:h,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[n,u,e,k,h,t,m]);return(0,Te.useEffect)(()=>{if(!m||!u)return;let v=!1,U=u;async function b(){try{let g=await U.getAccessToken();v||c(g??void 0)}catch{v||c(void 0)}}b();let E=window.setInterval(()=>{b()},6e4);return()=>{v=!0,window.clearInterval(E)}},[u,m]),(0,Qe.jsx)(be,{fallback:s,children:P?(0,Qe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Qe.jsx)(Ce.Provider,{value:S,children:i})})}var X=require("react"),nn=require("@urun-sh/core");function lr(e,t){return`${e}:${JSON.stringify(t??{})}`}function dr(e,t,n){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,fnName:t,args:n??{}})}var xe=new Map;var Et=class{constructor(t,n){this._doc=t;this._notify=n;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,n){return this._doc.get(t,n)}set(t){this._doc.set(t),this._notify()}on(t,n){return this._doc.on(t,r=>n(r))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let n=this._doc.text(t),r=this._notify;return{append(o){n.append(o),r()},toString:()=>n.toString(),get length(){return n.length},on:(o,s)=>n.on(o,i=>{s(i),r()})}}dispose(){this._unsubscribeChange()}},wt=class{constructor(t,n){this._stream=t;this._notify=n;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,n){return this._stream.on(t,n)}messages(){return this._stream.messages()}emit(t,n){return this._stream.emit(t,n)}dispose(){this._unsubscribeTrack()}},At=class{constructor(t,n){this._session=t;this._notifiers.add(n),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,n){return this._session.request(t,n)}requestStream(t,n){return this._session.requestStream(t,n)}complete(t,n){return this._session.complete(t,n)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let n=this._docs.get(t);return n||(n=new Et(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,n)),n}stream(t){let n=this._streams.get(t);return n||(n=new wt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,n)),n}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._notifyAll(),this._notifiers.clear()}};function rn(){let e=(0,X.useContext)(Ce);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,X.useReducer)(s=>s+1,0),n=(0,X.useRef)(new Map),r=(0,X.useRef)(new Map),o=(0,X.useMemo)(()=>(0,nn.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.useEffect)(()=>()=>{for(let[s,i]of r.current){let a=xe.get(s);a===i&&(a.handle.removeNotifier(t),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let c=xe.get(s);!c||c.refCount!==0||(xe.delete(s),c.handle.disconnect())},0)))}r.current.clear(),n.current.clear()},[]),(0,X.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let c=lr(i,a),u=n.current.get(c);if(u&&!u.disposed)return u;let p=dr(e,i,a),l=xe.get(p);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),xe.delete(p),r.current.get(p)===l&&r.current.delete(p),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new At(o[i](a),t),refCount:0,disposeTimer:null},xe.set(p,l)),r.current.get(p)!==l&&(r.current.set(p,l),l.handle.addNotifier(t),l.refCount+=1),n.current.set(c,l.handle),l.handle}}}),[e,o])}var F=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 pr(e){return e instanceof Error?e:new Error(String(e))}function on(e,t){let n=(0,F.useMemo)(()=>Ue(e),[e]),[r,o]=(0,F.useState)(void 0),[s,i]=(0,F.useState)(null),[a,c]=(0,F.useState)(!1),u=(0,F.useRef)(t);u.current=t;let p=(0,F.useRef)(0),l=(0,F.useRef)(null),m=(0,F.useRef)(!0);(0,F.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let h=(0,F.useCallback)(async S=>{l.current?.abort();let v=new AbortController;l.current=v;let U=++p.current,b=()=>m.current&&p.current===U;b()&&(c(!0),i(null));try{let E=await n.request(S,{...u.current,signal:v.signal});return b()&&(o(E),c(!1),u.current?.onSuccess?.(E)),E}catch(E){let g=pr(E);throw b()&&(i(g),c(!1),u.current?.onError?.(g)),g}},[n]),k=(0,F.useCallback)(S=>{h(S).catch(()=>{})},[h]),P=(0,F.useCallback)(()=>{p.current++,l.current?.abort(),l.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:k,mutateAsync:h,data:r,error:s,isPending:a,reset:P}}var V=require("react");function sn(e){return e instanceof Error?e:new Error(String(e))}var mr=e=>typeof e=="string"?e:String(e);function an(e,t){let n=(0,V.useMemo)(()=>Ue(e),[e]),[r,o]=(0,V.useState)(""),[s,i]=(0,V.useState)(!1),[a,c]=(0,V.useState)(null),u=(0,V.useRef)(t);u.current=t;let p=(0,V.useRef)(0),l=(0,V.useRef)(null),m=(0,V.useRef)(!0);(0,V.useEffect)(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let h=(0,V.useCallback)(()=>{p.current++,l.current?.cancel(),l.current=null,m.current&&i(!1)},[]),k=(0,V.useCallback)(async P=>{l.current?.cancel();let S=++p.current,v=()=>m.current&&p.current===S,U=u.current,b=U?.parseChunk??mr,E=U?.buildPayload??(T=>({prompt:T}));v()&&(o(""),c(null),i(!0));let{parseChunk:g,buildPayload:_,onFinish:A,onError:d,...C}=U??{},x="",R;try{R=n.requestStream(E(P),C),l.current=R}catch(T){let j=sn(T);v()&&(c(j),i(!1),U?.onError?.(j));return}try{for await(let T of R){if(p.current!==S)break;x+=b(T),v()&&o(x)}v()&&(i(!1),U?.onFinish?.(x))}catch(T){let j=sn(T);v()&&(c(j),i(!1),U?.onError?.(j))}finally{l.current===R&&(l.current=null)}},[n]);return{completion:r,complete:k,stop:h,isStreaming:s,error:a}}var O=require("react");function un(e){return e instanceof Error?e:new Error(String(e))}var fr=e=>typeof e=="string"?e:String(e),cn=0;function Mt(e){return cn+=1,`${e}-${cn}`}function ln(e,t){let n=(0,O.useMemo)(()=>Ue(e),[e]),[r,o]=(0,O.useState)(()=>(t?.initialMessages??[]).map(b=>({id:b.id??Mt("msg"),role:b.role,content:b.content}))),[s,i]=(0,O.useState)(""),[a,c]=(0,O.useState)(!1),[u,p]=(0,O.useState)(null),l=(0,O.useRef)(t);l.current=t;let m=(0,O.useRef)(r);m.current=r;let h=(0,O.useRef)(s);h.current=s;let k=(0,O.useRef)(0),P=(0,O.useRef)(null),S=(0,O.useRef)(!0);(0,O.useEffect)(()=>(S.current=!0,()=>{S.current=!1,P.current?.cancel(),P.current=null}),[]);let v=(0,O.useCallback)(()=>{k.current++,P.current?.cancel(),P.current=null,S.current&&c(!1)},[]),U=(0,O.useCallback)(async b=>{let E=b===void 0,g=(E?h.current:b)??"";if(!g.trim())return;P.current?.cancel();let A=++k.current,d=()=>S.current&&k.current===A,C=l.current,x=C?.parseChunk??fr,R={id:Mt("msg"),role:"user",content:g},T={id:Mt("msg"),role:"assistant",content:""},j=[...m.current,R].map(H=>({role:H.role,content:H.content})),f=[...m.current,R,T];m.current=f,o(f),E&&i(""),p(null),c(!0);let L=C?.buildPayload??(H=>({messages:H})),{initialMessages:B,parseChunk:K,buildPayload:q,onFinish:ie,onError:Ge,...Ze}=C??{},ve=H=>{o(W=>W.map(ae=>ae.id===T.id?{...ae,content:H}:ae))},pe="",ee;try{ee=n.requestStream(L(j),Ze),P.current=ee}catch(H){let W=un(H);d()&&(p(W),c(!1),C?.onError?.(W));return}try{for await(let H of ee){if(k.current!==A)break;pe+=x(H),d()&&ve(pe)}d()&&(c(!1),C?.onFinish?.({...T,content:pe}))}catch(H){let W=un(H);d()&&(p(W),c(!1),C?.onError?.(W))}finally{P.current===ee&&(P.current=null)}},[n]);return{messages:r,input:s,setInput:i,sendMessage:U,stop:v,isStreaming:a,error:u}}var D=require("react"),Re=require("@urun-sh/core"),_t=[];function dn(e,t={}){let{field:n=Re.INPUT_PRESENCE_FIELD,hz:r=Re.INPUT_PRESENCE_DEFAULT_HZ}=t,o=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,D.useMemo)(()=>s?(0,Re.createInputPresencePublisher)({awareness:{setLocalStateField:(g,_)=>s.setField(g,_)},field:n,hz:r}):null,[s,n,r]),a=(0,D.useRef)(null);a.current=i;let[c,u]=(0,D.useState)(!1),[p,l]=(0,D.useState)(_t),m=(0,D.useRef)(!1);(0,D.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let h=(0,D.useCallback)(()=>{let g=a.current;l(g?g.heldKeys():_t)},[]),k=(0,D.useCallback)(()=>{a.current?.clear(),l(_t)},[]);(0,D.useEffect)(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,_=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},A=T=>{g()&&(a.current?.keyDown(T.key),h())},d=T=>{a.current?.keyUp(T.key),h()},C=T=>{g()&&a.current?.movePointer(T.movementX,T.movementY)},x=T=>{g()&&a.current?.setButtons(T.buttons)},R=()=>{k()};return o.addEventListener("pointerlockchange",_),o.addEventListener("keydown",A),o.addEventListener("keyup",d),o.addEventListener("mousemove",C),o.addEventListener("mousedown",x),o.addEventListener("mouseup",x),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",_),o.removeEventListener("keydown",A),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",C),o.removeEventListener("mousedown",x),o.removeEventListener("mouseup",x),o.defaultView?.removeEventListener("blur",R)}},[o,k,h]);let P=(0,D.useCallback)(g=>{g.requestPointerLock?.()},[]),S=(0,D.useCallback)(()=>{m.current=!0,u(!0)},[]),v=(0,D.useCallback)(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),U=(0,D.useCallback)(g=>{a.current?.keyDown(g),h()},[h]),b=(0,D.useCallback)(g=>{a.current?.keyUp(g),h()},[h]),E=(0,D.useCallback)((g,_)=>{a.current?.movePointer(g,_)},[]);return{engage:P,engageTouch:S,release:v,engaged:c,heldKeys:p,pressKey:U,releaseKey:b,movePointer:E}}var pn=new Map;function mn(e,t,n){if(!n||typeof n.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);pn.set(e,{component:t,schema:n})}function fn(e,t){let n=pn.get(e);if(!n)return{error:`Unknown component: "${e}"`};let r=n.schema.safeParse(t);return r.success?{Component:n.component,validatedProps:r.data}:{error:`Validation failed for "${e}": ${r.error.message}`}}var fe=require("react/jsx-runtime");function gn({name:e,props:t,fallback:n}){let r=fn(e,t);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),n?(0,fe.jsx)(fe.Fragment,{children:n}):(0,fe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,fe.jsx)("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return(0,fe.jsx)(o,{...r.validatedProps})}var Ee=require("zod"),ge=require("react/jsx-runtime"),hn=Ee.z.object({step:Ee.z.number().min(0),total:Ee.z.number().min(1),label:Ee.z.string().optional(),variant:Ee.z.enum(["default","success","error"]).default("default")});function Nt(e){let{step:t,total:n,label:r,variant:o="default"}=e,s=Math.min(t/n*100,100),i=t>=n;return{step:t,total:n,label:r,variant:o,percentage:s,isComplete:i}}function Sn(e){let{step:t,total:n,label:r,variant:o,percentage:s}=Nt(e);return(0,ge.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[r&&(0,ge.jsx)("div",{className:"urun-progress-label",children:r}),(0,ge.jsx)("div",{className:"urun-progress-bar",children:(0,ge.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ge.jsxs)("div",{className:"urun-progress-text",children:[t,"/",n]})]})}var et=require("zod"),We=require("react/jsx-runtime"),vn=et.z.object({state:et.z.enum(["thinking","generating","idle","error"]),message:et.z.string().optional()}),gr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function It(e){let{state:t,message:n}=e,r=t==="thinking"||t==="generating",o=n??gr[t]??t;return{state:t,message:o,isActive:r}}function yn(e){let{state:t,message:n,isActive:r}=It(e);return(0,We.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,We.jsx)("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),(0,We.jsx)("span",{className:"urun-status-message",children:n})]})}var Ve=require("react"),tt=require("zod"),Be=require("react/jsx-runtime"),kn=tt.z.object({text:tt.z.string(),streaming:tt.z.boolean().default(!1)});function Dt(e){let{text:t,streaming:n=!1}=e,r=t.length===0;return{text:t,streaming:n,isEmpty:r}}function bn(e){let{text:t,streaming:n}=Dt(e),r=(0,Ve.useRef)(null),o=(0,Ve.useRef)(0);return(0,Ve.useEffect)(()=>{let s=r.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),(0,Be.jsxs)("div",{className:"urun-text-stream",children:[(0,Be.jsx)("span",{ref:r,className:"urun-text-content"}),n&&(0,Be.jsx)("span",{className:"urun-text-cursor"})]})}var He=require("zod"),$e=require("react/jsx-runtime"),Cn=He.z.object({src:He.z.string().url(),alt:He.z.string().optional(),caption:He.z.string().optional()});function Lt(e){let{src:t,alt:n,caption:r}=e;return{src:t,alt:n??"",caption:r}}function Pn(e){let{src:t,alt:n,caption:r}=Lt(e);return(0,$e.jsxs)("figure",{className:"urun-image-frame",children:[(0,$e.jsx)("img",{className:"urun-image",src:t,alt:n}),r&&(0,$e.jsx)("figcaption",{className:"urun-image-caption",children:r})]})}var re=require("zod"),we=require("react/jsx-runtime"),Tn=re.z.object({metrics:re.z.array(re.z.object({label:re.z.string(),value:re.z.union([re.z.string(),re.z.number()]),unit:re.z.string().optional()}))});function Ot(e){return{metrics:e.metrics.map(n=>({...n,displayValue:n.unit?`${n.value} ${n.unit}`:String(n.value)}))}}function xn(e){let{metrics:t}=Ot(e);return(0,we.jsx)("div",{className:"urun-metrics-panel",children:t.map((n,r)=>(0,we.jsxs)("div",{className:"urun-metric-card",children:[(0,we.jsx)("div",{className:"urun-metric-label",children:n.label}),(0,we.jsx)("div",{className:"urun-metric-value",children:n.displayValue})]},r))})}var N=require("react"),Rn=require("@urun-sh/core");var nt=null;function hr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function je(){if(nt)return nt;let e=hr();return e?(nt=new e,nt):null}function Ke(){let e=je();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var En=require("react/jsx-runtime"),Sr=1e3,Un=200;function qt(...e){console.debug("[urun-audio]",...e)}var rt=(0,N.forwardRef)(function(t,n){let{session:r,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:p}=t,l=(0,N.useRef)(null),m=(0,N.useRef)(null),h=(0,N.useRef)(null),k=(0,N.useRef)(null),P=(0,N.useRef)(c);P.current=c;let S=(0,N.useRef)(u);S.current=u;let v=(0,N.useCallback)(d=>{h.current!==d&&(h.current=d,S.current?.(d))},[]),U=(0,N.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},[]),b=(0,N.useCallback)(d=>{let C=l.current;if(!C)return;let x=C.play();!x||typeof x.then!="function"||x.then(()=>{C.muted||v(!0)}).catch(R=>{let T=R instanceof Error?R.name:String(R);if(T==="AbortError"){qt(`play() aborted (${d}); retrying in ${Un}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,b(`${d}:retry`)},Un);return}if(T==="NotAllowedError"){qt(`play() blocked pending a user gesture (${d})`),v(!1);return}qt(`play() failed (${d})`,R)})},[v]),E=(0,N.useCallback)(d=>{let C=U();if(C){for(let x of C.getAudioTracks())x!==d&&C.removeTrack(x);d&&!C.getAudioTracks().includes(d)&&C.addTrack(d),d&&b("track-attach"),P.current?.(d)}},[U,b]),g=(0,N.useCallback)(()=>{let d=l.current;d&&(U(),d.muted=!1,b("gesture"),Ke(),v(!0))},[U,b,v]);(0,N.useImperativeHandle)(n,()=>({unlock:g,get unlocked(){return h.current===!0},get element(){return l.current}}),[g]);let _=(0,N.useCallback)(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),p?.(d)},[U,p]),A=s!==void 0;return(0,N.useEffect)(()=>{if(A){E(s??null);return}if(!r)return;let d=r.stream(o),C=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},x=f=>{if(f!==C()&&(E(f),f)){let L=()=>{C()===f&&E(null)};f.addEventListener("ended",L)}},R=d.track;R&&R.readyState==="live"&&x(R);let T=d.on("track",f=>{f&&f.readyState!=="live"||x(f)}),j=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&x(f)},Sr);return()=>{T(),clearInterval(j)}},[r,o,A,s,E]),(0,N.useEffect)(()=>(0,Rn.observePageLifecycle)(()=>{Ke(),h.current===!0&&b("foreground")}),[b]),(0,N.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,En.jsx)("audio",{ref:_,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var M=require("react"),Ae=require("@urun-sh/core");var An=require("react/jsx-runtime"),Ft={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ot(...e){console.debug("[urun-voice]",...e)}var wn=(0,M.forwardRef)(function(t,n){let{session:r,stream:o="audio",constraints:s=Ft,connectTimeoutMs:i,attempts:a=3,retryDelayMs:c=1500,onActiveChange:u,onError:p,onMicStream:l,onTrack:m,onUnlockChange:h,capture:k}=t,P=(0,M.useRef)(null),S=(0,M.useRef)(null),v=(0,M.useRef)(null),U=(0,M.useRef)([]),b=(0,M.useRef)(!1),E=(0,M.useRef)(u);E.current=u;let g=(0,M.useRef)(p);g.current=p;let _=(0,M.useRef)(l);_.current=l;let A=(0,M.useCallback)(f=>{b.current!==f&&(b.current=f,E.current?.(f))},[]),d=(0,M.useCallback)(()=>{for(let f of U.current)f();U.current=[],v.current?.release(),v.current=null,S.current&&(S.current=null,_.current?.(null))},[]),C=(0,M.useCallback)(async()=>{let f=v.current;if(f){let q=await f.update(s);return S.current=f.stream,_.current?.(f.stream),q}let B=await(k??(0,Ae.sharedCaptureController)()).claim("audio",s);v.current=B,U.current=[B.onTrack((q,ie)=>{S.current=ie,_.current?.(ie),b.current&&r.stream(o).attach(q).catch(Ge=>ot("mic re-attach after one-capture re-acquire failed",Ge))}),B.onLost(q=>{v.current=null,U.current=[],S.current=null,_.current?.(null),A(!1),g.current?.(q)})],S.current=B.stream,_.current?.(B.stream);let K=B.track;if(!K)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return K},[k,s,r,o,A]),x=(0,M.useCallback)(async()=>{d(),A(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,A]),R=(0,M.useCallback)(async()=>{P.current?.unlock();let f;try{f=await C()}catch(K){d();let q=(0,Ae.sessionFailureFromMediaError)(K,r.status);throw g.current?.(q),q}r.connect?.();let L;for(let K=1;K<=a;K++)try{await r.whenLive(i!==void 0?{timeout:i}:void 0),await r.stream(o).attach(f),A(!0);return}catch(q){L=q,ot(`start attempt ${K}/${a} failed`,q),K<a&&await new Promise(ie=>setTimeout(ie,c))}d(),A(!1);let B=L instanceof Error?L:new Error(String(L??"voice start failed"));throw g.current?.(B),B},[r,o,i,a,c,C,d,A]);(0,M.useImperativeHandle)(n,()=>({start:R,stop:x,unlock:()=>P.current?.unlock(),get active(){return b.current},get micStream(){return S.current},get audio(){return P.current}}),[R,x]);let T=(0,M.useRef)(!1),j=(0,M.useCallback)(async()=>{if(!b.current||T.current)return;let f=S.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await r.stream(o).attach(f)}catch(L){ot("foreground mic re-assert failed (will retry on next pass)",L)}return}T.current=!0;try{let L=await C();await r.stream(o).attach(L)}catch(L){let B=L instanceof Error?L:new Error(String(L));ot("foreground mic re-acquire failed",B),g.current?.(B)}finally{T.current=!1}},[r,o,C]);return(0,M.useEffect)(()=>{let f=()=>{j()};return typeof r.onRecovery=="function"?r.onRecovery(f):(0,Ae.observePageLifecycle)(f)},[r,j]),(0,M.useEffect)(()=>d,[d]),(0,An.jsx)(rt,{ref:P,session:r,stream:o,onTrack:m,onUnlockChange:h})});var st=require("@urun-sh/core"),y=require("react"),Y=require("react/jsx-runtime"),Vt={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Wt(...e){console.debug("[urun-camera]",...e)}function vr(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function yr(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(n=>n.kind==="videoinput")}catch{return null}}var Mn=(0,y.forwardRef)(function(t,n){let{session:r,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:c,preview:u=!0,className:p,videoClassName:l,onActiveChange:m,onError:h,onStream:k,onTrack:P,children:S,capture:v,flipControl:U="auto",flipControlClassName:b,onDevices:E}=t,g=(0,y.useRef)(null),_=(0,y.useRef)(null),A=(0,y.useRef)(null),d=(0,y.useRef)([]),C=(0,y.useRef)(null),x=(0,y.useRef)(!1),R=(0,y.useRef)(i),[T,j]=(0,y.useState)(i),[f,L]=(0,y.useState)(!1),[B,K]=(0,y.useState)(null),[q,ie]=(0,y.useState)(!1),[Ge]=(0,y.useState)(vr),Ze=(0,y.useRef)(m);Ze.current=m;let ve=(0,y.useRef)(h);ve.current=h;let pe=(0,y.useRef)(k);pe.current=k;let ee=(0,y.useRef)(P);ee.current=P;let H=(0,y.useRef)(E);H.current=E;let W=(0,y.useCallback)(w=>{x.current!==w&&(x.current=w,L(w),Ze.current?.(w))},[]);(0,y.useEffect)(()=>{if(!f){K(null);return}let w=!1,I=()=>{yr().then(z=>{w||(K(z),z&&H.current?.(z))})};I();let $=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof $?.addEventListener=="function"?($.addEventListener("devicechange",I),()=>{w=!0,$.removeEventListener?.("devicechange",I)}):()=>{w=!0}},[f]);let ae=(0,y.useCallback)(w=>{let I=g.current;I&&(I.muted=!0,I.defaultMuted=!0,I.setAttribute("muted",""),I.setAttribute("playsinline",""),I.setAttribute("webkit-playsinline",""),I.srcObject=w,w&&I.play()?.catch?.($=>Wt("preview play() failed",$)))},[]),te=(0,y.useCallback)(()=>{C.current?.(),C.current=null;for(let w of d.current)w();d.current=[],A.current?.release(),A.current=null,_.current&&(_.current=null,pe.current?.(null),ee.current?.(null)),ae(null)},[ae]),Tt=(0,y.useCallback)((w,I)=>{C.current?.(),_.current=I,ae(I),pe.current?.(I);let $=()=>{_.current===I&&(Wt("camera track ended (device removed or permission revoked)"),te(),W(!1))};w.addEventListener("ended",$),C.current=()=>w.removeEventListener("ended",$)},[ae,te,W]),ye=(0,y.useCallback)(async w=>{let I={...Vt,...s,facingMode:w},$;try{let z=A.current;if(z)$=await z.update(I);else{let Le=await(v??(0,st.sharedCaptureController)()).claim("video",I);if(A.current=Le,d.current=[Le.onTrack((Oe,nr)=>{Tt(Oe,nr),x.current&&r.stream(o).attachVideo(Oe).then(()=>ee.current?.(Oe)).catch(rr=>Wt("camera re-publish after one-capture re-acquire failed",rr))}),Le.onLost(Oe=>{A.current=null,d.current=[],te(),W(!1),ve.current?.(Oe)})],!Le.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=Le.track}}catch(z){let ke=(0,st.sessionFailureFromMediaError)(z,r.status);throw ve.current?.(ke),ke}R.current=w,j(w),Tt($,A.current?.stream??new MediaStream([$]));try{r.connect?.(),await r.whenLive(c!==void 0?{timeout:c}:void 0),await r.stream(o).attachVideo($)}catch(z){te(),W(!1);let ke=z instanceof Error?z:new Error(String(z));throw ve.current?.(ke),ke}ee.current?.($),W(!0)},[r,o,s,c,v,Tt,te,W]),Kt=(0,y.useCallback)(w=>ye(w?.facingMode??R.current),[ye]),Jt=(0,y.useCallback)(async w=>{x.current&&R.current===w||await ye(w)},[ye]),xt=(0,y.useCallback)(()=>ye(R.current==="environment"?"user":"environment"),[ye]),zt=(0,y.useCallback)(async()=>{te(),W(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,te,W]);if((0,y.useImperativeHandle)(n,()=>({start:Kt,stop:zt,flip:xt,setFacingMode:Jt,get active(){return x.current},get facingMode(){return R.current},get stream(){return _.current},get element(){return g.current}}),[Kt,zt,xt,Jt]),(0,y.useEffect)(()=>te,[te]),!u)return null;let Qn=a==="auto"?T==="user":a,er=f&&(U===!0||U==="auto"&&Ge&&(B?.length??0)>1),tr=()=>{q||(ie(!0),xt().catch(()=>{}).finally(()=>ie(!1)))};return(0,Y.jsxs)("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":T,children:[(0,Y.jsx)("video",{ref:g,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Qn?{transform:"scaleX(-1)"}:{}}}),er?(0,Y.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:tr,disabled:q,className:b,style:b?{opacity:q?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:q?.6:1},children:(0,Y.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,Y.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,Y.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,Y.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,Y.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,Y.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});var it=require("react");var Bt={level:0,speaking:!1};function _n(e,t={}){let{fftSize:n=512,intervalMs:r=100,speakingThreshold:o=.02}=t,[s,i]=(0,it.useState)(Bt);return(0,it.useEffect)(()=>{if(!e){i(Bt);return}let a=je();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,p;try{u=a.createMediaStreamSource(c),p=a.createAnalyser(),p.fftSize=n,u.connect(p)}catch{return}let l=new Uint8Array(p.fftSize),h=setInterval(()=>{p.getByteTimeDomainData(l);let k=0;for(let S=0;S<l.length;S++){let v=(l[S]-128)/128;k+=v*v}let P=Math.sqrt(k/l.length);i(S=>{let v=P>o;return Math.abs(S.level-P)<.005&&S.speaking===v?S:{level:P,speaking:v}})},r);return()=>{clearInterval(h),u.disconnect(),i(Bt)}},[e,n,r,o]),s}var at=require("react");function Nn(e,t){let[n,r]=(0,at.useState)(null);return(0,at.useEffect)(()=>{if(!e||!t){r(null);return}let o=e.stream(t);return r(o.track),o.on("track",r)},[e,t]),n}var Ln=require("react");var ct=require("react");var In=require("zustand/vanilla"),Dn=require("zustand"),kr=()=>{};function ut(e,t={}){let n=u=>{e?.set(u)},r=()=>e?e.get()??{}:{},o=(0,In.createStore)(()=>({doc:r(),synced:e?e.synced:!1,set:n})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(o.setState({doc:r(),synced:e.synced}),s=[e.on("change",u=>o.setState({doc:u})),e.onSynced(()=>o.setState({synced:!0}))]),i):kr,c=(u=>(0,Dn.useStore)(o,u));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:n,bind:a,unbind:i}),t.bind!==!1&&a(),c}function Me(e,t){let n=(0,ct.useMemo)(()=>ut(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,ct.useEffect)(()=>n.bind(),[n]),n}function On(e,t,n){let o=Me(e,t)(n??(a=>a)),s=(0,Ln.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(n)return o;let i=o;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var dt=require("react");var ue=200;function oe(e,t,n=200){let r=[...e,t];return r.length>n?r.slice(r.length-n):r}function _e(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function lt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let n;try{n=JSON.parse(t)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return n===null||typeof n!="object"||Array.isArray(n)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:n}}function pt(e,t,n={}){let r=n.cap??200,[o,s]=(0,dt.useState)([]);return(0,dt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>oe(u,{at:Date.now(),payload:c.value},r))}})(),()=>{i=!1,a.return?.()}},[e,t,r]),o}var Q=require("react/jsx-runtime");function qn({session:e,name:t,cap:n,className:r}){let o=pt(e,t,{cap:n});return(0,Q.jsxs)("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[(0,Q.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Q.jsx)("code",{children:t}),(0,Q.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,Q.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,Q.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Q.jsx)("code",{children:t})," messages\u2026"]}):o.map((s,i)=>(0,Q.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Q.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",_e(s.payload)]},`${s.at}-${i}`))})]})}var Je=require("react");var J=require("react/jsx-runtime");function ze({placeholder:e,buttonLabel:t,disabled:n,onApply:r}){let[o,s]=(0,Je.useState)(""),[i,a]=(0,Je.useState)(null),c=(0,Je.useCallback)(()=>{let u=lt(o);if(!u.ok){a(u.error);return}a(null),r(u.value,o.trim()),s("")},[o,r]);return(0,J.jsxs)("div",{className:"urun-doc-patch",children:[(0,J.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:e,rows:3}),(0,J.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,J.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:n||!o.trim(),onClick:c,children:t}),i?(0,J.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Fn({session:e,docKey:t,editable:n=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=Me(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return(0,J.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,J.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,J.jsx)("code",{children:t}),(0,J.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,J.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),n?(0,J.jsx)(ze,{placeholder:r,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}var mt=require("react");var se=require("react/jsx-runtime");function Wn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Vn({session:e,docKey:t="control",cap:n=200,className:r}){let[o,s]=(0,mt.useState)([]);return(0,mt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>oe(c,{at:Date.now(),direction:"in",text:Wn(_e(a))},n))}):void 0),[e,t,n]),(0,se.jsxs)("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[(0,se.jsx)(ze,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>oe(c,{at:Date.now(),direction:"out",text:Wn(a)},n))}}),(0,se.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,se.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>(0,se.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,se.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,se.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var ft=require("react");var he=require("react/jsx-runtime");function Bn({session:e,trackNames:t=["video","audio"],docKeys:n=["control"],cap:r=200,className:o}){let[s,i]=(0,ft.useState)([]),a=t.join(","),c=n.join(",");return(0,ft.useEffect)(()=>{if(i([]),!e)return;let u=(l,m)=>i(h=>oe(h,{at:Date.now(),kind:l,text:m},r)),p=[];p.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let m=e.stream(l);p.push(m.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of n){let m=e.doc(l);p.push(m.on("change",()=>u("doc",`${l} changed`)))}return()=>p.forEach(l=>l())},[e,a,c,r]),(0,he.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,he.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>(0,he.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,he.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,he.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}var bt=require("@urun-sh/core");var gt=require("react");function G(e){let[t,n]=(0,gt.useState)(e?.phase??null);return(0,gt.useEffect)(()=>{if(!e){n(null);return}return e.onPhase(n)},[e]),t}var $n=require("@urun-sh/core");var Ne=require("react"),Hn=require("@urun-sh/core");function ht(e){let t=G(e),n=(0,Hn.isWakingPhase)(t?.name),r=(0,Ne.useRef)(void 0);n?r.current??=Date.now():r.current=void 0;let o=n?t?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=(0,Ne.useState)(s);return(0,Ne.useEffect)(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:n,phase:t,state:n?t?.runtime?.state:void 0,reason:n?t?.runtime?.reason:void 0,since:o,seconds:n?i:0}}var ce=require("react/jsx-runtime");function St({session:e,render:t,className:n}){let r=ht(e);return!r.waking||!r.phase?null:(0,ce.jsx)("span",{className:["urun-session-waking",n].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:t?t(r):(0,ce.jsxs)(ce.Fragment,{children:[(0,ce.jsx)("span",{className:"urun-session-waking-label",children:(0,$n.describeSessionPhase)(r.phase)})," ",(0,ce.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}var yt=require("react");var le=require("react"),br={event:null,elapsedMs:0};function vt(e,t){let[n,r]=(0,le.useState)(null),o=(0,le.useRef)(0);(0,le.useEffect)(()=>{if(r(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(o.current=Date.now(),r(a))})},[e,t]);let[s,i]=(0,le.useState)(0);return(0,le.useEffect)(()=>{if(!n){i(0);return}if(n.state==="first-media"){i(n.elapsedMs);return}let a=o.current,c=()=>n.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[n]),n?{event:n,elapsedMs:s}:br}var Ie=require("react/jsx-runtime"),Cr={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Pr(e){let[t,n]=(0,yt.useState)(!1);return(0,yt.useEffect)(()=>{if(n(!1),!e)return;let r=e;if(typeof r.requestVideoFrameCallback=="function"){let s=r.requestVideoFrameCallback(()=>n(!0));return()=>r.cancelVideoFrameCallback?.(s)}let o=()=>{let s=r.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:r.readyState>=2)&&n(!0)};return o(),r.addEventListener("loadeddata",o),r.addEventListener("timeupdate",o),()=>{r.removeEventListener("loadeddata",o),r.removeEventListener("timeupdate",o)}},[e]),t}function kt({session:e,stream:t,videoElement:n,render:r,className:o}){let s=vt(e,t),i=Pr(n),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return(0,Ie.jsx)("div",{className:["urun-activation-overlay",o].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:r?r(s):(0,Ie.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,Ie.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Cr[c]})," ",(0,Ie.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var Z=require("react/jsx-runtime"),Tr={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function jn({session:e,className:t}){let n=G(e),r=n?.name??"idle",o=n?.name==="queued"&&n.queue?`pos ${n.queue.position} / depth ${n.queue.depth}`:(n?.name==="error"||n?.name==="expired")&&n.error?n.error.reason:n?.runtime?.reason??null;return(0,Z.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":r,children:[(0,Z.jsx)("span",{className:"urun-session-status-dot","data-phase":r}),(0,Z.jsx)("span",{className:"urun-session-status-label",children:Tr[r]}),o?(0,Z.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function Kn({session:e,children:t,fallback:n,onStartOver:r,className:o}){let s=G(e);if(s?.name==="live")return(0,Z.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[t,(0,Z.jsx)(kt,{session:e})]});let i=n?n(s):(0,Z.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,bt.isWakingPhase)(s.name)?(0,Z.jsx)(St,{session:e}):s&&s.name!=="idle"?(0,bt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,Z.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?(0,Z.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}var Ct=require("react");var zn=require("react/jsx-runtime");function Ht(e){return G(e)?.endsAt??null}function xr(e){let t=Math.max(0,Math.floor(e/1e3)),n=Math.floor(t/60),r=t%60;return`${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Jn({session:e,urgentMs:t=6e4,className:n}){let o=Ht(e)?.getTime()??null,[s,i]=(0,Ct.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,Ct.useEffect)(()=>{if(o===null){i(null);return}let c=()=>i(Math.max(0,o-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=xr(s);return(0,zn.jsx)("span",{className:["urun-session-clock",n].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Xe=require("react/jsx-runtime"),Ur=new Set(["expired","ended","error"]);function Xn({session:e,onNewSession:t,children:n,className:r}){let o=G(e);if(!o||!Ur.has(o.name))return null;let s=n?n(o):(0,Xe.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Xe.jsxs)("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,t?(0,Xe.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var de=require("react"),Se=require("react/jsx-runtime");function $t(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function jt(e){let t=(0,de.useMemo)(()=>e?e.doc("control"):null,[e]),[n,r]=(0,de.useState)(()=>t?$t(t.get("idle")):null);return(0,de.useEffect)(()=>{if(!t){r(null);return}return r($t(t.get("idle"))),t.on("change",()=>r($t(t.get("idle"))))},[t]),n}function Rr(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Gn({session:e,onStillHere:t,className:n}){let r=jt(e),o=r?.deadlineEpochS??null,[s,i]=(0,de.useState)(null);if((0,de.useEffect)(()=>{if(o===null){i(null);return}let c=()=>i(Math.max(0,o-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[o]),!r||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Se.jsx)("div",{className:["urun-idle-warning",n].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,Se.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Se.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Se.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Rr(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Se.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var De=require("react"),Zn=require("@urun-sh/core");function Yn(e){let t=(0,De.useContext)(Ce),[n,r]=(0,De.useState)(null),o=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,p=t?.getAccessToken,l=t?.authProvider;return(0,De.useEffect)(()=>{if(!a||!c||!o||!s)return;let m=!1,h=()=>{(0,Zn.prewake)({baseUrl:a,app:o,functionName:s,orgId:c,jwt:u,getAccessToken:p,authProvider:l}).then(P=>{m||r(P)}).catch(()=>{})};h();let k=setInterval(h,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,c,u,p,l]),n}var Pt=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,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var Ut=Object.defineProperty;var or=Object.getOwnPropertyDescriptor;var sr=Object.getOwnPropertyNames;var ir=Object.prototype.hasOwnProperty;var ar=(t,e)=>{for(var n in e)Ut(t,n,{get:e[n],enumerable:!0})},ur=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of sr(e))!ir.call(t,o)&&o!==n&&Ut(t,o,{get:()=>e[o],enumerable:!(r=or(e,o))||r.enumerable});return t};var cr=t=>ur(Ut({},"__esModule",{value:!0}),t);var Er={};ar(Er,{ComponentRenderer:()=>gn,DEFAULT_CAMERA_CONSTRAINTS:()=>Vt,DEFAULT_LOG_CAP:()=>ue,DEFAULT_VOICE_CONSTRAINTS:()=>Ft,DocPatchForm:()=>ze,ImageFrame:()=>Pn,ImageFrameSchema:()=>Cn,MetricsPanel:()=>xn,MetricsPanelSchema:()=>Tn,ProgressCard:()=>Sn,ProgressCardSchema:()=>hn,StatusBadge:()=>yn,StatusBadgeSchema:()=>vn,TextStream:()=>bn,TextStreamSchema:()=>kn,UrunActivationOverlay:()=>kt,UrunAudio:()=>rt,UrunAuthProvider:()=>Rt,UrunCamera:()=>_n,UrunControlSender:()=>Vn,UrunDocPanel:()=>Fn,UrunErrorBoundary:()=>be,UrunEventSpine:()=>Bn,UrunIdleWarning:()=>Gn,UrunJwtProvider:()=>Qt,UrunProvider:()=>tn,UrunSessionClock:()=>Jn,UrunSessionEnded:()=>Xn,UrunSessionGate:()=>Kn,UrunSessionStatus:()=>jn,UrunSessionWaking:()=>St,UrunStreamTail:()=>qn,UrunVoice:()=>wn,authMode:()=>Fe,createDocStore:()=>ut,describeSessionPhase:()=>Pt.describeSessionPhase,formatPayload:()=>Me,getUrunAudioContext:()=>je,isWakingPhase:()=>Pt.isWakingPhase,parseJsonObject:()=>lt,pushCapped:()=>oe,registerComponent:()=>mn,resumeUrunAudioContext:()=>Ke,urunPublicEnv:()=>ne,useActivation:()=>vt,useApp:()=>rn,useChat:()=>ln,useCompletion:()=>an,useDocStore:()=>_e,useImageFrame:()=>Lt,useInputPresence:()=>dn,useMetricsPanel:()=>Ot,useProgressCard:()=>Nt,useRequest:()=>on,useSessionDoc:()=>On,useSessionEndsAt:()=>Ht,useSessionIdle:()=>jt,useSessionPhase:()=>G,useSessionTrack:()=>Nn,useSessionWake:()=>ht,useStatusBadge:()=>It,useStreamMessages:()=>pt,useTextStream:()=>Dt,useUrunAudioLevel:()=>Mn,useUrunAuth:()=>Ye,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Zt});module.exports=cr(Er);var Te=require("react");var Xt=require("react"),qe=require("react/jsx-runtime"),be=class extends Xt.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,n){console.error("[urun] Error caught by UrunErrorBoundary:",e,n)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,qe.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,qe.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,qe.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Gt=require("react"),Ce=(0,Gt.createContext)(null);function me(t){return t&&t.trim()?t.trim():void 0}function ne(t){switch(t){case"NEXT_PUBLIC_AUTH_MODE":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return me(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return me(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return me(typeof process<"u"?process.env?.[t]:void 0)}}function Fe(){let t=ne("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return t==="jwt"||t==="customer-jwt"||t==="test-jwt"?"jwt":t==="workos"||ne("VERCEL_ENV")==="production"?"workos":ne("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Zt(){return Fe()==="workos"}var Pe=require("react"),en=require("react/jsx-runtime"),Yt=(0,Pe.createContext)(null);function Rt({getAccessToken:t,children:e}){let n=(0,Pe.useMemo)(()=>({getAccessToken:t}),[t]);return(0,en.jsx)(Yt.Provider,{value:n,children:e})}var Qt=Rt;function Ye(){return(0,Pe.useContext)(Yt)}var Qe=require("react/jsx-runtime");function tn({baseUrl:t,orgId:e,appId:n,jwt:r,authProvider:o,eventsUrl:s,fallback:a,children:i}){let[u,c]=(0,Te.useState)(),p=Ye(),l=ne("NEXT_PUBLIC_SESSION_TOKEN")??ne("NEXT_PUBLIC_URUN_JWT"),f=Fe(),g=f==="workos"&&!r,v=r??(f==="jwt"?l:void 0)??u,b=o??ne("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=g&&!v,k=(0,Te.useMemo)(()=>({appId:n,baseUrl:t,orgId:e,jwt:v,getAccessToken:g?p?.getAccessToken:void 0,authProvider:b,eventsUrl:s}),[n,p,t,b,v,s,e,g]);return(0,Te.useEffect)(()=>{if(!g||!p)return;let x=!1,P=p;async function E(){try{let w=await P.getAccessToken();x||c(w??void 0)}catch{x||c(void 0)}}E();let h=window.setInterval(()=>{E()},6e4);return()=>{x=!0,window.clearInterval(h)}},[p,g]),(0,Qe.jsx)(be,{fallback:a,children:S?(0,Qe.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Qe.jsx)(Ce.Provider,{value:k,children:i})})}var X=require("react"),nn=require("@urun-sh/core");function lr(t,e){return`${t}:${JSON.stringify(e??{})}`}function dr(t,e,n){return JSON.stringify({appId:t.appId,baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,authProvider:t.authProvider,fnName:e,args:n??{}})}var xe=new Map;var Et=class{constructor(e,n){this._doc=e;this._notify=n;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,n){return this._doc.get(e,n)}set(e){this._doc.set(e),this._notify()}on(e,n){return this._doc.on(e,r=>n(r))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let n=this._doc.text(e),r=this._notify;return{append(o){n.append(o),r()},toString:()=>n.toString(),get length(){return n.length},on:(o,s)=>n.on(o,a=>{s(a),r()})}}dispose(){this._unsubscribeChange()}},wt=class{constructor(e,n){this._stream=e;this._notify=n;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,n){return this._stream.on(e,n)}messages(){return this._stream.messages()}emit(e,n){return this._stream.emit(e,n)}dispose(){this._unsubscribeTrack()}},At=class{constructor(e,n,r){this._session=e;this._notifiers.add(n),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),r&&this._attachReporter(r)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(e){let n=!1,r=!1,o=i=>{fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{r||(r=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(o);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let u=i.error,c=u?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);o({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else i.name==="live"&&!n&&(n=!0,o({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}onDiagnostic(e){return this._session.onDiagnostic(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,n){return this._session.request(e,n)}requestStream(e,n){return this._session.requestStream(e,n)}complete(e,n){return this._session.complete(e,n)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let n=this._docs.get(e);return n||(n=new Et(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,n)),n}stream(e){let n=this._streams.get(e);return n||(n=new wt(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,n)),n}async end(){let e=await this._session.end();return this._disposeHandle(),e}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function rn(){let t=(0,X.useContext)(Ce);if(!t)throw new Error("useApp must be used within <UrunProvider>");if(!t.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,X.useReducer)(s=>s+1,0),n=(0,X.useRef)(new Map),r=(0,X.useRef)(new Map),o=(0,X.useMemo)(()=>(0,nn.App)(t.appId,{baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,getAccessToken:t.getAccessToken,authProvider:t.authProvider}),[t.appId,t.baseUrl,t.orgId,t.jwt,t.getAccessToken,t.authProvider]);return(0,X.useEffect)(()=>()=>{for(let[s,a]of r.current){let i=xe.get(s);i===a&&(i.handle.removeNotifier(e),i.refCount=Math.max(0,i.refCount-1),i.refCount===0&&(i.disposeTimer=setTimeout(()=>{let u=xe.get(s);!u||u.refCount!==0||(xe.delete(s),u.handle.disconnect())},0)))}r.current.clear(),n.current.clear()},[]),(0,X.useMemo)(()=>new Proxy({},{get(s,a){if(typeof a=="string")return i=>{let u=lr(a,i),c=n.current.get(u);if(c&&!c.disposed)return c;let p=dr(t,a,i),l=xe.get(p);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),xe.delete(p),r.current.get(p)===l&&r.current.delete(p),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new At(o[a](i),e,t.eventsUrl),refCount:0,disposeTimer:null},xe.set(p,l)),r.current.get(p)!==l&&(r.current.set(p,l),l.handle.addNotifier(e),l.refCount+=1),n.current.set(u,l.handle),l.handle}}}),[t,o])}var F=require("react");function Ue(t){let e=t;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function pr(t){return t instanceof Error?t:new Error(String(t))}function on(t,e){let n=(0,F.useMemo)(()=>Ue(t),[t]),[r,o]=(0,F.useState)(void 0),[s,a]=(0,F.useState)(null),[i,u]=(0,F.useState)(!1),c=(0,F.useRef)(e);c.current=e;let p=(0,F.useRef)(0),l=(0,F.useRef)(null),f=(0,F.useRef)(!0);(0,F.useEffect)(()=>(f.current=!0,()=>{f.current=!1,l.current?.abort()}),[]);let g=(0,F.useCallback)(async S=>{l.current?.abort();let k=new AbortController;l.current=k;let x=++p.current,P=()=>f.current&&p.current===x;P()&&(u(!0),a(null));try{let E=await n.request(S,{...c.current,signal:k.signal});return P()&&(o(E),u(!1),c.current?.onSuccess?.(E)),E}catch(E){let h=pr(E);throw P()&&(a(h),u(!1),c.current?.onError?.(h)),h}},[n]),v=(0,F.useCallback)(S=>{g(S).catch(()=>{})},[g]),b=(0,F.useCallback)(()=>{p.current++,l.current?.abort(),l.current=null,o(void 0),a(null),u(!1)},[]);return{mutate:v,mutateAsync:g,data:r,error:s,isPending:i,reset:b}}var V=require("react");function sn(t){return t instanceof Error?t:new Error(String(t))}var mr=t=>typeof t=="string"?t:String(t);function an(t,e){let n=(0,V.useMemo)(()=>Ue(t),[t]),[r,o]=(0,V.useState)(""),[s,a]=(0,V.useState)(!1),[i,u]=(0,V.useState)(null),c=(0,V.useRef)(e);c.current=e;let p=(0,V.useRef)(0),l=(0,V.useRef)(null),f=(0,V.useRef)(!0);(0,V.useEffect)(()=>(f.current=!0,()=>{f.current=!1,l.current?.cancel(),l.current=null}),[]);let g=(0,V.useCallback)(()=>{p.current++,l.current?.cancel(),l.current=null,f.current&&a(!1)},[]),v=(0,V.useCallback)(async b=>{l.current?.cancel();let S=++p.current,k=()=>f.current&&p.current===S,x=c.current,P=x?.parseChunk??mr,E=x?.buildPayload??(T=>({prompt:T}));k()&&(o(""),u(null),a(!0));let{parseChunk:h,buildPayload:w,onFinish:_,onError:d,...C}=x??{},U="",R;try{R=n.requestStream(E(b),C),l.current=R}catch(T){let j=sn(T);k()&&(u(j),a(!1),x?.onError?.(j));return}try{for await(let T of R){if(p.current!==S)break;U+=P(T),k()&&o(U)}k()&&(a(!1),x?.onFinish?.(U))}catch(T){let j=sn(T);k()&&(u(j),a(!1),x?.onError?.(j))}finally{l.current===R&&(l.current=null)}},[n]);return{completion:r,complete:v,stop:g,isStreaming:s,error:i}}var O=require("react");function un(t){return t instanceof Error?t:new Error(String(t))}var fr=t=>typeof t=="string"?t:String(t),cn=0;function _t(t){return cn+=1,`${t}-${cn}`}function ln(t,e){let n=(0,O.useMemo)(()=>Ue(t),[t]),[r,o]=(0,O.useState)(()=>(e?.initialMessages??[]).map(P=>({id:P.id??_t("msg"),role:P.role,content:P.content}))),[s,a]=(0,O.useState)(""),[i,u]=(0,O.useState)(!1),[c,p]=(0,O.useState)(null),l=(0,O.useRef)(e);l.current=e;let f=(0,O.useRef)(r);f.current=r;let g=(0,O.useRef)(s);g.current=s;let v=(0,O.useRef)(0),b=(0,O.useRef)(null),S=(0,O.useRef)(!0);(0,O.useEffect)(()=>(S.current=!0,()=>{S.current=!1,b.current?.cancel(),b.current=null}),[]);let k=(0,O.useCallback)(()=>{v.current++,b.current?.cancel(),b.current=null,S.current&&u(!1)},[]),x=(0,O.useCallback)(async P=>{let E=P===void 0,h=(E?g.current:P)??"";if(!h.trim())return;b.current?.cancel();let _=++v.current,d=()=>S.current&&v.current===_,C=l.current,U=C?.parseChunk??fr,R={id:_t("msg"),role:"user",content:h},T={id:_t("msg"),role:"assistant",content:""},j=[...f.current,R].map(H=>({role:H.role,content:H.content})),m=[...f.current,R,T];f.current=m,o(m),E&&a(""),p(null),u(!0);let L=C?.buildPayload??(H=>({messages:H})),{initialMessages:B,parseChunk:K,buildPayload:q,onFinish:ie,onError:Ge,...Ze}=C??{},ve=H=>{o(W=>W.map(ae=>ae.id===T.id?{...ae,content:H}:ae))},pe="",ee;try{ee=n.requestStream(L(j),Ze),b.current=ee}catch(H){let W=un(H);d()&&(p(W),u(!1),C?.onError?.(W));return}try{for await(let H of ee){if(v.current!==_)break;pe+=U(H),d()&&ve(pe)}d()&&(u(!1),C?.onFinish?.({...T,content:pe}))}catch(H){let W=un(H);d()&&(p(W),u(!1),C?.onError?.(W))}finally{b.current===ee&&(b.current=null)}},[n]);return{messages:r,input:s,setInput:a,sendMessage:x,stop:k,isStreaming:i,error:c}}var D=require("react"),Re=require("@urun-sh/core"),Mt=[];function dn(t,e={}){let{field:n=Re.INPUT_PRESENCE_FIELD,hz:r=Re.INPUT_PRESENCE_DEFAULT_HZ}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=t?.presence??null,a=(0,D.useMemo)(()=>s?(0,Re.createInputPresencePublisher)({awareness:{setLocalStateField:(h,w)=>s.setField(h,w)},field:n,hz:r}):null,[s,n,r]),i=(0,D.useRef)(null);i.current=a;let[u,c]=(0,D.useState)(!1),[p,l]=(0,D.useState)(Mt),f=(0,D.useRef)(!1);(0,D.useEffect)(()=>{if(a)return()=>a.dispose()},[a]);let g=(0,D.useCallback)(()=>{let h=i.current;l(h?h.heldKeys():Mt)},[]),v=(0,D.useCallback)(()=>{i.current?.clear(),l(Mt)},[]);(0,D.useEffect)(()=>{if(!o)return;let h=()=>!!o.pointerLockElement,w=()=>{if(h()){f.current=!1,c(!0);return}f.current||(c(!1),v())},_=T=>{h()&&(i.current?.keyDown(T.key),g())},d=T=>{i.current?.keyUp(T.key),g()},C=T=>{h()&&i.current?.movePointer(T.movementX,T.movementY)},U=T=>{h()&&i.current?.setButtons(T.buttons)},R=()=>{v()};return o.addEventListener("pointerlockchange",w),o.addEventListener("keydown",_),o.addEventListener("keyup",d),o.addEventListener("mousemove",C),o.addEventListener("mousedown",U),o.addEventListener("mouseup",U),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",w),o.removeEventListener("keydown",_),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",C),o.removeEventListener("mousedown",U),o.removeEventListener("mouseup",U),o.defaultView?.removeEventListener("blur",R)}},[o,v,g]);let b=(0,D.useCallback)(h=>{h.requestPointerLock?.()},[]),S=(0,D.useCallback)(()=>{f.current=!0,c(!0)},[]),k=(0,D.useCallback)(()=>{f.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),c(!1),v()},[o,v]),x=(0,D.useCallback)(h=>{i.current?.keyDown(h),g()},[g]),P=(0,D.useCallback)(h=>{i.current?.keyUp(h),g()},[g]),E=(0,D.useCallback)((h,w)=>{i.current?.movePointer(h,w)},[]);return{engage:b,engageTouch:S,release:k,engaged:u,heldKeys:p,pressKey:x,releaseKey:P,movePointer:E}}var pn=new Map;function mn(t,e,n){if(!n||typeof n.safeParse!="function")throw new Error(`registerComponent("${t}"): schema must be a valid Zod schema`);pn.set(t,{component:e,schema:n})}function fn(t,e){let n=pn.get(t);if(!n)return{error:`Unknown component: "${t}"`};let r=n.schema.safeParse(e);return r.success?{Component:n.component,validatedProps:r.data}:{error:`Validation failed for "${t}": ${r.error.message}`}}var fe=require("react/jsx-runtime");function gn({name:t,props:e,fallback:n}){let r=fn(t,e);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),n?(0,fe.jsx)(fe.Fragment,{children:n}):(0,fe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,fe.jsx)("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return(0,fe.jsx)(o,{...r.validatedProps})}var Ee=require("zod"),ge=require("react/jsx-runtime"),hn=Ee.z.object({step:Ee.z.number().min(0),total:Ee.z.number().min(1),label:Ee.z.string().optional(),variant:Ee.z.enum(["default","success","error"]).default("default")});function Nt(t){let{step:e,total:n,label:r,variant:o="default"}=t,s=Math.min(e/n*100,100),a=e>=n;return{step:e,total:n,label:r,variant:o,percentage:s,isComplete:a}}function Sn(t){let{step:e,total:n,label:r,variant:o,percentage:s}=Nt(t);return(0,ge.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[r&&(0,ge.jsx)("div",{className:"urun-progress-label",children:r}),(0,ge.jsx)("div",{className:"urun-progress-bar",children:(0,ge.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ge.jsxs)("div",{className:"urun-progress-text",children:[e,"/",n]})]})}var et=require("zod"),We=require("react/jsx-runtime"),vn=et.z.object({state:et.z.enum(["thinking","generating","idle","error"]),message:et.z.string().optional()}),gr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function It(t){let{state:e,message:n}=t,r=e==="thinking"||e==="generating",o=n??gr[e]??e;return{state:e,message:o,isActive:r}}function yn(t){let{state:e,message:n,isActive:r}=It(t);return(0,We.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,We.jsx)("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),(0,We.jsx)("span",{className:"urun-status-message",children:n})]})}var Ve=require("react"),tt=require("zod"),Be=require("react/jsx-runtime"),kn=tt.z.object({text:tt.z.string(),streaming:tt.z.boolean().default(!1)});function Dt(t){let{text:e,streaming:n=!1}=t,r=e.length===0;return{text:e,streaming:n,isEmpty:r}}function bn(t){let{text:e,streaming:n}=Dt(t),r=(0,Ve.useRef)(null),o=(0,Ve.useRef)(0);return(0,Ve.useEffect)(()=>{let s=r.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),(0,Be.jsxs)("div",{className:"urun-text-stream",children:[(0,Be.jsx)("span",{ref:r,className:"urun-text-content"}),n&&(0,Be.jsx)("span",{className:"urun-text-cursor"})]})}var He=require("zod"),$e=require("react/jsx-runtime"),Cn=He.z.object({src:He.z.string().url(),alt:He.z.string().optional(),caption:He.z.string().optional()});function Lt(t){let{src:e,alt:n,caption:r}=t;return{src:e,alt:n??"",caption:r}}function Pn(t){let{src:e,alt:n,caption:r}=Lt(t);return(0,$e.jsxs)("figure",{className:"urun-image-frame",children:[(0,$e.jsx)("img",{className:"urun-image",src:e,alt:n}),r&&(0,$e.jsx)("figcaption",{className:"urun-image-caption",children:r})]})}var re=require("zod"),we=require("react/jsx-runtime"),Tn=re.z.object({metrics:re.z.array(re.z.object({label:re.z.string(),value:re.z.union([re.z.string(),re.z.number()]),unit:re.z.string().optional()}))});function Ot(t){return{metrics:t.metrics.map(n=>({...n,displayValue:n.unit?`${n.value} ${n.unit}`:String(n.value)}))}}function xn(t){let{metrics:e}=Ot(t);return(0,we.jsx)("div",{className:"urun-metrics-panel",children:e.map((n,r)=>(0,we.jsxs)("div",{className:"urun-metric-card",children:[(0,we.jsx)("div",{className:"urun-metric-label",children:n.label}),(0,we.jsx)("div",{className:"urun-metric-value",children:n.displayValue})]},r))})}var N=require("react"),Rn=require("@urun-sh/core");var nt=null;function hr(){if(typeof window>"u")return null;let t=window;return t.AudioContext??t.webkitAudioContext??null}function je(){if(nt)return nt;let t=hr();return t?(nt=new t,nt):null}function Ke(){let t=je();t&&t.state==="suspended"&&t.resume().catch(()=>{})}var En=require("react/jsx-runtime"),Sr=1e3,Un=200;function qt(...t){console.debug("[urun-audio]",...t)}var rt=(0,N.forwardRef)(function(e,n){let{session:r,stream:o="audio",track:s,controls:a=!1,className:i,onTrack:u,onUnlockChange:c,onAudioElement:p}=e,l=(0,N.useRef)(null),f=(0,N.useRef)(null),g=(0,N.useRef)(null),v=(0,N.useRef)(null),b=(0,N.useRef)(u);b.current=u;let S=(0,N.useRef)(c);S.current=c;let k=(0,N.useCallback)(d=>{g.current!==d&&(g.current=d,S.current?.(d))},[]),x=(0,N.useCallback)(()=>{if(typeof MediaStream>"u")return null;f.current||(f.current=new MediaStream);let d=l.current;return d&&d.srcObject!==f.current&&(d.srcObject=f.current),f.current},[]),P=(0,N.useCallback)(d=>{let C=l.current;if(!C)return;let U=C.play();!U||typeof U.then!="function"||U.then(()=>{C.muted||k(!0)}).catch(R=>{let T=R instanceof Error?R.name:String(R);if(T==="AbortError"){qt(`play() aborted (${d}); retrying in ${Un}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,P(`${d}:retry`)},Un);return}if(T==="NotAllowedError"){qt(`play() blocked pending a user gesture (${d})`),k(!1);return}qt(`play() failed (${d})`,R)})},[k]),E=(0,N.useCallback)(d=>{let C=x();if(C){for(let U of C.getAudioTracks())U!==d&&C.removeTrack(U);d&&!C.getAudioTracks().includes(d)&&C.addTrack(d),d&&P("track-attach"),b.current?.(d)}},[x,P]),h=(0,N.useCallback)(()=>{let d=l.current;d&&(x(),d.muted=!1,P("gesture"),Ke(),k(!0))},[x,P,k]);(0,N.useImperativeHandle)(n,()=>({unlock:h,get unlocked(){return g.current===!0},get element(){return l.current}}),[h]);let w=(0,N.useCallback)(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),_=s!==void 0;return(0,N.useEffect)(()=>{if(_){E(s??null);return}if(!r)return;let d=r.stream(o),C=()=>{let m=f.current;return m?m.getAudioTracks()[0]??null:null},U=m=>{if(m!==C()&&(E(m),m)){let L=()=>{C()===m&&E(null)};m.addEventListener("ended",L)}},R=d.track;R&&R.readyState==="live"&&U(R);let T=d.on("track",m=>{m&&m.readyState!=="live"||U(m)}),j=setInterval(()=>{let m=d.track;m&&m.readyState==="live"&&U(m)},Sr);return()=>{T(),clearInterval(j)}},[r,o,_,s,E]),(0,N.useEffect)(()=>(0,Rn.observePageLifecycle)(()=>{Ke(),g.current===!0&&P("foreground")}),[P]),(0,N.useEffect)(()=>()=>{v.current&&clearTimeout(v.current)},[]),(0,En.jsx)("audio",{ref:w,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});var M=require("react"),Ae=require("@urun-sh/core");var An=require("react/jsx-runtime"),Ft={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ot(...t){console.debug("[urun-voice]",...t)}var wn=(0,M.forwardRef)(function(e,n){let{session:r,stream:o="audio",constraints:s=Ft,connectTimeoutMs:a,attempts:i=3,retryDelayMs:u=1500,onActiveChange:c,onError:p,onMicStream:l,onTrack:f,onUnlockChange:g,capture:v}=e,b=(0,M.useRef)(null),S=(0,M.useRef)(null),k=(0,M.useRef)(null),x=(0,M.useRef)([]),P=(0,M.useRef)(!1),E=(0,M.useRef)(c);E.current=c;let h=(0,M.useRef)(p);h.current=p;let w=(0,M.useRef)(l);w.current=l;let _=(0,M.useCallback)(m=>{P.current!==m&&(P.current=m,E.current?.(m))},[]),d=(0,M.useCallback)(()=>{for(let m of x.current)m();x.current=[],k.current?.release(),k.current=null,S.current&&(S.current=null,w.current?.(null))},[]),C=(0,M.useCallback)(async()=>{let m=k.current;if(m){let q=await m.update(s);return S.current=m.stream,w.current?.(m.stream),q}let B=await(v??(0,Ae.sharedCaptureController)()).claim("audio",s);k.current=B,x.current=[B.onTrack((q,ie)=>{S.current=ie,w.current?.(ie),P.current&&r.stream(o).attach(q).catch(Ge=>ot("mic re-attach after one-capture re-acquire failed",Ge))}),B.onLost(q=>{k.current=null,x.current=[],S.current=null,w.current?.(null),_(!1),h.current?.(q)})],S.current=B.stream,w.current?.(B.stream);let K=B.track;if(!K)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return K},[v,s,r,o,_]),U=(0,M.useCallback)(async()=>{d(),_(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,_]),R=(0,M.useCallback)(async()=>{b.current?.unlock();let m;try{m=await C()}catch(K){d();let q=(0,Ae.sessionFailureFromMediaError)(K,r.status);throw h.current?.(q),q}r.connect?.();let L;for(let K=1;K<=i;K++)try{await r.whenLive(a!==void 0?{timeout:a}:void 0),await r.stream(o).attach(m),_(!0);return}catch(q){L=q,ot(`start attempt ${K}/${i} failed`,q),K<i&&await new Promise(ie=>setTimeout(ie,u))}d(),_(!1);let B=L instanceof Error?L:new Error(String(L??"voice start failed"));throw h.current?.(B),B},[r,o,a,i,u,C,d,_]);(0,M.useImperativeHandle)(n,()=>({start:R,stop:U,unlock:()=>b.current?.unlock(),get active(){return P.current},get micStream(){return S.current},get audio(){return b.current}}),[R,U]);let T=(0,M.useRef)(!1),j=(0,M.useCallback)(async()=>{if(!P.current||T.current)return;let m=S.current?.getAudioTracks()[0]??null;if(m&&m.readyState==="live"){try{await r.stream(o).attach(m)}catch(L){ot("foreground mic re-assert failed (will retry on next pass)",L)}return}T.current=!0;try{let L=await C();await r.stream(o).attach(L)}catch(L){let B=L instanceof Error?L:new Error(String(L));ot("foreground mic re-acquire failed",B),h.current?.(B)}finally{T.current=!1}},[r,o,C]);return(0,M.useEffect)(()=>{let m=()=>{j()};return typeof r.onRecovery=="function"?r.onRecovery(m):(0,Ae.observePageLifecycle)(m)},[r,j]),(0,M.useEffect)(()=>d,[d]),(0,An.jsx)(rt,{ref:b,session:r,stream:o,onTrack:f,onUnlockChange:g})});var st=require("@urun-sh/core"),y=require("react"),Y=require("react/jsx-runtime"),Vt={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Wt(...t){console.debug("[urun-camera]",...t)}function vr(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function yr(){let t=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof t?.enumerateDevices!="function")return null;try{return(await t.enumerateDevices()).filter(n=>n.kind==="videoinput")}catch{return null}}var _n=(0,y.forwardRef)(function(e,n){let{session:r,stream:o="video",constraints:s,facingMode:a="environment",mirror:i="auto",connectTimeoutMs:u,preview:c=!0,className:p,videoClassName:l,onActiveChange:f,onError:g,onStream:v,onTrack:b,children:S,capture:k,flipControl:x="auto",flipControlClassName:P,onDevices:E}=e,h=(0,y.useRef)(null),w=(0,y.useRef)(null),_=(0,y.useRef)(null),d=(0,y.useRef)([]),C=(0,y.useRef)(null),U=(0,y.useRef)(!1),R=(0,y.useRef)(a),[T,j]=(0,y.useState)(a),[m,L]=(0,y.useState)(!1),[B,K]=(0,y.useState)(null),[q,ie]=(0,y.useState)(!1),[Ge]=(0,y.useState)(vr),Ze=(0,y.useRef)(f);Ze.current=f;let ve=(0,y.useRef)(g);ve.current=g;let pe=(0,y.useRef)(v);pe.current=v;let ee=(0,y.useRef)(b);ee.current=b;let H=(0,y.useRef)(E);H.current=E;let W=(0,y.useCallback)(A=>{U.current!==A&&(U.current=A,L(A),Ze.current?.(A))},[]);(0,y.useEffect)(()=>{if(!m){K(null);return}let A=!1,I=()=>{yr().then(z=>{A||(K(z),z&&H.current?.(z))})};I();let $=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof $?.addEventListener=="function"?($.addEventListener("devicechange",I),()=>{A=!0,$.removeEventListener?.("devicechange",I)}):()=>{A=!0}},[m]);let ae=(0,y.useCallback)(A=>{let I=h.current;I&&(I.muted=!0,I.defaultMuted=!0,I.setAttribute("muted",""),I.setAttribute("playsinline",""),I.setAttribute("webkit-playsinline",""),I.srcObject=A,A&&I.play()?.catch?.($=>Wt("preview play() failed",$)))},[]),te=(0,y.useCallback)(()=>{C.current?.(),C.current=null;for(let A of d.current)A();d.current=[],_.current?.release(),_.current=null,w.current&&(w.current=null,pe.current?.(null),ee.current?.(null)),ae(null)},[ae]),Tt=(0,y.useCallback)((A,I)=>{C.current?.(),w.current=I,ae(I),pe.current?.(I);let $=()=>{w.current===I&&(Wt("camera track ended (device removed or permission revoked)"),te(),W(!1))};A.addEventListener("ended",$),C.current=()=>A.removeEventListener("ended",$)},[ae,te,W]),ye=(0,y.useCallback)(async A=>{let I={...Vt,...s,facingMode:A},$;try{let z=_.current;if(z)$=await z.update(I);else{let Le=await(k??(0,st.sharedCaptureController)()).claim("video",I);if(_.current=Le,d.current=[Le.onTrack((Oe,nr)=>{Tt(Oe,nr),U.current&&r.stream(o).attachVideo(Oe).then(()=>ee.current?.(Oe)).catch(rr=>Wt("camera re-publish after one-capture re-acquire failed",rr))}),Le.onLost(Oe=>{_.current=null,d.current=[],te(),W(!1),ve.current?.(Oe)})],!Le.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=Le.track}}catch(z){let ke=(0,st.sessionFailureFromMediaError)(z,r.status);throw ve.current?.(ke),ke}R.current=A,j(A),Tt($,_.current?.stream??new MediaStream([$]));try{r.connect?.(),await r.whenLive(u!==void 0?{timeout:u}:void 0),await r.stream(o).attachVideo($)}catch(z){te(),W(!1);let ke=z instanceof Error?z:new Error(String(z));throw ve.current?.(ke),ke}ee.current?.($),W(!0)},[r,o,s,u,k,Tt,te,W]),Kt=(0,y.useCallback)(A=>ye(A?.facingMode??R.current),[ye]),Jt=(0,y.useCallback)(async A=>{U.current&&R.current===A||await ye(A)},[ye]),xt=(0,y.useCallback)(()=>ye(R.current==="environment"?"user":"environment"),[ye]),zt=(0,y.useCallback)(async()=>{te(),W(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,te,W]);if((0,y.useImperativeHandle)(n,()=>({start:Kt,stop:zt,flip:xt,setFacingMode:Jt,get active(){return U.current},get facingMode(){return R.current},get stream(){return w.current},get element(){return h.current}}),[Kt,zt,xt,Jt]),(0,y.useEffect)(()=>te,[te]),!c)return null;let Qn=i==="auto"?T==="user":i,er=m&&(x===!0||x==="auto"&&Ge&&(B?.length??0)>1),tr=()=>{q||(ie(!0),xt().catch(()=>{}).finally(()=>ie(!1)))};return(0,Y.jsxs)("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":T,children:[(0,Y.jsx)("video",{ref:h,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Qn?{transform:"scaleX(-1)"}:{}}}),er?(0,Y.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:tr,disabled:q,className:P,style:P?{opacity:q?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:q?.6:1},children:(0,Y.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,Y.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,Y.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,Y.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,Y.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,Y.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});var it=require("react");var Bt={level:0,speaking:!1};function Mn(t,e={}){let{fftSize:n=512,intervalMs:r=100,speakingThreshold:o=.02}=e,[s,a]=(0,it.useState)(Bt);return(0,it.useEffect)(()=>{if(!t){a(Bt);return}let i=je();if(!i||typeof MediaStream>"u")return;let u;t instanceof MediaStream?u=t:(u=new MediaStream,u.addTrack(t));let c,p;try{c=i.createMediaStreamSource(u),p=i.createAnalyser(),p.fftSize=n,c.connect(p)}catch{return}let l=new Uint8Array(p.fftSize),g=setInterval(()=>{p.getByteTimeDomainData(l);let v=0;for(let S=0;S<l.length;S++){let k=(l[S]-128)/128;v+=k*k}let b=Math.sqrt(v/l.length);a(S=>{let k=b>o;return Math.abs(S.level-b)<.005&&S.speaking===k?S:{level:b,speaking:k}})},r);return()=>{clearInterval(g),c.disconnect(),a(Bt)}},[t,n,r,o]),s}var at=require("react");function Nn(t,e){let[n,r]=(0,at.useState)(null);return(0,at.useEffect)(()=>{if(!t||!e){r(null);return}let o=t.stream(e);return r(o.track),o.on("track",r)},[t,e]),n}var Ln=require("react");var ct=require("react");var In=require("zustand/vanilla"),Dn=require("zustand"),kr=()=>{};function ut(t,e={}){let n=c=>{t?.set(c)},r=()=>t?t.get()??{}:{},o=(0,In.createStore)(()=>({doc:r(),synced:t?t.synced:!1,set:n})),s=null,a=()=>{if(s){for(let c of s)c();s=null}},i=()=>t?(s||(o.setState({doc:r(),synced:t.synced}),s=[t.on("change",c=>o.setState({doc:c})),t.onSynced(()=>o.setState({synced:!0}))]),a):kr,u=(c=>(0,Dn.useStore)(o,c));return Object.assign(u,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:n,bind:i,unbind:a}),e.bind!==!1&&i(),u}function _e(t,e){let n=(0,ct.useMemo)(()=>ut(t&&e?t.doc(e):null,{bind:!1}),[t,e]);return(0,ct.useEffect)(()=>n.bind(),[n]),n}function On(t,e,n){let o=_e(t,e)(n??(i=>i)),s=(0,Ln.useCallback)(i=>{t&&e&&t.doc(e).set(i)},[t,e]);if(n)return o;let a=o;return{snapshot:t&&e?a.doc:null,synced:a.synced,set:s}}var dt=require("react");var ue=200;function oe(t,e,n=200){let r=[...t,e];return r.length>n?r.slice(r.length-n):r}function Me(t){if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}function lt(t){let e=t.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let n;try{n=JSON.parse(e)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return n===null||typeof n!="object"||Array.isArray(n)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:n}}function pt(t,e,n={}){let r=n.cap??200,[o,s]=(0,dt.useState)([]);return(0,dt.useEffect)(()=>{if(s([]),!t||!e)return;let a=!0,i=t.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await i.next();if(!a||u.done)break;s(c=>oe(c,{at:Date.now(),payload:u.value},r))}})(),()=>{a=!1,i.return?.()}},[t,e,r]),o}var Q=require("react/jsx-runtime");function qn({session:t,name:e,cap:n,className:r}){let o=pt(t,e,{cap:n});return(0,Q.jsxs)("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[(0,Q.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Q.jsx)("code",{children:e}),(0,Q.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,Q.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,Q.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Q.jsx)("code",{children:e})," messages\u2026"]}):o.map((s,a)=>(0,Q.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Q.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Me(s.payload)]},`${s.at}-${a}`))})]})}var Je=require("react");var J=require("react/jsx-runtime");function ze({placeholder:t,buttonLabel:e,disabled:n,onApply:r}){let[o,s]=(0,Je.useState)(""),[a,i]=(0,Je.useState)(null),u=(0,Je.useCallback)(()=>{let c=lt(o);if(!c.ok){i(c.error);return}i(null),r(c.value,o.trim()),s("")},[o,r]);return(0,J.jsxs)("div",{className:"urun-doc-patch",children:[(0,J.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:c=>s(c.target.value),placeholder:t,rows:3}),(0,J.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,J.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:n||!o.trim(),onClick:u,children:e}),a?(0,J.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function Fn({session:t,docKey:e,editable:n=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=_e(t,e),a=s(c=>c.doc),i=s(c=>c.synced),u=s(c=>c.set);return(0,J.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,J.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,J.jsx)("code",{children:e}),(0,J.jsx)("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),(0,J.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),n?(0,J.jsx)(ze,{placeholder:r,buttonLabel:"Apply patch",disabled:!t,onApply:c=>u(c)}):null]})}var mt=require("react");var se=require("react/jsx-runtime");function Wn(t,e=600){return t.length>e?`${t.slice(0,e)}\u2026`:t}function Vn({session:t,docKey:e="control",cap:n=200,className:r}){let[o,s]=(0,mt.useState)([]);return(0,mt.useEffect)(()=>(s([]),t?t.doc(e).on("change",i=>{s(u=>oe(u,{at:Date.now(),direction:"in",text:Wn(Me(i))},n))}):void 0),[t,e,n]),(0,se.jsxs)("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[(0,se.jsx)(ze,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!t,onApply:(a,i)=>{t?.doc(e).set(a),s(u=>oe(u,{at:Date.now(),direction:"out",text:Wn(i)},n))}}),(0,se.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,se.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,i)=>(0,se.jsxs)("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[(0,se.jsx)("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",(0,se.jsx)("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}var ft=require("react");var he=require("react/jsx-runtime");function Bn({session:t,trackNames:e=["video","audio"],docKeys:n=["control"],cap:r=200,className:o}){let[s,a]=(0,ft.useState)([]),i=e.join(","),u=n.join(",");return(0,ft.useEffect)(()=>{if(a([]),!t)return;let c=(l,f)=>a(g=>oe(g,{at:Date.now(),kind:l,text:f},r)),p=[];p.push(t.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of e){let f=t.stream(l);p.push(f.on("track",g=>c("track",`${l}: ${g?"track arrived":"track ended"}`)))}for(let l of n){let f=t.doc(l);p.push(f.on("change",()=>c("doc",`${l} changed`)))}return()=>p.forEach(l=>l())},[t,i,u,r]),(0,he.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,he.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,p)=>(0,he.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,he.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,he.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${p}`))})}var bt=require("@urun-sh/core");var gt=require("react");function G(t){let[e,n]=(0,gt.useState)(t?.phase??null);return(0,gt.useEffect)(()=>{if(!t){n(null);return}return t.onPhase(n)},[t]),e}var $n=require("@urun-sh/core");var Ne=require("react"),Hn=require("@urun-sh/core");function ht(t){let e=G(t),n=(0,Hn.isWakingPhase)(e?.name),r=(0,Ne.useRef)(void 0);n?r.current??=Date.now():r.current=void 0;let o=n?e?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,i]=(0,Ne.useState)(s);return(0,Ne.useEffect)(()=>{if(o===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-o)/1e3)));let u=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(u)},[o]),{waking:n,phase:e,state:n?e?.runtime?.state:void 0,reason:n?e?.runtime?.reason:void 0,since:o,seconds:n?a:0}}var ce=require("react/jsx-runtime");function St({session:t,render:e,className:n}){let r=ht(t);return!r.waking||!r.phase?null:(0,ce.jsx)("span",{className:["urun-session-waking",n].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:e?e(r):(0,ce.jsxs)(ce.Fragment,{children:[(0,ce.jsx)("span",{className:"urun-session-waking-label",children:(0,$n.describeSessionPhase)(r.phase)})," ",(0,ce.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}var yt=require("react");var le=require("react"),br={event:null,elapsedMs:0};function vt(t,e){let[n,r]=(0,le.useState)(null),o=(0,le.useRef)(0);(0,le.useEffect)(()=>{if(r(null),!!t?.onActivation)return t.onActivation(i=>{e!==void 0&&i.stream!==e||(o.current=Date.now(),r(i))})},[t,e]);let[s,a]=(0,le.useState)(0);return(0,le.useEffect)(()=>{if(!n){a(0);return}if(n.state==="first-media"){a(n.elapsedMs);return}let i=o.current,u=()=>n.elapsedMs+Math.max(0,Date.now()-i);a(u());let c=setInterval(()=>a(u()),1e3);return()=>clearInterval(c)},[n]),n?{event:n,elapsedMs:s}:br}var Ie=require("react/jsx-runtime"),Cr={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Pr(t){let[e,n]=(0,yt.useState)(!1);return(0,yt.useEffect)(()=>{if(n(!1),!t)return;let r=t;if(typeof r.requestVideoFrameCallback=="function"){let s=r.requestVideoFrameCallback(()=>n(!0));return()=>r.cancelVideoFrameCallback?.(s)}let o=()=>{let s=r.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:r.readyState>=2)&&n(!0)};return o(),r.addEventListener("loadeddata",o),r.addEventListener("timeupdate",o),()=>{r.removeEventListener("loadeddata",o),r.removeEventListener("timeupdate",o)}},[t]),e}function kt({session:t,stream:e,videoElement:n,render:r,className:o}){let s=vt(t,e),a=Pr(n),i=s.event;if(!i||i.state==="first-media"||a)return null;let u=i.state;return(0,Ie.jsx)("div",{className:["urun-activation-overlay",o].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:r?r(s):(0,Ie.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,Ie.jsx)("span",{className:"urun-activation-overlay-copy",children:i.hint??Cr[u]})," ",(0,Ie.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var Z=require("react/jsx-runtime"),Tr={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function jn({session:t,className:e}){let n=G(t),r=n?.name??"idle",o=n?.name==="queued"&&n.queue?`pos ${n.queue.position} / depth ${n.queue.depth}`:(n?.name==="error"||n?.name==="expired")&&n.error?n.error.reason:n?.runtime?.reason??null;return(0,Z.jsxs)("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":r,children:[(0,Z.jsx)("span",{className:"urun-session-status-dot","data-phase":r}),(0,Z.jsx)("span",{className:"urun-session-status-label",children:Tr[r]}),o?(0,Z.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function Kn({session:t,children:e,fallback:n,onStartOver:r,className:o}){let s=G(t);if(s?.name==="live")return(0,Z.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[e,(0,Z.jsx)(kt,{session:t})]});let a=n?n(s):(0,Z.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,bt.isWakingPhase)(s.name)?(0,Z.jsx)(St,{session:t}):s&&s.name!=="idle"?(0,bt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),i=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,Z.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,i?(0,Z.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}var Ct=require("react");var zn=require("react/jsx-runtime");function Ht(t){return G(t)?.endsAt??null}function xr(t){let e=Math.max(0,Math.floor(t/1e3)),n=Math.floor(e/60),r=e%60;return`${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Jn({session:t,urgentMs:e=6e4,className:n}){let o=Ht(t)?.getTime()??null,[s,a]=(0,Ct.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,Ct.useEffect)(()=>{if(o===null){a(null);return}let u=()=>a(Math.max(0,o-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[o]),s===null)return null;let i=xr(s);return(0,zn.jsx)("span",{className:["urun-session-clock",n].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:i})}var Xe=require("react/jsx-runtime"),Ur=new Set(["expired","ended","error"]);function Xn({session:t,onNewSession:e,children:n,className:r}){let o=G(t);if(!o||!Ur.has(o.name))return null;let s=n?n(o):(0,Xe.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Xe.jsxs)("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?(0,Xe.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}var de=require("react"),Se=require("react/jsx-runtime");function $t(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function jt(t){let e=(0,de.useMemo)(()=>t?t.doc("control"):null,[t]),[n,r]=(0,de.useState)(()=>e?$t(e.get("idle")):null);return(0,de.useEffect)(()=>{if(!e){r(null);return}return r($t(e.get("idle"))),e.on("change",()=>r($t(e.get("idle"))))},[e]),n}function Rr(t){let e=Math.max(0,Math.floor(t));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function Gn({session:t,onStillHere:e,className:n}){let r=jt(t),o=r?.deadlineEpochS??null,[s,a]=(0,de.useState)(null);if((0,de.useEffect)(()=>{if(o===null){a(null);return}let u=()=>a(Math.max(0,o-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[o]),!r||!t)return null;let i=()=>{t.touch?.(),e?.()};return(0,Se.jsx)("div",{className:["urun-idle-warning",n].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,Se.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Se.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Se.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Rr(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Se.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}var De=require("react"),Zn=require("@urun-sh/core");function Yn(t){let e=(0,De.useContext)(Ce),[n,r]=(0,De.useState)(null),o=t.app??e?.appId,s=t.function,a=t.intervalS??60,i=e?.baseUrl,u=e?.orgId,c=e?.jwt,p=e?.getAccessToken,l=e?.authProvider;return(0,De.useEffect)(()=>{if(!i||!u||!o||!s)return;let f=!1,g=()=>{(0,Zn.prewake)({baseUrl:i,app:o,functionName:s,orgId:u,jwt:c,getAccessToken:p,authProvider:l}).then(b=>{f||r(b)}).catch(()=>{})};g();let v=setInterval(g,Math.max(1,a)*1e3);return()=>{f=!0,clearInterval(v)}},[o,s,a,i,u,c,p,l]),n}var Pt=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,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
import{a as gn,b as hn,c as He}from"./chunk-WF2OBDSX.mjs";import{useEffect as bn,useMemo as Cn,useState as Pn}from"react";import{Component as Sn}from"react";import{jsx as kt,jsxs as vn}from"react/jsx-runtime";var Se=class extends Sn{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,n){console.error("[urun] Error caught by UrunErrorBoundary:",t,n)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||vn("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:[kt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),kt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as yn}from"react";var ue=yn(null);function ee(e){return e&&e.trim()?e.trim():void 0}function X(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ee(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ee(typeof process<"u"?process.env?.[e]:void 0)}}function Re(){let e=X("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||X("VERCEL_ENV")==="production"?"workos":X("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function kn(){return Re()==="workos"}import{jsx as $e}from"react/jsx-runtime";function Tn({baseUrl:e,orgId:t,appId:n,jwt:r,authProvider:o,fallback:s,children:i}){let[a,c]=Pn(),u=He(),p=X("NEXT_PUBLIC_SESSION_TOKEN")??X("NEXT_PUBLIC_URUN_JWT"),l=Re(),m=l==="workos"&&!r,h=r??(l==="jwt"?p:void 0)??a,y=o??X("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!h,S=Cn(()=>({appId:n,baseUrl:e,orgId:t,jwt:h,getAccessToken:m?u?.getAccessToken:void 0,authProvider:y}),[n,u,e,y,h,t,m]);return bn(()=>{if(!m||!u)return;let v=!1,x=u;async function k(){try{let g=await x.getAccessToken();v||c(g??void 0)}catch{v||c(void 0)}}k();let E=window.setInterval(()=>{k()},6e4);return()=>{v=!0,window.clearInterval(E)}},[u,m]),$e(Se,{fallback:s,children:C?$e("div",{role:"status","aria-live":"polite",children:"Signing in..."}):$e(ue.Provider,{value:S,children:i})})}import{useContext as xn,useEffect as Rn,useMemo as bt,useReducer as En,useRef as Ct}from"react";import{App as Un}from"@urun-sh/core";function wn(e,t){return`${e}:${JSON.stringify(t??{})}`}function An(e,t,n){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,fnName:t,args:n??{}})}var ce=new Map;var je=class{constructor(t,n){this._doc=t;this._notify=n;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,n){return this._doc.get(t,n)}set(t){this._doc.set(t),this._notify()}on(t,n){return this._doc.on(t,r=>n(r))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let n=this._doc.text(t),r=this._notify;return{append(o){n.append(o),r()},toString:()=>n.toString(),get length(){return n.length},on:(o,s)=>n.on(o,i=>{s(i),r()})}}dispose(){this._unsubscribeChange()}},Ke=class{constructor(t,n){this._stream=t;this._notify=n;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,n){return this._stream.on(t,n)}messages(){return this._stream.messages()}emit(t,n){return this._stream.emit(t,n)}dispose(){this._unsubscribeTrack()}},Je=class{constructor(t,n){this._session=t;this._notifiers.add(n),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,n){return this._session.request(t,n)}requestStream(t,n){return this._session.requestStream(t,n)}complete(t,n){return this._session.complete(t,n)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let n=this._docs.get(t);return n||(n=new je(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,n)),n}stream(t){let n=this._streams.get(t);return n||(n=new Ke(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,n)),n}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._notifyAll(),this._notifiers.clear()}};function Mn(){let e=xn(ue);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=En(s=>s+1,0),n=Ct(new Map),r=Ct(new Map),o=bt(()=>Un(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 Rn(()=>()=>{for(let[s,i]of r.current){let a=ce.get(s);a===i&&(a.handle.removeNotifier(t),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let c=ce.get(s);!c||c.refCount!==0||(ce.delete(s),c.handle.disconnect())},0)))}r.current.clear(),n.current.clear()},[]),bt(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let c=wn(i,a),u=n.current.get(c);if(u&&!u.disposed)return u;let p=An(e,i,a),l=ce.get(p);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),ce.delete(p),r.current.get(p)===l&&r.current.delete(p),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new Je(o[i](a),t),refCount:0,disposeTimer:null},ce.set(p,l)),r.current.get(p)!==l&&(r.current.set(p,l),l.handle.addNotifier(t),l.refCount+=1),n.current.set(c,l.handle),l.handle}}}),[e,o])}import{useCallback as ze,useEffect as _n,useMemo as Nn,useRef as Ee,useState as Xe}from"react";function le(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 In(e){return e instanceof Error?e:new Error(String(e))}function Dn(e,t){let n=Nn(()=>le(e),[e]),[r,o]=Xe(void 0),[s,i]=Xe(null),[a,c]=Xe(!1),u=Ee(t);u.current=t;let p=Ee(0),l=Ee(null),m=Ee(!0);_n(()=>(m.current=!0,()=>{m.current=!1,l.current?.abort()}),[]);let h=ze(async S=>{l.current?.abort();let v=new AbortController;l.current=v;let x=++p.current,k=()=>m.current&&p.current===x;k()&&(c(!0),i(null));try{let E=await n.request(S,{...u.current,signal:v.signal});return k()&&(o(E),c(!1),u.current?.onSuccess?.(E)),E}catch(E){let g=In(E);throw k()&&(i(g),c(!1),u.current?.onError?.(g)),g}},[n]),y=ze(S=>{h(S).catch(()=>{})},[h]),C=ze(()=>{p.current++,l.current?.abort(),l.current=null,o(void 0),i(null),c(!1)},[]);return{mutate:y,mutateAsync:h,data:r,error:s,isPending:a,reset:C}}import{useCallback as Pt,useEffect as Ln,useMemo as On,useRef as Ue,useState as Ge}from"react";function Tt(e){return e instanceof Error?e:new Error(String(e))}var qn=e=>typeof e=="string"?e:String(e);function Fn(e,t){let n=On(()=>le(e),[e]),[r,o]=Ge(""),[s,i]=Ge(!1),[a,c]=Ge(null),u=Ue(t);u.current=t;let p=Ue(0),l=Ue(null),m=Ue(!0);Ln(()=>(m.current=!0,()=>{m.current=!1,l.current?.cancel(),l.current=null}),[]);let h=Pt(()=>{p.current++,l.current?.cancel(),l.current=null,m.current&&i(!1)},[]),y=Pt(async C=>{l.current?.cancel();let S=++p.current,v=()=>m.current&&p.current===S,x=u.current,k=x?.parseChunk??qn,E=x?.buildPayload??(P=>({prompt:P}));v()&&(o(""),c(null),i(!0));let{parseChunk:g,buildPayload:A,onFinish:w,onError:d,...b}=x??{},T="",R;try{R=n.requestStream(E(C),b),l.current=R}catch(P){let q=Tt(P);v()&&(c(q),i(!1),x?.onError?.(q));return}try{for await(let P of R){if(p.current!==S)break;T+=k(P),v()&&o(T)}v()&&(i(!1),x?.onFinish?.(T))}catch(P){let q=Tt(P);v()&&(c(q),i(!1),x?.onError?.(q))}finally{l.current===R&&(l.current=null)}},[n]);return{completion:r,complete:y,stop:h,isStreaming:s,error:a}}import{useCallback as xt,useEffect as Wn,useMemo as Vn,useRef as de,useState as we}from"react";function Rt(e){return e instanceof Error?e:new Error(String(e))}var Bn=e=>typeof e=="string"?e:String(e),Et=0;function Ze(e){return Et+=1,`${e}-${Et}`}function Hn(e,t){let n=Vn(()=>le(e),[e]),[r,o]=we(()=>(t?.initialMessages??[]).map(k=>({id:k.id??Ze("msg"),role:k.role,content:k.content}))),[s,i]=we(""),[a,c]=we(!1),[u,p]=we(null),l=de(t);l.current=t;let m=de(r);m.current=r;let h=de(s);h.current=s;let y=de(0),C=de(null),S=de(!0);Wn(()=>(S.current=!0,()=>{S.current=!1,C.current?.cancel(),C.current=null}),[]);let v=xt(()=>{y.current++,C.current?.cancel(),C.current=null,S.current&&c(!1)},[]),x=xt(async k=>{let E=k===void 0,g=(E?h.current:k)??"";if(!g.trim())return;C.current?.cancel();let w=++y.current,d=()=>S.current&&y.current===w,b=l.current,T=b?.parseChunk??Bn,R={id:Ze("msg"),role:"user",content:g},P={id:Ze("msg"),role:"assistant",content:""},q=[...m.current,R].map(L=>({role:L.role,content:L.content})),f=[...m.current,R,P];m.current=f,o(f),E&&i(""),p(null),c(!0);let _=b?.buildPayload??(L=>({messages:L})),{initialMessages:D,parseChunk:F,buildPayload:N,onFinish:J,onError:Te,...xe}=b??{},se=L=>{o(I=>I.map(z=>z.id===P.id?{...z,content:L}:z))},Q="",H;try{H=n.requestStream(_(q),xe),C.current=H}catch(L){let I=Rt(L);d()&&(p(I),c(!1),b?.onError?.(I));return}try{for await(let L of H){if(y.current!==w)break;Q+=T(L),d()&&se(Q)}d()&&(c(!1),b?.onFinish?.({...P,content:Q}))}catch(L){let I=Rt(L);d()&&(p(I),c(!1),b?.onError?.(I))}finally{C.current===H&&(C.current=null)}},[n]);return{messages:r,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}import{useCallback as G,useEffect as Ut,useMemo as $n,useRef as wt,useState as At}from"react";import{createInputPresencePublisher as jn,INPUT_PRESENCE_DEFAULT_HZ as Kn,INPUT_PRESENCE_FIELD as Jn}from"@urun-sh/core";var Ye=[];function zn(e,t={}){let{field:n=Jn,hz:r=Kn}=t,o=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=$n(()=>s?jn({awareness:{setLocalStateField:(g,A)=>s.setField(g,A)},field:n,hz:r}):null,[s,n,r]),a=wt(null);a.current=i;let[c,u]=At(!1),[p,l]=At(Ye),m=wt(!1);Ut(()=>{if(i)return()=>i.dispose()},[i]);let h=G(()=>{let g=a.current;l(g?g.heldKeys():Ye)},[]),y=G(()=>{a.current?.clear(),l(Ye)},[]);Ut(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,A=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),y())},w=P=>{g()&&(a.current?.keyDown(P.key),h())},d=P=>{a.current?.keyUp(P.key),h()},b=P=>{g()&&a.current?.movePointer(P.movementX,P.movementY)},T=P=>{g()&&a.current?.setButtons(P.buttons)},R=()=>{y()};return o.addEventListener("pointerlockchange",A),o.addEventListener("keydown",w),o.addEventListener("keyup",d),o.addEventListener("mousemove",b),o.addEventListener("mousedown",T),o.addEventListener("mouseup",T),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",A),o.removeEventListener("keydown",w),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",b),o.removeEventListener("mousedown",T),o.removeEventListener("mouseup",T),o.defaultView?.removeEventListener("blur",R)}},[o,y,h]);let C=G(g=>{g.requestPointerLock?.()},[]),S=G(()=>{m.current=!0,u(!0)},[]),v=G(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),y()},[o,y]),x=G(g=>{a.current?.keyDown(g),h()},[h]),k=G(g=>{a.current?.keyUp(g),h()},[h]),E=G((g,A)=>{a.current?.movePointer(g,A)},[]);return{engage:C,engageTouch:S,release:v,engaged:c,heldKeys:p,pressKey:x,releaseKey:k,movePointer:E}}var Mt=new Map;function Xn(e,t,n){if(!n||typeof n.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Mt.set(e,{component:t,schema:n})}function _t(e,t){let n=Mt.get(e);if(!n)return{error:`Unknown component: "${e}"`};let r=n.schema.safeParse(t);return r.success?{Component:n.component,validatedProps:r.data}:{error:`Validation failed for "${e}": ${r.error.message}`}}import{Fragment as Zn,jsx as Ae}from"react/jsx-runtime";function Gn({name:e,props:t,fallback:n}){let r=_t(e,t);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),n?Ae(Zn,{children:n}):Ae("div",{className:"urun-component-error",role:"alert",children:Ae("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return Ae(o,{...r.validatedProps})}import{z as ve}from"zod";import{jsx as Qe,jsxs as Nt}from"react/jsx-runtime";var Yn=ve.object({step:ve.number().min(0),total:ve.number().min(1),label:ve.string().optional(),variant:ve.enum(["default","success","error"]).default("default")});function It(e){let{step:t,total:n,label:r,variant:o="default"}=e,s=Math.min(t/n*100,100),i=t>=n;return{step:t,total:n,label:r,variant:o,percentage:s,isComplete:i}}function Qn(e){let{step:t,total:n,label:r,variant:o,percentage:s}=It(e);return Nt("div",{className:"urun-progress-card","data-variant":o,children:[r&&Qe("div",{className:"urun-progress-label",children:r}),Qe("div",{className:"urun-progress-bar",children:Qe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Nt("div",{className:"urun-progress-text",children:[t,"/",n]})]})}import{z as et}from"zod";import{jsx as Dt,jsxs as rr}from"react/jsx-runtime";var er=et.object({state:et.enum(["thinking","generating","idle","error"]),message:et.string().optional()}),tr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Lt(e){let{state:t,message:n}=e,r=t==="thinking"||t==="generating",o=n??tr[t]??t;return{state:t,message:o,isActive:r}}function nr(e){let{state:t,message:n,isActive:r}=Lt(e);return rr("span",{className:"urun-status-badge","data-state":t,children:[Dt("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),Dt("span",{className:"urun-status-message",children:n})]})}import{useRef as Ot,useEffect as or}from"react";import{z as tt}from"zod";import{jsx as qt,jsxs as ar}from"react/jsx-runtime";var sr=tt.object({text:tt.string(),streaming:tt.boolean().default(!1)});function Ft(e){let{text:t,streaming:n=!1}=e,r=t.length===0;return{text:t,streaming:n,isEmpty:r}}function ir(e){let{text:t,streaming:n}=Ft(e),r=Ot(null),o=Ot(0);return or(()=>{let s=r.current;s&&t.length!==o.current&&(s.textContent=t,o.current=t.length)},[t]),ar("div",{className:"urun-text-stream",children:[qt("span",{ref:r,className:"urun-text-content"}),n&&qt("span",{className:"urun-text-cursor"})]})}import{z as Me}from"zod";import{jsx as Wt,jsxs as lr}from"react/jsx-runtime";var ur=Me.object({src:Me.string().url(),alt:Me.string().optional(),caption:Me.string().optional()});function Vt(e){let{src:t,alt:n,caption:r}=e;return{src:t,alt:n??"",caption:r}}function cr(e){let{src:t,alt:n,caption:r}=Vt(e);return lr("figure",{className:"urun-image-frame",children:[Wt("img",{className:"urun-image",src:t,alt:n}),r&&Wt("figcaption",{className:"urun-image-caption",children:r})]})}import{z as Z}from"zod";import{jsx as nt,jsxs as mr}from"react/jsx-runtime";var dr=Z.object({metrics:Z.array(Z.object({label:Z.string(),value:Z.union([Z.string(),Z.number()]),unit:Z.string().optional()}))});function Bt(e){return{metrics:e.metrics.map(n=>({...n,displayValue:n.unit?`${n.value} ${n.unit}`:String(n.value)}))}}function pr(e){let{metrics:t}=Bt(e);return nt("div",{className:"urun-metrics-panel",children:t.map((n,r)=>mr("div",{className:"urun-metric-card",children:[nt("div",{className:"urun-metric-label",children:n.label}),nt("div",{className:"urun-metric-value",children:n.displayValue})]},r))})}import{forwardRef as gr,useCallback as pe,useEffect as rt,useImperativeHandle as hr,useRef as me}from"react";import{observePageLifecycle as Sr}from"@urun-sh/core";var _e=null;function fr(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ne(){if(_e)return _e;let e=fr();return e?(_e=new e,_e):null}function Ie(){let e=Ne();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as yr}from"react/jsx-runtime";var vr=1e3,Ht=200;function ot(...e){console.debug("[urun-audio]",...e)}var st=gr(function(t,n){let{session:r,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:p}=t,l=me(null),m=me(null),h=me(null),y=me(null),C=me(c);C.current=c;let S=me(u);S.current=u;let v=pe(d=>{h.current!==d&&(h.current=d,S.current?.(d))},[]),x=pe(()=>{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},[]),k=pe(d=>{let b=l.current;if(!b)return;let T=b.play();!T||typeof T.then!="function"||T.then(()=>{b.muted||v(!0)}).catch(R=>{let P=R instanceof Error?R.name:String(R);if(P==="AbortError"){ot(`play() aborted (${d}); retrying in ${Ht}ms`),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{y.current=null,k(`${d}:retry`)},Ht);return}if(P==="NotAllowedError"){ot(`play() blocked pending a user gesture (${d})`),v(!1);return}ot(`play() failed (${d})`,R)})},[v]),E=pe(d=>{let b=x();if(b){for(let T of b.getAudioTracks())T!==d&&b.removeTrack(T);d&&!b.getAudioTracks().includes(d)&&b.addTrack(d),d&&k("track-attach"),C.current?.(d)}},[x,k]),g=pe(()=>{let d=l.current;d&&(x(),d.muted=!1,k("gesture"),Ie(),v(!0))},[x,k,v]);hr(n,()=>({unlock:g,get unlocked(){return h.current===!0},get element(){return l.current}}),[g]);let A=pe(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),w=s!==void 0;return rt(()=>{if(w){E(s??null);return}if(!r)return;let d=r.stream(o),b=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},T=f=>{if(f!==b()&&(E(f),f)){let _=()=>{b()===f&&E(null)};f.addEventListener("ended",_)}},R=d.track;R&&R.readyState==="live"&&T(R);let P=d.on("track",f=>{f&&f.readyState!=="live"||T(f)}),q=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&T(f)},vr);return()=>{P(),clearInterval(q)}},[r,o,w,s,E]),rt(()=>Sr(()=>{Ie(),h.current===!0&&k("foreground")}),[k]),rt(()=>()=>{y.current&&clearTimeout(y.current)},[]),yr("audio",{ref:A,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as kr,useCallback as fe,useEffect as $t,useImperativeHandle as br,useRef as j}from"react";import{observePageLifecycle as Cr,sessionFailureFromMediaError as Pr,sharedCaptureController as Tr}from"@urun-sh/core";import{jsx as Rr}from"react/jsx-runtime";var jt={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function De(...e){console.debug("[urun-voice]",...e)}var xr=kr(function(t,n){let{session:r,stream:o="audio",constraints:s=jt,connectTimeoutMs:i,attempts:a=3,retryDelayMs:c=1500,onActiveChange:u,onError:p,onMicStream:l,onTrack:m,onUnlockChange:h,capture:y}=t,C=j(null),S=j(null),v=j(null),x=j([]),k=j(!1),E=j(u);E.current=u;let g=j(p);g.current=p;let A=j(l);A.current=l;let w=fe(f=>{k.current!==f&&(k.current=f,E.current?.(f))},[]),d=fe(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,S.current&&(S.current=null,A.current?.(null))},[]),b=fe(async()=>{let f=v.current;if(f){let N=await f.update(s);return S.current=f.stream,A.current?.(f.stream),N}let D=await(y??Tr()).claim("audio",s);v.current=D,x.current=[D.onTrack((N,J)=>{S.current=J,A.current?.(J),k.current&&r.stream(o).attach(N).catch(Te=>De("mic re-attach after one-capture re-acquire failed",Te))}),D.onLost(N=>{v.current=null,x.current=[],S.current=null,A.current?.(null),w(!1),g.current?.(N)})],S.current=D.stream,A.current?.(D.stream);let F=D.track;if(!F)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return F},[y,s,r,o,w]),T=fe(async()=>{d(),w(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,w]),R=fe(async()=>{C.current?.unlock();let f;try{f=await b()}catch(F){d();let N=Pr(F,r.status);throw g.current?.(N),N}r.connect?.();let _;for(let F=1;F<=a;F++)try{await r.whenLive(i!==void 0?{timeout:i}:void 0),await r.stream(o).attach(f),w(!0);return}catch(N){_=N,De(`start attempt ${F}/${a} failed`,N),F<a&&await new Promise(J=>setTimeout(J,c))}d(),w(!1);let D=_ instanceof Error?_:new Error(String(_??"voice start failed"));throw g.current?.(D),D},[r,o,i,a,c,b,d,w]);br(n,()=>({start:R,stop:T,unlock:()=>C.current?.unlock(),get active(){return k.current},get micStream(){return S.current},get audio(){return C.current}}),[R,T]);let P=j(!1),q=fe(async()=>{if(!k.current||P.current)return;let f=S.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await r.stream(o).attach(f)}catch(_){De("foreground mic re-assert failed (will retry on next pass)",_)}return}P.current=!0;try{let _=await b();await r.stream(o).attach(_)}catch(_){let D=_ instanceof Error?_:new Error(String(_));De("foreground mic re-acquire failed",D),g.current?.(D)}finally{P.current=!1}},[r,o,b]);return $t(()=>{let f=()=>{q()};return typeof r.onRecovery=="function"?r.onRecovery(f):Cr(f)},[r,q]),$t(()=>d,[d]),Rr(st,{ref:C,session:r,stream:o,onTrack:m,onUnlockChange:h})});import{sessionFailureFromMediaError as Er,sharedCaptureController as Ur}from"@urun-sh/core";import{forwardRef as wr,useCallback as K,useEffect as Kt,useImperativeHandle as Ar,useRef as V,useState as ye}from"react";import{jsx as te,jsxs as Jt}from"react/jsx-runtime";var zt={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function it(...e){console.debug("[urun-camera]",...e)}function Mr(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function _r(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(n=>n.kind==="videoinput")}catch{return null}}var Nr=wr(function(t,n){let{session:r,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:c,preview:u=!0,className:p,videoClassName:l,onActiveChange:m,onError:h,onStream:y,onTrack:C,children:S,capture:v,flipControl:x="auto",flipControlClassName:k,onDevices:E}=t,g=V(null),A=V(null),w=V(null),d=V([]),b=V(null),T=V(!1),R=V(i),[P,q]=ye(i),[f,_]=ye(!1),[D,F]=ye(null),[N,J]=ye(!1),[Te]=ye(Mr),xe=V(m);xe.current=m;let se=V(h);se.current=h;let Q=V(y);Q.current=y;let H=V(C);H.current=C;let L=V(E);L.current=E;let I=K(U=>{T.current!==U&&(T.current=U,_(U),xe.current?.(U))},[]);Kt(()=>{if(!f){F(null);return}let U=!1,M=()=>{_r().then(W=>{U||(F(W),W&&L.current?.(W))})};M();let O=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof O?.addEventListener=="function"?(O.addEventListener("devicechange",M),()=>{U=!0,O.removeEventListener?.("devicechange",M)}):()=>{U=!0}},[f]);let z=K(U=>{let M=g.current;M&&(M.muted=!0,M.defaultMuted=!0,M.setAttribute("muted",""),M.setAttribute("playsinline",""),M.setAttribute("webkit-playsinline",""),M.srcObject=U,U&&M.play()?.catch?.(O=>it("preview play() failed",O)))},[]),$=K(()=>{b.current?.(),b.current=null;for(let U of d.current)U();d.current=[],w.current?.release(),w.current=null,A.current&&(A.current=null,Q.current?.(null),H.current?.(null)),z(null)},[z]),Ve=K((U,M)=>{b.current?.(),A.current=M,z(M),Q.current?.(M);let O=()=>{A.current===M&&(it("camera track ended (device removed or permission revoked)"),$(),I(!1))};U.addEventListener("ended",O),b.current=()=>U.removeEventListener("ended",O)},[z,$,I]),ie=K(async U=>{let M={...zt,...s,facingMode:U},O;try{let W=w.current;if(W)O=await W.update(M);else{let ge=await(v??Ur()).claim("video",M);if(w.current=ge,d.current=[ge.onTrack((he,mn)=>{Ve(he,mn),T.current&&r.stream(o).attachVideo(he).then(()=>H.current?.(he)).catch(fn=>it("camera re-publish after one-capture re-acquire failed",fn))}),ge.onLost(he=>{w.current=null,d.current=[],$(),I(!1),se.current?.(he)})],!ge.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});O=ge.track}}catch(W){let ae=Er(W,r.status);throw se.current?.(ae),ae}R.current=U,q(U),Ve(O,w.current?.stream??new MediaStream([O]));try{r.connect?.(),await r.whenLive(c!==void 0?{timeout:c}:void 0),await r.stream(o).attachVideo(O)}catch(W){$(),I(!1);let ae=W instanceof Error?W:new Error(String(W));throw se.current?.(ae),ae}H.current?.(O),I(!0)},[r,o,s,c,v,Ve,$,I]),St=K(U=>ie(U?.facingMode??R.current),[ie]),vt=K(async U=>{T.current&&R.current===U||await ie(U)},[ie]),Be=K(()=>ie(R.current==="environment"?"user":"environment"),[ie]),yt=K(async()=>{$(),I(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,$,I]);if(Ar(n,()=>({start:St,stop:yt,flip:Be,setFacingMode:vt,get active(){return T.current},get facingMode(){return R.current},get stream(){return A.current},get element(){return g.current}}),[St,yt,Be,vt]),Kt(()=>$,[$]),!u)return null;let ln=a==="auto"?P==="user":a,dn=f&&(x===!0||x==="auto"&&Te&&(D?.length??0)>1),pn=()=>{N||(J(!0),Be().catch(()=>{}).finally(()=>J(!1)))};return Jt("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[te("video",{ref:g,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ln?{transform:"scaleX(-1)"}:{}}}),dn?te("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:pn,disabled:N,className:k,style:k?{opacity:N?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:N?.6:1},children:Jt("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[te("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),te("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),te("path",{d:"M14.5 10.5v1.6h-1.6"}),te("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),te("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});import{useEffect as Ir,useState as Dr}from"react";var at={level:0,speaking:!1};function Lr(e,t={}){let{fftSize:n=512,intervalMs:r=100,speakingThreshold:o=.02}=t,[s,i]=Dr(at);return Ir(()=>{if(!e){i(at);return}let a=Ne();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,p;try{u=a.createMediaStreamSource(c),p=a.createAnalyser(),p.fftSize=n,u.connect(p)}catch{return}let l=new Uint8Array(p.fftSize),h=setInterval(()=>{p.getByteTimeDomainData(l);let y=0;for(let S=0;S<l.length;S++){let v=(l[S]-128)/128;y+=v*v}let C=Math.sqrt(y/l.length);i(S=>{let v=C>o;return Math.abs(S.level-C)<.005&&S.speaking===v?S:{level:C,speaking:v}})},r);return()=>{clearInterval(h),u.disconnect(),i(at)}},[e,n,r,o]),s}import{useEffect as Or,useState as qr}from"react";function Fr(e,t){let[n,r]=qr(null);return Or(()=>{if(!e||!t){r(null);return}let o=e.stream(t);return r(o.track),o.on("track",r)},[e,t]),n}import{useCallback as jr}from"react";import{useEffect as Hr,useMemo as $r}from"react";import{createStore as Wr}from"zustand/vanilla";import{useStore as Vr}from"zustand";var Br=()=>{};function ut(e,t={}){let n=u=>{e?.set(u)},r=()=>e?e.get()??{}:{},o=Wr(()=>({doc:r(),synced:e?e.synced:!1,set:n})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(o.setState({doc:r(),synced:e.synced}),s=[e.on("change",u=>o.setState({doc:u})),e.onSynced(()=>o.setState({synced:!0}))]),i):Br,c=(u=>Vr(o,u));return Object.assign(c,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:n,bind:a,unbind:i}),t.bind!==!1&&a(),c}function ke(e,t){let n=$r(()=>ut(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Hr(()=>n.bind(),[n]),n}function Kr(e,t,n){let o=ke(e,t)(n??(a=>a)),s=jr(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(n)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 ne=200;function Y(e,t,n=200){let r=[...e,t];return r.length>n?r.slice(r.length-n):r}function be(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function ct(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let n;try{n=JSON.parse(t)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return n===null||typeof n!="object"||Array.isArray(n)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:n}}function lt(e,t,n={}){let r=n.cap??200,[o,s]=zr([]);return Jr(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>Y(u,{at:Date.now(),payload:c.value},r))}})(),()=>{i=!1,a.return?.()}},[e,t,r]),o}import{jsx as Le,jsxs as Ce}from"react/jsx-runtime";function Xr({session:e,name:t,cap:n,className:r}){let o=lt(e,t,{cap:n});return Ce("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[Ce("div",{className:"urun-stream-tail-meta",children:[Le("code",{children:t}),Ce("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Le("div",{className:"urun-stream-tail-log",children:o.length===0?Ce("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Le("code",{children:t})," messages\u2026"]}):o.map((s,i)=>Ce("div",{className:"urun-stream-tail-line",children:[Le("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",be(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Gr,useState as Xt}from"react";import{jsx as re,jsxs as Oe}from"react/jsx-runtime";function qe({placeholder:e,buttonLabel:t,disabled:n,onApply:r}){let[o,s]=Xt(""),[i,a]=Xt(null),c=Gr(()=>{let u=ct(o);if(!u.ok){a(u.error);return}a(null),r(u.value,o.trim()),s("")},[o,r]);return Oe("div",{className:"urun-doc-patch",children:[re("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:e,rows:3}),Oe("div",{className:"urun-doc-patch-actions",children:[re("button",{type:"button",className:"urun-doc-patch-button",disabled:n||!o.trim(),onClick:c,children:t}),i?re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Zr({session:e,docKey:t,editable:n=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=ke(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return Oe("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[Oe("div",{className:"urun-doc-panel-meta",children:[re("code",{children:t}),re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),n?re(qe,{placeholder:r,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}import{useEffect as Yr,useState as Qr}from"react";import{jsx as Pe,jsxs as Zt}from"react/jsx-runtime";function Gt(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function eo({session:e,docKey:t="control",cap:n=200,className:r}){let[o,s]=Qr([]);return Yr(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>Y(c,{at:Date.now(),direction:"in",text:Gt(be(a))},n))}):void 0),[e,t,n]),Zt("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[Pe(qe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>Y(c,{at:Date.now(),direction:"out",text:Gt(a)},n))}}),Pe("div",{className:"urun-control-sender-log",children:o.length===0?Pe("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>Zt("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Pe("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Pe("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as to,useState as no}from"react";import{jsx as Fe,jsxs as oo}from"react/jsx-runtime";function ro({session:e,trackNames:t=["video","audio"],docKeys:n=["control"],cap:r=200,className:o}){let[s,i]=no([]),a=t.join(","),c=n.join(",");return to(()=>{if(i([]),!e)return;let u=(l,m)=>i(h=>Y(h,{at:Date.now(),kind:l,text:m},r)),p=[];p.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let m=e.stream(l);p.push(m.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of n){let m=e.doc(l);p.push(m.on("change",()=>u("doc",`${l} changed`)))}return()=>p.forEach(l=>l())},[e,a,c,r]),Fe("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Fe("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>oo("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[Fe("span",{className:"urun-event-spine-kind",children:u.kind})," ",Fe("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}import{describeSessionPhase as ko,isWakingPhase as bo}from"@urun-sh/core";import{useEffect as so,useState as io}from"react";function B(e){let[t,n]=io(e?.phase??null);return so(()=>{if(!e){n(null);return}return e.onPhase(n)},[e]),t}import{describeSessionPhase as po}from"@urun-sh/core";import{useEffect as ao,useRef as uo,useState as co}from"react";import{isWakingPhase as lo}from"@urun-sh/core";function dt(e){let t=B(e),n=lo(t?.name),r=uo(void 0);n?r.current??=Date.now():r.current=void 0;let o=n?t?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=co(s);return ao(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(c)},[o]),{waking:n,phase:t,state:n?t?.runtime?.state:void 0,reason:n?t?.runtime?.reason:void 0,since:o,seconds:n?i:0}}import{Fragment as mo,jsx as Yt,jsxs as Qt}from"react/jsx-runtime";function pt({session:e,render:t,className:n}){let r=dt(e);return!r.waking||!r.phase?null:Yt("span",{className:["urun-session-waking",n].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:t?t(r):Qt(mo,{children:[Yt("span",{className:"urun-session-waking-label",children:po(r.phase)})," ",Qt("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}import{useEffect as ho,useState as So}from"react";import{useEffect as en,useRef as fo,useState as tn}from"react";var go={event:null,elapsedMs:0};function mt(e,t){let[n,r]=tn(null),o=fo(0);en(()=>{if(r(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(o.current=Date.now(),r(a))})},[e,t]);let[s,i]=tn(0);return en(()=>{if(!n){i(0);return}if(n.state==="first-media"){i(n.elapsedMs);return}let a=o.current,c=()=>n.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[n]),n?{event:n,elapsedMs:s}:go}import{jsx as nn,jsxs as rn}from"react/jsx-runtime";var vo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function yo(e){let[t,n]=So(!1);return ho(()=>{if(n(!1),!e)return;let r=e;if(typeof r.requestVideoFrameCallback=="function"){let s=r.requestVideoFrameCallback(()=>n(!0));return()=>r.cancelVideoFrameCallback?.(s)}let o=()=>{let s=r.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:r.readyState>=2)&&n(!0)};return o(),r.addEventListener("loadeddata",o),r.addEventListener("timeupdate",o),()=>{r.removeEventListener("loadeddata",o),r.removeEventListener("timeupdate",o)}},[e]),t}function ft({session:e,stream:t,videoElement:n,render:r,className:o}){let s=mt(e,t),i=yo(n),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return nn("div",{className:["urun-activation-overlay",o].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:r?r(s):rn("div",{className:"urun-activation-overlay-card",children:[nn("span",{className:"urun-activation-overlay-copy",children:a.hint??vo[c]})," ",rn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as oe,jsxs as gt}from"react/jsx-runtime";var Co={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Po({session:e,className:t}){let n=B(e),r=n?.name??"idle",o=n?.name==="queued"&&n.queue?`pos ${n.queue.position} / depth ${n.queue.depth}`:(n?.name==="error"||n?.name==="expired")&&n.error?n.error.reason:n?.runtime?.reason??null;return gt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":r,children:[oe("span",{className:"urun-session-status-dot","data-phase":r}),oe("span",{className:"urun-session-status-label",children:Co[r]}),o?oe("span",{className:"urun-session-status-detail",children:o}):null]})}function To({session:e,children:t,fallback:n,onStartOver:r,className:o}){let s=B(e);if(s?.name==="live")return gt("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[t,oe(ft,{session:e})]});let i=n?n(s):oe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&bo(s.name)?oe(pt,{session:e}):s&&s.name!=="idle"?ko(s):"Waiting for a live session\u2026"}),a=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return gt("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?oe("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}import{useEffect as xo,useState as Ro}from"react";import{jsx as wo}from"react/jsx-runtime";function on(e){return B(e)?.endsAt??null}function Eo(e){let t=Math.max(0,Math.floor(e/1e3)),n=Math.floor(t/60),r=t%60;return`${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Uo({session:e,urgentMs:t=6e4,className:n}){let o=on(e)?.getTime()??null,[s,i]=Ro(()=>o===null?null:Math.max(0,o-Date.now()));if(xo(()=>{if(o===null){i(null);return}let c=()=>i(Math.max(0,o-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=Eo(s);return wo("span",{className:["urun-session-clock",n].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as sn,jsxs as _o}from"react/jsx-runtime";var Ao=new Set(["expired","ended","error"]);function Mo({session:e,onNewSession:t,children:n,className:r}){let o=B(e);if(!o||!Ao.has(o.name))return null;let s=n?n(o):sn("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return _o("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,t?sn("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as an,useMemo as No,useState as un}from"react";import{jsx as We,jsxs as Lo}from"react/jsx-runtime";function ht(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function cn(e){let t=No(()=>e?e.doc("control"):null,[e]),[n,r]=un(()=>t?ht(t.get("idle")):null);return an(()=>{if(!t){r(null);return}return r(ht(t.get("idle"))),t.on("change",()=>r(ht(t.get("idle"))))},[t]),n}function Io(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Do({session:e,onStillHere:t,className:n}){let r=cn(e),o=r?.deadlineEpochS??null,[s,i]=un(null);if(an(()=>{if(o===null){i(null);return}let c=()=>i(Math.max(0,o-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[o]),!r||!e)return null;let a=()=>{e.touch?.(),t?.()};return We("div",{className:["urun-idle-warning",n].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Lo("div",{className:"urun-idle-warning-card",children:[We("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),We("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Io(s)} due to inactivity.`:"This session will end soon due to inactivity."}),We("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as Oo,useEffect as qo,useState as Fo}from"react";import{prewake as Wo}from"@urun-sh/core";function Vo(e){let t=Oo(ue),[n,r]=Fo(null),o=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,p=t?.getAccessToken,l=t?.authProvider;return qo(()=>{if(!a||!c||!o||!s)return;let m=!1,h=()=>{Wo({baseUrl:a,app:o,functionName:s,orgId:c,jwt:u,getAccessToken:p,authProvider:l}).then(C=>{m||r(C)}).catch(()=>{})};h();let y=setInterval(h,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(y)}},[o,s,i,a,c,u,p,l]),n}import{describeSessionPhase as iu,isWakingPhase as au}from"@urun-sh/core";export{Gn as ComponentRenderer,zt as DEFAULT_CAMERA_CONSTRAINTS,ne as DEFAULT_LOG_CAP,jt as DEFAULT_VOICE_CONSTRAINTS,qe as DocPatchForm,cr as ImageFrame,ur as ImageFrameSchema,pr as MetricsPanel,dr as MetricsPanelSchema,Qn as ProgressCard,Yn as ProgressCardSchema,nr as StatusBadge,er as StatusBadgeSchema,ir as TextStream,sr as TextStreamSchema,ft as UrunActivationOverlay,st as UrunAudio,gn as UrunAuthProvider,Nr as UrunCamera,eo as UrunControlSender,Zr as UrunDocPanel,Se as UrunErrorBoundary,ro as UrunEventSpine,Do as UrunIdleWarning,hn as UrunJwtProvider,Tn as UrunProvider,Uo as UrunSessionClock,Mo as UrunSessionEnded,To as UrunSessionGate,Po as UrunSessionStatus,pt as UrunSessionWaking,Xr as UrunStreamTail,xr as UrunVoice,Re as authMode,ut as createDocStore,iu as describeSessionPhase,be as formatPayload,Ne as getUrunAudioContext,au as isWakingPhase,ct as parseJsonObject,Y as pushCapped,Xn as registerComponent,Ie as resumeUrunAudioContext,X as urunPublicEnv,mt as useActivation,Mn as useApp,Hn as useChat,Fn as useCompletion,ke as useDocStore,Vt as useImageFrame,zn as useInputPresence,Bt as useMetricsPanel,It as useProgressCard,Dn as useRequest,Kr as useSessionDoc,on as useSessionEndsAt,cn as useSessionIdle,B as useSessionPhase,Fr as useSessionTrack,dt as useSessionWake,Lt as useStatusBadge,lt as useStreamMessages,Ft as useTextStream,Lr as useUrunAudioLevel,He as useUrunAuth,Vo as useUrunPrewake,kn as usesWorkOSAuth};
|
|
2
|
+
import{a as gn,b as hn,c as He}from"./chunk-WF2OBDSX.mjs";import{useEffect as bn,useMemo as Cn,useState as Pn}from"react";import{Component as Sn}from"react";import{jsx as kt,jsxs as vn}from"react/jsx-runtime";var Se=class extends Sn{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,n){console.error("[urun] Error caught by UrunErrorBoundary:",e,n)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||vn("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:[kt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),kt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as yn}from"react";var ue=yn(null);function ee(t){return t&&t.trim()?t.trim():void 0}function X(t){switch(t){case"NEXT_PUBLIC_AUTH_MODE":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ee(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ee(typeof process<"u"?process.env?.[t]:void 0)}}function Re(){let t=X("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return t==="jwt"||t==="customer-jwt"||t==="test-jwt"?"jwt":t==="workos"||X("VERCEL_ENV")==="production"?"workos":X("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function kn(){return Re()==="workos"}import{jsx as $e}from"react/jsx-runtime";function Tn({baseUrl:t,orgId:e,appId:n,jwt:r,authProvider:o,eventsUrl:s,fallback:a,children:i}){let[u,c]=Pn(),p=He(),l=X("NEXT_PUBLIC_SESSION_TOKEN")??X("NEXT_PUBLIC_URUN_JWT"),f=Re(),g=f==="workos"&&!r,v=r??(f==="jwt"?l:void 0)??u,k=o??X("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),S=g&&!v,y=Cn(()=>({appId:n,baseUrl:t,orgId:e,jwt:v,getAccessToken:g?p?.getAccessToken:void 0,authProvider:k,eventsUrl:s}),[n,p,t,k,v,s,e,g]);return bn(()=>{if(!g||!p)return;let T=!1,C=p;async function U(){try{let E=await C.getAccessToken();T||c(E??void 0)}catch{T||c(void 0)}}U();let h=window.setInterval(()=>{U()},6e4);return()=>{T=!0,window.clearInterval(h)}},[p,g]),$e(Se,{fallback:a,children:S?$e("div",{role:"status","aria-live":"polite",children:"Signing in..."}):$e(ue.Provider,{value:y,children:i})})}import{useContext as xn,useEffect as Rn,useMemo as bt,useReducer as Un,useRef as Ct}from"react";import{App as En}from"@urun-sh/core";function wn(t,e){return`${t}:${JSON.stringify(e??{})}`}function An(t,e,n){return JSON.stringify({appId:t.appId,baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,authProvider:t.authProvider,fnName:e,args:n??{}})}var ce=new Map;var je=class{constructor(e,n){this._doc=e;this._notify=n;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,n){return this._doc.get(e,n)}set(e){this._doc.set(e),this._notify()}on(e,n){return this._doc.on(e,r=>n(r))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let n=this._doc.text(e),r=this._notify;return{append(o){n.append(o),r()},toString:()=>n.toString(),get length(){return n.length},on:(o,s)=>n.on(o,a=>{s(a),r()})}}dispose(){this._unsubscribeChange()}},Ke=class{constructor(e,n){this._stream=e;this._notify=n;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,n){return this._stream.on(e,n)}messages(){return this._stream.messages()}emit(e,n){return this._stream.emit(e,n)}dispose(){this._unsubscribeTrack()}},Je=class{constructor(e,n,r){this._session=e;this._notifiers.add(n),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),r&&this._attachReporter(r)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(e){let n=!1,r=!1,o=i=>{fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0}).catch(()=>{r||(r=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(o);let s=this._session.onPhase(i=>{if(i.name==="error"||i.name==="expired"){let u=i.error,c=u?.reason??(i.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);o({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else i.name==="live"&&!n&&(n=!0,o({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),a=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{a(),s()}}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}onDiagnostic(e){return this._session.onDiagnostic(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,n){return this._session.request(e,n)}requestStream(e,n){return this._session.requestStream(e,n)}complete(e,n){return this._session.complete(e,n)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let n=this._docs.get(e);return n||(n=new je(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,n)),n}stream(e){let n=this._streams.get(e);return n||(n=new Ke(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,n)),n}async end(){let e=await this._session.end();return this._disposeHandle(),e}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function _n(){let t=xn(ue);if(!t)throw new Error("useApp must be used within <UrunProvider>");if(!t.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=Un(s=>s+1,0),n=Ct(new Map),r=Ct(new Map),o=bt(()=>En(t.appId,{baseUrl:t.baseUrl,orgId:t.orgId,jwt:t.jwt,getAccessToken:t.getAccessToken,authProvider:t.authProvider}),[t.appId,t.baseUrl,t.orgId,t.jwt,t.getAccessToken,t.authProvider]);return Rn(()=>()=>{for(let[s,a]of r.current){let i=ce.get(s);i===a&&(i.handle.removeNotifier(e),i.refCount=Math.max(0,i.refCount-1),i.refCount===0&&(i.disposeTimer=setTimeout(()=>{let u=ce.get(s);!u||u.refCount!==0||(ce.delete(s),u.handle.disconnect())},0)))}r.current.clear(),n.current.clear()},[]),bt(()=>new Proxy({},{get(s,a){if(typeof a=="string")return i=>{let u=wn(a,i),c=n.current.get(u);if(c&&!c.disposed)return c;let p=An(t,a,i),l=ce.get(p);return l?.handle.disposed&&(l.disposeTimer&&clearTimeout(l.disposeTimer),ce.delete(p),r.current.get(p)===l&&r.current.delete(p),l=void 0),l?l.disposeTimer&&(clearTimeout(l.disposeTimer),l.disposeTimer=null):(l={handle:new Je(o[a](i),e,t.eventsUrl),refCount:0,disposeTimer:null},ce.set(p,l)),r.current.get(p)!==l&&(r.current.set(p,l),l.handle.addNotifier(e),l.refCount+=1),n.current.set(u,l.handle),l.handle}}}),[t,o])}import{useCallback as ze,useEffect as Mn,useMemo as Nn,useRef as Ue,useState as Xe}from"react";function le(t){let e=t;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function In(t){return t instanceof Error?t:new Error(String(t))}function Dn(t,e){let n=Nn(()=>le(t),[t]),[r,o]=Xe(void 0),[s,a]=Xe(null),[i,u]=Xe(!1),c=Ue(e);c.current=e;let p=Ue(0),l=Ue(null),f=Ue(!0);Mn(()=>(f.current=!0,()=>{f.current=!1,l.current?.abort()}),[]);let g=ze(async S=>{l.current?.abort();let y=new AbortController;l.current=y;let T=++p.current,C=()=>f.current&&p.current===T;C()&&(u(!0),a(null));try{let U=await n.request(S,{...c.current,signal:y.signal});return C()&&(o(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let h=In(U);throw C()&&(a(h),u(!1),c.current?.onError?.(h)),h}},[n]),v=ze(S=>{g(S).catch(()=>{})},[g]),k=ze(()=>{p.current++,l.current?.abort(),l.current=null,o(void 0),a(null),u(!1)},[]);return{mutate:v,mutateAsync:g,data:r,error:s,isPending:i,reset:k}}import{useCallback as Pt,useEffect as Ln,useMemo as On,useRef as Ee,useState as Ge}from"react";function Tt(t){return t instanceof Error?t:new Error(String(t))}var qn=t=>typeof t=="string"?t:String(t);function Fn(t,e){let n=On(()=>le(t),[t]),[r,o]=Ge(""),[s,a]=Ge(!1),[i,u]=Ge(null),c=Ee(e);c.current=e;let p=Ee(0),l=Ee(null),f=Ee(!0);Ln(()=>(f.current=!0,()=>{f.current=!1,l.current?.cancel(),l.current=null}),[]);let g=Pt(()=>{p.current++,l.current?.cancel(),l.current=null,f.current&&a(!1)},[]),v=Pt(async k=>{l.current?.cancel();let S=++p.current,y=()=>f.current&&p.current===S,T=c.current,C=T?.parseChunk??qn,U=T?.buildPayload??(P=>({prompt:P}));y()&&(o(""),u(null),a(!0));let{parseChunk:h,buildPayload:E,onFinish:A,onError:d,...b}=T??{},x="",R;try{R=n.requestStream(U(k),b),l.current=R}catch(P){let q=Tt(P);y()&&(u(q),a(!1),T?.onError?.(q));return}try{for await(let P of R){if(p.current!==S)break;x+=C(P),y()&&o(x)}y()&&(a(!1),T?.onFinish?.(x))}catch(P){let q=Tt(P);y()&&(u(q),a(!1),T?.onError?.(q))}finally{l.current===R&&(l.current=null)}},[n]);return{completion:r,complete:v,stop:g,isStreaming:s,error:i}}import{useCallback as xt,useEffect as Wn,useMemo as Vn,useRef as de,useState as we}from"react";function Rt(t){return t instanceof Error?t:new Error(String(t))}var Bn=t=>typeof t=="string"?t:String(t),Ut=0;function Ze(t){return Ut+=1,`${t}-${Ut}`}function Hn(t,e){let n=Vn(()=>le(t),[t]),[r,o]=we(()=>(e?.initialMessages??[]).map(C=>({id:C.id??Ze("msg"),role:C.role,content:C.content}))),[s,a]=we(""),[i,u]=we(!1),[c,p]=we(null),l=de(e);l.current=e;let f=de(r);f.current=r;let g=de(s);g.current=s;let v=de(0),k=de(null),S=de(!0);Wn(()=>(S.current=!0,()=>{S.current=!1,k.current?.cancel(),k.current=null}),[]);let y=xt(()=>{v.current++,k.current?.cancel(),k.current=null,S.current&&u(!1)},[]),T=xt(async C=>{let U=C===void 0,h=(U?g.current:C)??"";if(!h.trim())return;k.current?.cancel();let A=++v.current,d=()=>S.current&&v.current===A,b=l.current,x=b?.parseChunk??Bn,R={id:Ze("msg"),role:"user",content:h},P={id:Ze("msg"),role:"assistant",content:""},q=[...f.current,R].map(L=>({role:L.role,content:L.content})),m=[...f.current,R,P];f.current=m,o(m),U&&a(""),p(null),u(!0);let M=b?.buildPayload??(L=>({messages:L})),{initialMessages:D,parseChunk:F,buildPayload:N,onFinish:J,onError:Te,...xe}=b??{},se=L=>{o(I=>I.map(z=>z.id===P.id?{...z,content:L}:z))},Q="",H;try{H=n.requestStream(M(q),xe),k.current=H}catch(L){let I=Rt(L);d()&&(p(I),u(!1),b?.onError?.(I));return}try{for await(let L of H){if(v.current!==A)break;Q+=x(L),d()&&se(Q)}d()&&(u(!1),b?.onFinish?.({...P,content:Q}))}catch(L){let I=Rt(L);d()&&(p(I),u(!1),b?.onError?.(I))}finally{k.current===H&&(k.current=null)}},[n]);return{messages:r,input:s,setInput:a,sendMessage:T,stop:y,isStreaming:i,error:c}}import{useCallback as G,useEffect as Et,useMemo as $n,useRef as wt,useState as At}from"react";import{createInputPresencePublisher as jn,INPUT_PRESENCE_DEFAULT_HZ as Kn,INPUT_PRESENCE_FIELD as Jn}from"@urun-sh/core";var Ye=[];function zn(t,e={}){let{field:n=Jn,hz:r=Kn}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=t?.presence??null,a=$n(()=>s?jn({awareness:{setLocalStateField:(h,E)=>s.setField(h,E)},field:n,hz:r}):null,[s,n,r]),i=wt(null);i.current=a;let[u,c]=At(!1),[p,l]=At(Ye),f=wt(!1);Et(()=>{if(a)return()=>a.dispose()},[a]);let g=G(()=>{let h=i.current;l(h?h.heldKeys():Ye)},[]),v=G(()=>{i.current?.clear(),l(Ye)},[]);Et(()=>{if(!o)return;let h=()=>!!o.pointerLockElement,E=()=>{if(h()){f.current=!1,c(!0);return}f.current||(c(!1),v())},A=P=>{h()&&(i.current?.keyDown(P.key),g())},d=P=>{i.current?.keyUp(P.key),g()},b=P=>{h()&&i.current?.movePointer(P.movementX,P.movementY)},x=P=>{h()&&i.current?.setButtons(P.buttons)},R=()=>{v()};return o.addEventListener("pointerlockchange",E),o.addEventListener("keydown",A),o.addEventListener("keyup",d),o.addEventListener("mousemove",b),o.addEventListener("mousedown",x),o.addEventListener("mouseup",x),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",E),o.removeEventListener("keydown",A),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",b),o.removeEventListener("mousedown",x),o.removeEventListener("mouseup",x),o.defaultView?.removeEventListener("blur",R)}},[o,v,g]);let k=G(h=>{h.requestPointerLock?.()},[]),S=G(()=>{f.current=!0,c(!0)},[]),y=G(()=>{f.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),c(!1),v()},[o,v]),T=G(h=>{i.current?.keyDown(h),g()},[g]),C=G(h=>{i.current?.keyUp(h),g()},[g]),U=G((h,E)=>{i.current?.movePointer(h,E)},[]);return{engage:k,engageTouch:S,release:y,engaged:u,heldKeys:p,pressKey:T,releaseKey:C,movePointer:U}}var _t=new Map;function Xn(t,e,n){if(!n||typeof n.safeParse!="function")throw new Error(`registerComponent("${t}"): schema must be a valid Zod schema`);_t.set(t,{component:e,schema:n})}function Mt(t,e){let n=_t.get(t);if(!n)return{error:`Unknown component: "${t}"`};let r=n.schema.safeParse(e);return r.success?{Component:n.component,validatedProps:r.data}:{error:`Validation failed for "${t}": ${r.error.message}`}}import{Fragment as Zn,jsx as Ae}from"react/jsx-runtime";function Gn({name:t,props:e,fallback:n}){let r=Mt(t,e);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),n?Ae(Zn,{children:n}):Ae("div",{className:"urun-component-error",role:"alert",children:Ae("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return Ae(o,{...r.validatedProps})}import{z as ve}from"zod";import{jsx as Qe,jsxs as Nt}from"react/jsx-runtime";var Yn=ve.object({step:ve.number().min(0),total:ve.number().min(1),label:ve.string().optional(),variant:ve.enum(["default","success","error"]).default("default")});function It(t){let{step:e,total:n,label:r,variant:o="default"}=t,s=Math.min(e/n*100,100),a=e>=n;return{step:e,total:n,label:r,variant:o,percentage:s,isComplete:a}}function Qn(t){let{step:e,total:n,label:r,variant:o,percentage:s}=It(t);return Nt("div",{className:"urun-progress-card","data-variant":o,children:[r&&Qe("div",{className:"urun-progress-label",children:r}),Qe("div",{className:"urun-progress-bar",children:Qe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Nt("div",{className:"urun-progress-text",children:[e,"/",n]})]})}import{z as et}from"zod";import{jsx as Dt,jsxs as rr}from"react/jsx-runtime";var er=et.object({state:et.enum(["thinking","generating","idle","error"]),message:et.string().optional()}),tr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Lt(t){let{state:e,message:n}=t,r=e==="thinking"||e==="generating",o=n??tr[e]??e;return{state:e,message:o,isActive:r}}function nr(t){let{state:e,message:n,isActive:r}=Lt(t);return rr("span",{className:"urun-status-badge","data-state":e,children:[Dt("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),Dt("span",{className:"urun-status-message",children:n})]})}import{useRef as Ot,useEffect as or}from"react";import{z as tt}from"zod";import{jsx as qt,jsxs as ar}from"react/jsx-runtime";var sr=tt.object({text:tt.string(),streaming:tt.boolean().default(!1)});function Ft(t){let{text:e,streaming:n=!1}=t,r=e.length===0;return{text:e,streaming:n,isEmpty:r}}function ir(t){let{text:e,streaming:n}=Ft(t),r=Ot(null),o=Ot(0);return or(()=>{let s=r.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),ar("div",{className:"urun-text-stream",children:[qt("span",{ref:r,className:"urun-text-content"}),n&&qt("span",{className:"urun-text-cursor"})]})}import{z as _e}from"zod";import{jsx as Wt,jsxs as lr}from"react/jsx-runtime";var ur=_e.object({src:_e.string().url(),alt:_e.string().optional(),caption:_e.string().optional()});function Vt(t){let{src:e,alt:n,caption:r}=t;return{src:e,alt:n??"",caption:r}}function cr(t){let{src:e,alt:n,caption:r}=Vt(t);return lr("figure",{className:"urun-image-frame",children:[Wt("img",{className:"urun-image",src:e,alt:n}),r&&Wt("figcaption",{className:"urun-image-caption",children:r})]})}import{z as Z}from"zod";import{jsx as nt,jsxs as mr}from"react/jsx-runtime";var dr=Z.object({metrics:Z.array(Z.object({label:Z.string(),value:Z.union([Z.string(),Z.number()]),unit:Z.string().optional()}))});function Bt(t){return{metrics:t.metrics.map(n=>({...n,displayValue:n.unit?`${n.value} ${n.unit}`:String(n.value)}))}}function pr(t){let{metrics:e}=Bt(t);return nt("div",{className:"urun-metrics-panel",children:e.map((n,r)=>mr("div",{className:"urun-metric-card",children:[nt("div",{className:"urun-metric-label",children:n.label}),nt("div",{className:"urun-metric-value",children:n.displayValue})]},r))})}import{forwardRef as gr,useCallback as pe,useEffect as rt,useImperativeHandle as hr,useRef as me}from"react";import{observePageLifecycle as Sr}from"@urun-sh/core";var Me=null;function fr(){if(typeof window>"u")return null;let t=window;return t.AudioContext??t.webkitAudioContext??null}function Ne(){if(Me)return Me;let t=fr();return t?(Me=new t,Me):null}function Ie(){let t=Ne();t&&t.state==="suspended"&&t.resume().catch(()=>{})}import{jsx as yr}from"react/jsx-runtime";var vr=1e3,Ht=200;function ot(...t){console.debug("[urun-audio]",...t)}var st=gr(function(e,n){let{session:r,stream:o="audio",track:s,controls:a=!1,className:i,onTrack:u,onUnlockChange:c,onAudioElement:p}=e,l=me(null),f=me(null),g=me(null),v=me(null),k=me(u);k.current=u;let S=me(c);S.current=c;let y=pe(d=>{g.current!==d&&(g.current=d,S.current?.(d))},[]),T=pe(()=>{if(typeof MediaStream>"u")return null;f.current||(f.current=new MediaStream);let d=l.current;return d&&d.srcObject!==f.current&&(d.srcObject=f.current),f.current},[]),C=pe(d=>{let b=l.current;if(!b)return;let x=b.play();!x||typeof x.then!="function"||x.then(()=>{b.muted||y(!0)}).catch(R=>{let P=R instanceof Error?R.name:String(R);if(P==="AbortError"){ot(`play() aborted (${d}); retrying in ${Ht}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,C(`${d}:retry`)},Ht);return}if(P==="NotAllowedError"){ot(`play() blocked pending a user gesture (${d})`),y(!1);return}ot(`play() failed (${d})`,R)})},[y]),U=pe(d=>{let b=T();if(b){for(let x of b.getAudioTracks())x!==d&&b.removeTrack(x);d&&!b.getAudioTracks().includes(d)&&b.addTrack(d),d&&C("track-attach"),k.current?.(d)}},[T,C]),h=pe(()=>{let d=l.current;d&&(T(),d.muted=!1,C("gesture"),Ie(),y(!0))},[T,C,y]);hr(n,()=>({unlock:h,get unlocked(){return g.current===!0},get element(){return l.current}}),[h]);let E=pe(d=>{l.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),T()),p?.(d)},[T,p]),A=s!==void 0;return rt(()=>{if(A){U(s??null);return}if(!r)return;let d=r.stream(o),b=()=>{let m=f.current;return m?m.getAudioTracks()[0]??null:null},x=m=>{if(m!==b()&&(U(m),m)){let M=()=>{b()===m&&U(null)};m.addEventListener("ended",M)}},R=d.track;R&&R.readyState==="live"&&x(R);let P=d.on("track",m=>{m&&m.readyState!=="live"||x(m)}),q=setInterval(()=>{let m=d.track;m&&m.readyState==="live"&&x(m)},vr);return()=>{P(),clearInterval(q)}},[r,o,A,s,U]),rt(()=>Sr(()=>{Ie(),g.current===!0&&C("foreground")}),[C]),rt(()=>()=>{v.current&&clearTimeout(v.current)},[]),yr("audio",{ref:E,className:i,autoPlay:!0,playsInline:!0,controls:a,"data-urun-audio":""})});import{forwardRef as kr,useCallback as fe,useEffect as $t,useImperativeHandle as br,useRef as j}from"react";import{observePageLifecycle as Cr,sessionFailureFromMediaError as Pr,sharedCaptureController as Tr}from"@urun-sh/core";import{jsx as Rr}from"react/jsx-runtime";var jt={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function De(...t){console.debug("[urun-voice]",...t)}var xr=kr(function(e,n){let{session:r,stream:o="audio",constraints:s=jt,connectTimeoutMs:a,attempts:i=3,retryDelayMs:u=1500,onActiveChange:c,onError:p,onMicStream:l,onTrack:f,onUnlockChange:g,capture:v}=e,k=j(null),S=j(null),y=j(null),T=j([]),C=j(!1),U=j(c);U.current=c;let h=j(p);h.current=p;let E=j(l);E.current=l;let A=fe(m=>{C.current!==m&&(C.current=m,U.current?.(m))},[]),d=fe(()=>{for(let m of T.current)m();T.current=[],y.current?.release(),y.current=null,S.current&&(S.current=null,E.current?.(null))},[]),b=fe(async()=>{let m=y.current;if(m){let N=await m.update(s);return S.current=m.stream,E.current?.(m.stream),N}let D=await(v??Tr()).claim("audio",s);y.current=D,T.current=[D.onTrack((N,J)=>{S.current=J,E.current?.(J),C.current&&r.stream(o).attach(N).catch(Te=>De("mic re-attach after one-capture re-acquire failed",Te))}),D.onLost(N=>{y.current=null,T.current=[],S.current=null,E.current?.(null),A(!1),h.current?.(N)})],S.current=D.stream,E.current?.(D.stream);let F=D.track;if(!F)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return F},[v,s,r,o,A]),x=fe(async()=>{d(),A(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,A]),R=fe(async()=>{k.current?.unlock();let m;try{m=await b()}catch(F){d();let N=Pr(F,r.status);throw h.current?.(N),N}r.connect?.();let M;for(let F=1;F<=i;F++)try{await r.whenLive(a!==void 0?{timeout:a}:void 0),await r.stream(o).attach(m),A(!0);return}catch(N){M=N,De(`start attempt ${F}/${i} failed`,N),F<i&&await new Promise(J=>setTimeout(J,u))}d(),A(!1);let D=M instanceof Error?M:new Error(String(M??"voice start failed"));throw h.current?.(D),D},[r,o,a,i,u,b,d,A]);br(n,()=>({start:R,stop:x,unlock:()=>k.current?.unlock(),get active(){return C.current},get micStream(){return S.current},get audio(){return k.current}}),[R,x]);let P=j(!1),q=fe(async()=>{if(!C.current||P.current)return;let m=S.current?.getAudioTracks()[0]??null;if(m&&m.readyState==="live"){try{await r.stream(o).attach(m)}catch(M){De("foreground mic re-assert failed (will retry on next pass)",M)}return}P.current=!0;try{let M=await b();await r.stream(o).attach(M)}catch(M){let D=M instanceof Error?M:new Error(String(M));De("foreground mic re-acquire failed",D),h.current?.(D)}finally{P.current=!1}},[r,o,b]);return $t(()=>{let m=()=>{q()};return typeof r.onRecovery=="function"?r.onRecovery(m):Cr(m)},[r,q]),$t(()=>d,[d]),Rr(st,{ref:k,session:r,stream:o,onTrack:f,onUnlockChange:g})});import{sessionFailureFromMediaError as Ur,sharedCaptureController as Er}from"@urun-sh/core";import{forwardRef as wr,useCallback as K,useEffect as Kt,useImperativeHandle as Ar,useRef as V,useState as ye}from"react";import{jsx as te,jsxs as Jt}from"react/jsx-runtime";var zt={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function it(...t){console.debug("[urun-camera]",...t)}function _r(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Mr(){let t=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof t?.enumerateDevices!="function")return null;try{return(await t.enumerateDevices()).filter(n=>n.kind==="videoinput")}catch{return null}}var Nr=wr(function(e,n){let{session:r,stream:o="video",constraints:s,facingMode:a="environment",mirror:i="auto",connectTimeoutMs:u,preview:c=!0,className:p,videoClassName:l,onActiveChange:f,onError:g,onStream:v,onTrack:k,children:S,capture:y,flipControl:T="auto",flipControlClassName:C,onDevices:U}=e,h=V(null),E=V(null),A=V(null),d=V([]),b=V(null),x=V(!1),R=V(a),[P,q]=ye(a),[m,M]=ye(!1),[D,F]=ye(null),[N,J]=ye(!1),[Te]=ye(_r),xe=V(f);xe.current=f;let se=V(g);se.current=g;let Q=V(v);Q.current=v;let H=V(k);H.current=k;let L=V(U);L.current=U;let I=K(w=>{x.current!==w&&(x.current=w,M(w),xe.current?.(w))},[]);Kt(()=>{if(!m){F(null);return}let w=!1,_=()=>{Mr().then(W=>{w||(F(W),W&&L.current?.(W))})};_();let O=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof O?.addEventListener=="function"?(O.addEventListener("devicechange",_),()=>{w=!0,O.removeEventListener?.("devicechange",_)}):()=>{w=!0}},[m]);let z=K(w=>{let _=h.current;_&&(_.muted=!0,_.defaultMuted=!0,_.setAttribute("muted",""),_.setAttribute("playsinline",""),_.setAttribute("webkit-playsinline",""),_.srcObject=w,w&&_.play()?.catch?.(O=>it("preview play() failed",O)))},[]),$=K(()=>{b.current?.(),b.current=null;for(let w of d.current)w();d.current=[],A.current?.release(),A.current=null,E.current&&(E.current=null,Q.current?.(null),H.current?.(null)),z(null)},[z]),Ve=K((w,_)=>{b.current?.(),E.current=_,z(_),Q.current?.(_);let O=()=>{E.current===_&&(it("camera track ended (device removed or permission revoked)"),$(),I(!1))};w.addEventListener("ended",O),b.current=()=>w.removeEventListener("ended",O)},[z,$,I]),ie=K(async w=>{let _={...zt,...s,facingMode:w},O;try{let W=A.current;if(W)O=await W.update(_);else{let ge=await(y??Er()).claim("video",_);if(A.current=ge,d.current=[ge.onTrack((he,mn)=>{Ve(he,mn),x.current&&r.stream(o).attachVideo(he).then(()=>H.current?.(he)).catch(fn=>it("camera re-publish after one-capture re-acquire failed",fn))}),ge.onLost(he=>{A.current=null,d.current=[],$(),I(!1),se.current?.(he)})],!ge.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});O=ge.track}}catch(W){let ae=Ur(W,r.status);throw se.current?.(ae),ae}R.current=w,q(w),Ve(O,A.current?.stream??new MediaStream([O]));try{r.connect?.(),await r.whenLive(u!==void 0?{timeout:u}:void 0),await r.stream(o).attachVideo(O)}catch(W){$(),I(!1);let ae=W instanceof Error?W:new Error(String(W));throw se.current?.(ae),ae}H.current?.(O),I(!0)},[r,o,s,u,y,Ve,$,I]),St=K(w=>ie(w?.facingMode??R.current),[ie]),vt=K(async w=>{x.current&&R.current===w||await ie(w)},[ie]),Be=K(()=>ie(R.current==="environment"?"user":"environment"),[ie]),yt=K(async()=>{$(),I(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,$,I]);if(Ar(n,()=>({start:St,stop:yt,flip:Be,setFacingMode:vt,get active(){return x.current},get facingMode(){return R.current},get stream(){return E.current},get element(){return h.current}}),[St,yt,Be,vt]),Kt(()=>$,[$]),!c)return null;let ln=i==="auto"?P==="user":i,dn=m&&(T===!0||T==="auto"&&Te&&(D?.length??0)>1),pn=()=>{N||(J(!0),Be().catch(()=>{}).finally(()=>J(!1)))};return Jt("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[te("video",{ref:h,className:l,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ln?{transform:"scaleX(-1)"}:{}}}),dn?te("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:pn,disabled:N,className:C,style:C?{opacity:N?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:N?.6:1},children:Jt("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[te("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),te("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),te("path",{d:"M14.5 10.5v1.6h-1.6"}),te("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),te("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});import{useEffect as Ir,useState as Dr}from"react";var at={level:0,speaking:!1};function Lr(t,e={}){let{fftSize:n=512,intervalMs:r=100,speakingThreshold:o=.02}=e,[s,a]=Dr(at);return Ir(()=>{if(!t){a(at);return}let i=Ne();if(!i||typeof MediaStream>"u")return;let u;t instanceof MediaStream?u=t:(u=new MediaStream,u.addTrack(t));let c,p;try{c=i.createMediaStreamSource(u),p=i.createAnalyser(),p.fftSize=n,c.connect(p)}catch{return}let l=new Uint8Array(p.fftSize),g=setInterval(()=>{p.getByteTimeDomainData(l);let v=0;for(let S=0;S<l.length;S++){let y=(l[S]-128)/128;v+=y*y}let k=Math.sqrt(v/l.length);a(S=>{let y=k>o;return Math.abs(S.level-k)<.005&&S.speaking===y?S:{level:k,speaking:y}})},r);return()=>{clearInterval(g),c.disconnect(),a(at)}},[t,n,r,o]),s}import{useEffect as Or,useState as qr}from"react";function Fr(t,e){let[n,r]=qr(null);return Or(()=>{if(!t||!e){r(null);return}let o=t.stream(e);return r(o.track),o.on("track",r)},[t,e]),n}import{useCallback as jr}from"react";import{useEffect as Hr,useMemo as $r}from"react";import{createStore as Wr}from"zustand/vanilla";import{useStore as Vr}from"zustand";var Br=()=>{};function ut(t,e={}){let n=c=>{t?.set(c)},r=()=>t?t.get()??{}:{},o=Wr(()=>({doc:r(),synced:t?t.synced:!1,set:n})),s=null,a=()=>{if(s){for(let c of s)c();s=null}},i=()=>t?(s||(o.setState({doc:r(),synced:t.synced}),s=[t.on("change",c=>o.setState({doc:c})),t.onSynced(()=>o.setState({synced:!0}))]),a):Br,u=(c=>Vr(o,c));return Object.assign(u,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:n,bind:i,unbind:a}),e.bind!==!1&&i(),u}function ke(t,e){let n=$r(()=>ut(t&&e?t.doc(e):null,{bind:!1}),[t,e]);return Hr(()=>n.bind(),[n]),n}function Kr(t,e,n){let o=ke(t,e)(n??(i=>i)),s=jr(i=>{t&&e&&t.doc(e).set(i)},[t,e]);if(n)return o;let a=o;return{snapshot:t&&e?a.doc:null,synced:a.synced,set:s}}import{useEffect as Jr,useState as zr}from"react";var ne=200;function Y(t,e,n=200){let r=[...t,e];return r.length>n?r.slice(r.length-n):r}function be(t){if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}function ct(t){let e=t.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let n;try{n=JSON.parse(e)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return n===null||typeof n!="object"||Array.isArray(n)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:n}}function lt(t,e,n={}){let r=n.cap??200,[o,s]=zr([]);return Jr(()=>{if(s([]),!t||!e)return;let a=!0,i=t.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await i.next();if(!a||u.done)break;s(c=>Y(c,{at:Date.now(),payload:u.value},r))}})(),()=>{a=!1,i.return?.()}},[t,e,r]),o}import{jsx as Le,jsxs as Ce}from"react/jsx-runtime";function Xr({session:t,name:e,cap:n,className:r}){let o=lt(t,e,{cap:n});return Ce("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[Ce("div",{className:"urun-stream-tail-meta",children:[Le("code",{children:e}),Ce("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Le("div",{className:"urun-stream-tail-log",children:o.length===0?Ce("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Le("code",{children:e})," messages\u2026"]}):o.map((s,a)=>Ce("div",{className:"urun-stream-tail-line",children:[Le("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",be(s.payload)]},`${s.at}-${a}`))})]})}import{useCallback as Gr,useState as Xt}from"react";import{jsx as re,jsxs as Oe}from"react/jsx-runtime";function qe({placeholder:t,buttonLabel:e,disabled:n,onApply:r}){let[o,s]=Xt(""),[a,i]=Xt(null),u=Gr(()=>{let c=ct(o);if(!c.ok){i(c.error);return}i(null),r(c.value,o.trim()),s("")},[o,r]);return Oe("div",{className:"urun-doc-patch",children:[re("textarea",{className:"urun-doc-patch-input",value:o,onChange:c=>s(c.target.value),placeholder:t,rows:3}),Oe("div",{className:"urun-doc-patch-actions",children:[re("button",{type:"button",className:"urun-doc-patch-button",disabled:n||!o.trim(),onClick:u,children:e}),a?re("span",{className:"urun-doc-patch-error",role:"alert",children:a}):null]})]})}function Zr({session:t,docKey:e,editable:n=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=ke(t,e),a=s(c=>c.doc),i=s(c=>c.synced),u=s(c=>c.set);return Oe("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[Oe("div",{className:"urun-doc-panel-meta",children:[re("code",{children:e}),re("span",{className:"urun-doc-panel-synced","data-synced":i?"true":"false",children:i?"synced":"syncing\u2026"})]}),re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(a??{},null,2)}),n?re(qe,{placeholder:r,buttonLabel:"Apply patch",disabled:!t,onApply:c=>u(c)}):null]})}import{useEffect as Yr,useState as Qr}from"react";import{jsx as Pe,jsxs as Zt}from"react/jsx-runtime";function Gt(t,e=600){return t.length>e?`${t.slice(0,e)}\u2026`:t}function eo({session:t,docKey:e="control",cap:n=200,className:r}){let[o,s]=Qr([]);return Yr(()=>(s([]),t?t.doc(e).on("change",i=>{s(u=>Y(u,{at:Date.now(),direction:"in",text:Gt(be(i))},n))}):void 0),[t,e,n]),Zt("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[Pe(qe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!t,onApply:(a,i)=>{t?.doc(e).set(a),s(u=>Y(u,{at:Date.now(),direction:"out",text:Gt(i)},n))}}),Pe("div",{className:"urun-control-sender-log",children:o.length===0?Pe("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((a,i)=>Zt("div",{className:"urun-control-sender-line","data-direction":a.direction,children:[Pe("span",{className:"urun-control-sender-dir",children:a.direction==="out"?"sent":"change"})," ",Pe("span",{className:"urun-control-sender-time",children:new Date(a.at).toLocaleTimeString()})," ",a.text]},`${a.at}-${i}`))})]})}import{useEffect as to,useState as no}from"react";import{jsx as Fe,jsxs as oo}from"react/jsx-runtime";function ro({session:t,trackNames:e=["video","audio"],docKeys:n=["control"],cap:r=200,className:o}){let[s,a]=no([]),i=e.join(","),u=n.join(",");return to(()=>{if(a([]),!t)return;let c=(l,f)=>a(g=>Y(g,{at:Date.now(),kind:l,text:f},r)),p=[];p.push(t.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of e){let f=t.stream(l);p.push(f.on("track",g=>c("track",`${l}: ${g?"track arrived":"track ended"}`)))}for(let l of n){let f=t.doc(l);p.push(f.on("change",()=>c("doc",`${l} changed`)))}return()=>p.forEach(l=>l())},[t,i,u,r]),Fe("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Fe("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,p)=>oo("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[Fe("span",{className:"urun-event-spine-kind",children:c.kind})," ",Fe("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${p}`))})}import{describeSessionPhase as ko,isWakingPhase as bo}from"@urun-sh/core";import{useEffect as so,useState as io}from"react";function B(t){let[e,n]=io(t?.phase??null);return so(()=>{if(!t){n(null);return}return t.onPhase(n)},[t]),e}import{describeSessionPhase as po}from"@urun-sh/core";import{useEffect as ao,useRef as uo,useState as co}from"react";import{isWakingPhase as lo}from"@urun-sh/core";function dt(t){let e=B(t),n=lo(e?.name),r=uo(void 0);n?r.current??=Date.now():r.current=void 0;let o=n?e?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[a,i]=co(s);return ao(()=>{if(o===void 0){i(0);return}i(Math.max(0,Math.floor((Date.now()-o)/1e3)));let u=setInterval(()=>{i(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(u)},[o]),{waking:n,phase:e,state:n?e?.runtime?.state:void 0,reason:n?e?.runtime?.reason:void 0,since:o,seconds:n?a:0}}import{Fragment as mo,jsx as Yt,jsxs as Qt}from"react/jsx-runtime";function pt({session:t,render:e,className:n}){let r=dt(t);return!r.waking||!r.phase?null:Yt("span",{className:["urun-session-waking",n].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:e?e(r):Qt(mo,{children:[Yt("span",{className:"urun-session-waking-label",children:po(r.phase)})," ",Qt("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}import{useEffect as ho,useState as So}from"react";import{useEffect as en,useRef as fo,useState as tn}from"react";var go={event:null,elapsedMs:0};function mt(t,e){let[n,r]=tn(null),o=fo(0);en(()=>{if(r(null),!!t?.onActivation)return t.onActivation(i=>{e!==void 0&&i.stream!==e||(o.current=Date.now(),r(i))})},[t,e]);let[s,a]=tn(0);return en(()=>{if(!n){a(0);return}if(n.state==="first-media"){a(n.elapsedMs);return}let i=o.current,u=()=>n.elapsedMs+Math.max(0,Date.now()-i);a(u());let c=setInterval(()=>a(u()),1e3);return()=>clearInterval(c)},[n]),n?{event:n,elapsedMs:s}:go}import{jsx as nn,jsxs as rn}from"react/jsx-runtime";var vo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function yo(t){let[e,n]=So(!1);return ho(()=>{if(n(!1),!t)return;let r=t;if(typeof r.requestVideoFrameCallback=="function"){let s=r.requestVideoFrameCallback(()=>n(!0));return()=>r.cancelVideoFrameCallback?.(s)}let o=()=>{let s=r.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:r.readyState>=2)&&n(!0)};return o(),r.addEventListener("loadeddata",o),r.addEventListener("timeupdate",o),()=>{r.removeEventListener("loadeddata",o),r.removeEventListener("timeupdate",o)}},[t]),e}function ft({session:t,stream:e,videoElement:n,render:r,className:o}){let s=mt(t,e),a=yo(n),i=s.event;if(!i||i.state==="first-media"||a)return null;let u=i.state;return nn("div",{className:["urun-activation-overlay",o].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:r?r(s):rn("div",{className:"urun-activation-overlay-card",children:[nn("span",{className:"urun-activation-overlay-copy",children:i.hint??vo[u]})," ",rn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as oe,jsxs as gt}from"react/jsx-runtime";var Co={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Po({session:t,className:e}){let n=B(t),r=n?.name??"idle",o=n?.name==="queued"&&n.queue?`pos ${n.queue.position} / depth ${n.queue.depth}`:(n?.name==="error"||n?.name==="expired")&&n.error?n.error.reason:n?.runtime?.reason??null;return gt("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":r,children:[oe("span",{className:"urun-session-status-dot","data-phase":r}),oe("span",{className:"urun-session-status-label",children:Co[r]}),o?oe("span",{className:"urun-session-status-detail",children:o}):null]})}function To({session:t,children:e,fallback:n,onStartOver:r,className:o}){let s=B(t);if(s?.name==="live")return gt("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[e,oe(ft,{session:t})]});let a=n?n(s):oe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&bo(s.name)?oe(pt,{session:t}):s&&s.name!=="idle"?ko(s):"Waiting for a live session\u2026"}),i=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return gt("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[a,i?oe("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}import{useEffect as xo,useState as Ro}from"react";import{jsx as wo}from"react/jsx-runtime";function on(t){return B(t)?.endsAt??null}function Uo(t){let e=Math.max(0,Math.floor(t/1e3)),n=Math.floor(e/60),r=e%60;return`${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Eo({session:t,urgentMs:e=6e4,className:n}){let o=on(t)?.getTime()??null,[s,a]=Ro(()=>o===null?null:Math.max(0,o-Date.now()));if(xo(()=>{if(o===null){a(null);return}let u=()=>a(Math.max(0,o-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[o]),s===null)return null;let i=Uo(s);return wo("span",{className:["urun-session-clock",n].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${i}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:i})}import{jsx as sn,jsxs as Mo}from"react/jsx-runtime";var Ao=new Set(["expired","ended","error"]);function _o({session:t,onNewSession:e,children:n,className:r}){let o=B(t);if(!o||!Ao.has(o.name))return null;let s=n?n(o):sn("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return Mo("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?sn("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}import{useEffect as an,useMemo as No,useState as un}from"react";import{jsx as We,jsxs as Lo}from"react/jsx-runtime";function ht(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function cn(t){let e=No(()=>t?t.doc("control"):null,[t]),[n,r]=un(()=>e?ht(e.get("idle")):null);return an(()=>{if(!e){r(null);return}return r(ht(e.get("idle"))),e.on("change",()=>r(ht(e.get("idle"))))},[e]),n}function Io(t){let e=Math.max(0,Math.floor(t));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function Do({session:t,onStillHere:e,className:n}){let r=cn(t),o=r?.deadlineEpochS??null,[s,a]=un(null);if(an(()=>{if(o===null){a(null);return}let u=()=>a(Math.max(0,o-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[o]),!r||!t)return null;let i=()=>{t.touch?.(),e?.()};return We("div",{className:["urun-idle-warning",n].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Lo("div",{className:"urun-idle-warning-card",children:[We("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),We("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Io(s)} due to inactivity.`:"This session will end soon due to inactivity."}),We("button",{type:"button",className:"urun-idle-warning-confirm",onClick:i,children:"I'm still here"})]})})}import{useContext as Oo,useEffect as qo,useState as Fo}from"react";import{prewake as Wo}from"@urun-sh/core";function Vo(t){let e=Oo(ue),[n,r]=Fo(null),o=t.app??e?.appId,s=t.function,a=t.intervalS??60,i=e?.baseUrl,u=e?.orgId,c=e?.jwt,p=e?.getAccessToken,l=e?.authProvider;return qo(()=>{if(!i||!u||!o||!s)return;let f=!1,g=()=>{Wo({baseUrl:i,app:o,functionName:s,orgId:u,jwt:c,getAccessToken:p,authProvider:l}).then(k=>{f||r(k)}).catch(()=>{})};g();let v=setInterval(g,Math.max(1,a)*1e3);return()=>{f=!0,clearInterval(v)}},[o,s,a,i,u,c,p,l]),n}import{describeSessionPhase as iu,isWakingPhase as au}from"@urun-sh/core";export{Gn as ComponentRenderer,zt as DEFAULT_CAMERA_CONSTRAINTS,ne as DEFAULT_LOG_CAP,jt as DEFAULT_VOICE_CONSTRAINTS,qe as DocPatchForm,cr as ImageFrame,ur as ImageFrameSchema,pr as MetricsPanel,dr as MetricsPanelSchema,Qn as ProgressCard,Yn as ProgressCardSchema,nr as StatusBadge,er as StatusBadgeSchema,ir as TextStream,sr as TextStreamSchema,ft as UrunActivationOverlay,st as UrunAudio,gn as UrunAuthProvider,Nr as UrunCamera,eo as UrunControlSender,Zr as UrunDocPanel,Se as UrunErrorBoundary,ro as UrunEventSpine,Do as UrunIdleWarning,hn as UrunJwtProvider,Tn as UrunProvider,Eo as UrunSessionClock,_o as UrunSessionEnded,To as UrunSessionGate,Po as UrunSessionStatus,pt as UrunSessionWaking,Xr as UrunStreamTail,xr as UrunVoice,Re as authMode,ut as createDocStore,iu as describeSessionPhase,be as formatPayload,Ne as getUrunAudioContext,au as isWakingPhase,ct as parseJsonObject,Y as pushCapped,Xn as registerComponent,Ie as resumeUrunAudioContext,X as urunPublicEnv,mt as useActivation,_n as useApp,Hn as useChat,Fn as useCompletion,ke as useDocStore,Vt as useImageFrame,zn as useInputPresence,Bt as useMetricsPanel,It as useProgressCard,Dn as useRequest,Kr as useSessionDoc,on as useSessionEndsAt,cn as useSessionIdle,B as useSessionPhase,Fr as useSessionTrack,dt as useSessionWake,Lt as useStatusBadge,lt as useStreamMessages,Ft as useTextStream,Lr as useUrunAudioLevel,He as useUrunAuth,Vo as useUrunPrewake,kn as usesWorkOSAuth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urun-sh/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.19",
|
|
4
4
|
"description": "React bindings for the urun TypeScript SDK",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dev": "tsup --watch"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@urun-sh/core": "^0.2.
|
|
56
|
+
"@urun-sh/core": "^0.2.19",
|
|
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",
|