@livelayer/react 0.3.0 → 0.4.0

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/README.md CHANGED
@@ -153,11 +153,81 @@ Or attach extra app state without replacing the walker:
153
153
  />
154
154
  ```
155
155
 
156
- ### 4. Persist the session across pages (multi-page apps)
156
+ ### 4. Let the agent click + scroll + fill forms (0.4.0)
157
+
158
+ **Click anything the agent should be able to trigger**: tag interactive elements with `data-ll-action` (or any selector you want — `button[aria-label="..."]` works too).
159
+
160
+ ```tsx
161
+ <button data-ll-action="open-pricing-modal" onClick={openPricing}>
162
+ See pricing
163
+ </button>
164
+ ```
165
+
166
+ The agent emits `{ type: "click", selector: "[data-ll-action='open-pricing-modal']" }` and the widget triggers a click. **Use `onNavigate` for nav-shaped clicks** — `click` is for buttons, dialog toggles, expand/collapse, etc.
167
+
168
+ **Page scrolling**: the agent can call `scroll_page` with `direction: "up" | "down" | "top" | "bottom"`. Default behavior scrolls the window by ±1 viewport height. Override with `onScrollPage` for custom scroll containers.
169
+
170
+ **Forms** — declarative wrappers. Tag the form and the fields the agent is allowed to fill:
171
+
172
+ ```tsx
173
+ import { LiveLayerForm, LiveLayerField } from "@livelayer/react";
174
+
175
+ <LiveLayerForm id="contact" intent="contact us — send a message">
176
+ <LiveLayerField name="name" label="Your name" />
177
+ <LiveLayerField name="email" label="Email" type="email" />
178
+ <LiveLayerField name="message" as="textarea" label="Message" />
179
+ <button type="submit">Send</button>
180
+ </LiveLayerForm>
181
+ ```
182
+
183
+ Or use raw HTML with `data-ll-form` / `data-ll-field`:
184
+
185
+ ```html
186
+ <form data-ll-form="contact" data-ll-intent="contact us">
187
+ <input data-ll-field="name" name="name" />
188
+ <input data-ll-field="email" name="email" type="email" />
189
+ <textarea data-ll-field="message" name="message"></textarea>
190
+ <button type="submit">Send</button>
191
+ </form>
192
+ ```
193
+
194
+ The agent sees these in `PageContext.forms` and calls:
195
+ - `fill_form` — sets values via the React-controlled-input pattern (your `onChange` listeners fire correctly)
196
+ - `focus_field` — moves focus to a specific field
197
+ - `submit_form` — calls `form.requestSubmit()`. The widget publishes `{ type: "form_submitted", formId }` on success or `{ type: "form_submit_blocked", formId, reason: "validation" }` on HTML5 validation failure
198
+
199
+ **Privacy is enforced regardless of tagging**: `type="password"`, `autocomplete="cc-*"`, and `[data-ll-private="true"]` fields are NEVER agent-fillable. Card fields belong in Stripe Elements; we will not be the rail.
200
+
201
+ **Routes**: the agent can call `request_routes` to get up to 200 deduped `<a href>` entries from the page (internal flagged separately from external). Useful for "where can I go?" prompts.
202
+
203
+ ### 5. Restrict what the agent can do (0.4.0)
204
+
205
+ Compliance / safety knob: pass an allowlist.
206
+
207
+ ```tsx
208
+ <AvatarWidget
209
+ agentId="..."
210
+ capabilities={["read_page", "navigate", "scroll", "fill_forms"]}
211
+ // not in list: "click", "submit_forms"
212
+ />
213
+ ```
214
+
215
+ | Capability | Commands gated |
216
+ |---|---|
217
+ | `navigate` | `navigate` |
218
+ | `scroll` | `scroll_to`, `scroll_page` |
219
+ | `click` | `click` |
220
+ | `fill_forms` | `fill_form`, `focus_field` |
221
+ | `submit_forms` | `submit_form` |
222
+ | `read_page` | `request_page_context`, `request_routes` |
223
+
224
+ Default (`capabilities` undefined) = all enabled. **Recommended starter**: omit `submit_forms` for the first few weeks of production. Filling is reversible, submitting isn't.
225
+
226
+ ### 6. Persist the session across pages (multi-page apps)
157
227
 
158
228
  For SPAs (Next.js, Remix, React Router), mount the widget at the app root and the session survives route changes automatically. For multi-page apps where the entire React tree unmounts, use `controlledSession` to own the LiveKit Room yourself and keep it alive across reloads. See [the `ControlledSession` interface](src/AvatarWidget.tsx) for the contract.
159
229
 
160
- ### 5. Custom branding
230
+ ### 7. Custom branding
161
231
 
162
232
  ```tsx
163
233
  <AvatarWidget
@@ -188,8 +258,11 @@ All props are optional except `agentId`.
188
258
  | `hideOn` | `RoutePattern[]` | Never render on matching paths. Wins over `showOn`. |
189
259
  | `onNavigate` | `(href: string) => void` | Called on agent `navigate` command. Wire to your router. |
190
260
  | `onScrollToSelector` | `(sel, behavior?) => void` | Called on agent `scroll_to` command. Default: `scrollIntoView({ behavior: "smooth" })`. |
261
+ | `onScrollPage` | `(direction, behavior?) => void` | Called on agent `scroll_page` command. Default: `window.scrollBy` / `scrollTo`. |
262
+ | `onClick` | `(selector: string) => void` | Called on agent `click` command. Default: `document.querySelector(selector)?.click()`. |
191
263
  | `getPageContext` | `() => PageContext \| Promise<PageContext>` | Override the default DOM walker. |
192
264
  | `pageContextExtras` | `Record<string, unknown>` | Extra app state attached to every page context snapshot. |
265
+ | `capabilities` | `AgentCapability[]` | Allowlist gating which commands the agent can run. |
193
266
  | `position` | `"top-left" \| "top-right" \| "bottom-left" \| "bottom-right" \| "custom"` | Where the widget docks. Defaults to `"bottom-right"`. |
194
267
  | `defaultDisplayMode` | `"hidden" \| "minimized" \| "expanded"` | Initial display mode. |
195
268
  | `branding` | `BrandingConfig` | Colors, product name, logo. |
@@ -208,6 +281,22 @@ All props are optional except `agentId`.
208
281
 
209
282
  Renders a wrapper element with `data-ll-region` + `data-ll-intent` that the page-context extractor prioritizes.
210
283
 
284
+ ### `<LiveLayerForm>` + `<LiveLayerField>` (form primitives, 0.4.0)
285
+
286
+ ```tsx
287
+ <LiveLayerForm id="signup" intent="create account" onSubmit={handleSubmit}>
288
+ <LiveLayerField name="email" label="Email" type="email" />
289
+ <LiveLayerField name="bio" as="textarea" label="Bio" />
290
+ <LiveLayerField name="role" as="select" label="Role">
291
+ <option value="dev">Developer</option>
292
+ <option value="pm">PM</option>
293
+ </LiveLayerField>
294
+ <button type="submit">Sign up</button>
295
+ </LiveLayerForm>
296
+ ```
297
+
298
+ Equivalent to raw HTML with `data-ll-form` + `data-ll-field` attributes. Untagged forms remain invisible to the agent.
299
+
211
300
  ### Hooks (power users)
212
301
 
213
302
  `useLiveKitSession`, `useDisplayMode`, `useAgentInfo`, `usePathname`, `useRouteMatch`, `useAudioLevel`, `useMicrophoneState`, `useCameraState`, `useScreenShareState`, `useMediaDevices`, `useTranscript`. All exported from the package root.
package/dist/index.d.ts CHANGED
@@ -6,15 +6,35 @@ import { CSSProperties } from 'react';
6
6
  import { ElementType } from 'react';
7
7
  import { ErrorInfo } from 'react';
8
8
  import { FC } from 'react';
9
+ import { FormHTMLAttributes } from 'react';
9
10
  import { ForwardRefExoticComponent } from 'react';
11
+ import { InputHTMLAttributes } from 'react';
10
12
  import { JSX } from 'react/jsx-runtime';
11
13
  import { LiveKitSession } from '@livelayer/sdk';
12
14
  import { ReactNode } from 'react';
13
15
  import { RefAttributes } from 'react';
14
16
  import { Room } from 'livekit-client';
17
+ import { SelectHTMLAttributes } from 'react';
15
18
  import { SessionOptions } from '@livelayer/sdk';
19
+ import { TextareaHTMLAttributes } from 'react';
16
20
  import { TranscriptEntry } from '@livelayer/sdk';
17
21
 
22
+ /**
23
+ * What the agent's data-channel commands are allowed to do. Pass to
24
+ * `<AvatarWidget capabilities={[...]} />` to restrict.
25
+ *
26
+ * Mapping:
27
+ * "navigate" → navigate command
28
+ * "scroll" → scroll_to + scroll_page commands
29
+ * "click" → click command
30
+ * "fill_forms" → fill_form + focus_field commands
31
+ * "submit_forms" → submit_form command
32
+ * "read_page" → request_page_context + request_routes commands
33
+ *
34
+ * Default (undefined): everything enabled (matches 0.3.x behavior).
35
+ */
36
+ export declare type AgentCapability = "navigate" | "scroll" | "click" | "fill_forms" | "submit_forms" | "read_page";
37
+
18
38
  /**
19
39
  * Agent commands streamed over the LiveKit data channel. The base package
20
40
  * recognizes universal types (agent_state, avatar_active, etc.) and forwards
@@ -141,6 +161,32 @@ export declare interface AvatarWidgetProps {
141
161
  getPageContext?: (extras?: Record<string, unknown>) => PageContext | Promise<PageContext>;
142
162
  /** Free-form metadata bag the agent should always know about. */
143
163
  pageContextExtras?: Record<string, unknown>;
164
+ /**
165
+ * Called on agent `scroll_page` commands. Default: scrolls window
166
+ * by ±1 viewport height (or to top/bottom). Override to scroll a
167
+ * custom container.
168
+ */
169
+ onScrollPage?: (direction: "up" | "down" | "top" | "bottom", behavior?: "smooth" | "instant") => void;
170
+ /**
171
+ * Called on agent `click` commands. Default: dispatches click on
172
+ * the matched element. Override to add safety checks or block
173
+ * specific selectors. **Use `onNavigate` for nav-shaped clicks** —
174
+ * `click` here is for non-nav buttons / dialogs / state toggles.
175
+ */
176
+ onClick?: (selector: string) => void;
177
+ /**
178
+ * Restrict what the agent's commands can do. If undefined, ALL
179
+ * capabilities are allowed (default — matches 0.3.x behavior).
180
+ *
181
+ * Available capabilities:
182
+ * "navigate" — navigate command
183
+ * "scroll" — scroll_to + scroll_page
184
+ * "click" — click
185
+ * "fill_forms" — fill_form + focus_field
186
+ * "submit_forms" — submit_form
187
+ * "read_page" — request_page_context + request_routes
188
+ */
189
+ capabilities?: AgentCapability[];
144
190
  onConnect?: () => void;
145
191
  onDisconnect?: () => void;
146
192
  onTranscript?: (entries: TranscriptEntry[]) => void;
@@ -188,6 +234,17 @@ export declare interface CameraStateHandle {
188
234
 
189
235
  export declare function clearPageContextCache(): void;
190
236
 
237
+ export declare function clearRoutesCache(): void;
238
+
239
+ declare interface CommonFieldProps {
240
+ /** Field identifier. Becomes `data-ll-field` AND the input's `name`. */
241
+ name: string;
242
+ /** Visible label. Wrapped in <label>. */
243
+ label?: ReactNode;
244
+ /** Optional className for the wrapping <label>. */
245
+ labelClassName?: string;
246
+ }
247
+
191
248
  export { ConnectionState }
192
249
 
193
250
  /**
@@ -231,6 +288,13 @@ export declare class ErrorBoundary extends Component<Props, State> {
231
288
  render(): ReactNode;
232
289
  }
233
290
 
291
+ export declare interface ExtractedRoute {
292
+ href: string;
293
+ text: string;
294
+ /** Same origin as `window.location.origin`. External links surface but flagged. */
295
+ internal: boolean;
296
+ }
297
+
234
298
  declare interface ExtractOptions {
235
299
  /** Override doc — for tests. */
236
300
  doc?: Document;
@@ -238,8 +302,14 @@ declare interface ExtractOptions {
238
302
 
239
303
  export declare function extractPageContext(extras?: Record<string, unknown>, opts?: ExtractOptions): PageContext;
240
304
 
305
+ export declare function extractRoutes(doc?: Document): ExtractedRoute[];
306
+
307
+ declare type FieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
308
+
241
309
  export declare function getCachedPageContext(extras?: Record<string, unknown>, opts?: ExtractOptions): PageContext;
242
310
 
311
+ export declare function getCachedRoutes(): ExtractedRoute[];
312
+
243
313
  export declare interface LegacyAgentEventDetail {
244
314
  eventName: string;
245
315
  data: Record<string, unknown>;
@@ -247,6 +317,30 @@ export declare interface LegacyAgentEventDetail {
247
317
 
248
318
  declare type LevelSubscriber = (level: number) => void;
249
319
 
320
+ export declare const LiveLayerField: ForwardRefExoticComponent<LiveLayerFieldProps & RefAttributes<FieldElement>>;
321
+
322
+ export declare type LiveLayerFieldProps = (CommonFieldProps & {
323
+ as?: "input";
324
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, "name">) | (CommonFieldProps & {
325
+ as: "textarea";
326
+ } & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "name">) | (CommonFieldProps & {
327
+ as: "select";
328
+ children: ReactNode;
329
+ } & Omit<SelectHTMLAttributes<HTMLSelectElement>, "name">);
330
+
331
+ export declare const LiveLayerForm: ForwardRefExoticComponent<LiveLayerFormProps & RefAttributes<HTMLFormElement>>;
332
+
333
+ export declare interface LiveLayerFormProps extends FormHTMLAttributes<HTMLFormElement> {
334
+ /** Stable identifier for the form. Becomes `data-ll-form`. */
335
+ id: string;
336
+ /**
337
+ * One-line description the agent sees. e.g. "create account",
338
+ * "request a demo". The agent uses this to decide WHEN to fill the
339
+ * form (matching user intent → form intent).
340
+ */
341
+ intent?: string;
342
+ }
343
+
250
344
  export declare const LiveLayerRegion: ForwardRefExoticComponent<LiveLayerRegionProps & RefAttributes<HTMLElement>>;
251
345
 
252
346
  export declare interface LiveLayerRegionProps {
@@ -367,6 +461,20 @@ export declare interface PageContext {
367
461
  label: string;
368
462
  type: string;
369
463
  }>;
464
+ /**
465
+ * Author-curated forms via <LiveLayerForm> / data-ll-form. The agent
466
+ * uses these to call `fill_form` / `submit_form`. Values NEVER included.
467
+ * (0.4.0)
468
+ */
469
+ forms: Array<{
470
+ id: string;
471
+ intent?: string;
472
+ fields: Array<{
473
+ name: string;
474
+ label: string;
475
+ type: string;
476
+ }>;
477
+ }>;
370
478
  /** Free-form metadata bag from the consumer's pageContextExtras prop. */
371
479
  extras?: Record<string, unknown>;
372
480
  }
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),qt=require("@livelayer/sdk"),Ae=require("livekit-client");class xt extends n.Component{constructor(){super(...arguments),this.state={hasError:!1,error:null},this.reset=()=>{this.setState({hasError:!1,error:null})}}static getDerivedStateFromError(r){return{hasError:!0,error:r}}componentDidCatch(r,i){var s,o;(o=(s=this.props).onError)==null||o.call(s,r,i)}render(){var r;return this.state.hasError?this.props.fallback?this.props.fallback:e.jsxs("div",{className:"ll-error-boundary",role:"alert",children:[e.jsx("p",{className:"ll-error-boundary__title",children:"Widget crashed"}),e.jsx("p",{className:"ll-error-boundary__message",children:((r=this.state.error)==null?void 0:r.message)||"Something went wrong."}),e.jsx("button",{type:"button",className:"ll-error-boundary__retry",onClick:this.reset,children:"Reload widget"})]}):this.props.children}}function vt(t){const[r,i]=n.useState("idle"),[s,o]=n.useState("idle"),[l,d]=n.useState([]),[f,u]=n.useState(null),[x,p]=n.useState(null),[a,c]=n.useState(null),[j,_]=n.useState(!1),[k,R]=n.useState(null),y=n.useRef(null),L=n.useRef(t.onDataMessage);L.current=t.onDataMessage,n.useEffect(()=>{const w={onConnectionStateChange:b=>{i(b),b==="connected"&&R(null)},onAgentStateChange:o,onTranscript:b=>d([...b]),onAgentConfig:u,onAudioTrack:b=>c(b),onVideoTrack:b=>p(b),onVideoTrackRemoved:()=>p(null),onError:b=>R(b),onDataMessage:b=>{var M;(M=L.current)==null||M.call(L,b)},onResumabilityChange:_},S=new qt.LiveKitSession({agentId:t.agentId,baseUrl:t.baseUrl,apiKey:t.apiKey,sessionEndpoint:t.sessionEndpoint,sessionBody:t.sessionBody},w);return y.current=S,i("idle"),o("idle"),d([]),u(null),p(null),c(null),_(!1),R(null),()=>{var b;(b=S.destroy)==null||b.call(S),y.current=null}},[t.agentId,t.baseUrl,t.apiKey,t.sessionEndpoint,JSON.stringify(t.sessionBody??{})]);const m=n.useCallback(async()=>{const w=y.current;if(w)try{await w.connect()}catch(S){throw R(S instanceof Error?S.message:String(S)),S}},[]),C=n.useCallback(()=>{const w=y.current;w&&w.disconnect()},[]),N=n.useCallback(()=>{var w;return((w=y.current)==null?void 0:w.getRoom())??null},[]);return{connectionState:r,agentState:s,transcript:l,agentConfig:f,videoElement:x,audioElement:a,canResume:j,error:k,connect:m,disconnect:C,getRoom:N,session:y.current}}function yt(){const t=n.useRef(null),r=n.useRef(null),i=n.useRef(null),s=n.useRef(null),o=n.useRef(new Set),l=n.useRef(null),d=n.useCallback(()=>{const a=r.current;if(!a){s.current=null;return}(!l.current||l.current.length!==a.frequencyBinCount)&&(l.current=new Uint8Array(new ArrayBuffer(a.frequencyBinCount)));const c=l.current;a.getByteFrequencyData(c);let j=0;for(let k=0;k<c.length;k++)j+=c[k];const _=j/c.length/255;for(const k of o.current)try{k(_)}catch(R){console.error("[useAudioLevel] subscriber threw:",R)}s.current=requestAnimationFrame(d)},[]),f=n.useCallback(()=>{if(t.current||typeof window>"u"||typeof AudioContext>"u")return;const a=new AudioContext,c=a.createAnalyser();c.fftSize=64,c.connect(a.destination),t.current=a,r.current=c},[]),u=n.useCallback(a=>{if(f(),!(!t.current||!r.current)){if(i.current){try{i.current.disconnect()}catch{}i.current=null}try{const c=t.current.createMediaElementSource(a);c.connect(r.current),i.current=c}catch(c){console.warn("[useAudioLevel] createMediaElementSource failed:",c);return}s.current===null&&(s.current=requestAnimationFrame(d))}},[f,d]),x=n.useCallback(()=>{if(s.current!==null&&(cancelAnimationFrame(s.current),s.current=null),i.current){try{i.current.disconnect()}catch{}i.current=null}},[]),p=n.useCallback(a=>(o.current.add(a),()=>{o.current.delete(a)}),[]);return n.useEffect(()=>()=>{if(x(),r.current){try{r.current.disconnect()}catch{}r.current=null}if(t.current){try{t.current.close()}catch{}t.current=null}o.current.clear(),l.current=null},[x]),{attach:u,detach:x,subscribe:p}}function bt(){const[t,r]=n.useState(!1),[i,s]=n.useState(null),o=n.useRef(null),l=n.useRef(null),d=n.useCallback(async p=>{if(o.current&&l.current){try{await l.current.localParticipant.unpublishTrack(o.current)}catch{}o.current.stop(),o.current=null}l.current=p,s(null);try{const a=await Ae.createLocalAudioTrack({echoCancellation:!0,noiseSuppression:!0});await p.localParticipant.publishTrack(a),o.current=a,r(a.isMuted)}catch(a){const c=a instanceof Error&&a.name==="NotAllowedError"?"Enable your microphone to talk with the agent.":"Microphone unavailable. Check browser permissions and try again.";throw s(c),a}},[]),f=n.useCallback(()=>{const p=o.current;p&&(p.isMuted?(p.unmute(),r(!1)):(p.mute(),r(!0)))},[]),u=n.useCallback(()=>{const p=o.current,a=l.current;if(p&&a){try{a.localParticipant.unpublishTrack(p)}catch{}p.stop()}o.current=null,l.current=null,r(!1)},[]),x=n.useCallback(()=>s(null),[]);return{isMuted:t,micError:i,toggleMute:f,setupMic:d,teardownMic:u,clearError:x}}const Gt={resolution:{width:640,height:480,frameRate:24}};function _t(){const[t,r]=n.useState(!1),[i,s]=n.useState(null),[o,l]=n.useState(null),[d,f]=n.useState(""),u=n.useRef(null),x=n.useRef(null),p=n.useCallback(y=>{u.current=y},[]),a=n.useCallback(()=>{const y=u.current,L=x.current;if(L&&y){const m=y.localParticipant.getTrackPublication(Ae.Track.Source.Camera);if(m!=null&&m.track){try{y.localParticipant.unpublishTrack(m.track)}catch{}m.track.stop()}else L.stop()}x.current=null,l(null),r(!1)},[]),c=n.useCallback(async y=>{const L=u.current;if(L){s(null);try{const m={...Gt};y&&(m.deviceId=y);const C=await Ae.createLocalVideoTrack(m);await L.localParticipant.publishTrack(C),x.current=C;const N=C.attach();l(N),r(!0),y&&f(y);try{L.localParticipant.publishData(new TextEncoder().encode(JSON.stringify({type:"user_camera_on"})),{reliable:!0})}catch{}}catch(m){const C=m instanceof Error&&m.name==="NotAllowedError"?"Enable your camera in the browser to share video.":"Camera unavailable. Check permissions and try again.";s(C)}}},[]),j=n.useCallback(async()=>{t?a():await c(d||void 0)},[t,d,a,c]),_=n.useCallback(async y=>{a(),await c(y)},[a,c]),k=n.useCallback(()=>{a(),u.current=null,s(null),f("")},[a]),R=n.useCallback(()=>s(null),[]);return n.useEffect(()=>()=>{x.current&&x.current.stop()},[]),{isEnabled:t,error:i,previewEl:o,activeDeviceId:d,toggle:j,switchDevice:_,attachRoom:p,teardown:k,clearError:R}}function wt(){const[t,r]=n.useState(!1),[i,s]=n.useState(null),[o,l]=n.useState(null),d=n.useRef(null),f=n.useCallback(c=>{d.current=c},[]),u=n.useCallback(()=>l(null),[]),x=n.useCallback(async()=>{const c=d.current;if(c){if(t){try{await c.localParticipant.setScreenShareEnabled(!1)}catch{}u(),r(!1);return}s(null);try{await c.localParticipant.setScreenShareEnabled(!0);let j=0;const _=()=>{const k=c.localParticipant.getTrackPublication(Ae.Track.Source.ScreenShare);if(k!=null&&k.track){const R=k.track.attach();l(R),r(!0);try{c.localParticipant.publishData(new TextEncoder().encode(JSON.stringify({type:"user_screen_share_on"})),{reliable:!0})}catch{}return}j++<10?setTimeout(_,100):r(!0)};_()}catch(j){const _=j instanceof Error?j.name:"";_!=="NotAllowedError"&&_!=="AbortError"&&s("Screen share unavailable. Try again."),r(!1)}}},[t,u]),p=n.useCallback(()=>{const c=d.current;if(c&&t)try{c.localParticipant.setScreenShareEnabled(!1)}catch{}u(),r(!1),s(null),d.current=null},[t,u]),a=n.useCallback(()=>s(null),[]);return{isEnabled:t,error:i,previewEl:o,toggle:x,attachRoom:f,teardown:p,clearError:a}}function kt(){const[t,r]=n.useState([]),[i,s]=n.useState([]),o=n.useCallback(async()=>{if(!(typeof navigator>"u"||!navigator.mediaDevices))try{const l=await navigator.mediaDevices.enumerateDevices();r(l.filter(d=>d.kind==="audioinput")),s(l.filter(d=>d.kind==="videoinput"))}catch{}},[]);return n.useEffect(()=>{if(o(),typeof navigator>"u"||!navigator.mediaDevices)return;const l=()=>void o();return navigator.mediaDevices.addEventListener("devicechange",l),()=>navigator.mediaDevices.removeEventListener("devicechange",l)},[o]),{mics:t,cameras:i,refresh:o}}function Ct(t,r,i=!1){const[s,o]=n.useState(null),[l,d]=n.useState(null),[f,u]=n.useState(!i&&!!t);return n.useEffect(()=>{if(i||!t){u(!1);return}const x=new AbortController,p=r||"https://app.livelayer.studio";return u(!0),d(null),fetch(`${p}/api/widget/agent/${encodeURIComponent(t)}`,{signal:x.signal}).then(async a=>{if(!a.ok){const c=await a.json().catch(()=>({}));throw new Error(c.error||`HTTP ${a.status}`)}return a.json()}).then(a=>{x.signal.aborted||(o(a),u(!1))}).catch(a=>{x.signal.aborted||(d(a instanceof Error?a.message:"Agent lookup failed"),u(!1))}),()=>x.abort()},[t,r,i]),{info:s,error:l,loading:f}}function Kt(t){if(typeof window>"u")return null;try{return window.localStorage.getItem(t)}catch{return null}}function Yt(t,r){if(!(typeof window>"u"))try{window.localStorage.setItem(t,r)}catch{}}function jt({value:t,defaultValue:r="expanded",onChange:i}={}){const s=t!==void 0,[o,l]=n.useState(r),d=s?t:o,f=n.useCallback(u=>{u!==d&&(s||l(u),i==null||i(u))},[d,s,i]);return[d,f]}const Xt=["hidden","minimized","expanded"];function Jt(t){return t&&Xt.includes(t)?t:null}function St({value:t,defaultValue:r="expanded",onChange:i,persistKey:s="ll-widget",disablePersistence:o=!1}={}){const l=`${s}:display-mode`,d=n.useRef(!1),[f,u]=jt({value:t,defaultValue:r,onChange:x=>{t===void 0&&!o&&Yt(l,x),i==null||i(x)}});return n.useEffect(()=>{if(d.current||(d.current=!0,o||t!==void 0))return;const x=Jt(Kt(l));x&&x!==f&&u(x)},[]),[f,u]}const Qt=640;function Et(t=Qt){const[r,i]=n.useState(!1);return n.useEffect(()=>{if(t===!1){i(!1);return}if(typeof window>"u"||typeof window.matchMedia>"u")return;const s=`(max-width: ${t-1}px)`,o=window.matchMedia(s),l=()=>i(o.matches);return l(),typeof o.addEventListener=="function"?(o.addEventListener("change",l),()=>o.removeEventListener("change",l)):(o.addListener(l),()=>{o.removeListener(l)})},[t]),r}const st="__llHistoryPatched",Me="ll:pathname";function Zt(){if(typeof window>"u"||window.history[st])return;const t=window.history.pushState,r=window.history.replaceState;window.history.pushState=function(...i){const s=t.apply(this,i);return window.dispatchEvent(new Event(Me)),s},window.history.replaceState=function(...i){const s=r.apply(this,i);return window.dispatchEvent(new Event(Me)),s},window.history[st]=!0}function ot(){return typeof window>"u"?"/":window.location.pathname||"/"}function Nt(t){const[r,i]=n.useState(()=>t??ot());return n.useEffect(()=>{if(t!==void 0)return;Zt();const s=()=>i(ot());return s(),window.addEventListener("popstate",s),window.addEventListener(Me,s),()=>{window.removeEventListener("popstate",s),window.removeEventListener(Me,s)}},[t]),t??r}const lt=new Map,en=/[\\^$+?.()|{}[\]]/g;function tn(t){return t.replace(en,"\\$&")}function nn(t){const r=lt.get(t);if(r)return r;const i=t.length>1&&t.endsWith("/")?t.slice(0,-1):t,s="",o="",l=i.replace(/\*\*/g,s).replace(/\*/g,o),f=tn(l).replace(new RegExp(`\\/${s}`,"g"),"(?:\\/.*)?").replace(new RegExp(s,"g"),".*").replace(new RegExp(o,"g"),"[^/]+"),u=new RegExp(`^${f}\\/?$`);return lt.set(t,u),u}function rn(t,r){const i=r.length>1&&r.endsWith("/")?r.slice(0,-1):r;return nn(t).test(i)}function Lt(t,r){return typeof t=="function"?t(r):t instanceof RegExp?t.test(r):rn(t,r)}function at(t,r){if(!t||t.length===0)return!1;for(const i of t)if(Lt(i,r))return!0;return!1}function Rt(t,r,i){return t===void 0?!0:at(i,t)?!1:r&&r.length>0?at(r,t):!0}function At(t,r,i){return n.useMemo(()=>Rt(t,r,i),[t,r,i])}const ct=({muted:t=!1,className:r})=>t?e.jsxs("svg",{className:r,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:[e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"}),e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2"})]}):e.jsx("svg",{className:r,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4M12 1a3 3 0 00-3 3v4a3 3 0 006 0V4a3 3 0 00-3-3z"})}),ut=({className:t})=>e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"})}),sn=({className:t})=>e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})}),on={left:180,right:0,up:-90,down:90},ln=({direction:t="right",className:r})=>e.jsx("svg",{className:r,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,style:{transform:`rotate(${on[t]}deg)`},"aria-hidden":"true",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 6l6 6-6 6"})});function an(t){return t==="top-left"||t==="bottom-left"?"left":"right"}const Mt="ll-hidden-tab-center-y",cn=5,dt=16;function un(){if(typeof window>"u")return null;try{const t=window.localStorage.getItem(Mt);if(!t)return null;const r=Number.parseFloat(t);return Number.isFinite(r)?r:null}catch{return null}}function ft(t){if(!(typeof window>"u"))try{window.localStorage.setItem(Mt,String(t))}catch{}}const dn=({position:t,isMobile:r,isSpeaking:i,onExpand:s,label:o="Open widget"})=>{const l=an(t),d=l==="right"?"left":"right",f=r?80:72,[u,x]=n.useState(null),[p,a]=n.useState(!1),c=n.useRef(null),j=n.useRef(!1),_=n.useCallback(w=>{if(typeof window>"u")return w;const S=f/2,b=dt+S,M=window.innerHeight-dt-S;return M<b?Math.max(b,w):Math.max(b,Math.min(M,w))},[f]);n.useEffect(()=>{const w=un();x(_(w??window.innerHeight/2));const S=()=>{x(b=>b===null?null:_(b))};return window.addEventListener("resize",S),()=>window.removeEventListener("resize",S)},[_]);const k=n.useCallback(w=>{if(!(w.pointerType==="mouse"&&w.button!==0)&&u!==null){try{w.currentTarget.setPointerCapture(w.pointerId)}catch{}c.current={startClientY:w.clientY,startCenterY:u,moved:!1}}},[u]),R=n.useCallback(w=>{const S=c.current;if(!S)return;const b=w.clientY-S.startClientY;!S.moved&&Math.abs(b)>cn&&(S.moved=!0,a(!0)),S.moved&&x(_(S.startCenterY+b))},[_]),y=n.useCallback(w=>{const S=c.current;if(S){try{w.currentTarget.releasePointerCapture(w.pointerId)}catch{}c.current=null,S.moved&&(a(!1),j.current=!0,x(b=>(b!==null&&ft(b),b)))}},[]),L=n.useCallback(()=>{if(j.current){j.current=!1;return}s()},[s]),m=n.useCallback(w=>{if(w.key==="ArrowUp"||w.key==="ArrowDown"){w.preventDefault();const S=w.key==="ArrowUp"?-8:8;x(b=>{if(b===null)return b;const M=_(b+S);return ft(M),M})}},[_]),C=["ll-hidden",`ll-hidden--${l}`,r?"ll-hidden--mobile":"ll-hidden--desktop",i?"ll-hidden--speaking":null,p?"is-dragging":null].filter(Boolean).join(" "),N=u===null?void 0:{top:`${u-f/2}px`,transform:"none"};return e.jsx("button",{type:"button",className:C,onPointerDown:k,onPointerMove:R,onPointerUp:y,onPointerCancel:y,onClick:L,onKeyDown:m,"aria-label":o,"data-position":t,style:N,children:e.jsx(ln,{direction:d,className:"ll-hidden__chevron"})})},fn=({audioLevel:t,bars:r=20,maxHeight:i=20,minHeight:s=4,className:o,barClassName:l})=>{const d=n.useRef(null),f=n.useRef([]),u=n.useMemo(()=>{const p=(Math.sqrt(5)-1)/2;return Array.from({length:r},(a,c)=>.5+c*p%1*.5)},[r]);n.useEffect(()=>t.subscribe(a=>{for(let c=0;c<r;c++){const j=f.current[c];if(!j)continue;const _=Math.max(s,a*i*u[c]);j.style.height=`${_}px`}}),[t,r,i,s,u]);const x=["ll-waveform",o].filter(Boolean).join(" ");return e.jsx("div",{ref:d,className:x,"aria-hidden":"true",children:Array.from({length:r},(p,a)=>e.jsx("div",{ref:c=>{f.current[a]=c},className:["ll-waveform__bar",l].filter(Boolean).join(" "),style:{height:`${s}px`}},a))})},hn=({position:t,isMobile:r,agentName:i,avatarImageUrl:s,agentState:o,isMuted:l,audioLevel:d,onExpand:f,onToggleMute:u,onClose:x})=>r?e.jsx("div",{className:"ll-minimized ll-minimized--mobile",role:"region","aria-label":`${i} widget`,children:e.jsxs("button",{type:"button",className:"ll-minimized__surface",onClick:f,"aria-label":`Expand ${i} widget`,children:[s?e.jsx("img",{src:s,alt:i,className:"ll-minimized__avatar"}):e.jsx("div",{className:"ll-minimized__avatar ll-minimized__avatar--placeholder"}),e.jsx(fn,{audioLevel:d,bars:16,maxHeight:18,className:"ll-minimized__waveform"}),e.jsx("span",{className:"ll-minimized__name",children:i}),e.jsxs("div",{className:"ll-minimized__controls",children:[e.jsx("span",{className:"ll-minimized__btn",role:"button",tabIndex:0,onClick:p=>{p.stopPropagation(),u()},onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.stopPropagation(),p.preventDefault(),u())},"aria-label":l?"Unmute microphone":"Mute microphone",children:e.jsx(ct,{muted:l,className:"ll-minimized__icon"})}),e.jsx(ut,{className:"ll-minimized__icon ll-minimized__icon--expand"})]})]})}):e.jsx("div",{className:"ll-minimized ll-minimized--desktop","data-position":t,role:"region","aria-label":`${i} widget`,children:e.jsxs("div",{className:"ll-minimized__surface",children:[s?e.jsx("img",{src:s,alt:i,className:"ll-minimized__avatar"}):e.jsx("div",{className:"ll-minimized__avatar ll-minimized__avatar--placeholder"}),e.jsxs("div",{className:"ll-minimized__meta",children:[e.jsx("span",{className:"ll-minimized__name",children:i}),e.jsx("span",{className:"ll-minimized__state",children:o==="speaking"?"Speaking":o==="thinking"?"Thinking":"Listening"})]}),e.jsxs("div",{className:"ll-minimized__controls",children:[e.jsx("button",{type:"button",className:"ll-minimized__btn",onClick:u,"aria-label":l?"Unmute microphone":"Mute microphone",children:e.jsx(ct,{muted:l,className:"ll-minimized__icon"})}),e.jsx("button",{type:"button",className:"ll-minimized__btn",onClick:f,"aria-label":`Expand ${i} widget`,children:e.jsx(ut,{className:"ll-minimized__icon"})}),e.jsx("button",{type:"button",className:"ll-minimized__btn ll-minimized__btn--close",onClick:x,"aria-label":"Close widget",children:e.jsx(sn,{className:"ll-minimized__icon"})})]})]})}),pn=({src:t,alt:r,preCannedPlaying:i=!1,className:s,style:o})=>{const[l,d]=n.useState(!1),f=n.useRef(t);if(n.useEffect(()=>{f.current!==t&&(f.current=t,d(!1))},[t]),!t)return null;const u={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",objectPosition:"top",transition:"opacity 500ms ease, transform 500ms ease",transform:i?"scale(1.02)":"scale(1)",opacity:l?1:0,...o};return e.jsx("img",{src:t,alt:r,className:s,style:u,loading:"eager",fetchpriority:"high",onLoad:()=>d(!0)})},mn=({position:t,isMobile:r,agentName:i,avatarImageUrl:s,idleLoopUrl:o,greeting:l,branding:d,teamMembers:f,currentTeamMemberId:u,isSwitchingTeamMember:x,teamSwitcherOpen:p,onToggleTeamSwitcher:a,onSelectTeamMember:c,languageMenuOpen:j,onToggleLanguageMenu:_,connectionState:k,agentState:R,transcript:y,canResume:L,needsUserGesture:m,error:C,isMuted:N,micError:w,micDevices:S,isCameraEnabled:b,cameraPreviewEl:M,cameraDevices:_e,activeCameraId:Te,isScreenShareEnabled:V,screenPreviewEl:q,isSpeakerMuted:Y,allowCamera:we,allowScreenShare:te,allowTyping:ne,avatarVideoContainerRef:re,onConnect:X,onDisconnect:ie,onRetry:se,onResumeAudio:oe,onToggleMute:A,onToggleCamera:Ie,onSwitchCameraDevice:Pe,onToggleScreenShare:De,onToggleSpeaker:ke,onSendMessage:le,onMinimize:ae,onClose:Ce,onClearMicError:ze})=>{var Se;const U=y.length>0?y[y.length-1]:null,T=((f==null?void 0:f.length)??0)>1,J=k==="connecting"||k==="connected",O=k==="connected",G=k==="idle"||k==="disconnected"||k==="error",Q=n.useRef(null),ce=n.useRef(null);n.useEffect(()=>{const h=Q.current;h&&(h.innerHTML="",M&&(M.style.width="100%",M.style.height="100%",M.style.objectFit="cover",M.style.transform="scaleX(-1)",h.appendChild(M)))},[M]),n.useEffect(()=>{const h=ce.current;h&&(h.innerHTML="",q&&(q.style.width="100%",q.style.height="100%",q.style.objectFit="contain",h.appendChild(q)))},[q]);const[$,B]=n.useState(!1),[H,K]=n.useState(!1);n.useEffect(()=>{if(!$&&!H&&!j&&!p)return;const h=()=>{B(!1),K(!1),j&&_(),p&&a()};return document.addEventListener("click",h),()=>document.removeEventListener("click",h)},[$,H,j,p,_,a]);const[ue,de]=n.useState(""),ge=n.useCallback(h=>{h.preventDefault();const D=ue.trim();D&&(le(D),de(""))},[ue,le]),je=d.productName||"Live Layer",fe=O&&(U!=null&&U.text)?U.text:l||"",xe=["ll-expanded",r?"ll-expanded--mobile":"ll-expanded--desktop"].join(" ");return e.jsxs("div",{className:xe,"data-position":t,"data-state":O?"connected":J?"connecting":"idle",role:"dialog","aria-label":`${i} widget`,children:[e.jsxs("div",{className:"ll-expanded__bg",children:[s?e.jsx(pn,{src:s,alt:i,className:"ll-expanded__bg-img"}):e.jsx("div",{className:"ll-expanded__bg-fallback",children:e.jsx("span",{className:"ll-expanded__bg-initial",children:((Se=i==null?void 0:i.charAt(0))==null?void 0:Se.toUpperCase())||"A"})}),o&&!O&&e.jsx("video",{className:"ll-expanded__bg-idle",src:o,autoPlay:!0,loop:!0,muted:!0,playsInline:!0})]}),e.jsx("div",{ref:re,className:"ll-expanded__video"}),k==="connecting"&&e.jsxs("div",{className:"ll-expanded__overlay ll-expanded__overlay--connecting",children:[e.jsx("div",{className:"ll-expanded__spinner"}),e.jsx("p",{className:"ll-expanded__overlay-text",children:x?"Switching...":"Connecting..."})]}),m&&O&&e.jsxs("button",{type:"button",className:"ll-expanded__overlay ll-expanded__overlay--gesture",onClick:oe,children:[e.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:e.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.54.12a5 5 0 0 1 0 5.76l-1.41-1.41a3 3 0 0 0 0-2.94L16.54 9.12z"})}),e.jsx("p",{className:"ll-expanded__overlay-text",children:"Tap to enable audio"})]}),J?e.jsxs("div",{className:"ll-expanded__topbar",children:[e.jsxs("div",{className:"ll-expanded__topbar-left",children:[e.jsxs("div",{className:"ll-expanded__pill-wrap",children:[e.jsxs("button",{type:"button",className:"ll-hpill",onClick:h=>{T&&(h.stopPropagation(),a())},"aria-haspopup":T?"listbox":void 0,"aria-expanded":T?p:void 0,children:[e.jsx("span",{className:"ll-hpill__label",children:i}),T&&e.jsx(Le,{})]}),T&&p&&e.jsx("div",{className:"ll-hmenu",onClick:h=>h.stopPropagation(),role:"listbox",children:f==null?void 0:f.map(h=>e.jsxs("button",{type:"button",className:`ll-hmenu__item ${h.id===u?"is-active":""}`,onClick:()=>c(h.id),role:"option","aria-selected":h.id===u,children:[h.avatarImageUrl&&e.jsx("img",{src:h.avatarImageUrl,alt:"",className:"ll-hmenu__avatar"}),e.jsx("span",{className:"ll-hmenu__name",children:h.name}),h.role&&e.jsx("span",{className:"ll-hmenu__role",children:h.role})]},h.id))})]}),e.jsxs("div",{className:"ll-expanded__pill-wrap",children:[e.jsxs("button",{type:"button",className:"ll-hpill ll-hpill--compact",onClick:h=>{h.stopPropagation(),_()},"aria-haspopup":"listbox","aria-expanded":j,"aria-label":"Language: English",title:"Language: English",children:[e.jsx("span",{className:"ll-hpill__label",children:"EN"}),e.jsx(Le,{})]}),j&&e.jsx("div",{className:"ll-hmenu",onClick:h=>h.stopPropagation(),role:"listbox",children:e.jsx("button",{type:"button",className:"ll-hmenu__item is-active",role:"option","aria-selected":!0,children:e.jsx("span",{className:"ll-hmenu__name",children:"English"})})})]}),e.jsx("span",{className:`ll-expanded__state ll-expanded__state--${R}`,children:R})]}),e.jsxs("div",{className:"ll-expanded__header-actions",children:[e.jsx("button",{type:"button",className:"ll-hbtn",onClick:ae,"aria-label":"Minimize widget",title:"Minimize",children:e.jsx(pt,{})}),e.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--danger",onClick:Ce,"aria-label":"End call",title:"End call",children:e.jsx(ht,{})})]})]}):e.jsxs("div",{className:"ll-expanded__header ll-expanded__header--idle",children:[e.jsx("span",{className:"ll-expanded__brand",children:je}),e.jsxs("div",{className:"ll-expanded__header-actions",children:[e.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--ghost",onClick:ae,"aria-label":"Minimize widget",children:e.jsx(pt,{})}),e.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--danger",onClick:Ce,"aria-label":"Close widget",children:e.jsx(ht,{})})]})]}),G&&(()=>{const h=L?"Restart paused session":k==="disconnected"?"Reconnect to agent":"Start video call",D=L?"Pick up where you left off":null,$e=k==="idle"&&!L&&!C;return e.jsxs(e.Fragment,{children:[$e&&e.jsxs("button",{type:"button",className:"ll-expanded__play",onClick:X,"aria-label":h,children:[e.jsx("div",{className:"ll-expanded__play-circle",children:e.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:e.jsx("polygon",{points:"6 3 20 12 6 21 6 3"})})}),e.jsx("span",{className:"ll-expanded__play-label",children:h})]}),e.jsxs("div",{className:"ll-expanded__bottom ll-expanded__bottom--idle",children:[l&&e.jsx("div",{className:"ll-expanded__transcript",children:e.jsx("p",{className:"ll-expanded__transcript-text",children:l})}),D&&e.jsx("p",{className:"ll-expanded__cta-sublabel",children:D}),e.jsx("button",{type:"button",className:"ll-expanded__cta",onClick:X,"aria-label":h,children:h})]})]})})(),e.jsxs("div",{className:`ll-expanded__pip ${J&&(b||V)?"is-visible":""}`,children:[e.jsx("div",{ref:ce,className:V?"ll-expanded__pip-host":"ll-expanded__pip-host is-hidden"}),e.jsx("div",{ref:Q,className:!V&&b?"ll-expanded__pip-host":"ll-expanded__pip-host is-hidden"})]}),J?e.jsxs("div",{className:"ll-expanded__bottom",children:[fe&&e.jsx("div",{className:"ll-expanded__transcript",children:e.jsx("p",{className:"ll-expanded__transcript-text",children:fe})}),e.jsxs("div",{className:"ll-toolbar",onClick:h=>h.stopPropagation(),children:[te&&e.jsx("button",{type:"button",className:`ll-tool ${V?"is-on":""}`,onClick:De,"aria-label":V?"Stop sharing screen":"Share screen",title:V?"Stop sharing":"Share screen",children:e.jsx(gn,{})}),we&&e.jsxs("div",{className:"ll-tool-split",children:[e.jsx("button",{type:"button",className:`ll-tool ll-tool--left ${b?"is-on":""}`,onClick:Ie,"aria-label":b?"Turn off camera":"Turn on camera",title:b?"Stop camera":"Start camera",children:e.jsx(xn,{})}),e.jsx("button",{type:"button",className:`ll-tool ll-tool--right ${b?"is-on":""}`,onClick:h=>{h.stopPropagation(),K(D=>!D),B(!1)},"aria-label":"Camera devices","aria-haspopup":"listbox","aria-expanded":H,children:e.jsx(Le,{})}),H&&_e.length>0&&e.jsx(mt,{label:"Camera",devices:_e,activeId:Te,onPick:h=>{K(!1),Pe(h)}})]}),e.jsxs("div",{className:"ll-tool-split",children:[e.jsx("button",{type:"button",className:`ll-tool ll-tool--left ${N?"is-muted":""}`,onClick:A,"aria-label":N?"Unmute microphone":"Mute microphone",title:N?"Unmute":"Mute",children:e.jsx(vn,{muted:N})}),e.jsx("button",{type:"button",className:`ll-tool ll-tool--right ${N?"is-muted":""}`,onClick:h=>{h.stopPropagation(),B(D=>!D),K(!1)},"aria-label":"Microphone devices","aria-haspopup":"listbox","aria-expanded":$,children:e.jsx(Le,{})}),$&&S.length>0&&e.jsx(mt,{label:"Microphone",devices:S,activeId:"",onPick:()=>B(!1)})]}),e.jsx("button",{type:"button",className:`ll-tool ${Y?"is-muted":""}`,onClick:ke,"aria-label":Y?"Unmute speaker":"Mute speaker",title:Y?"Unmute speaker":"Mute speaker",children:e.jsx(yn,{muted:Y})})]}),ne&&e.jsxs("form",{className:"ll-message-input",onSubmit:ge,children:[e.jsx("input",{type:"text",className:"ll-message-input__field",placeholder:"Message...",value:ue,onChange:h=>de(h.target.value),"aria-label":"Message the agent"}),ue.trim()&&e.jsx("button",{type:"submit",className:"ll-message-input__send","aria-label":"Send message",children:e.jsx(bn,{})})]}),e.jsx("button",{type:"button",className:"ll-expanded__end",onClick:ie,children:"End conversation"})]}):null,(()=>{if(w&&k!=="error")return e.jsxs("div",{className:"ll-expanded__banner",role:"alert",children:[e.jsx("span",{children:w}),e.jsx("button",{type:"button",className:"ll-expanded__banner-x",onClick:ze,"aria-label":"Dismiss",children:"×"})]});if(!C||k!=="error")return null;let h="Failed to connect",D="Try again";return C==="MIC_PERMISSION_DENIED"?h="Microphone blocked. Allow access to talk.":C==="MIC_NOT_FOUND"?h="No microphone found. Plug one in + retry.":C==="MIC_UNAVAILABLE"?h="Mic unavailable. Check other apps using it.":C==="AGENT_TIMEOUT"?h="Agent didn't pick up. Try again.":C==="CONNECT_FAILED"?h="Connection failed. Check your network.":C.length<80&&(h=C),e.jsxs("div",{className:"ll-expanded__banner ll-expanded__banner--error",role:"alert",children:[e.jsx("span",{children:h}),e.jsx("button",{type:"button",className:"ll-expanded__banner-retry",onClick:se,children:D})]})})()]})};function Le(){return e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":!0,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})}function ht(){return e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function pt(){return e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})})}function gn(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[e.jsx("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2"}),e.jsx("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),e.jsx("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})}function xn(){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[e.jsx("path",{d:"M23 7l-7 5 7 5V7z"}),e.jsx("rect",{x:"1",y:"5",width:"15",height:"14",rx:"2"})]})}function vn({muted:t}){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[e.jsx("path",{d:"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"}),e.jsx("path",{d:"M19 10v2a7 7 0 0 1-14 0v-2"}),e.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),t&&e.jsx("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]})}function yn({muted:t}){return e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[e.jsx("polygon",{points:"11 5 6 9 2 9 2 15 6 15 11 19 11 5"}),t?e.jsx("line",{x1:"23",y1:"9",x2:"17",y2:"15"}):e.jsxs(e.Fragment,{children:[e.jsx("path",{d:"M19.07 4.93a10 10 0 0 1 0 14.14"}),e.jsx("path",{d:"M15.54 8.46a5 5 0 0 1 0 7.07"})]})]})}function bn(){return e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),e.jsx("polyline",{points:"12 5 19 12 12 19"})]})}const mt=({label:t,devices:r,activeId:i,onPick:s})=>e.jsxs("div",{className:"ll-device-menu",onClick:o=>o.stopPropagation(),role:"listbox",children:[e.jsx("p",{className:"ll-device-menu__label",children:t}),r.map((o,l)=>{const d=i===o.deviceId;return e.jsxs("button",{type:"button",className:`ll-device-menu__item ${d?"is-active":""}`,onClick:()=>s(o.deviceId),role:"option","aria-selected":d,children:[d&&e.jsx("span",{className:"ll-device-menu__dot",children:"●"}),e.jsx("span",{className:"ll-device-menu__name",children:o.label||`${t} ${l+1}`})]},o.deviceId||l)})]}),Re=4096,_n=20,wn=20,kn=10,gt=500,Cn=['[data-ll-private="true"]',".ll-widget","script","style","noscript","iframe"];function ye(t){if(t.getAttribute("aria-hidden")==="true"||t.hasAttribute("hidden"))return!0;let r=t;for(;r;){for(const i of Cn)if(r.matches(i))return!0;r=r.parentElement}return!1}function be(t){if(typeof window>"u")return!0;const r=t.getBoundingClientRect();if(r.width<=0||r.height<=0)return!1;const i=window.innerHeight||document.documentElement.clientHeight,s=window.innerWidth||document.documentElement.clientWidth;return r.bottom>0&&r.right>0&&r.top<i&&r.left<s}function jn(t){if(t.type==="password")return!0;const r=(t.getAttribute("autocomplete")||"").toLowerCase();return!!(r==="off"||r.startsWith("cc-"))}function Sn(t){const r=t.getAttribute("id");if(r){const l=document.querySelector(`label[for="${CSS.escape(r)}"]`);if(l!=null&&l.textContent)return l.textContent.trim()}const i=t.getAttribute("aria-label");if(i)return i.trim();const s=t.getAttribute("placeholder");if(s)return s.trim();const o=t.closest("label");return o!=null&&o.textContent?o.textContent.trim():""}function he(t,r){return t.length<=r?t:t.slice(0,r-1)+"…"}function pe(t){return t.length}function Tt(t,r={}){const i=r.doc??(typeof document<"u"?document:null);if(!i)return{url:"",title:"",pathname:"/",regions:[],visibleText:"",visibleLinks:[],visibleFields:[],extras:t};const s=typeof window<"u"&&window.location.href||"",o=typeof window<"u"&&window.location.pathname||"/",l=i.title||"",d=Array.from(i.querySelectorAll("[data-ll-region]")),f=[];for(const m of d){if(f.length>=kn)break;if(ye(m)||!be(m))continue;const C=m.getAttribute("data-ll-region")??"",N=m.getAttribute("data-ll-intent")??void 0,w=he((m.innerText||m.textContent||"").trim(),gt*2);!C||!w||f.push({id:C,intent:N,text:w})}const u=[],x=["H1","H2","H3","H4","H5","H6"],p=Array.from(i.querySelectorAll("h1, h2, h3, h4, h5, h6"));for(const m of p){if(ye(m)||!be(m))continue;const C=(m.textContent||"").trim();C&&u.push(`${m.tagName}: ${he(C,200)}`)}const a=Array.from(i.querySelectorAll("p, li"));for(const m of a){if(ye(m)||!be(m)||x.includes(m.tagName))continue;const C=(m.textContent||"").trim();C.length>10&&u.push(he(C,gt))}const c=u.join(`
2
- `),j=[],_=Array.from(i.querySelectorAll("a[href]"));for(const m of _){if(j.length>=_n)break;if(ye(m)||!be(m))continue;const C=m.getAttribute("href")||"",N=(m.textContent||"").trim();!C||!N||j.push({href:C,text:he(N,100)})}const k=[],R=Array.from(i.querySelectorAll("input, textarea, select"));for(const m of R){if(k.length>=wn)break;if(ye(m)||m instanceof HTMLInputElement&&jn(m)||!be(m))continue;const C=Sn(m),N=m instanceof HTMLInputElement?m.type:m.tagName.toLowerCase();C&&k.push({label:he(C,100),type:N})}const y={url:s,title:l,pathname:o,regions:f,visibleText:c,visibleLinks:j,visibleFields:k,extras:t};let L=pe(JSON.stringify(y.regions))+pe(y.visibleText)+pe(JSON.stringify(y.visibleLinks))+pe(JSON.stringify(y.visibleFields));for(;L>Re&&y.visibleFields.length>0;)y.visibleFields.pop(),L=pe(JSON.stringify(y.visibleFields));for(;L>Re&&y.visibleLinks.length>0;)y.visibleLinks.pop(),L-=80;return pe(y.visibleText)>Re&&(y.visibleText=he(y.visibleText,Re-100)),y}let me=null;function Ve(t,r={}){const i=Date.now(),o=`${typeof window<"u"&&window.location.pathname||"/"}::${typeof window<"u"?window.scrollY:0}`;if(me&&me.key===o&&i-me.at<1e3)return me.ctx;const l=Tt(t,r);return me={key:o,at:i,ctx:l},l}function It(){me=null}const En=new Set(["agent_state","avatar_stream_ready","avatar_active","avatar_idle","bot_ready","agent_error","idle_warning","idle_timeout","navigate","scroll_to","request_page_context"]);function Nn(t){var Qe,Ze,et,tt,nt,rt;const{agentId:r,apiKey:i,baseUrl:s="https://app.livelayer.studio",sessionEndpoint:o,sessionBody:l,autoConnect:d=!1,displayMode:f,defaultDisplayMode:u="expanded",onDisplayModeChange:x,position:p="bottom-right",mobileBreakpoint:a=640,persistKey:c="ll-widget",disablePersistence:j=!1,teamMembers:_,currentTeamMemberId:k,onTeamMemberChange:R,idleLoopUrl:y,greeting:L,avatarImageUrl:m,agentName:C,branding:N={},allowCamera:w=!0,allowScreenShare:S=!0,allowTyping:b=!0,showOn:M,hideOn:_e,pathname:Te,onNavigate:V,onScrollToSelector:q,getPageContext:Y,pageContextExtras:we,onConnect:te,onDisconnect:ne,onTranscript:re,onAgentState:X,onConnectionStateChange:ie,onAgentEvent:se,onAgentCommand:oe,controlledSession:A,className:Ie,style:Pe,zIndex:De=2147483647}=t,ke=Nt(Te),le=At(ke,M,_e);n.useEffect(()=>{It()},[ke]);const ae=k!==void 0,[Ce,ze]=n.useState(()=>{var v;return k??((v=_==null?void 0:_[0])==null?void 0:v.id)}),U=ae?k:Ce,T=n.useMemo(()=>(_==null?void 0:_.find(v=>v.id===U))??null,[_,U]),J=(T==null?void 0:T.agentId)??r,[O,G]=St({value:f,defaultValue:u,onChange:x,persistKey:c,disablePersistence:j}),Q=Et(a),ce=yt(),$=bt(),B=_t(),H=wt(),K=kt(),[ue,de]=n.useState(!1),[ge,je]=n.useState(!1),[fe,xe]=n.useState(!1),[Se,h]=n.useState(!1),[D,$e]=n.useState(!1),Be=n.useRef(V),Ue=n.useRef(q),qe=n.useRef(Y),Ge=n.useRef(we),Ee=n.useRef(null);Be.current=V,Ue.current=q,qe.current=Y,Ge.current=we;const Oe=n.useCallback(v=>{var F;const E=v;if(!(!E.type||typeof E.type!="string")){if(se==null||se({eventName:E.type,data:v}),E.type==="navigate"){const z=typeof E.href=="string"?E.href:null;if(!z){console.warn(`[LiveLayer] Agent emitted "navigate" without href. Skipping. Check your agent's tool schema. See https://livelayer.studio/docs/errors/navigate-missing-href`);return}if(Be.current){try{Be.current(z)}catch(P){console.warn(`[LiveLayer] onNavigate threw for "${z}". Falling back. Error:`,P)}return}if(typeof document<"u"){const P=document.querySelector(`a[href="${z.replace(/"/g,'\\"')}"]`);if(P){P.click();return}}if(typeof window<"u"&&typeof history<"u")try{history.pushState({},"",z),window.dispatchEvent(new PopStateEvent("popstate"))}catch(P){console.warn(`[LiveLayer] history.pushState fallback failed for "${z}". Pass an onNavigate prop to use your router directly. See https://livelayer.studio/docs/react/navigation`,P)}return}if(E.type==="scroll_to"){const z=typeof E.selector=="string"?E.selector:null;if(!z)return;const P=E.behavior==="instant"?"instant":"smooth";if(Ue.current){try{Ue.current(z,P)}catch(W){console.warn("[LiveLayer] onScrollToSelector threw.",W)}return}if(typeof document<"u"){let W=null;try{W=document.querySelector(z)}catch{console.warn(`[LiveLayer] scroll_to: invalid selector "${z}".`);return}if(!W){console.warn(`[LiveLayer] scroll_to: no element matched "${z}". The user may be on a different page. See https://livelayer.studio/docs/errors/scroll-no-match`);return}W.scrollIntoView({behavior:P,block:"start"})}return}if(E.type==="request_page_context"){const z=(F=Ee.current)==null?void 0:F.call(Ee),P=Z=>{const ee=z,Ne=ee==null?void 0:ee.localParticipant;if(Ne!=null&&Ne.publishData)try{const We=new TextEncoder().encode(JSON.stringify(Z));Ne.publishData(We,{reliable:!0})}catch(We){console.warn("[LiveLayer] publishData failed.",We)}},W=Ge.current,it=qe.current;try{if(it){const Z=it(W);if(Z instanceof Promise){P({type:"page_context_pending"}),Z.then(ee=>P({type:"page_context",context:ee})).catch(ee=>{console.warn("[LiveLayer] getPageContext rejected; falling back to default walker.",ee),P({type:"page_context",context:Ve(W)})});return}P({type:"page_context",context:Z});return}P({type:"page_context",context:Ve(W)})}catch(Z){console.warn("[LiveLayer] page-context extraction threw. Sending empty context.",Z),P({type:"page_context",context:{url:"",title:"",pathname:"/",regions:[],visibleText:"",visibleLinks:[],visibleFields:[],extras:W}})}return}En.has(E.type)||oe==null||oe(E)}},[oe,se]),I=vt({agentId:A?"__controlled__":J,baseUrl:s,apiKey:i,sessionEndpoint:o,sessionBody:l,onDataMessage:A?void 0:Oe});n.useEffect(()=>{if(A!=null&&A.subscribeToDataMessages)return A.subscribeToDataMessages(Oe)},[A,Oe]),Ee.current=()=>{var v;return(v=I.getRoom)==null?void 0:v.call(I)};const g=n.useMemo(()=>A?{connectionState:A.connectionState,agentState:A.agentState,transcript:A.transcript,videoElement:A.videoElement,audioElement:A.audioElement,canResume:A.canResume,error:A.error,agentConfig:null,connect:async()=>{await A.onConnect()},disconnect:()=>A.onDisconnect(),getRoom:I.getRoom,isControlled:!0}:{connectionState:I.connectionState,agentState:I.agentState,transcript:I.transcript,videoElement:I.videoElement,audioElement:I.audioElement,canResume:I.canResume,error:I.error,agentConfig:I.agentConfig,connect:I.connect,disconnect:I.disconnect,getRoom:I.getRoom,isControlled:!1},[A,I]),Ke=n.useRef(null);n.useEffect(()=>{const v=g.videoElement,E=Ke.current;if(!(!v||!E))return E.appendChild(v),()=>{v.parentNode===E&&E.removeChild(v)}},[g.videoElement]),n.useEffect(()=>{const v=g.audioElement;if(!v)return;ce.attach(v);const E=v.play();return E&&typeof E.catch=="function"&&E.catch(F=>{(F==null?void 0:F.name)==="NotAllowedError"&&de(!0)}),()=>{ce.detach()}},[g.audioElement]),n.useEffect(()=>{if(g.isControlled||g.connectionState!=="connected")return;const v=g.getRoom();if(v)return $.setupMic(v).catch(()=>{}),B.attachRoom(v),H.attachRoom(v),K.refresh(),()=>{$.teardownMic(),B.teardown(),H.teardown()}},[g.isControlled,g.connectionState]),n.useEffect(()=>{const v=g.audioElement;v&&(v.muted=D)},[g.audioElement,D]);const Pt=n.useCallback(v=>{const E=g.getRoom();if(E)try{const F=new TextEncoder().encode(JSON.stringify({type:"user_message",text:v}));E.localParticipant.publishData(F,{reliable:!0})}catch{}},[g]),Dt=n.useCallback(()=>{$e(v=>!v)},[]);n.useEffect(()=>{ie==null||ie(g.connectionState),g.connectionState==="connected"?te==null||te():g.connectionState==="disconnected"&&(ne==null||ne())},[g.connectionState,te,ne,ie]),n.useEffect(()=>{re==null||re(g.transcript)},[g.transcript,re]),n.useEffect(()=>{X==null||X(g.agentState)},[g.agentState,X]);const Ye=n.useRef(!1);n.useEffect(()=>{g.isControlled||!d||Ye.current||le&&g.connectionState==="idle"&&(Ye.current=!0,g.connect())},[d,g.connectionState,g,le]);const zt=n.useCallback(v=>{const E=_==null?void 0:_.find(F=>F.id===v);E&&(xe(!1),v!==U&&(je(!0),g.disconnect(),ae||ze(v),R==null||R(E)))},[_,U,g,ae,R]);n.useEffect(()=>{ge&&g.connectionState==="connected"&&je(!1)},[g.connectionState,ge]),n.useEffect(()=>{if(!fe)return;const v=E=>{E.key==="Escape"&&xe(!1)};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[fe]);const $t=!!m||!!(T!=null&&T.avatarImageUrl)||g.isControlled,He=Ct(J,s,$t),Fe=(T==null?void 0:T.name)??C??((Qe=g.agentConfig)==null?void 0:Qe.name)??((Ze=He.info)==null?void 0:Ze.name)??"Live Layer",Xe=(T==null?void 0:T.avatarImageUrl)??m??((et=g.agentConfig)==null?void 0:et.avatarImageUrl)??((tt=He.info)==null?void 0:tt.avatarImageUrl)??null,Bt=y??((nt=g.agentConfig)==null?void 0:nt.idleLoopUrl)??((rt=He.info)==null?void 0:rt.idleLoopUrl)??null,Ut=L??null,Ot=n.useCallback(()=>G("expanded"),[G]),Ht=n.useCallback(()=>G("minimized"),[G]),Je=n.useCallback(()=>{g.disconnect(),G("hidden")},[g,G]),Ft=n.useCallback(()=>{const v=g.audioElement;v&&v.play().then(()=>de(!1)).catch(()=>{})},[g.audioElement]),Wt=n.useCallback(()=>{de(!1),g.connect()},[g]),ve={...Pe,zIndex:De};N.primaryColor&&(ve["--ll-color-primary"]=N.primaryColor),N.accentColor&&(ve["--ll-color-accent"]=N.accentColor),N.backgroundColor&&(ve["--ll-color-bg"]=N.backgroundColor),N.textColor&&(ve["--ll-color-fg"]=N.textColor);const Vt=["ll-widget",`ll-widget--${O}`,`ll-widget--${Q?"mobile":"desktop"}`,Ie].filter(Boolean).join(" ");return le?e.jsxs("div",{className:Vt,style:ve,"data-display-mode":O,"data-position":p,children:[O==="hidden"&&e.jsx(dn,{position:p,isMobile:Q,isSpeaking:g.agentState==="speaking",onExpand:()=>G("expanded"),label:`Open ${Fe} widget`}),O==="minimized"&&e.jsx(hn,{position:p,isMobile:Q,agentName:Fe,avatarImageUrl:Xe,agentState:g.agentState,isMuted:$.isMuted,audioLevel:ce,onExpand:Ot,onToggleMute:$.toggleMute,onClose:Je}),O==="expanded"&&e.jsx(mn,{position:p,isMobile:Q,agentName:Fe,avatarImageUrl:Xe,idleLoopUrl:Bt,greeting:Ut,branding:N,teamMembers:_,currentTeamMemberId:U,isSwitchingTeamMember:ge,teamSwitcherOpen:fe,onToggleTeamSwitcher:()=>xe(v=>!v),onSelectTeamMember:zt,connectionState:g.connectionState,agentState:g.agentState,transcript:g.transcript,isMuted:$.isMuted,micDevices:K.mics,isCameraEnabled:B.isEnabled,cameraPreviewEl:B.previewEl,cameraDevices:K.cameras,activeCameraId:B.activeDeviceId,isScreenShareEnabled:H.isEnabled,screenPreviewEl:H.previewEl,isSpeakerMuted:D,allowCamera:w,allowScreenShare:S,allowTyping:b,languageMenuOpen:Se,onToggleLanguageMenu:()=>h(v=>!v),needsUserGesture:ue,canResume:g.canResume,micError:$.micError,error:g.error,avatarVideoContainerRef:Ke,onConnect:()=>void g.connect(),onDisconnect:()=>g.disconnect(),onRetry:Wt,onResumeAudio:Ft,onToggleMute:$.toggleMute,onToggleCamera:()=>void B.toggle(),onSwitchCameraDevice:v=>void B.switchDevice(v),onToggleScreenShare:()=>void H.toggle(),onToggleSpeaker:Dt,onSendMessage:Pt,onMinimize:Ht,onClose:Je,onClearMicError:$.clearError})]}):null}function Ln(t){return e.jsx(xt,{children:e.jsx(Nn,{...t})})}const Rn=({agentId:t,baseUrl:r,apiKey:i,mode:s,onAgentEvent:o,className:l,style:d})=>{const f=n.useRef(null),u=n.useRef(null),x=n.useRef(o);x.current=o;const p=n.useCallback(a=>{var j;const c=a.detail;(j=x.current)==null||j.call(x,c)},[]);return n.useEffect(()=>{const a=f.current;if(!a)return;const c=document.createElement("livelayer-widget");return c.setAttribute("agent-id",t),r&&c.setAttribute("base-url",r),i&&c.setAttribute("api-key",i),s&&c.setAttribute("mode",s),c.addEventListener("agent-event",p),a.appendChild(c),u.current=c,()=>{c.removeEventListener("agent-event",p),a.removeChild(c),u.current=null}},[t]),n.useEffect(()=>{u.current&&(s?u.current.setAttribute("mode",s):u.current.removeAttribute("mode"))},[s]),e.jsx("div",{ref:f,className:l,style:d})},An=n.forwardRef(function({id:r,intent:i,as:s="div",className:o,style:l,children:d},f){return n.createElement(s,{ref:f,"data-ll-region":r,"data-ll-intent":i,className:o,style:l},d)});function Mn(){const[t,r]=n.useState([]),i=n.useCallback(o=>{r(l=>{const d=l.findIndex(f=>f.id===o.id);if(d>=0){const f=l.slice();return f[d]=o,f}return[...l,o]})},[]),s=n.useCallback(()=>r([]),[]);return{entries:t,pushSegment:i,clear:s,latest:t.length>0?t[t.length-1]:null}}exports.AvatarWidget=Ln;exports.ErrorBoundary=xt;exports.LiveLayerRegion=An;exports.LiveLayerWidget=Rn;exports.clearPageContextCache=It;exports.extractPageContext=Tt;exports.getCachedPageContext=Ve;exports.matchesPattern=Lt;exports.shouldRenderAtPath=Rt;exports.useAgentInfo=Ct;exports.useAudioLevel=yt;exports.useCameraState=_t;exports.useDisplayMode=jt;exports.useDisplayModePersistence=St;exports.useIsMobile=Et;exports.useLiveKitSession=vt;exports.useMediaDevices=kt;exports.useMicrophoneState=bt;exports.usePathname=Nt;exports.useRouteMatch=At;exports.useScreenShareState=wt;exports.useTranscript=Mn;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),r=require("react"),pn=require("@livelayer/sdk"),Oe=require("livekit-client");class At extends r.Component{constructor(){super(...arguments),this.state={hasError:!1,error:null},this.reset=()=>{this.setState({hasError:!1,error:null})}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,i){var o,s;(s=(o=this.props).onError)==null||s.call(o,n,i)}render(){var n;return this.state.hasError?this.props.fallback?this.props.fallback:t.jsxs("div",{className:"ll-error-boundary",role:"alert",children:[t.jsx("p",{className:"ll-error-boundary__title",children:"Widget crashed"}),t.jsx("p",{className:"ll-error-boundary__message",children:((n=this.state.error)==null?void 0:n.message)||"Something went wrong."}),t.jsx("button",{type:"button",className:"ll-error-boundary__retry",onClick:this.reset,children:"Reload widget"})]}):this.props.children}}function Mt(e){const[n,i]=r.useState("idle"),[o,s]=r.useState("idle"),[l,u]=r.useState([]),[d,f]=r.useState(null),[y,h]=r.useState(null),[a,c]=r.useState(null),[j,C]=r.useState(!1),[E,T]=r.useState(null),N=r.useRef(null),M=r.useRef(e.onDataMessage);M.current=e.onDataMessage,r.useEffect(()=>{const x={onConnectionStateChange:w=>{i(w),w==="connected"&&T(null)},onAgentStateChange:s,onTranscript:w=>u([...w]),onAgentConfig:f,onAudioTrack:w=>c(w),onVideoTrack:w=>h(w),onVideoTrackRemoved:()=>h(null),onError:w=>T(w),onDataMessage:w=>{var I;(I=M.current)==null||I.call(M,w)},onResumabilityChange:C},S=new pn.LiveKitSession({agentId:e.agentId,baseUrl:e.baseUrl,apiKey:e.apiKey,sessionEndpoint:e.sessionEndpoint,sessionBody:e.sessionBody},x);return N.current=S,i("idle"),s("idle"),u([]),f(null),h(null),c(null),C(!1),T(null),()=>{var w;(w=S.destroy)==null||w.call(S),N.current=null}},[e.agentId,e.baseUrl,e.apiKey,e.sessionEndpoint,JSON.stringify(e.sessionBody??{})]);const L=r.useCallback(async()=>{const x=N.current;if(x)try{await x.connect()}catch(S){throw T(S instanceof Error?S.message:String(S)),S}},[]),A=r.useCallback(()=>{const x=N.current;x&&x.disconnect()},[]),g=r.useCallback(()=>{var x;return((x=N.current)==null?void 0:x.getRoom())??null},[]);return{connectionState:n,agentState:o,transcript:l,agentConfig:d,videoElement:y,audioElement:a,canResume:j,error:E,connect:L,disconnect:A,getRoom:g,session:N.current}}function Tt(){const e=r.useRef(null),n=r.useRef(null),i=r.useRef(null),o=r.useRef(null),s=r.useRef(new Set),l=r.useRef(null),u=r.useCallback(()=>{const a=n.current;if(!a){o.current=null;return}(!l.current||l.current.length!==a.frequencyBinCount)&&(l.current=new Uint8Array(new ArrayBuffer(a.frequencyBinCount)));const c=l.current;a.getByteFrequencyData(c);let j=0;for(let E=0;E<c.length;E++)j+=c[E];const C=j/c.length/255;for(const E of s.current)try{E(C)}catch(T){console.error("[useAudioLevel] subscriber threw:",T)}o.current=requestAnimationFrame(u)},[]),d=r.useCallback(()=>{if(e.current||typeof window>"u"||typeof AudioContext>"u")return;const a=new AudioContext,c=a.createAnalyser();c.fftSize=64,c.connect(a.destination),e.current=a,n.current=c},[]),f=r.useCallback(a=>{if(d(),!(!e.current||!n.current)){if(i.current){try{i.current.disconnect()}catch{}i.current=null}try{const c=e.current.createMediaElementSource(a);c.connect(n.current),i.current=c}catch(c){console.warn("[useAudioLevel] createMediaElementSource failed:",c);return}o.current===null&&(o.current=requestAnimationFrame(u))}},[d,u]),y=r.useCallback(()=>{if(o.current!==null&&(cancelAnimationFrame(o.current),o.current=null),i.current){try{i.current.disconnect()}catch{}i.current=null}},[]),h=r.useCallback(a=>(s.current.add(a),()=>{s.current.delete(a)}),[]);return r.useEffect(()=>()=>{if(y(),n.current){try{n.current.disconnect()}catch{}n.current=null}if(e.current){try{e.current.close()}catch{}e.current=null}s.current.clear(),l.current=null},[y]),{attach:f,detach:y,subscribe:h}}function It(){const[e,n]=r.useState(!1),[i,o]=r.useState(null),s=r.useRef(null),l=r.useRef(null),u=r.useCallback(async h=>{if(s.current&&l.current){try{await l.current.localParticipant.unpublishTrack(s.current)}catch{}s.current.stop(),s.current=null}l.current=h,o(null);try{const a=await Oe.createLocalAudioTrack({echoCancellation:!0,noiseSuppression:!0});await h.localParticipant.publishTrack(a),s.current=a,n(a.isMuted)}catch(a){const c=a instanceof Error&&a.name==="NotAllowedError"?"Enable your microphone to talk with the agent.":"Microphone unavailable. Check browser permissions and try again.";throw o(c),a}},[]),d=r.useCallback(()=>{const h=s.current;h&&(h.isMuted?(h.unmute(),n(!1)):(h.mute(),n(!0)))},[]),f=r.useCallback(()=>{const h=s.current,a=l.current;if(h&&a){try{a.localParticipant.unpublishTrack(h)}catch{}h.stop()}s.current=null,l.current=null,n(!1)},[]),y=r.useCallback(()=>o(null),[]);return{isMuted:e,micError:i,toggleMute:d,setupMic:u,teardownMic:f,clearError:y}}const hn={resolution:{width:640,height:480,frameRate:24}};function Pt(){const[e,n]=r.useState(!1),[i,o]=r.useState(null),[s,l]=r.useState(null),[u,d]=r.useState(""),f=r.useRef(null),y=r.useRef(null),h=r.useCallback(N=>{f.current=N},[]),a=r.useCallback(()=>{const N=f.current,M=y.current;if(M&&N){const L=N.localParticipant.getTrackPublication(Oe.Track.Source.Camera);if(L!=null&&L.track){try{N.localParticipant.unpublishTrack(L.track)}catch{}L.track.stop()}else M.stop()}y.current=null,l(null),n(!1)},[]),c=r.useCallback(async N=>{const M=f.current;if(M){o(null);try{const L={...hn};N&&(L.deviceId=N);const A=await Oe.createLocalVideoTrack(L);await M.localParticipant.publishTrack(A),y.current=A;const g=A.attach();l(g),n(!0),N&&d(N);try{M.localParticipant.publishData(new TextEncoder().encode(JSON.stringify({type:"user_camera_on"})),{reliable:!0})}catch{}}catch(L){const A=L instanceof Error&&L.name==="NotAllowedError"?"Enable your camera in the browser to share video.":"Camera unavailable. Check permissions and try again.";o(A)}}},[]),j=r.useCallback(async()=>{e?a():await c(u||void 0)},[e,u,a,c]),C=r.useCallback(async N=>{a(),await c(N)},[a,c]),E=r.useCallback(()=>{a(),f.current=null,o(null),d("")},[a]),T=r.useCallback(()=>o(null),[]);return r.useEffect(()=>()=>{y.current&&y.current.stop()},[]),{isEnabled:e,error:i,previewEl:s,activeDeviceId:u,toggle:j,switchDevice:C,attachRoom:h,teardown:E,clearError:T}}function Dt(){const[e,n]=r.useState(!1),[i,o]=r.useState(null),[s,l]=r.useState(null),u=r.useRef(null),d=r.useCallback(c=>{u.current=c},[]),f=r.useCallback(()=>l(null),[]),y=r.useCallback(async()=>{const c=u.current;if(c){if(e){try{await c.localParticipant.setScreenShareEnabled(!1)}catch{}f(),n(!1);return}o(null);try{await c.localParticipant.setScreenShareEnabled(!0);let j=0;const C=()=>{const E=c.localParticipant.getTrackPublication(Oe.Track.Source.ScreenShare);if(E!=null&&E.track){const T=E.track.attach();l(T),n(!0);try{c.localParticipant.publishData(new TextEncoder().encode(JSON.stringify({type:"user_screen_share_on"})),{reliable:!0})}catch{}return}j++<10?setTimeout(C,100):n(!0)};C()}catch(j){const C=j instanceof Error?j.name:"";C!=="NotAllowedError"&&C!=="AbortError"&&o("Screen share unavailable. Try again."),n(!1)}}},[e,f]),h=r.useCallback(()=>{const c=u.current;if(c&&e)try{c.localParticipant.setScreenShareEnabled(!1)}catch{}f(),n(!1),o(null),u.current=null},[e,f]),a=r.useCallback(()=>o(null),[]);return{isEnabled:e,error:i,previewEl:s,toggle:y,attachRoom:d,teardown:h,clearError:a}}function $t(){const[e,n]=r.useState([]),[i,o]=r.useState([]),s=r.useCallback(async()=>{if(!(typeof navigator>"u"||!navigator.mediaDevices))try{const l=await navigator.mediaDevices.enumerateDevices();n(l.filter(u=>u.kind==="audioinput")),o(l.filter(u=>u.kind==="videoinput"))}catch{}},[]);return r.useEffect(()=>{if(s(),typeof navigator>"u"||!navigator.mediaDevices)return;const l=()=>void s();return navigator.mediaDevices.addEventListener("devicechange",l),()=>navigator.mediaDevices.removeEventListener("devicechange",l)},[s]),{mics:e,cameras:i,refresh:s}}function zt(e,n,i=!1){const[o,s]=r.useState(null),[l,u]=r.useState(null),[d,f]=r.useState(!i&&!!e);return r.useEffect(()=>{if(i||!e){f(!1);return}const y=new AbortController,h=n||"https://app.livelayer.studio";return f(!0),u(null),fetch(`${h}/api/widget/agent/${encodeURIComponent(e)}`,{signal:y.signal}).then(async a=>{if(!a.ok){const c=await a.json().catch(()=>({}));throw new Error(c.error||`HTTP ${a.status}`)}return a.json()}).then(a=>{y.signal.aborted||(s(a),f(!1))}).catch(a=>{y.signal.aborted||(u(a instanceof Error?a.message:"Agent lookup failed"),f(!1))}),()=>y.abort()},[e,n,i]),{info:o,error:l,loading:d}}function mn(e){if(typeof window>"u")return null;try{return window.localStorage.getItem(e)}catch{return null}}function gn(e,n){if(!(typeof window>"u"))try{window.localStorage.setItem(e,n)}catch{}}function Ht({value:e,defaultValue:n="expanded",onChange:i}={}){const o=e!==void 0,[s,l]=r.useState(n),u=o?e:s,d=r.useCallback(f=>{f!==u&&(o||l(f),i==null||i(f))},[u,o,i]);return[u,d]}const yn=["hidden","minimized","expanded"];function xn(e){return e&&yn.includes(e)?e:null}function Ot({value:e,defaultValue:n="expanded",onChange:i,persistKey:o="ll-widget",disablePersistence:s=!1}={}){const l=`${o}:display-mode`,u=r.useRef(!1),[d,f]=Ht({value:e,defaultValue:n,onChange:y=>{e===void 0&&!s&&gn(l,y),i==null||i(y)}});return r.useEffect(()=>{if(u.current||(u.current=!0,s||e!==void 0))return;const y=xn(mn(l));y&&y!==d&&f(y)},[]),[d,f]}const vn=640;function Ft(e=vn){const[n,i]=r.useState(!1);return r.useEffect(()=>{if(e===!1){i(!1);return}if(typeof window>"u"||typeof window.matchMedia>"u")return;const o=`(max-width: ${e-1}px)`,s=window.matchMedia(o),l=()=>i(s.matches);return l(),typeof s.addEventListener=="function"?(s.addEventListener("change",l),()=>s.removeEventListener("change",l)):(s.addListener(l),()=>{s.removeListener(l)})},[e]),n}const xt="__llHistoryPatched",Fe="ll:pathname";function bn(){if(typeof window>"u"||window.history[xt])return;const e=window.history.pushState,n=window.history.replaceState;window.history.pushState=function(...i){const o=e.apply(this,i);return window.dispatchEvent(new Event(Fe)),o},window.history.replaceState=function(...i){const o=n.apply(this,i);return window.dispatchEvent(new Event(Fe)),o},window.history[xt]=!0}function vt(){return typeof window>"u"?"/":window.location.pathname||"/"}function qt(e){const[n,i]=r.useState(()=>e??vt());return r.useEffect(()=>{if(e!==void 0)return;bn();const o=()=>i(vt());return o(),window.addEventListener("popstate",o),window.addEventListener(Fe,o),()=>{window.removeEventListener("popstate",o),window.removeEventListener(Fe,o)}},[e]),e??n}const bt=new Map,wn=/[\\^$+?.()|{}[\]]/g;function _n(e){return e.replace(wn,"\\$&")}function kn(e){const n=bt.get(e);if(n)return n;const i=e.length>1&&e.endsWith("/")?e.slice(0,-1):e,o="",s="",l=i.replace(/\*\*/g,o).replace(/\*/g,s),d=_n(l).replace(new RegExp(`\\/${o}`,"g"),"(?:\\/.*)?").replace(new RegExp(o,"g"),".*").replace(new RegExp(s,"g"),"[^/]+"),f=new RegExp(`^${d}\\/?$`);return bt.set(e,f),f}function Cn(e,n){const i=n.length>1&&n.endsWith("/")?n.slice(0,-1):n;return kn(e).test(i)}function Bt(e,n){return typeof e=="function"?e(n):e instanceof RegExp?e.test(n):Cn(e,n)}function wt(e,n){if(!e||e.length===0)return!1;for(const i of e)if(Bt(i,n))return!0;return!1}function Ut(e,n,i){return e===void 0?!0:wt(i,e)?!1:n&&n.length>0?wt(n,e):!0}function Wt(e,n,i){return r.useMemo(()=>Ut(e,n,i),[e,n,i])}const _t=({muted:e=!1,className:n})=>e?t.jsxs("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:[t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"}),t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2"})]}):t.jsx("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4M12 1a3 3 0 00-3 3v4a3 3 0 006 0V4a3 3 0 00-3-3z"})}),kt=({className:e})=>t.jsx("svg",{className:e,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"})}),Sn=({className:e})=>t.jsx("svg",{className:e,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})}),jn={left:180,right:0,up:-90,down:90},En=({direction:e="right",className:n})=>t.jsx("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,style:{transform:`rotate(${jn[e]}deg)`},"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 6l6 6-6 6"})});function Ln(e){return e==="top-left"||e==="bottom-left"?"left":"right"}const Vt="ll-hidden-tab-center-y",Nn=5,Ct=16;function Rn(){if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Vt);if(!e)return null;const n=Number.parseFloat(e);return Number.isFinite(n)?n:null}catch{return null}}function St(e){if(!(typeof window>"u"))try{window.localStorage.setItem(Vt,String(e))}catch{}}const An=({position:e,isMobile:n,isSpeaking:i,onExpand:o,label:s="Open widget"})=>{const l=Ln(e),u=l==="right"?"left":"right",d=n?80:72,[f,y]=r.useState(null),[h,a]=r.useState(!1),c=r.useRef(null),j=r.useRef(!1),C=r.useCallback(x=>{if(typeof window>"u")return x;const S=d/2,w=Ct+S,I=window.innerHeight-Ct-S;return I<w?Math.max(w,x):Math.max(w,Math.min(I,x))},[d]);r.useEffect(()=>{const x=Rn();y(C(x??window.innerHeight/2));const S=()=>{y(w=>w===null?null:C(w))};return window.addEventListener("resize",S),()=>window.removeEventListener("resize",S)},[C]);const E=r.useCallback(x=>{if(!(x.pointerType==="mouse"&&x.button!==0)&&f!==null){try{x.currentTarget.setPointerCapture(x.pointerId)}catch{}c.current={startClientY:x.clientY,startCenterY:f,moved:!1}}},[f]),T=r.useCallback(x=>{const S=c.current;if(!S)return;const w=x.clientY-S.startClientY;!S.moved&&Math.abs(w)>Nn&&(S.moved=!0,a(!0)),S.moved&&y(C(S.startCenterY+w))},[C]),N=r.useCallback(x=>{const S=c.current;if(S){try{x.currentTarget.releasePointerCapture(x.pointerId)}catch{}c.current=null,S.moved&&(a(!1),j.current=!0,y(w=>(w!==null&&St(w),w)))}},[]),M=r.useCallback(()=>{if(j.current){j.current=!1;return}o()},[o]),L=r.useCallback(x=>{if(x.key==="ArrowUp"||x.key==="ArrowDown"){x.preventDefault();const S=x.key==="ArrowUp"?-8:8;y(w=>{if(w===null)return w;const I=C(w+S);return St(I),I})}},[C]),A=["ll-hidden",`ll-hidden--${l}`,n?"ll-hidden--mobile":"ll-hidden--desktop",i?"ll-hidden--speaking":null,h?"is-dragging":null].filter(Boolean).join(" "),g=f===null?void 0:{top:`${f-d/2}px`,transform:"none"};return t.jsx("button",{type:"button",className:A,onPointerDown:E,onPointerMove:T,onPointerUp:N,onPointerCancel:N,onClick:M,onKeyDown:L,"aria-label":s,"data-position":e,style:g,children:t.jsx(En,{direction:u,className:"ll-hidden__chevron"})})},Mn=({audioLevel:e,bars:n=20,maxHeight:i=20,minHeight:o=4,className:s,barClassName:l})=>{const u=r.useRef(null),d=r.useRef([]),f=r.useMemo(()=>{const h=(Math.sqrt(5)-1)/2;return Array.from({length:n},(a,c)=>.5+c*h%1*.5)},[n]);r.useEffect(()=>e.subscribe(a=>{for(let c=0;c<n;c++){const j=d.current[c];if(!j)continue;const C=Math.max(o,a*i*f[c]);j.style.height=`${C}px`}}),[e,n,i,o,f]);const y=["ll-waveform",s].filter(Boolean).join(" ");return t.jsx("div",{ref:u,className:y,"aria-hidden":"true",children:Array.from({length:n},(h,a)=>t.jsx("div",{ref:c=>{d.current[a]=c},className:["ll-waveform__bar",l].filter(Boolean).join(" "),style:{height:`${o}px`}},a))})},Tn=({position:e,isMobile:n,agentName:i,avatarImageUrl:o,agentState:s,isMuted:l,audioLevel:u,onExpand:d,onToggleMute:f,onClose:y})=>n?t.jsx("div",{className:"ll-minimized ll-minimized--mobile",role:"region","aria-label":`${i} widget`,children:t.jsxs("button",{type:"button",className:"ll-minimized__surface",onClick:d,"aria-label":`Expand ${i} widget`,children:[o?t.jsx("img",{src:o,alt:i,className:"ll-minimized__avatar"}):t.jsx("div",{className:"ll-minimized__avatar ll-minimized__avatar--placeholder"}),t.jsx(Mn,{audioLevel:u,bars:16,maxHeight:18,className:"ll-minimized__waveform"}),t.jsx("span",{className:"ll-minimized__name",children:i}),t.jsxs("div",{className:"ll-minimized__controls",children:[t.jsx("span",{className:"ll-minimized__btn",role:"button",tabIndex:0,onClick:h=>{h.stopPropagation(),f()},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.stopPropagation(),h.preventDefault(),f())},"aria-label":l?"Unmute microphone":"Mute microphone",children:t.jsx(_t,{muted:l,className:"ll-minimized__icon"})}),t.jsx(kt,{className:"ll-minimized__icon ll-minimized__icon--expand"})]})]})}):t.jsx("div",{className:"ll-minimized ll-minimized--desktop","data-position":e,role:"region","aria-label":`${i} widget`,children:t.jsxs("div",{className:"ll-minimized__surface",children:[o?t.jsx("img",{src:o,alt:i,className:"ll-minimized__avatar"}):t.jsx("div",{className:"ll-minimized__avatar ll-minimized__avatar--placeholder"}),t.jsxs("div",{className:"ll-minimized__meta",children:[t.jsx("span",{className:"ll-minimized__name",children:i}),t.jsx("span",{className:"ll-minimized__state",children:s==="speaking"?"Speaking":s==="thinking"?"Thinking":"Listening"})]}),t.jsxs("div",{className:"ll-minimized__controls",children:[t.jsx("button",{type:"button",className:"ll-minimized__btn",onClick:f,"aria-label":l?"Unmute microphone":"Mute microphone",children:t.jsx(_t,{muted:l,className:"ll-minimized__icon"})}),t.jsx("button",{type:"button",className:"ll-minimized__btn",onClick:d,"aria-label":`Expand ${i} widget`,children:t.jsx(kt,{className:"ll-minimized__icon"})}),t.jsx("button",{type:"button",className:"ll-minimized__btn ll-minimized__btn--close",onClick:y,"aria-label":"Close widget",children:t.jsx(Sn,{className:"ll-minimized__icon"})})]})]})}),In=({src:e,alt:n,preCannedPlaying:i=!1,className:o,style:s})=>{const[l,u]=r.useState(!1),d=r.useRef(e);if(r.useEffect(()=>{d.current!==e&&(d.current=e,u(!1))},[e]),!e)return null;const f={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",objectPosition:"top",transition:"opacity 500ms ease, transform 500ms ease",transform:i?"scale(1.02)":"scale(1)",opacity:l?1:0,...s};return t.jsx("img",{src:e,alt:n,className:o,style:f,loading:"eager",fetchpriority:"high",onLoad:()=>u(!0)})},Pn=({position:e,isMobile:n,agentName:i,avatarImageUrl:o,idleLoopUrl:s,greeting:l,branding:u,teamMembers:d,currentTeamMemberId:f,isSwitchingTeamMember:y,teamSwitcherOpen:h,onToggleTeamSwitcher:a,onSelectTeamMember:c,languageMenuOpen:j,onToggleLanguageMenu:C,connectionState:E,agentState:T,transcript:N,canResume:M,needsUserGesture:L,error:A,isMuted:g,micError:x,micDevices:S,isCameraEnabled:w,cameraPreviewEl:I,cameraDevices:W,activeCameraId:oe,isScreenShareEnabled:V,screenPreviewEl:K,isSpeakerMuted:se,allowCamera:Ae,allowScreenShare:Me,allowTyping:Te,avatarVideoContainerRef:Ie,onConnect:le,onDisconnect:de,onRetry:fe,onResumeAudio:pe,onToggleMute:he,onToggleCamera:me,onSwitchCameraDevice:ge,onToggleScreenShare:D,onToggleSpeaker:Be,onSendMessage:Pe,onMinimize:De,onClose:_e,onClearMicError:ke})=>{var Ee;const Z=N.length>0?N[N.length-1]:null,ae=((d==null?void 0:d.length)??0)>1,ye=E==="connecting"||E==="connected",Y=E==="connected",F=E==="idle"||E==="disconnected"||E==="error",Ce=r.useRef(null),ee=r.useRef(null);r.useEffect(()=>{const m=Ce.current;m&&(m.innerHTML="",I&&(I.style.width="100%",I.style.height="100%",I.style.objectFit="cover",I.style.transform="scaleX(-1)",m.appendChild(I)))},[I]),r.useEffect(()=>{const m=ee.current;m&&(m.innerHTML="",K&&(K.style.width="100%",K.style.height="100%",K.style.objectFit="contain",m.appendChild(K)))},[K]);const[B,Q]=r.useState(!1),[te,q]=r.useState(!1);r.useEffect(()=>{if(!B&&!te&&!j&&!h)return;const m=()=>{Q(!1),q(!1),j&&C(),h&&a()};return document.addEventListener("click",m),()=>document.removeEventListener("click",m)},[B,te,j,h,C,a]);const[U,ne]=r.useState(""),Se=r.useCallback(m=>{m.preventDefault();const H=U.trim();H&&(Pe(H),ne(""))},[U,Pe]),Ue=u.productName||"Live Layer",xe=Y&&(Z!=null&&Z.text)?Z.text:l||"",je=["ll-expanded",n?"ll-expanded--mobile":"ll-expanded--desktop"].join(" ");return t.jsxs("div",{className:je,"data-position":e,"data-state":Y?"connected":ye?"connecting":"idle",role:"dialog","aria-label":`${i} widget`,children:[t.jsxs("div",{className:"ll-expanded__bg",children:[o?t.jsx(In,{src:o,alt:i,className:"ll-expanded__bg-img"}):t.jsx("div",{className:"ll-expanded__bg-fallback",children:t.jsx("span",{className:"ll-expanded__bg-initial",children:((Ee=i==null?void 0:i.charAt(0))==null?void 0:Ee.toUpperCase())||"A"})}),s&&!Y&&t.jsx("video",{className:"ll-expanded__bg-idle",src:s,autoPlay:!0,loop:!0,muted:!0,playsInline:!0})]}),t.jsx("div",{ref:Ie,className:"ll-expanded__video"}),E==="connecting"&&t.jsxs("div",{className:"ll-expanded__overlay ll-expanded__overlay--connecting",children:[t.jsx("div",{className:"ll-expanded__spinner"}),t.jsx("p",{className:"ll-expanded__overlay-text",children:y?"Switching...":"Connecting..."})]}),L&&Y&&t.jsxs("button",{type:"button",className:"ll-expanded__overlay ll-expanded__overlay--gesture",onClick:pe,children:[t.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:t.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.54.12a5 5 0 0 1 0 5.76l-1.41-1.41a3 3 0 0 0 0-2.94L16.54 9.12z"})}),t.jsx("p",{className:"ll-expanded__overlay-text",children:"Tap to enable audio"})]}),ye?t.jsxs("div",{className:"ll-expanded__topbar",children:[t.jsxs("div",{className:"ll-expanded__topbar-left",children:[t.jsxs("div",{className:"ll-expanded__pill-wrap",children:[t.jsxs("button",{type:"button",className:"ll-hpill",onClick:m=>{ae&&(m.stopPropagation(),a())},"aria-haspopup":ae?"listbox":void 0,"aria-expanded":ae?h:void 0,children:[t.jsx("span",{className:"ll-hpill__label",children:i}),ae&&t.jsx(ze,{})]}),ae&&h&&t.jsx("div",{className:"ll-hmenu",onClick:m=>m.stopPropagation(),role:"listbox",children:d==null?void 0:d.map(m=>t.jsxs("button",{type:"button",className:`ll-hmenu__item ${m.id===f?"is-active":""}`,onClick:()=>c(m.id),role:"option","aria-selected":m.id===f,children:[m.avatarImageUrl&&t.jsx("img",{src:m.avatarImageUrl,alt:"",className:"ll-hmenu__avatar"}),t.jsx("span",{className:"ll-hmenu__name",children:m.name}),m.role&&t.jsx("span",{className:"ll-hmenu__role",children:m.role})]},m.id))})]}),t.jsxs("div",{className:"ll-expanded__pill-wrap",children:[t.jsxs("button",{type:"button",className:"ll-hpill ll-hpill--compact",onClick:m=>{m.stopPropagation(),C()},"aria-haspopup":"listbox","aria-expanded":j,"aria-label":"Language: English",title:"Language: English",children:[t.jsx("span",{className:"ll-hpill__label",children:"EN"}),t.jsx(ze,{})]}),j&&t.jsx("div",{className:"ll-hmenu",onClick:m=>m.stopPropagation(),role:"listbox",children:t.jsx("button",{type:"button",className:"ll-hmenu__item is-active",role:"option","aria-selected":!0,children:t.jsx("span",{className:"ll-hmenu__name",children:"English"})})})]}),t.jsx("span",{className:`ll-expanded__state ll-expanded__state--${T}`,children:T})]}),t.jsxs("div",{className:"ll-expanded__header-actions",children:[t.jsx("button",{type:"button",className:"ll-hbtn",onClick:De,"aria-label":"Minimize widget",title:"Minimize",children:t.jsx(Et,{})}),t.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--danger",onClick:_e,"aria-label":"End call",title:"End call",children:t.jsx(jt,{})})]})]}):t.jsxs("div",{className:"ll-expanded__header ll-expanded__header--idle",children:[t.jsx("span",{className:"ll-expanded__brand",children:Ue}),t.jsxs("div",{className:"ll-expanded__header-actions",children:[t.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--ghost",onClick:De,"aria-label":"Minimize widget",children:t.jsx(Et,{})}),t.jsx("button",{type:"button",className:"ll-hbtn ll-hbtn--danger",onClick:_e,"aria-label":"Close widget",children:t.jsx(jt,{})})]})]}),F&&(()=>{const m=M?"Restart paused session":E==="disconnected"?"Reconnect to agent":"Start video call",H=M?"Pick up where you left off":null,We=E==="idle"&&!M&&!A;return t.jsxs(t.Fragment,{children:[We&&t.jsxs("button",{type:"button",className:"ll-expanded__play",onClick:le,"aria-label":m,children:[t.jsx("div",{className:"ll-expanded__play-circle",children:t.jsx("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:t.jsx("polygon",{points:"6 3 20 12 6 21 6 3"})})}),t.jsx("span",{className:"ll-expanded__play-label",children:m})]}),t.jsxs("div",{className:"ll-expanded__bottom ll-expanded__bottom--idle",children:[l&&t.jsx("div",{className:"ll-expanded__transcript",children:t.jsx("p",{className:"ll-expanded__transcript-text",children:l})}),H&&t.jsx("p",{className:"ll-expanded__cta-sublabel",children:H}),t.jsx("button",{type:"button",className:"ll-expanded__cta",onClick:le,"aria-label":m,children:m})]})]})})(),t.jsxs("div",{className:`ll-expanded__pip ${ye&&(w||V)?"is-visible":""}`,children:[t.jsx("div",{ref:ee,className:V?"ll-expanded__pip-host":"ll-expanded__pip-host is-hidden"}),t.jsx("div",{ref:Ce,className:!V&&w?"ll-expanded__pip-host":"ll-expanded__pip-host is-hidden"})]}),ye?t.jsxs("div",{className:"ll-expanded__bottom",children:[xe&&t.jsx("div",{className:"ll-expanded__transcript",children:t.jsx("p",{className:"ll-expanded__transcript-text",children:xe})}),t.jsxs("div",{className:"ll-toolbar",onClick:m=>m.stopPropagation(),children:[Me&&t.jsx("button",{type:"button",className:`ll-tool ${V?"is-on":""}`,onClick:D,"aria-label":V?"Stop sharing screen":"Share screen",title:V?"Stop sharing":"Share screen",children:t.jsx(Dn,{})}),Ae&&t.jsxs("div",{className:"ll-tool-split",children:[t.jsx("button",{type:"button",className:`ll-tool ll-tool--left ${w?"is-on":""}`,onClick:me,"aria-label":w?"Turn off camera":"Turn on camera",title:w?"Stop camera":"Start camera",children:t.jsx($n,{})}),t.jsx("button",{type:"button",className:`ll-tool ll-tool--right ${w?"is-on":""}`,onClick:m=>{m.stopPropagation(),q(H=>!H),Q(!1)},"aria-label":"Camera devices","aria-haspopup":"listbox","aria-expanded":te,children:t.jsx(ze,{})}),te&&W.length>0&&t.jsx(Lt,{label:"Camera",devices:W,activeId:oe,onPick:m=>{q(!1),ge(m)}})]}),t.jsxs("div",{className:"ll-tool-split",children:[t.jsx("button",{type:"button",className:`ll-tool ll-tool--left ${g?"is-muted":""}`,onClick:he,"aria-label":g?"Unmute microphone":"Mute microphone",title:g?"Unmute":"Mute",children:t.jsx(zn,{muted:g})}),t.jsx("button",{type:"button",className:`ll-tool ll-tool--right ${g?"is-muted":""}`,onClick:m=>{m.stopPropagation(),Q(H=>!H),q(!1)},"aria-label":"Microphone devices","aria-haspopup":"listbox","aria-expanded":B,children:t.jsx(ze,{})}),B&&S.length>0&&t.jsx(Lt,{label:"Microphone",devices:S,activeId:"",onPick:()=>Q(!1)})]}),t.jsx("button",{type:"button",className:`ll-tool ${se?"is-muted":""}`,onClick:Be,"aria-label":se?"Unmute speaker":"Mute speaker",title:se?"Unmute speaker":"Mute speaker",children:t.jsx(Hn,{muted:se})})]}),Te&&t.jsxs("form",{className:"ll-message-input",onSubmit:Se,children:[t.jsx("input",{type:"text",className:"ll-message-input__field",placeholder:"Message...",value:U,onChange:m=>ne(m.target.value),"aria-label":"Message the agent"}),U.trim()&&t.jsx("button",{type:"submit",className:"ll-message-input__send","aria-label":"Send message",children:t.jsx(On,{})})]}),t.jsx("button",{type:"button",className:"ll-expanded__end",onClick:de,children:"End conversation"})]}):null,(()=>{if(x&&E!=="error")return t.jsxs("div",{className:"ll-expanded__banner",role:"alert",children:[t.jsx("span",{children:x}),t.jsx("button",{type:"button",className:"ll-expanded__banner-x",onClick:ke,"aria-label":"Dismiss",children:"×"})]});if(!A||E!=="error")return null;let m="Failed to connect",H="Try again";return A==="MIC_PERMISSION_DENIED"?m="Microphone blocked. Allow access to talk.":A==="MIC_NOT_FOUND"?m="No microphone found. Plug one in + retry.":A==="MIC_UNAVAILABLE"?m="Mic unavailable. Check other apps using it.":A==="AGENT_TIMEOUT"?m="Agent didn't pick up. Try again.":A==="CONNECT_FAILED"?m="Connection failed. Check your network.":A.length<80&&(m=A),t.jsxs("div",{className:"ll-expanded__banner ll-expanded__banner--error",role:"alert",children:[t.jsx("span",{children:m}),t.jsx("button",{type:"button",className:"ll-expanded__banner-retry",onClick:fe,children:H})]})})()]})};function ze(){return t.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":!0,children:t.jsx("polyline",{points:"6 9 12 15 18 9"})})}function jt(){return t.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:[t.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),t.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function Et(){return t.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:t.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})})}function Dn(){return t.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[t.jsx("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2"}),t.jsx("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),t.jsx("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})}function $n(){return t.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[t.jsx("path",{d:"M23 7l-7 5 7 5V7z"}),t.jsx("rect",{x:"1",y:"5",width:"15",height:"14",rx:"2"})]})}function zn({muted:e}){return t.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[t.jsx("path",{d:"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"}),t.jsx("path",{d:"M19 10v2a7 7 0 0 1-14 0v-2"}),t.jsx("line",{x1:"12",y1:"19",x2:"12",y2:"23"}),e&&t.jsx("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]})}function Hn({muted:e}){return t.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[t.jsx("polygon",{points:"11 5 6 9 2 9 2 15 6 15 11 19 11 5"}),e?t.jsx("line",{x1:"23",y1:"9",x2:"17",y2:"15"}):t.jsxs(t.Fragment,{children:[t.jsx("path",{d:"M19.07 4.93a10 10 0 0 1 0 14.14"}),t.jsx("path",{d:"M15.54 8.46a5 5 0 0 1 0 7.07"})]})]})}function On(){return t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[t.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"}),t.jsx("polyline",{points:"12 5 19 12 12 19"})]})}const Lt=({label:e,devices:n,activeId:i,onPick:o})=>t.jsxs("div",{className:"ll-device-menu",onClick:s=>s.stopPropagation(),role:"listbox",children:[t.jsx("p",{className:"ll-device-menu__label",children:e}),n.map((s,l)=>{const u=i===s.deviceId;return t.jsxs("button",{type:"button",className:`ll-device-menu__item ${u?"is-active":""}`,onClick:()=>o(s.deviceId),role:"option","aria-selected":u,children:[u&&t.jsx("span",{className:"ll-device-menu__dot",children:"●"}),t.jsx("span",{className:"ll-device-menu__name",children:s.label||`${e} ${l+1}`})]},s.deviceId||l)})]}),Fn=['[data-ll-private="true"]',".ll-widget"];function tt(e){let n=e;for(;n;){for(const i of Fn)if(n.matches(i))return!0;n=n.parentElement}return!1}function qe(e){if(tt(e))return!1;if(e instanceof HTMLInputElement){if(e.type==="password")return!1;const n=(e.getAttribute("autocomplete")||"").toLowerCase();if(n==="off"||n.startsWith("cc-"))return!1}return!0}const He=4096,qn=20,Bn=20,Un=10,Wn=10,Vn=30,Nt=500,Kn=['[data-ll-private="true"]',".ll-widget","script","style","noscript","iframe"];function Ne(e){if(e.getAttribute("aria-hidden")==="true"||e.hasAttribute("hidden"))return!0;let n=e;for(;n;){for(const i of Kn)if(n.matches(i))return!0;n=n.parentElement}return!1}function Re(e){if(typeof window>"u")return!0;const n=e.getBoundingClientRect();if(n.width<=0||n.height<=0)return!1;const i=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth;return n.bottom>0&&n.right>0&&n.top<i&&n.left<o}function Rt(e){const n=e.getAttribute("id");if(n){const l=document.querySelector(`label[for="${CSS.escape(n)}"]`);if(l!=null&&l.textContent)return l.textContent.trim()}const i=e.getAttribute("aria-label");if(i)return i.trim();const o=e.getAttribute("placeholder");if(o)return o.trim();const s=e.closest("label");return s!=null&&s.textContent?s.textContent.trim():""}function ue(e,n){return e.length<=n?e:e.slice(0,n-1)+"…"}function ve(e){return e.length}function Kt(e,n={}){const i=n.doc??(typeof document<"u"?document:null);if(!i)return{url:"",title:"",pathname:"/",regions:[],visibleText:"",visibleLinks:[],visibleFields:[],forms:[],extras:e};const o=typeof window<"u"&&window.location.href||"",s=typeof window<"u"&&window.location.pathname||"/",l=i.title||"",u=Array.from(i.querySelectorAll("[data-ll-region]")),d=[];for(const g of u){if(d.length>=Un)break;if(Ne(g)||!Re(g))continue;const x=g.getAttribute("data-ll-region")??"",S=g.getAttribute("data-ll-intent")??void 0,w=ue((g.innerText||g.textContent||"").trim(),Nt*2);!x||!w||d.push({id:x,intent:S,text:w})}const f=[],y=["H1","H2","H3","H4","H5","H6"],h=Array.from(i.querySelectorAll("h1, h2, h3, h4, h5, h6"));for(const g of h){if(Ne(g)||!Re(g))continue;const x=(g.textContent||"").trim();x&&f.push(`${g.tagName}: ${ue(x,200)}`)}const a=Array.from(i.querySelectorAll("p, li"));for(const g of a){if(Ne(g)||!Re(g)||y.includes(g.tagName))continue;const x=(g.textContent||"").trim();x.length>10&&f.push(ue(x,Nt))}const c=f.join(`
2
+ `),j=[],C=Array.from(i.querySelectorAll("a[href]"));for(const g of C){if(j.length>=qn)break;if(Ne(g)||!Re(g))continue;const x=g.getAttribute("href")||"",S=(g.textContent||"").trim();!x||!S||j.push({href:x,text:ue(S,100)})}const E=[],T=Array.from(i.querySelectorAll("input, textarea, select"));for(const g of T){if(E.length>=Bn)break;if(Ne(g)||!qe(g)||!Re(g))continue;const x=Rt(g),S=g instanceof HTMLInputElement?g.type:g.tagName.toLowerCase();x&&E.push({label:ue(x,100),type:S})}const N=Array.from(i.querySelectorAll("[data-ll-form]")),M=[];for(const g of N){if(M.length>=Wn)break;if(tt(g))continue;const x=g.getAttribute("data-ll-form")||"";if(!x)continue;const S=g.getAttribute("data-ll-intent")||void 0,w=Array.from(g.querySelectorAll("[data-ll-field]")),I=[];for(const W of w){if(I.length>=Vn)break;if(!qe(W))continue;const oe=W.getAttribute("data-ll-field")||"";if(!oe)continue;const V=Rt(W)||oe,K=W instanceof HTMLInputElement?W.type:W.tagName.toLowerCase();I.push({name:oe,label:ue(V,100),type:K})}M.push({id:x,intent:S,fields:I})}const L={url:o,title:l,pathname:s,regions:d,visibleText:c,visibleLinks:j,visibleFields:E,forms:M,extras:e};let A=ve(JSON.stringify(L.regions))+ve(L.visibleText)+ve(JSON.stringify(L.visibleLinks))+ve(JSON.stringify(L.visibleFields));for(;A>He&&L.visibleFields.length>0;)L.visibleFields.pop(),A=ve(JSON.stringify(L.visibleFields));for(;A>He&&L.visibleLinks.length>0;)L.visibleLinks.pop(),A-=80;return ve(L.visibleText)>He&&(L.visibleText=ue(L.visibleText,He-100)),L}let be=null;function et(e,n={}){const i=Date.now(),s=`${typeof window<"u"&&window.location.pathname||"/"}::${typeof window<"u"?window.scrollY:0}`;if(be&&be.key===s&&i-be.at<1e3)return be.ctx;const l=Kt(e,n);return be={key:s,at:i,ctx:l},l}function Yt(){be=null}const Yn=200;function Gn(e){return!(!e||e.startsWith("#")||e.startsWith("javascript:")||e.startsWith("mailto:")||e.startsWith("tel:"))}function Gt(e){const n=e??(typeof document<"u"?document:null);if(!n)return[];const i=typeof window<"u"&&window.location.origin||"",o=new Set,s=[],l=Array.from(n.querySelectorAll("a[href]"));for(const u of l){if(s.length>=Yn)break;if(tt(u))continue;const d=u.getAttribute("href")||"";if(!Gn(d))continue;let f=d,y=!0;try{if(typeof window<"u"){const a=new URL(d,i);y=a.origin===i,y&&d.startsWith("http")&&(f=a.pathname+a.search+a.hash)}}catch{continue}if(o.has(f))continue;o.add(f);const h=(u.textContent||"").trim().slice(0,120);s.push({href:f,text:h,internal:y})}return s}let we=null;const Xn=5e3;function Xt(){const e=Date.now(),n=typeof window<"u"&&window.location.pathname||"/";if(we&&we.pathname===n&&e-we.at<Xn)return we.routes;const i=Gt();return we={at:e,pathname:n,routes:i},i}function Jt(){we=null}function Jn(e,n){const i=e instanceof HTMLInputElement?HTMLInputElement.prototype:e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLSelectElement.prototype,o=Object.getOwnPropertyDescriptor(i,"value"),s=o==null?void 0:o.set;s?s.call(e,n):e.value=n}function Qn(e,n,i={}){const o=i.triggerInput??!0,s=i.triggerChange??!0;if(e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")){const l=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked"),u=l==null?void 0:l.set,d=n==="true"||n==="1"||n==="on";u?u.call(e,d):e.checked=d,o&&e.dispatchEvent(new Event("input",{bubbles:!0})),s&&e.dispatchEvent(new Event("change",{bubbles:!0}));return}Jn(e,n),o&&e.dispatchEvent(new Event("input",{bubbles:!0})),s&&e.dispatchEvent(new Event("change",{bubbles:!0}))}const Zn=new Set(["agent_state","avatar_stream_ready","avatar_active","avatar_idle","bot_ready","agent_error","idle_warning","idle_timeout","navigate","scroll_to","request_page_context","scroll_page","click","fill_form","focus_field","submit_form","request_routes"]);function er(e){var ct,ut,dt,ft,pt,ht;const{agentId:n,apiKey:i,baseUrl:o="https://app.livelayer.studio",sessionEndpoint:s,sessionBody:l,autoConnect:u=!1,displayMode:d,defaultDisplayMode:f="expanded",onDisplayModeChange:y,position:h="bottom-right",mobileBreakpoint:a=640,persistKey:c="ll-widget",disablePersistence:j=!1,teamMembers:C,currentTeamMemberId:E,onTeamMemberChange:T,idleLoopUrl:N,greeting:M,avatarImageUrl:L,agentName:A,branding:g={},allowCamera:x=!0,allowScreenShare:S=!0,allowTyping:w=!0,showOn:I,hideOn:W,pathname:oe,onNavigate:V,onScrollToSelector:K,getPageContext:se,pageContextExtras:Ae,onScrollPage:Me,onClick:Te,capabilities:Ie,onConnect:le,onDisconnect:de,onTranscript:fe,onAgentState:pe,onConnectionStateChange:he,onAgentEvent:me,onAgentCommand:ge,controlledSession:D,className:Be,style:Pe,zIndex:De=2147483647}=e,_e=qt(oe),ke=Wt(_e,I,W);r.useEffect(()=>{Yt(),Jt()},[_e]);const Z=E!==void 0,[ae,ye]=r.useState(()=>{var v;return E??((v=C==null?void 0:C[0])==null?void 0:v.id)}),Y=Z?E:ae,F=r.useMemo(()=>(C==null?void 0:C.find(v=>v.id===Y))??null,[C,Y]),Ce=(F==null?void 0:F.agentId)??n,[ee,B]=Ot({value:d,defaultValue:f,onChange:y,persistKey:c,disablePersistence:j}),Q=Ft(a),te=Tt(),q=It(),U=Pt(),ne=Dt(),Se=$t(),[Ue,xe]=r.useState(!1),[je,Ee]=r.useState(!1),[m,H]=r.useState(!1),[We,Qt]=r.useState(!1),[Ve,Zt]=r.useState(!1),Ke=r.useRef(V),Ye=r.useRef(K),Ge=r.useRef(Me),Xe=r.useRef(Te),nt=r.useRef(se),rt=r.useRef(Ae),it=r.useRef(Ie),G=r.useRef(null);Ke.current=V,Ye.current=K,Ge.current=Me,Xe.current=Te,nt.current=se,rt.current=Ae,it.current=Ie;function re(v){const p=it.current;return p?p.includes(v):!0}function ie(v,p){console.warn(`[LiveLayer] Agent command "${v}" blocked — capability "${p}" not in allowlist. See https://livelayer.studio/docs/react/capabilities`)}const Je=r.useCallback(v=>{var X,mt,gt,yt;const p=v;if(!(!p.type||typeof p.type!="string")){if(me==null||me({eventName:p.type,data:v}),p.type==="navigate"){if(!re("navigate")){ie("navigate","navigate");return}const _=typeof p.href=="string"?p.href:null;if(!_){console.warn(`[LiveLayer] Agent emitted "navigate" without href. Skipping. Check your agent's tool schema. See https://livelayer.studio/docs/errors/navigate-missing-href`);return}if(Ke.current){try{Ke.current(_)}catch(k){console.warn(`[LiveLayer] onNavigate threw for "${_}". Falling back. Error:`,k)}return}if(typeof document<"u"){const k=document.querySelector(`a[href="${_.replace(/"/g,'\\"')}"]`);if(k){k.click();return}}if(typeof window<"u"&&typeof history<"u")try{history.pushState({},"",_),window.dispatchEvent(new PopStateEvent("popstate"))}catch(k){console.warn(`[LiveLayer] history.pushState fallback failed for "${_}". Pass an onNavigate prop to use your router directly. See https://livelayer.studio/docs/react/navigation`,k)}return}if(p.type==="scroll_to"){if(!re("scroll")){ie("scroll_to","scroll");return}const _=typeof p.selector=="string"?p.selector:null;if(!_)return;const k=p.behavior==="instant"?"instant":"smooth";if(Ye.current){try{Ye.current(_,k)}catch(R){console.warn("[LiveLayer] onScrollToSelector threw.",R)}return}if(typeof document<"u"){let R=null;try{R=document.querySelector(_)}catch{console.warn(`[LiveLayer] scroll_to: invalid selector "${_}".`);return}if(!R){console.warn(`[LiveLayer] scroll_to: no element matched "${_}". The user may be on a different page. See https://livelayer.studio/docs/errors/scroll-no-match`);return}R.scrollIntoView({behavior:k,block:"start"})}return}if(p.type==="request_page_context"){if(!re("read_page")){ie("request_page_context","read_page");return}const _=(X=G.current)==null?void 0:X.call(G),k=$=>{const O=_,J=O==null?void 0:O.localParticipant;if(J!=null&&J.publishData)try{const ce=new TextEncoder().encode(JSON.stringify($));J.publishData(ce,{reliable:!0})}catch(ce){console.warn("[LiveLayer] publishData failed.",ce)}},R=rt.current,P=nt.current;try{if(P){const $=P(R);if($ instanceof Promise){k({type:"page_context_pending"}),$.then(O=>k({type:"page_context",context:O})).catch(O=>{console.warn("[LiveLayer] getPageContext rejected; falling back to default walker.",O),k({type:"page_context",context:et(R)})});return}k({type:"page_context",context:$});return}k({type:"page_context",context:et(R)})}catch($){console.warn("[LiveLayer] page-context extraction threw. Sending empty context.",$),k({type:"page_context",context:{url:"",title:"",pathname:"/",regions:[],visibleText:"",visibleLinks:[],visibleFields:[],extras:R}})}return}if(p.type==="scroll_page"){if(!re("scroll")){ie("scroll_page","scroll");return}const _=p.direction;if(_!=="up"&&_!=="down"&&_!=="top"&&_!=="bottom"){console.warn(`[LiveLayer] scroll_page: invalid direction "${String(_)}". Expected up | down | top | bottom.`);return}const k=p.behavior==="instant"?"instant":"smooth";if(Ge.current){try{Ge.current(_,k)}catch(P){console.warn("[LiveLayer] onScrollPage threw.",P)}return}if(typeof window>"u")return;const R={behavior:k};_==="up"?window.scrollBy({top:-window.innerHeight,...R}):_==="down"?window.scrollBy({top:window.innerHeight,...R}):_==="top"?window.scrollTo({top:0,...R}):window.scrollTo({top:document.body.scrollHeight,...R});return}if(p.type==="click"){if(!re("click")){ie("click","click");return}const _=typeof p.selector=="string"?p.selector:null;if(!_){console.warn("[LiveLayer] click: missing selector.");return}if(Xe.current){try{Xe.current(_)}catch(R){console.warn("[LiveLayer] onClick threw.",R)}return}if(typeof document>"u")return;let k=null;try{k=document.querySelector(_)}catch{console.warn(`[LiveLayer] click: invalid selector "${_}".`);return}if(!k){console.warn(`[LiveLayer] click: no element matched "${_}". See https://livelayer.studio/docs/errors/click-no-match`);return}if(k.closest('[data-ll-private="true"], .ll-widget')){console.warn("[LiveLayer] click: refusing to click element inside a private subtree.");return}(mt=k.click)==null||mt.call(k);return}if(p.type==="fill_form"||p.type==="focus_field"){if(!re("fill_forms")){ie(p.type,"fill_forms");return}if(typeof document>"u")return;const _=typeof p.formId=="string"?p.formId:null;if(!_){console.warn(`[LiveLayer] ${p.type}: missing formId.`);return}const k=document.querySelector(`[data-ll-form="${_.replace(/"/g,'\\"')}"]`);if(!k){console.warn(`[LiveLayer] ${p.type}: no form with data-ll-form="${_}". Tag your form with <LiveLayerForm id> or data-ll-form. See https://livelayer.studio/docs/react/forms`);return}if(k.closest('[data-ll-private="true"], .ll-widget')){console.warn(`[LiveLayer] ${p.type}: refusing to touch a form in a private subtree.`);return}if(p.type==="focus_field"){const P=typeof p.fieldName=="string"?p.fieldName:null;if(!P){console.warn("[LiveLayer] focus_field: missing fieldName.");return}const $=k.querySelector(`[data-ll-field="${P.replace(/"/g,'\\"')}"]`);if(!$){console.warn(`[LiveLayer] focus_field: no field "${P}" in form "${_}".`);return}if(!qe($)){console.warn(`[LiveLayer] focus_field: field "${P}" is privacy-protected and not focusable.`);return}$.focus();return}const R=p.values&&typeof p.values=="object"?p.values:null;if(!R){console.warn("[LiveLayer] fill_form: missing or invalid values.");return}for(const[P,$]of Object.entries(R)){if(typeof $!="string")continue;const O=k.querySelector(`[data-ll-field="${P.replace(/"/g,'\\"')}"]`);if(!O){console.warn(`[LiveLayer] fill_form: no field "${P}" in form "${_}". Skipping.`);continue}if(!qe(O)){console.warn(`[LiveLayer] fill_form: field "${P}" is privacy-protected (password / cc-* / private). Skipping.`);continue}try{Qn(O,$)}catch(J){console.warn(`[LiveLayer] fill_form: failed to set "${P}".`,J)}}return}if(p.type==="submit_form"){if(!re("submit_forms")){ie("submit_form","submit_forms");return}if(typeof document>"u")return;const _=typeof p.formId=="string"?p.formId:null;if(!_){console.warn("[LiveLayer] submit_form: missing formId.");return}const k=document.querySelector(`[data-ll-form="${_.replace(/"/g,'\\"')}"]`);if(!k){console.warn(`[LiveLayer] submit_form: no form with data-ll-form="${_}".`);return}if(k.closest('[data-ll-private="true"], .ll-widget')){console.warn("[LiveLayer] submit_form: refusing to submit a form in a private subtree.");return}const R=(gt=G.current)==null?void 0:gt.call(G),P=J=>{const ce=R,$e=ce==null?void 0:ce.localParticipant;if($e!=null&&$e.publishData)try{const fn=new TextEncoder().encode(JSON.stringify(J));$e.publishData(fn,{reliable:!0})}catch{}};let $=!1;const O=()=>{$=!0,P({type:"form_submitted",formId:_})};k.addEventListener("submit",O,{once:!0});try{typeof k.requestSubmit=="function"?k.requestSubmit():k.submit()}catch(J){console.warn("[LiveLayer] submit_form: requestSubmit threw.",J),k.removeEventListener("submit",O),P({type:"form_submit_blocked",formId:_,reason:"exception"});return}setTimeout(()=>{$||(k.removeEventListener("submit",O),P({type:"form_submit_blocked",formId:_,reason:"validation"}))},500);return}if(p.type==="request_routes"){if(!re("read_page")){ie("request_routes","read_page");return}const k=(yt=G.current)==null?void 0:yt.call(G),R=k==null?void 0:k.localParticipant;if(!(R!=null&&R.publishData))return;try{const P=Xt(),$=new TextEncoder().encode(JSON.stringify({type:"routes",routes:P}));R.publishData($,{reliable:!0})}catch(P){console.warn("[LiveLayer] request_routes: extractRoutes threw.",P)}return}Zn.has(p.type)||ge==null||ge(p)}},[ge,me]),z=Mt({agentId:D?"__controlled__":Ce,baseUrl:o,apiKey:i,sessionEndpoint:s,sessionBody:l,onDataMessage:D?void 0:Je});r.useEffect(()=>{if(D!=null&&D.subscribeToDataMessages)return D.subscribeToDataMessages(Je)},[D,Je]),G.current=()=>{var v;return(v=z.getRoom)==null?void 0:v.call(z)};const b=r.useMemo(()=>D?{connectionState:D.connectionState,agentState:D.agentState,transcript:D.transcript,videoElement:D.videoElement,audioElement:D.audioElement,canResume:D.canResume,error:D.error,agentConfig:null,connect:async()=>{await D.onConnect()},disconnect:()=>D.onDisconnect(),getRoom:z.getRoom,isControlled:!0}:{connectionState:z.connectionState,agentState:z.agentState,transcript:z.transcript,videoElement:z.videoElement,audioElement:z.audioElement,canResume:z.canResume,error:z.error,agentConfig:z.agentConfig,connect:z.connect,disconnect:z.disconnect,getRoom:z.getRoom,isControlled:!1},[D,z]),ot=r.useRef(null);r.useEffect(()=>{const v=b.videoElement,p=ot.current;if(!(!v||!p))return p.appendChild(v),()=>{v.parentNode===p&&p.removeChild(v)}},[b.videoElement]),r.useEffect(()=>{const v=b.audioElement;if(!v)return;te.attach(v);const p=v.play();return p&&typeof p.catch=="function"&&p.catch(X=>{(X==null?void 0:X.name)==="NotAllowedError"&&xe(!0)}),()=>{te.detach()}},[b.audioElement]),r.useEffect(()=>{if(b.isControlled||b.connectionState!=="connected")return;const v=b.getRoom();if(v)return q.setupMic(v).catch(()=>{}),U.attachRoom(v),ne.attachRoom(v),Se.refresh(),()=>{q.teardownMic(),U.teardown(),ne.teardown()}},[b.isControlled,b.connectionState]),r.useEffect(()=>{const v=b.audioElement;v&&(v.muted=Ve)},[b.audioElement,Ve]);const en=r.useCallback(v=>{const p=b.getRoom();if(p)try{const X=new TextEncoder().encode(JSON.stringify({type:"user_message",text:v}));p.localParticipant.publishData(X,{reliable:!0})}catch{}},[b]),tn=r.useCallback(()=>{Zt(v=>!v)},[]);r.useEffect(()=>{he==null||he(b.connectionState),b.connectionState==="connected"?le==null||le():b.connectionState==="disconnected"&&(de==null||de())},[b.connectionState,le,de,he]),r.useEffect(()=>{fe==null||fe(b.transcript)},[b.transcript,fe]),r.useEffect(()=>{pe==null||pe(b.agentState)},[b.agentState,pe]);const st=r.useRef(!1);r.useEffect(()=>{b.isControlled||!u||st.current||ke&&b.connectionState==="idle"&&(st.current=!0,b.connect())},[u,b.connectionState,b,ke]);const nn=r.useCallback(v=>{const p=C==null?void 0:C.find(X=>X.id===v);p&&(H(!1),v!==Y&&(Ee(!0),b.disconnect(),Z||ye(v),T==null||T(p)))},[C,Y,b,Z,T]);r.useEffect(()=>{je&&b.connectionState==="connected"&&Ee(!1)},[b.connectionState,je]),r.useEffect(()=>{if(!m)return;const v=p=>{p.key==="Escape"&&H(!1)};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[m]);const rn=!!L||!!(F!=null&&F.avatarImageUrl)||b.isControlled,Qe=zt(Ce,o,rn),Ze=(F==null?void 0:F.name)??A??((ct=b.agentConfig)==null?void 0:ct.name)??((ut=Qe.info)==null?void 0:ut.name)??"Live Layer",lt=(F==null?void 0:F.avatarImageUrl)??L??((dt=b.agentConfig)==null?void 0:dt.avatarImageUrl)??((ft=Qe.info)==null?void 0:ft.avatarImageUrl)??null,on=N??((pt=b.agentConfig)==null?void 0:pt.idleLoopUrl)??((ht=Qe.info)==null?void 0:ht.idleLoopUrl)??null,sn=M??null,ln=r.useCallback(()=>B("expanded"),[B]),an=r.useCallback(()=>B("minimized"),[B]),at=r.useCallback(()=>{b.disconnect(),B("hidden")},[b,B]),cn=r.useCallback(()=>{const v=b.audioElement;v&&v.play().then(()=>xe(!1)).catch(()=>{})},[b.audioElement]),un=r.useCallback(()=>{xe(!1),b.connect()},[b]),Le={...Pe,zIndex:De};g.primaryColor&&(Le["--ll-color-primary"]=g.primaryColor),g.accentColor&&(Le["--ll-color-accent"]=g.accentColor),g.backgroundColor&&(Le["--ll-color-bg"]=g.backgroundColor),g.textColor&&(Le["--ll-color-fg"]=g.textColor);const dn=["ll-widget",`ll-widget--${ee}`,`ll-widget--${Q?"mobile":"desktop"}`,Be].filter(Boolean).join(" ");return ke?t.jsxs("div",{className:dn,style:Le,"data-display-mode":ee,"data-position":h,children:[ee==="hidden"&&t.jsx(An,{position:h,isMobile:Q,isSpeaking:b.agentState==="speaking",onExpand:()=>B("expanded"),label:`Open ${Ze} widget`}),ee==="minimized"&&t.jsx(Tn,{position:h,isMobile:Q,agentName:Ze,avatarImageUrl:lt,agentState:b.agentState,isMuted:q.isMuted,audioLevel:te,onExpand:ln,onToggleMute:q.toggleMute,onClose:at}),ee==="expanded"&&t.jsx(Pn,{position:h,isMobile:Q,agentName:Ze,avatarImageUrl:lt,idleLoopUrl:on,greeting:sn,branding:g,teamMembers:C,currentTeamMemberId:Y,isSwitchingTeamMember:je,teamSwitcherOpen:m,onToggleTeamSwitcher:()=>H(v=>!v),onSelectTeamMember:nn,connectionState:b.connectionState,agentState:b.agentState,transcript:b.transcript,isMuted:q.isMuted,micDevices:Se.mics,isCameraEnabled:U.isEnabled,cameraPreviewEl:U.previewEl,cameraDevices:Se.cameras,activeCameraId:U.activeDeviceId,isScreenShareEnabled:ne.isEnabled,screenPreviewEl:ne.previewEl,isSpeakerMuted:Ve,allowCamera:x,allowScreenShare:S,allowTyping:w,languageMenuOpen:We,onToggleLanguageMenu:()=>Qt(v=>!v),needsUserGesture:Ue,canResume:b.canResume,micError:q.micError,error:b.error,avatarVideoContainerRef:ot,onConnect:()=>void b.connect(),onDisconnect:()=>b.disconnect(),onRetry:un,onResumeAudio:cn,onToggleMute:q.toggleMute,onToggleCamera:()=>void U.toggle(),onSwitchCameraDevice:v=>void U.switchDevice(v),onToggleScreenShare:()=>void ne.toggle(),onToggleSpeaker:tn,onSendMessage:en,onMinimize:an,onClose:at,onClearMicError:q.clearError})]}):null}function tr(e){return t.jsx(At,{children:t.jsx(er,{...e})})}const nr=({agentId:e,baseUrl:n,apiKey:i,mode:o,onAgentEvent:s,className:l,style:u})=>{const d=r.useRef(null),f=r.useRef(null),y=r.useRef(s);y.current=s;const h=r.useCallback(a=>{var j;const c=a.detail;(j=y.current)==null||j.call(y,c)},[]);return r.useEffect(()=>{const a=d.current;if(!a)return;const c=document.createElement("livelayer-widget");return c.setAttribute("agent-id",e),n&&c.setAttribute("base-url",n),i&&c.setAttribute("api-key",i),o&&c.setAttribute("mode",o),c.addEventListener("agent-event",h),a.appendChild(c),f.current=c,()=>{c.removeEventListener("agent-event",h),a.removeChild(c),f.current=null}},[e]),r.useEffect(()=>{f.current&&(o?f.current.setAttribute("mode",o):f.current.removeAttribute("mode"))},[o]),t.jsx("div",{ref:d,className:l,style:u})},rr=r.forwardRef(function({id:n,intent:i,as:o="div",className:s,style:l,children:u},d){return r.createElement(o,{ref:d,"data-ll-region":n,"data-ll-intent":i,className:s,style:l},u)}),ir=r.forwardRef(function({id:n,intent:i,children:o,...s},l){return t.jsx("form",{ref:l,"data-ll-form":n,"data-ll-intent":i,...s,children:o})}),or=r.forwardRef(function(n,i){const{name:o,label:s,labelClassName:l}=n,u={name:o,"data-ll-field":o};let d;if("as"in n&&n.as==="textarea"){const{name:f,label:y,labelClassName:h,as:a,...c}=n;d=t.jsx("textarea",{ref:i,...u,...c})}else if("as"in n&&n.as==="select"){const{name:f,label:y,labelClassName:h,as:a,children:c,...j}=n;d=t.jsx("select",{ref:i,...u,...j,children:c})}else{const{name:f,label:y,labelClassName:h,as:a,...c}=n;d=t.jsx("input",{ref:i,...u,...c})}return s===void 0?d:t.jsxs("label",{className:l,children:[s,d]})});function sr(){const[e,n]=r.useState([]),i=r.useCallback(s=>{n(l=>{const u=l.findIndex(d=>d.id===s.id);if(u>=0){const d=l.slice();return d[u]=s,d}return[...l,s]})},[]),o=r.useCallback(()=>n([]),[]);return{entries:e,pushSegment:i,clear:o,latest:e.length>0?e[e.length-1]:null}}exports.AvatarWidget=tr;exports.ErrorBoundary=At;exports.LiveLayerField=or;exports.LiveLayerForm=ir;exports.LiveLayerRegion=rr;exports.LiveLayerWidget=nr;exports.clearPageContextCache=Yt;exports.clearRoutesCache=Jt;exports.extractPageContext=Kt;exports.extractRoutes=Gt;exports.getCachedPageContext=et;exports.getCachedRoutes=Xt;exports.matchesPattern=Bt;exports.shouldRenderAtPath=Ut;exports.useAgentInfo=zt;exports.useAudioLevel=Tt;exports.useCameraState=Pt;exports.useDisplayMode=Ht;exports.useDisplayModePersistence=Ot;exports.useIsMobile=Ft;exports.useLiveKitSession=Mt;exports.useMediaDevices=$t;exports.useMicrophoneState=It;exports.usePathname=qt;exports.useRouteMatch=Wt;exports.useScreenShareState=Dt;exports.useTranscript=sr;