@skippr/live-agent-sdk 0.43.0 → 0.45.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.
@@ -8,15 +8,123 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
8
8
 
9
9
  // src/components/LiveAgent.tsx
10
10
  import { LiveKitRoom, RoomAudioRenderer } from "@livekit/components-react";
11
- import { useCallback as useCallback8, useMemo as useMemo5, useRef as useRef11, useState as useState12 } from "react";
11
+ import { useCallback as useCallback10, useMemo as useMemo5, useRef as useRef13, useState as useState15 } from "react";
12
12
 
13
13
  // src/context/LiveAgentContext.tsx
14
14
  import { createContext } from "react";
15
15
  var LiveAgentContext = createContext(null);
16
16
 
17
- // src/hooks/useAuth.ts
17
+ // src/hooks/useAdoptionGoals.ts
18
18
  import { useCallback, useEffect, useState } from "react";
19
+
20
+ // src/lib/navigation.ts
21
+ var listeners = new Set;
22
+ var patched = false;
23
+ var lastHref = "";
24
+ function emit() {
25
+ if (window.location.href === lastHref)
26
+ return;
27
+ lastHref = window.location.href;
28
+ for (const listener of listeners)
29
+ listener();
30
+ }
31
+ function ensurePatched() {
32
+ if (patched)
33
+ return;
34
+ patched = true;
35
+ lastHref = window.location.href;
36
+ const originalPushState = history.pushState.bind(history);
37
+ const originalReplaceState = history.replaceState.bind(history);
38
+ history.pushState = (...args) => {
39
+ originalPushState(...args);
40
+ emit();
41
+ };
42
+ history.replaceState = (...args) => {
43
+ originalReplaceState(...args);
44
+ emit();
45
+ };
46
+ window.addEventListener("popstate", emit);
47
+ window.addEventListener("hashchange", emit);
48
+ }
49
+ function subscribeToLocationChange(listener) {
50
+ ensurePatched();
51
+ listeners.add(listener);
52
+ return () => {
53
+ listeners.delete(listener);
54
+ };
55
+ }
56
+
57
+ // src/hooks/useAdoptionGoals.ts
19
58
  var API_URL = "https://specialist.skippr.ai/api";
59
+ var MATCH_DEBOUNCE_MS = 400;
60
+ function useAdoptionGoals({
61
+ enabled,
62
+ bearerToken,
63
+ authedFetch
64
+ }) {
65
+ const [goals, setGoals] = useState([]);
66
+ const match = useCallback(async () => {
67
+ try {
68
+ const resp = await authedFetch(`${API_URL}/v1/adoption/goals/match`, {
69
+ method: "POST",
70
+ headers: { "Content-Type": "application/json" },
71
+ body: JSON.stringify({ url: window.location.origin + window.location.pathname })
72
+ });
73
+ if (!resp.ok) {
74
+ setGoals([]);
75
+ return;
76
+ }
77
+ const data = await resp.json();
78
+ setGoals(Array.isArray(data?.goals) ? data.goals : []);
79
+ } catch (e) {
80
+ console.warn("[Skippr] adoption match failed", e);
81
+ setGoals([]);
82
+ }
83
+ }, [authedFetch]);
84
+ useEffect(() => {
85
+ if (!enabled || !bearerToken) {
86
+ setGoals([]);
87
+ return;
88
+ }
89
+ match();
90
+ let lastPath = window.location.pathname;
91
+ let timer;
92
+ const unsubscribe = subscribeToLocationChange(() => {
93
+ if (window.location.pathname === lastPath)
94
+ return;
95
+ lastPath = window.location.pathname;
96
+ if (timer)
97
+ clearTimeout(timer);
98
+ timer = setTimeout(() => {
99
+ match();
100
+ }, MATCH_DEBOUNCE_MS);
101
+ });
102
+ return () => {
103
+ if (timer)
104
+ clearTimeout(timer);
105
+ unsubscribe();
106
+ };
107
+ }, [enabled, bearerToken, match]);
108
+ const postStatus = useCallback((goalId, status) => {
109
+ authedFetch(`${API_URL}/v1/adoption/goals/${goalId}/status`, {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json" },
112
+ body: JSON.stringify({ status })
113
+ }).catch((e) => console.warn("[Skippr] adoption status update failed", e));
114
+ }, [authedFetch]);
115
+ const dismissGoal = useCallback((goalId) => {
116
+ setGoals((prev) => prev.filter((goal) => goal.goalId !== goalId));
117
+ postStatus(goalId, "dismissed" /* Dismissed */);
118
+ }, [postStatus]);
119
+ const attendGoal = useCallback((goalId) => {
120
+ postStatus(goalId, "attended" /* Attended */);
121
+ }, [postStatus]);
122
+ return { goals, dismissGoal, attendGoal };
123
+ }
124
+
125
+ // src/hooks/useAuth.ts
126
+ import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
127
+ var API_URL2 = "https://specialist.skippr.ai/api";
20
128
  function storageKey(appKey) {
21
129
  return `skippr_auth_${appKey}`;
22
130
  }
@@ -42,12 +150,12 @@ function clearStoredToken(appKey) {
42
150
  }
43
151
  }
44
152
  function useAuth({ appKey }) {
45
- const [authToken, setAuthToken] = useState(null);
46
- const [isValidating, setIsValidating] = useState(false);
47
- const [isSubmitting, setIsSubmitting] = useState(false);
48
- const [error, setError] = useState("");
153
+ const [authToken, setAuthToken] = useState2(null);
154
+ const [isValidating, setIsValidating] = useState2(false);
155
+ const [isSubmitting, setIsSubmitting] = useState2(false);
156
+ const [error, setError] = useState2("");
49
157
  const isAuthenticated = authToken !== null;
50
- useEffect(() => {
158
+ useEffect2(() => {
51
159
  if (!appKey)
52
160
  return;
53
161
  const stored = getStoredToken(appKey);
@@ -56,7 +164,7 @@ function useAuth({ appKey }) {
56
164
  async function validateStoredToken() {
57
165
  setIsValidating(true);
58
166
  try {
59
- const res = await fetch(`${API_URL}/v1/auth/validate-token`, {
167
+ const res = await fetch(`${API_URL2}/v1/auth/validate-token`, {
60
168
  credentials: "omit",
61
169
  headers: { Authorization: `Bearer ${stored}` }
62
170
  });
@@ -73,7 +181,7 @@ function useAuth({ appKey }) {
73
181
  }
74
182
  validateStoredToken();
75
183
  }, [appKey]);
76
- useEffect(() => {
184
+ useEffect2(() => {
77
185
  function handleLogout() {
78
186
  setAuthToken(null);
79
187
  setError("");
@@ -81,13 +189,13 @@ function useAuth({ appKey }) {
81
189
  window.addEventListener("skippr:logout", handleLogout);
82
190
  return () => window.removeEventListener("skippr:logout", handleLogout);
83
191
  }, []);
84
- const requestOtp = useCallback(async (email) => {
192
+ const requestOtp = useCallback2(async (email) => {
85
193
  if (!appKey)
86
194
  return false;
87
195
  setIsSubmitting(true);
88
196
  setError("");
89
197
  try {
90
- const resp = await fetch(`${API_URL}/v1/auth/request-otp`, {
198
+ const resp = await fetch(`${API_URL2}/v1/auth/request-otp`, {
91
199
  method: "POST",
92
200
  credentials: "omit",
93
201
  headers: {
@@ -108,13 +216,13 @@ function useAuth({ appKey }) {
108
216
  setIsSubmitting(false);
109
217
  }
110
218
  }, [appKey]);
111
- const verifyOtp = useCallback(async (email, code) => {
219
+ const verifyOtp = useCallback2(async (email, code) => {
112
220
  if (!appKey)
113
221
  return;
114
222
  setIsSubmitting(true);
115
223
  setError("");
116
224
  try {
117
- const resp = await fetch(`${API_URL}/v1/auth/verify-otp`, {
225
+ const resp = await fetch(`${API_URL2}/v1/auth/verify-otp`, {
118
226
  method: "POST",
119
227
  credentials: "omit",
120
228
  headers: {
@@ -137,7 +245,7 @@ function useAuth({ appKey }) {
137
245
  setIsSubmitting(false);
138
246
  }
139
247
  }, [appKey]);
140
- const logout = useCallback(async () => {
248
+ const logout = useCallback2(async () => {
141
249
  const token = authToken;
142
250
  if (appKey)
143
251
  clearStoredToken(appKey);
@@ -146,7 +254,7 @@ function useAuth({ appKey }) {
146
254
  if (!token)
147
255
  return;
148
256
  try {
149
- await fetch(`${API_URL}/v1/auth/logout`, {
257
+ await fetch(`${API_URL2}/v1/auth/logout`, {
150
258
  method: "POST",
151
259
  credentials: "omit",
152
260
  headers: { Authorization: `Bearer ${token}` }
@@ -168,21 +276,21 @@ function useAuth({ appKey }) {
168
276
  }
169
277
 
170
278
  // src/hooks/useAvailableModules.ts
171
- import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
172
- var API_URL2 = "https://specialist.skippr.ai/api";
279
+ import { useCallback as useCallback3, useEffect as useEffect3, useState as useState3 } from "react";
280
+ var API_URL3 = "https://specialist.skippr.ai/api";
173
281
  function useAvailableModules({
174
282
  enabled,
175
283
  bearerToken,
176
284
  authedFetch
177
285
  }) {
178
- const [modules, setModules] = useState2([]);
179
- const [isLoading, setIsLoading] = useState2(false);
180
- const [error, setError] = useState2(null);
181
- const fetchModules = useCallback2(async () => {
286
+ const [modules, setModules] = useState3([]);
287
+ const [isLoading, setIsLoading] = useState3(false);
288
+ const [error, setError] = useState3(null);
289
+ const fetchModules = useCallback3(async () => {
182
290
  setIsLoading(true);
183
291
  setError(null);
184
292
  try {
185
- const resp = await authedFetch(`${API_URL2}/v1/modules/available`);
293
+ const resp = await authedFetch(`${API_URL3}/v1/modules/available`);
186
294
  if (!resp.ok) {
187
295
  const body = await resp.json().catch(() => null);
188
296
  throw new Error(body?.detail || `Failed to load modules: ${resp.status}`);
@@ -195,7 +303,7 @@ function useAvailableModules({
195
303
  setIsLoading(false);
196
304
  }
197
305
  }, [authedFetch]);
198
- useEffect2(() => {
306
+ useEffect3(() => {
199
307
  if (!enabled || !bearerToken)
200
308
  return;
201
309
  fetchModules();
@@ -209,11 +317,11 @@ function useAvailableModules({
209
317
  }
210
318
 
211
319
  // src/hooks/useSession.ts
212
- import { useCallback as useCallback3, useEffect as useEffect3, useRef, useState as useState3 } from "react";
213
- var API_URL3 = "https://specialist.skippr.ai/api";
320
+ import { useCallback as useCallback4, useEffect as useEffect4, useRef, useState as useState4 } from "react";
321
+ var API_URL4 = "https://specialist.skippr.ai/api";
214
322
  async function fetchSessionMessages(sessionId, authedFetch) {
215
323
  try {
216
- const resp = await authedFetch(`${API_URL3}/v1/sessions/${sessionId}/messages`);
324
+ const resp = await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/messages`);
217
325
  if (!resp.ok)
218
326
  return [];
219
327
  const { messages } = await resp.json();
@@ -243,7 +351,7 @@ function stopStream(stream) {
243
351
  track.stop();
244
352
  }
245
353
  async function exchangeForBearerToken(appKey, userToken) {
246
- const resp = await fetch(`${API_URL3}/v1/auth/token-exchange`, {
354
+ const resp = await fetch(`${API_URL4}/v1/auth/token-exchange`, {
247
355
  method: "POST",
248
356
  credentials: "omit",
249
357
  headers: {
@@ -267,26 +375,26 @@ function useSession({
267
375
  onStartError,
268
376
  onDisconnect
269
377
  }) {
270
- const [connection, setConnection] = useState3(null);
271
- const [shouldConnect, setShouldConnect] = useState3(false);
272
- const [isStarting, setIsStarting] = useState3(false);
273
- const [isDisconnecting, setIsDisconnecting] = useState3(false);
274
- const [error, setError] = useState3("");
275
- const [errorCode, setErrorCode] = useState3(null);
276
- const [sessionId, setSessionId] = useState3(null);
277
- const [bearerToken, setBearerToken] = useState3(authToken ?? null);
278
- const [pendingScreenStream, setPendingScreenStream] = useState3(null);
279
- const [isPaused, setIsPaused] = useState3(false);
280
- const [isPausing, setIsPausing] = useState3(false);
281
- const [historyMessages, setHistoryMessages] = useState3([]);
282
- const [authFailed, setAuthFailed] = useState3(false);
378
+ const [connection, setConnection] = useState4(null);
379
+ const [shouldConnect, setShouldConnect] = useState4(false);
380
+ const [isStarting, setIsStarting] = useState4(false);
381
+ const [isDisconnecting, setIsDisconnecting] = useState4(false);
382
+ const [error, setError] = useState4("");
383
+ const [errorCode, setErrorCode] = useState4(null);
384
+ const [sessionId, setSessionId] = useState4(null);
385
+ const [bearerToken, setBearerToken] = useState4(authToken ?? null);
386
+ const [pendingScreenStream, setPendingScreenStream] = useState4(null);
387
+ const [isPaused, setIsPaused] = useState4(false);
388
+ const [isPausing, setIsPausing] = useState4(false);
389
+ const [historyMessages, setHistoryMessages] = useState4([]);
390
+ const [authFailed, setAuthFailed] = useState4(false);
283
391
  const tokenRef = useRef(authToken ? { token: authToken, expiresAt: null } : null);
284
392
  const getUserTokenRef = useRef(getUserToken);
285
393
  getUserTokenRef.current = getUserToken ?? (userToken ? () => Promise.resolve(userToken) : undefined);
286
394
  const failedBearerRef = useRef(null);
287
395
  const inFlightExchangeRef = useRef(null);
288
- const canExchange = useCallback3(() => !!appKey && !!getUserTokenRef.current, [appKey]);
289
- const reExchange = useCallback3(async () => {
396
+ const canExchange = useCallback4(() => !!appKey && !!getUserTokenRef.current, [appKey]);
397
+ const reExchange = useCallback4(async () => {
290
398
  if (inFlightExchangeRef.current)
291
399
  return inFlightExchangeRef.current;
292
400
  const provider = getUserTokenRef.current;
@@ -306,7 +414,7 @@ function useSession({
306
414
  inFlightExchangeRef.current = null;
307
415
  }
308
416
  }, [appKey]);
309
- const getValidBearer = useCallback3(async () => {
417
+ const getValidBearer = useCallback4(async () => {
310
418
  const current = tokenRef.current;
311
419
  if (current) {
312
420
  if (current.expiresAt === null)
@@ -318,7 +426,7 @@ function useSession({
318
426
  return reExchange();
319
427
  return current?.token ?? null;
320
428
  }, [canExchange, reExchange]);
321
- const authedFetch = useCallback3(async (input, init = {}) => {
429
+ const authedFetch = useCallback4(async (input, init = {}) => {
322
430
  const isSecretMode = canExchange();
323
431
  const onTerminalAuthFailure = () => {
324
432
  if (isSecretMode)
@@ -360,7 +468,7 @@ function useSession({
360
468
  setAuthFailed(false);
361
469
  return resp;
362
470
  }, [canExchange, getValidBearer, reExchange]);
363
- useEffect3(() => {
471
+ useEffect4(() => {
364
472
  let stale = false;
365
473
  if (authToken) {
366
474
  tokenRef.current = { token: authToken, expiresAt: null };
@@ -381,12 +489,12 @@ function useSession({
381
489
  }, [authToken, canExchange, reExchange]);
382
490
  const pauseOnUnloadRef = useRef(null);
383
491
  pauseOnUnloadRef.current = connection !== null && !isPaused && sessionId && bearerToken ? { sessionId, bearerToken } : null;
384
- useEffect3(() => {
492
+ useEffect4(() => {
385
493
  const onPageHide = () => {
386
494
  const pending = pauseOnUnloadRef.current;
387
495
  if (!pending)
388
496
  return;
389
- fetch(`${API_URL3}/v1/sessions/${pending.sessionId}/pause`, {
497
+ fetch(`${API_URL4}/v1/sessions/${pending.sessionId}/pause`, {
390
498
  method: "POST",
391
499
  credentials: "omit",
392
500
  keepalive: true,
@@ -396,7 +504,7 @@ function useSession({
396
504
  window.addEventListener("pagehide", onPageHide);
397
505
  return () => window.removeEventListener("pagehide", onPageHide);
398
506
  }, []);
399
- const startSession = useCallback3(async ({ agentId, agentControls, existingSessionId }) => {
507
+ const startSession = useCallback4(async ({ agentId, agentControls, existingSessionId, adoptionGoalId }) => {
400
508
  if (!bearerToken) {
401
509
  setError("No auth token available");
402
510
  return;
@@ -413,11 +521,16 @@ function useSession({
413
521
  if (captureMode === "screenshare") {
414
522
  screenStream = await requestScreenShare();
415
523
  }
416
- const requestAgentControls = agentControls?.highlight === true ? { highlight: true } : undefined;
524
+ const enabledControls = {};
525
+ if (agentControls?.highlight === true)
526
+ enabledControls.highlight = true;
527
+ if (agentControls?.actions === true)
528
+ enabledControls.actions = true;
529
+ const requestAgentControls = Object.keys(enabledControls).length > 0 ? enabledControls : undefined;
417
530
  try {
418
531
  let resolvedSessionId = existingSessionId;
419
532
  if (!resolvedSessionId) {
420
- const createResp = await authedFetch(`${API_URL3}/v1/sessions`, {
533
+ const createResp = await authedFetch(`${API_URL4}/v1/sessions`, {
421
534
  method: "POST",
422
535
  headers: { "Content-Type": "application/json" },
423
536
  body: JSON.stringify({
@@ -434,10 +547,14 @@ function useSession({
434
547
  const { session: session2 } = await createResp.json();
435
548
  resolvedSessionId = session2.id;
436
549
  }
437
- const startResp = await authedFetch(`${API_URL3}/v1/sessions/${resolvedSessionId}/start`, {
550
+ const startResp = await authedFetch(`${API_URL4}/v1/sessions/${resolvedSessionId}/start`, {
438
551
  method: "POST",
439
552
  headers: { "Content-Type": "application/json" },
440
- body: JSON.stringify({ captureMode, agentControls: requestAgentControls })
553
+ body: JSON.stringify({
554
+ captureMode,
555
+ agentControls: requestAgentControls,
556
+ adoptionGoalId
557
+ })
441
558
  });
442
559
  if (!startResp.ok) {
443
560
  const body = await startResp.json().catch(() => null);
@@ -463,12 +580,12 @@ function useSession({
463
580
  setIsStarting(false);
464
581
  }
465
582
  }, [captureMode, bearerToken, authedFetch, onStart, onStartError]);
466
- const pauseSession = useCallback3(async () => {
583
+ const pauseSession = useCallback4(async () => {
467
584
  if (!sessionId || !bearerToken)
468
585
  return;
469
586
  setIsPausing(true);
470
587
  try {
471
- const resp = await authedFetch(`${API_URL3}/v1/sessions/${sessionId}/pause`, {
588
+ const resp = await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/pause`, {
472
589
  method: "POST"
473
590
  });
474
591
  if (!resp.ok) {
@@ -489,12 +606,12 @@ function useSession({
489
606
  setIsPaused(true);
490
607
  setIsPausing(false);
491
608
  }, [sessionId, bearerToken, authedFetch, pendingScreenStream]);
492
- const disconnect = useCallback3(async () => {
609
+ const disconnect = useCallback4(async () => {
493
610
  setIsDisconnecting(true);
494
611
  try {
495
612
  if (sessionId && bearerToken) {
496
613
  try {
497
- await authedFetch(`${API_URL3}/v1/sessions/${sessionId}/pause`, {
614
+ await authedFetch(`${API_URL4}/v1/sessions/${sessionId}/pause`, {
498
615
  method: "POST"
499
616
  });
500
617
  } catch {}
@@ -532,6 +649,13 @@ function useSession({
532
649
  };
533
650
  }
534
651
 
652
+ // src/lib/agentMode.ts
653
+ var AGENT_MODE = {
654
+ Standard: "standard",
655
+ AlwaysOn: "always_on"
656
+ };
657
+ var AGENT_MODES = Object.values(AGENT_MODE);
658
+
535
659
  // src/lib/constants.ts
536
660
  var SIDEBAR_WIDTH = 360;
537
661
  var WIDGET_ROOT_ID = "skippr-sdk-root";
@@ -540,15 +664,9 @@ var PRIVATE_ATTR = "data-skippr-private";
540
664
  var DOM_SNAPSHOT_TOPIC = "skippr.dom-snapshot";
541
665
  var DOM_EVENTS_TOPIC = "skippr.dom-events";
542
666
  var HIGHLIGHT_TOPIC = "skippr.highlight";
667
+ var PAGE_ACTIONS_TOPIC = "skippr.page-actions";
543
668
  var NAME_MAX_CHARS = 80;
544
669
 
545
- // src/lib/agentMode.ts
546
- var AGENT_MODE = {
547
- Standard: "standard",
548
- AlwaysOn: "always_on"
549
- };
550
- var AGENT_MODES = Object.values(AGENT_MODE);
551
-
552
670
  // src/lib/sessionStatus.ts
553
671
  var SESSION_STATUS = {
554
672
  pending: "pending",
@@ -597,12 +715,12 @@ function getModuleSessionState(currentSession, mode) {
597
715
  // src/components/AutoStartMedia.tsx
598
716
  import { useConnectionState, useLocalParticipant } from "@livekit/components-react/hooks";
599
717
  import { ConnectionState, Track } from "livekit-client";
600
- import { useEffect as useEffect4, useRef as useRef2 } from "react";
718
+ import { useEffect as useEffect5, useRef as useRef2 } from "react";
601
719
  function AutoStartMedia({ pendingScreenStream }) {
602
720
  const { localParticipant } = useLocalParticipant();
603
721
  const connectionState = useConnectionState();
604
722
  const didStartRef = useRef2(false);
605
- useEffect4(() => {
723
+ useEffect5(() => {
606
724
  if (didStartRef.current)
607
725
  return;
608
726
  if (connectionState !== ConnectionState.Connected)
@@ -627,7 +745,7 @@ function AutoStartMedia({ pendingScreenStream }) {
627
745
  // src/components/DomCapture.tsx
628
746
  import { useConnectionState as useConnectionState2, useLocalParticipant as useLocalParticipant2 } from "@livekit/components-react/hooks";
629
747
  import { ConnectionState as ConnectionState2, ScreenSharePresets, Track as Track2 } from "livekit-client";
630
- import { useEffect as useEffect5, useRef as useRef3 } from "react";
748
+ import { useEffect as useEffect6, useRef as useRef3 } from "react";
631
749
 
632
750
  // src/capture/a11yUtils.ts
633
751
  var ROLE_BY_TAG = {
@@ -868,6 +986,25 @@ function shouldMaskValue(input) {
868
986
  return true;
869
987
  return false;
870
988
  }
989
+ function isDisabled(element) {
990
+ if ("disabled" in element && element.disabled === true) {
991
+ return true;
992
+ }
993
+ return element.getAttribute("aria-disabled") === "true";
994
+ }
995
+ function isActionBlocked(element) {
996
+ if (isDisabled(element))
997
+ return true;
998
+ if (element.tagName === "IFRAME" && isSensitiveIframe(element))
999
+ return true;
1000
+ const ownerFrame = element.ownerDocument?.defaultView?.frameElement;
1001
+ if (ownerFrame && isSensitiveIframe(ownerFrame))
1002
+ return true;
1003
+ if ((element.tagName === "INPUT" || element.tagName === "TEXTAREA") && shouldMaskValue(element)) {
1004
+ return true;
1005
+ }
1006
+ return false;
1007
+ }
871
1008
  function escapeAttributeValue(value) {
872
1009
  return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/[\r\n]+/g, " ");
873
1010
  }
@@ -1084,6 +1221,20 @@ function buildAccessibilityTree() {
1084
1221
  };
1085
1222
  }
1086
1223
 
1224
+ // src/capture/agentActionSignal.ts
1225
+ var isDispatchingAgentAction = false;
1226
+ function runAgentAction(dispatch) {
1227
+ isDispatchingAgentAction = true;
1228
+ try {
1229
+ dispatch();
1230
+ } finally {
1231
+ isDispatchingAgentAction = false;
1232
+ }
1233
+ }
1234
+ function isAgentActionInProgress() {
1235
+ return isDispatchingAgentAction;
1236
+ }
1237
+
1087
1238
  // src/capture/domEvents.ts
1088
1239
  var MUTATION_DEBOUNCE_MS = 250;
1089
1240
  var textEncoder = new TextEncoder;
@@ -1128,6 +1279,8 @@ function installDomEventListeners(localParticipant, options = {}) {
1128
1279
  const onClick = (event) => {
1129
1280
  if (isInsideWidget(event.target))
1130
1281
  return;
1282
+ if (isAgentActionInProgress())
1283
+ return;
1131
1284
  if (!(event.target instanceof Element))
1132
1285
  return;
1133
1286
  const matchedRef = findNearestRef(event.target);
@@ -1144,6 +1297,8 @@ function installDomEventListeners(localParticipant, options = {}) {
1144
1297
  const onSubmit = (event) => {
1145
1298
  if (isInsideWidget(event.target))
1146
1299
  return;
1300
+ if (isAgentActionInProgress())
1301
+ return;
1147
1302
  if (!(event.target instanceof HTMLFormElement))
1148
1303
  return;
1149
1304
  const submittedForm = event.target;
@@ -1375,7 +1530,7 @@ function DomCapture() {
1375
1530
  const { localParticipant } = useLocalParticipant2();
1376
1531
  const connectionState = useConnectionState2();
1377
1532
  const didStartRef = useRef3(false);
1378
- useEffect5(() => {
1533
+ useEffect6(() => {
1379
1534
  if (didStartRef.current)
1380
1535
  return;
1381
1536
  if (connectionState !== ConnectionState2.Connected)
@@ -1801,31 +1956,16 @@ var __iconNode26 = [
1801
1956
  ["line", { x1: "22", x2: "16", y1: "11", y2: "11", key: "1shjgl" }]
1802
1957
  ];
1803
1958
  var UserPlus = createLucideIcon("user-plus", __iconNode26);
1959
+ // ../../node_modules/.bun/lucide-react@1.8.0+83d5fd7b249dbeef/node_modules/lucide-react/dist/esm/icons/x.js
1960
+ var __iconNode27 = [
1961
+ ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
1962
+ ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
1963
+ ];
1964
+ var X = createLucideIcon("x", __iconNode27);
1804
1965
  // src/components/HighlightOverlay.tsx
1805
- import { useCallback as useCallback4, useEffect as useEffect6, useRef as useRef4, useState as useState4 } from "react";
1806
- import { jsx, jsxs } from "react/jsx-runtime";
1807
- var Z_INDEX = 2147483646;
1808
- var HIGHLIGHT_PADDING = 6;
1809
- var textDecoder = new TextDecoder;
1810
- function parseHighlightMessage(payload) {
1811
- try {
1812
- const json = JSON.parse(textDecoder.decode(payload));
1813
- if (!json || typeof json !== "object")
1814
- return null;
1815
- if (json.type === "show" && typeof json.ref === "string") {
1816
- return {
1817
- type: "show",
1818
- ref: json.ref,
1819
- message: typeof json.message === "string" ? json.message : undefined
1820
- };
1821
- }
1822
- if (json.type === "clear")
1823
- return { type: "clear" };
1824
- return null;
1825
- } catch {
1826
- return null;
1827
- }
1828
- }
1966
+ import { useCallback as useCallback5, useEffect as useEffect7, useRef as useRef4, useState as useState5 } from "react";
1967
+
1968
+ // src/capture/elementRef.ts
1829
1969
  function safeGetIframeDocument(iframe) {
1830
1970
  try {
1831
1971
  return iframe.contentDocument;
@@ -1894,6 +2034,31 @@ function getRectInTopViewport(el) {
1894
2034
  }
1895
2035
  return rect;
1896
2036
  }
2037
+
2038
+ // src/components/HighlightOverlay.tsx
2039
+ import { jsx, jsxs } from "react/jsx-runtime";
2040
+ var Z_INDEX = 2147483646;
2041
+ var HIGHLIGHT_PADDING = 6;
2042
+ var textDecoder = new TextDecoder;
2043
+ function parseHighlightMessage(payload) {
2044
+ try {
2045
+ const json = JSON.parse(textDecoder.decode(payload));
2046
+ if (!json || typeof json !== "object")
2047
+ return null;
2048
+ if (json.type === "show" && typeof json.ref === "string") {
2049
+ return {
2050
+ type: "show",
2051
+ ref: json.ref,
2052
+ message: typeof json.message === "string" ? json.message : undefined
2053
+ };
2054
+ }
2055
+ if (json.type === "clear")
2056
+ return { type: "clear" };
2057
+ return null;
2058
+ } catch {
2059
+ return null;
2060
+ }
2061
+ }
1897
2062
  function findScrollableAncestor(el) {
1898
2063
  const win = el.ownerDocument?.defaultView ?? window;
1899
2064
  let node = el.parentElement;
@@ -1906,14 +2071,14 @@ function findScrollableAncestor(el) {
1906
2071
  return el.ownerDocument?.documentElement ?? document.documentElement;
1907
2072
  }
1908
2073
  function HighlightOverlay() {
1909
- const [overlayState, setOverlayState] = useState4(null);
2074
+ const [overlayState, setOverlayState] = useState5(null);
1910
2075
  const targetElementRef = useRef4(null);
1911
2076
  const pendingFrameRef = useRef4(null);
1912
- const clearOverlay = useCallback4(() => {
2077
+ const clearOverlay = useCallback5(() => {
1913
2078
  targetElementRef.current = null;
1914
2079
  setOverlayState(null);
1915
2080
  }, []);
1916
- const recomputeRect = useCallback4(() => {
2081
+ const recomputeRect = useCallback5(() => {
1917
2082
  pendingFrameRef.current = null;
1918
2083
  const target = targetElementRef.current;
1919
2084
  if (!target)
@@ -1925,12 +2090,12 @@ function HighlightOverlay() {
1925
2090
  const rect2 = getRectInTopViewport(target);
1926
2091
  setOverlayState((prev) => prev ? { ...prev, rect: rect2 } : prev);
1927
2092
  }, [clearOverlay]);
1928
- const scheduleRecompute = useCallback4(() => {
2093
+ const scheduleRecompute = useCallback5(() => {
1929
2094
  if (pendingFrameRef.current !== null)
1930
2095
  return;
1931
2096
  pendingFrameRef.current = window.requestAnimationFrame(recomputeRect);
1932
2097
  }, [recomputeRect]);
1933
- const onHighlightMessage = useCallback4((msg) => {
2098
+ const onHighlightMessage = useCallback5((msg) => {
1934
2099
  const parsed = parseHighlightMessage(msg.payload);
1935
2100
  if (!parsed)
1936
2101
  return;
@@ -1951,7 +2116,7 @@ function HighlightOverlay() {
1951
2116
  });
1952
2117
  }, [clearOverlay]);
1953
2118
  useDataChannel(HIGHLIGHT_TOPIC, onHighlightMessage);
1954
- useEffect6(() => {
2119
+ useEffect7(() => {
1955
2120
  if (!overlayState)
1956
2121
  return;
1957
2122
  const target = targetElementRef.current;
@@ -2033,7 +2198,7 @@ function HighlightOverlay() {
2033
2198
  }
2034
2199
 
2035
2200
  // src/components/MinimizedBubble.tsx
2036
- import { useEffect as useEffect7 } from "react";
2201
+ import { useContext as useContext3, useEffect as useEffect8 } from "react";
2037
2202
 
2038
2203
  // src/hooks/useLiveAgent.ts
2039
2204
  import { useContext as useContext2 } from "react";
@@ -2050,6 +2215,9 @@ function useLiveAgent() {
2050
2215
  historyMessages,
2051
2216
  phasesSnapshot,
2052
2217
  setPhasesSnapshot,
2218
+ adoptionGoals,
2219
+ dismissAdoptionGoal,
2220
+ startAdoptionSession,
2053
2221
  ...publicValue
2054
2222
  } = ctx;
2055
2223
  return publicValue;
@@ -2058,7 +2226,7 @@ function useLiveAgent() {
2058
2226
  // src/hooks/useMediaControls.ts
2059
2227
  import { useLocalParticipant as useLocalParticipant3 } from "@livekit/components-react/hooks";
2060
2228
  import { ScreenSharePresets as ScreenSharePresets2 } from "livekit-client";
2061
- import { useCallback as useCallback5 } from "react";
2229
+ import { useCallback as useCallback6 } from "react";
2062
2230
  var SCREEN_SHARE_OPTIONS = {
2063
2231
  video: { displaySurface: "browser" },
2064
2232
  resolution: ScreenSharePresets2.h720fps30.resolution,
@@ -2068,14 +2236,14 @@ function useMediaControls() {
2068
2236
  const { localParticipant } = useLocalParticipant3();
2069
2237
  const isMuted = !localParticipant.isMicrophoneEnabled;
2070
2238
  const isScreenSharing = localParticipant.isScreenShareEnabled;
2071
- const toggleMute = useCallback5(async () => {
2239
+ const toggleMute = useCallback6(async () => {
2072
2240
  try {
2073
2241
  await localParticipant.setMicrophoneEnabled(isMuted);
2074
2242
  } catch (error) {
2075
2243
  console.error("Failed to toggle microphone:", error);
2076
2244
  }
2077
2245
  }, [localParticipant, isMuted]);
2078
- const toggleScreenShare = useCallback5(async () => {
2246
+ const toggleScreenShare = useCallback6(async () => {
2079
2247
  try {
2080
2248
  await localParticipant.setScreenShareEnabled(!isScreenSharing, SCREEN_SHARE_OPTIONS);
2081
2249
  } catch (error) {
@@ -2092,6 +2260,31 @@ function cn(...inputs) {
2092
2260
  return twMerge(clsx(inputs));
2093
2261
  }
2094
2262
 
2263
+ // src/components/AdoptionBubble.tsx
2264
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
2265
+ function AdoptionBubble({ goal, onAttend, onDismiss }) {
2266
+ return /* @__PURE__ */ jsxs2("div", {
2267
+ className: cn("skippr:flex skippr:max-w-72 skippr:items-center skippr:gap-1.5", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:py-1.5 skippr:pr-1.5 skippr:pl-3.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]"),
2268
+ children: [
2269
+ /* @__PURE__ */ jsx2("button", {
2270
+ type: "button",
2271
+ onClick: () => onAttend(goal),
2272
+ className: "skippr:min-w-0 skippr:flex-1 skippr:cursor-pointer skippr:truncate skippr:rounded-full skippr:text-left skippr:transition-opacity skippr:hover:opacity-90 skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-inset skippr:focus-visible:ring-white/70",
2273
+ children: goal.displayMessage
2274
+ }),
2275
+ /* @__PURE__ */ jsx2("button", {
2276
+ type: "button",
2277
+ onClick: () => onDismiss(goal.goalId),
2278
+ "aria-label": "Dismiss suggestion",
2279
+ className: cn("skippr:flex skippr:size-5 skippr:shrink-0 skippr:items-center skippr:justify-center", "skippr:rounded-full skippr:text-white/70 skippr:cursor-pointer", "skippr:transition-colors skippr:hover:bg-white/15 skippr:hover:text-white", "skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-white/70"),
2280
+ children: /* @__PURE__ */ jsx2(X, {
2281
+ className: "skippr:size-3.5"
2282
+ })
2283
+ })
2284
+ ]
2285
+ });
2286
+ }
2287
+
2095
2288
  // src/hooks/useAgentVoiceState.ts
2096
2289
  import { useVoiceAssistant } from "@livekit/components-react/hooks";
2097
2290
  function useAgentVoiceState() {
@@ -2104,7 +2297,7 @@ function useAgentVoiceState() {
2104
2297
  }
2105
2298
 
2106
2299
  // src/components/LauncherStatusPill.tsx
2107
- import { jsx as jsx2, jsxs as jsxs2, Fragment } from "react/jsx-runtime";
2300
+ import { jsx as jsx3, jsxs as jsxs3, Fragment } from "react/jsx-runtime";
2108
2301
  function pillStatusFromAgent(state, canSeePage) {
2109
2302
  if (state === "speaking")
2110
2303
  return "talking";
@@ -2141,58 +2334,58 @@ function LauncherStatusPill() {
2141
2334
  setSidebarTab("chat");
2142
2335
  expandPanel();
2143
2336
  };
2144
- return /* @__PURE__ */ jsx2("button", {
2337
+ return /* @__PURE__ */ jsx3("button", {
2145
2338
  type: "button",
2146
2339
  onClick: handleClick,
2147
2340
  className: cn("skippr:fixed skippr:bottom-20 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", "skippr:rounded-full skippr:bg-bubble/95 skippr:backdrop-blur-sm", "skippr:px-3 skippr:py-1.5", "skippr:text-xs skippr:font-medium skippr:text-white", "skippr:shadow-[0_8px_24px_rgba(45,43,61,0.35)]", "skippr:cursor-pointer skippr:transition-colors skippr:hover:bg-bubble", "skippr:animate-[skippr-bubble-in_0.28s_ease-out]", position === "right" ? "skippr:right-6" : "skippr:left-6"),
2148
2341
  "aria-label": ariaLabel,
2149
- children: /* @__PURE__ */ jsxs2("span", {
2342
+ children: /* @__PURE__ */ jsxs3("span", {
2150
2343
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:animate-[skippr-pill-content_0.22s_ease-out]",
2151
2344
  children: [
2152
- status === "standing-by" && /* @__PURE__ */ jsxs2(Fragment, {
2345
+ status === "standing-by" && /* @__PURE__ */ jsxs3(Fragment, {
2153
2346
  children: [
2154
- /* @__PURE__ */ jsx2("span", {
2347
+ /* @__PURE__ */ jsx3("span", {
2155
2348
  children: "Standing by"
2156
2349
  }),
2157
- /* @__PURE__ */ jsx2(ThinkingDots, {})
2350
+ /* @__PURE__ */ jsx3(ThinkingDots, {})
2158
2351
  ]
2159
2352
  }),
2160
- status === "observing" && /* @__PURE__ */ jsxs2(Fragment, {
2353
+ status === "observing" && /* @__PURE__ */ jsxs3(Fragment, {
2161
2354
  children: [
2162
- /* @__PURE__ */ jsx2(ObservingIcon, {}),
2163
- /* @__PURE__ */ jsx2("span", {
2355
+ /* @__PURE__ */ jsx3(ObservingIcon, {}),
2356
+ /* @__PURE__ */ jsx3("span", {
2164
2357
  children: "Skippr is observing"
2165
2358
  })
2166
2359
  ]
2167
2360
  }),
2168
- status === "connected" && /* @__PURE__ */ jsxs2(Fragment, {
2361
+ status === "connected" && /* @__PURE__ */ jsxs3(Fragment, {
2169
2362
  children: [
2170
- /* @__PURE__ */ jsx2(ConnectedDot, {}),
2171
- /* @__PURE__ */ jsx2("span", {
2363
+ /* @__PURE__ */ jsx3(ConnectedDot, {}),
2364
+ /* @__PURE__ */ jsx3("span", {
2172
2365
  children: "Skippr is connected"
2173
2366
  })
2174
2367
  ]
2175
2368
  }),
2176
- status === "talking" && /* @__PURE__ */ jsxs2(Fragment, {
2369
+ status === "talking" && /* @__PURE__ */ jsxs3(Fragment, {
2177
2370
  children: [
2178
- /* @__PURE__ */ jsx2(SpeakingBars, {}),
2179
- /* @__PURE__ */ jsx2("span", {
2371
+ /* @__PURE__ */ jsx3(SpeakingBars, {}),
2372
+ /* @__PURE__ */ jsx3("span", {
2180
2373
  children: "Skippr is talking"
2181
2374
  })
2182
2375
  ]
2183
2376
  }),
2184
- status === "thinking" && /* @__PURE__ */ jsxs2(Fragment, {
2377
+ status === "thinking" && /* @__PURE__ */ jsxs3(Fragment, {
2185
2378
  children: [
2186
- /* @__PURE__ */ jsx2(ThinkingDots, {}),
2187
- /* @__PURE__ */ jsx2("span", {
2379
+ /* @__PURE__ */ jsx3(ThinkingDots, {}),
2380
+ /* @__PURE__ */ jsx3("span", {
2188
2381
  children: "Skippr is thinking"
2189
2382
  })
2190
2383
  ]
2191
2384
  }),
2192
- status === "paused" && /* @__PURE__ */ jsxs2(Fragment, {
2385
+ status === "paused" && /* @__PURE__ */ jsxs3(Fragment, {
2193
2386
  children: [
2194
- /* @__PURE__ */ jsx2(PausedDot, {}),
2195
- /* @__PURE__ */ jsx2("span", {
2387
+ /* @__PURE__ */ jsx3(PausedDot, {}),
2388
+ /* @__PURE__ */ jsx3("span", {
2196
2389
  children: "Session paused"
2197
2390
  })
2198
2391
  ]
@@ -2202,25 +2395,25 @@ function LauncherStatusPill() {
2202
2395
  });
2203
2396
  }
2204
2397
  function ConnectedDot() {
2205
- return /* @__PURE__ */ jsxs2("span", {
2398
+ return /* @__PURE__ */ jsxs3("span", {
2206
2399
  className: "skippr:relative skippr:flex skippr:size-2",
2207
2400
  children: [
2208
- /* @__PURE__ */ jsx2("span", {
2401
+ /* @__PURE__ */ jsx3("span", {
2209
2402
  className: "skippr:absolute skippr:inline-flex skippr:size-full skippr:animate-ping skippr:rounded-full skippr:bg-emerald-400 skippr:opacity-75"
2210
2403
  }),
2211
- /* @__PURE__ */ jsx2("span", {
2404
+ /* @__PURE__ */ jsx3("span", {
2212
2405
  className: "skippr:relative skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-emerald-400"
2213
2406
  })
2214
2407
  ]
2215
2408
  });
2216
2409
  }
2217
2410
  function PausedDot() {
2218
- return /* @__PURE__ */ jsx2("span", {
2411
+ return /* @__PURE__ */ jsx3("span", {
2219
2412
  className: "skippr:inline-flex skippr:size-2 skippr:rounded-full skippr:bg-amber-400"
2220
2413
  });
2221
2414
  }
2222
2415
  function ObservingIcon() {
2223
- return /* @__PURE__ */ jsxs2("svg", {
2416
+ return /* @__PURE__ */ jsxs3("svg", {
2224
2417
  viewBox: "0 0 24 24",
2225
2418
  className: "skippr:size-3.5",
2226
2419
  fill: "none",
@@ -2230,10 +2423,10 @@ function ObservingIcon() {
2230
2423
  strokeLinejoin: "round",
2231
2424
  "aria-hidden": "true",
2232
2425
  children: [
2233
- /* @__PURE__ */ jsx2("path", {
2426
+ /* @__PURE__ */ jsx3("path", {
2234
2427
  d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"
2235
2428
  }),
2236
- /* @__PURE__ */ jsx2("circle", {
2429
+ /* @__PURE__ */ jsx3("circle", {
2237
2430
  cx: "12",
2238
2431
  cy: "12",
2239
2432
  r: "3",
@@ -2245,38 +2438,38 @@ function ObservingIcon() {
2245
2438
  });
2246
2439
  }
2247
2440
  function SpeakingBars() {
2248
- return /* @__PURE__ */ jsxs2("span", {
2441
+ return /* @__PURE__ */ jsxs3("span", {
2249
2442
  className: "skippr:flex skippr:items-center skippr:gap-[2px] skippr:h-3.5",
2250
2443
  children: [
2251
- /* @__PURE__ */ jsx2("span", {
2444
+ /* @__PURE__ */ jsx3("span", {
2252
2445
  className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_infinite] skippr:h-1.5"
2253
2446
  }),
2254
- /* @__PURE__ */ jsx2("span", {
2447
+ /* @__PURE__ */ jsx3("span", {
2255
2448
  className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.15s_infinite] skippr:h-3"
2256
2449
  }),
2257
- /* @__PURE__ */ jsx2("span", {
2450
+ /* @__PURE__ */ jsx3("span", {
2258
2451
  className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.3s_infinite] skippr:h-2"
2259
2452
  }),
2260
- /* @__PURE__ */ jsx2("span", {
2453
+ /* @__PURE__ */ jsx3("span", {
2261
2454
  className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.45s_infinite] skippr:h-3.5"
2262
2455
  }),
2263
- /* @__PURE__ */ jsx2("span", {
2456
+ /* @__PURE__ */ jsx3("span", {
2264
2457
  className: "skippr:w-[2px] skippr:rounded-sm skippr:bg-white skippr:animate-[skippr-speak_1.1s_ease-in-out_0.6s_infinite] skippr:h-1"
2265
2458
  })
2266
2459
  ]
2267
2460
  });
2268
2461
  }
2269
2462
  function ThinkingDots() {
2270
- return /* @__PURE__ */ jsxs2("span", {
2463
+ return /* @__PURE__ */ jsxs3("span", {
2271
2464
  className: "skippr:flex skippr:items-center skippr:gap-[3px]",
2272
2465
  children: [
2273
- /* @__PURE__ */ jsx2("span", {
2466
+ /* @__PURE__ */ jsx3("span", {
2274
2467
  className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:0ms]"
2275
2468
  }),
2276
- /* @__PURE__ */ jsx2("span", {
2469
+ /* @__PURE__ */ jsx3("span", {
2277
2470
  className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:150ms]"
2278
2471
  }),
2279
- /* @__PURE__ */ jsx2("span", {
2472
+ /* @__PURE__ */ jsx3("span", {
2280
2473
  className: "skippr:size-1 skippr:rounded-full skippr:bg-white skippr:animate-bounce skippr:[animation-delay:300ms]"
2281
2474
  })
2282
2475
  ]
@@ -2284,9 +2477,9 @@ function ThinkingDots() {
2284
2477
  }
2285
2478
 
2286
2479
  // src/components/Logo.tsx
2287
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
2480
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
2288
2481
  function Logo({ className }) {
2289
- return /* @__PURE__ */ jsxs3("svg", {
2482
+ return /* @__PURE__ */ jsxs4("svg", {
2290
2483
  width: "1em",
2291
2484
  height: "1em",
2292
2485
  viewBox: "0 0 200 200",
@@ -2296,20 +2489,20 @@ function Logo({ className }) {
2296
2489
  "aria-label": "Skippr",
2297
2490
  className,
2298
2491
  children: [
2299
- /* @__PURE__ */ jsx3("rect", {
2492
+ /* @__PURE__ */ jsx4("rect", {
2300
2493
  width: "200",
2301
2494
  height: "200",
2302
2495
  rx: "40",
2303
2496
  fill: "#2D2D3F"
2304
2497
  }),
2305
- /* @__PURE__ */ jsxs3("g", {
2498
+ /* @__PURE__ */ jsxs4("g", {
2306
2499
  transform: "translate(100 100) scale(0.8) translate(-100 -100)",
2307
2500
  children: [
2308
- /* @__PURE__ */ jsx3("path", {
2501
+ /* @__PURE__ */ jsx4("path", {
2309
2502
  d: "M144.497 59C149.193 59 153 62.8071 153 67.5033V116.397C153 118.034 152.536 119.562 151.735 120.859L114.894 92.4811L114.894 92.4804C105.42 85.1648 91.2971 91.7058 91.297 104.015V124.901H54.5033C49.8071 124.901 46 121.094 46 116.397V67.5033C46 62.8071 49.8071 59 54.5033 59H144.497ZM101.272 104.015C101.272 100.172 105.736 98.0111 108.798 100.375L140.637 124.901H101.272V104.015Z",
2310
2503
  fill: "white"
2311
2504
  }),
2312
- /* @__PURE__ */ jsx3("path", {
2505
+ /* @__PURE__ */ jsx4("path", {
2313
2506
  d: "M108.798 99.8856C105.736 97.5211 101.271 99.6824 101.271 103.525V155.892C101.271 160.27 106.852 162.191 109.594 158.755L122.619 142.437C123.1 141.836 123.712 141.35 124.409 141.016C125.106 140.683 125.871 140.51 126.645 140.51H147.946C152.386 140.51 154.316 134.944 150.81 132.247L108.798 99.8856Z",
2314
2507
  fill: "#2BC0AE"
2315
2508
  })
@@ -2320,7 +2513,7 @@ function Logo({ className }) {
2320
2513
  }
2321
2514
 
2322
2515
  // src/components/MinimizedBubble.tsx
2323
- import { jsx as jsx4, jsxs as jsxs4, Fragment as Fragment2 } from "react/jsx-runtime";
2516
+ import { jsx as jsx5, jsxs as jsxs5, Fragment as Fragment2 } from "react/jsx-runtime";
2324
2517
  var CONTROL_BUTTON = "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center skippr:rounded-[14px] skippr:cursor-pointer skippr:transition-all skippr:hover:-translate-y-0.5 skippr:active:translate-y-0";
2325
2518
  var CONTROL_SHADOW = "skippr:shadow-[0_4px_16px_rgba(0,0,0,0.15),0_2px_4px_rgba(0,0,0,0.1)]";
2326
2519
  function ConnectedLauncher() {
@@ -2341,61 +2534,61 @@ function ConnectedLauncher() {
2341
2534
  setSidebarTab("chat");
2342
2535
  expandPanel();
2343
2536
  };
2344
- return /* @__PURE__ */ jsxs4(Fragment2, {
2537
+ return /* @__PURE__ */ jsxs5(Fragment2, {
2345
2538
  children: [
2346
- !showPaused && /* @__PURE__ */ jsxs4(Fragment2, {
2539
+ !showPaused && /* @__PURE__ */ jsxs5(Fragment2, {
2347
2540
  children: [
2348
- /* @__PURE__ */ jsx4("button", {
2541
+ /* @__PURE__ */ jsx5("button", {
2349
2542
  type: "button",
2350
2543
  onClick: toggleMute,
2351
2544
  "aria-label": isMuted ? "Unmute" : "Mute",
2352
2545
  className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isMuted ? "skippr:bg-destructive/10 skippr:text-destructive skippr:hover:bg-destructive/20" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
2353
- children: isMuted ? /* @__PURE__ */ jsx4(MicOff, {
2546
+ children: isMuted ? /* @__PURE__ */ jsx5(MicOff, {
2354
2547
  className: "skippr:size-5"
2355
- }) : /* @__PURE__ */ jsx4(Mic, {
2548
+ }) : /* @__PURE__ */ jsx5(Mic, {
2356
2549
  className: "skippr:size-5"
2357
2550
  })
2358
2551
  }),
2359
- showScreenShareToggle && /* @__PURE__ */ jsx4("button", {
2552
+ showScreenShareToggle && /* @__PURE__ */ jsx5("button", {
2360
2553
  type: "button",
2361
2554
  onClick: toggleScreenShare,
2362
2555
  "aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
2363
2556
  className: cn(CONTROL_BUTTON, CONTROL_SHADOW, isScreenSharing ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted"),
2364
- children: isScreenSharing ? /* @__PURE__ */ jsx4(MonitorOff, {
2557
+ children: isScreenSharing ? /* @__PURE__ */ jsx5(MonitorOff, {
2365
2558
  className: "skippr:size-5"
2366
- }) : /* @__PURE__ */ jsx4(Monitor, {
2559
+ }) : /* @__PURE__ */ jsx5(Monitor, {
2367
2560
  className: "skippr:size-5"
2368
2561
  })
2369
2562
  })
2370
2563
  ]
2371
2564
  }),
2372
- /* @__PURE__ */ jsx4("button", {
2565
+ /* @__PURE__ */ jsx5("button", {
2373
2566
  type: "button",
2374
2567
  onClick: () => isPaused ? resumeSession() : pauseSession(),
2375
2568
  disabled: isPausing,
2376
2569
  "aria-label": showPaused ? "Resume session" : "Pause session",
2377
2570
  className: cn(CONTROL_BUTTON, CONTROL_SHADOW, "skippr:bg-white skippr:text-foreground skippr:hover:bg-muted skippr:disabled:opacity-60"),
2378
- children: showPaused ? /* @__PURE__ */ jsx4(Play, {
2571
+ children: showPaused ? /* @__PURE__ */ jsx5(Play, {
2379
2572
  className: "skippr:size-5"
2380
- }) : /* @__PURE__ */ jsx4(Pause, {
2573
+ }) : /* @__PURE__ */ jsx5(Pause, {
2381
2574
  className: "skippr:size-5"
2382
2575
  })
2383
2576
  }),
2384
- /* @__PURE__ */ jsx4("button", {
2577
+ /* @__PURE__ */ jsx5("button", {
2385
2578
  type: "button",
2386
2579
  onClick: () => disconnect(),
2387
2580
  "aria-label": "End session",
2388
2581
  className: cn(CONTROL_BUTTON, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90", "skippr:shadow-[0_4px_16px_rgba(217,79,79,0.45),0_2px_4px_rgba(0,0,0,0.1)]"),
2389
- children: /* @__PURE__ */ jsx4(PhoneOff, {
2582
+ children: /* @__PURE__ */ jsx5(PhoneOff, {
2390
2583
  className: "skippr:size-5"
2391
2584
  })
2392
2585
  }),
2393
- !showPaused && /* @__PURE__ */ jsx4("button", {
2586
+ !showPaused && /* @__PURE__ */ jsx5("button", {
2394
2587
  type: "button",
2395
2588
  onClick: openChat,
2396
2589
  "aria-label": "Open chat",
2397
2590
  className: cn(CONTROL_BUTTON, "skippr:bg-bubble skippr:text-white skippr:overflow-hidden", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:hover:shadow-[0_6px_24px_rgba(45,43,61,0.55),0_4px_8px_rgba(0,0,0,0.1)]"),
2398
- children: /* @__PURE__ */ jsx4(MessageSquare, {
2591
+ children: /* @__PURE__ */ jsx5(MessageSquare, {
2399
2592
  className: "skippr:size-5"
2400
2593
  })
2401
2594
  })
@@ -2404,12 +2597,12 @@ function ConnectedLauncher() {
2404
2597
  }
2405
2598
  function IdleLauncher() {
2406
2599
  const { expandPanel } = useLiveAgent();
2407
- return /* @__PURE__ */ jsx4("button", {
2600
+ return /* @__PURE__ */ jsx5("button", {
2408
2601
  type: "button",
2409
2602
  onClick: expandPanel,
2410
2603
  "aria-label": "Skippr assistant",
2411
2604
  className: cn("skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:rounded-[10px] skippr:overflow-hidden skippr:cursor-pointer", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)]", "skippr:transition-all skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0"),
2412
- children: /* @__PURE__ */ jsx4(Logo, {
2605
+ children: /* @__PURE__ */ jsx5(Logo, {
2413
2606
  className: "skippr:size-12"
2414
2607
  })
2415
2608
  });
@@ -2419,18 +2612,18 @@ function WelcomeBubble({
2419
2612
  position,
2420
2613
  onDismiss
2421
2614
  }) {
2422
- useEffect7(() => {
2615
+ useEffect8(() => {
2423
2616
  const timer = setTimeout(onDismiss, 5000);
2424
2617
  return () => clearTimeout(timer);
2425
2618
  }, [onDismiss]);
2426
- return /* @__PURE__ */ jsxs4("button", {
2619
+ return /* @__PURE__ */ jsxs5("button", {
2427
2620
  type: "button",
2428
2621
  className: cn("skippr:absolute skippr:bottom-full skippr:mb-3", "skippr:max-w-64 skippr:rounded-xl skippr:bg-card skippr:shadow-lg", "skippr:border skippr:border-border skippr:px-4 skippr:py-3", "skippr:text-sm skippr:text-foreground skippr:leading-relaxed skippr:text-left", "skippr:animate-[skippr-fade-in_0.3s_ease-out]", "skippr:cursor-pointer", position === "right" ? "skippr:right-0" : "skippr:left-0"),
2429
2622
  onClick: onDismiss,
2430
2623
  "aria-label": "Dismiss",
2431
2624
  children: [
2432
2625
  message,
2433
- /* @__PURE__ */ jsx4("span", {
2626
+ /* @__PURE__ */ jsx5("span", {
2434
2627
  className: cn("skippr:absolute skippr:top-full skippr:size-2.5", "skippr:border-l skippr:border-t skippr:border-border skippr:bg-card", "skippr:rotate-[225deg]", position === "right" ? "skippr:right-5" : "skippr:left-5", "skippr:-mt-[5px]")
2435
2628
  })
2436
2629
  ]
@@ -2441,30 +2634,381 @@ function MinimizedBubble({
2441
2634
  welcomeDismissed,
2442
2635
  onDismissWelcome
2443
2636
  }) {
2444
- const { isConnected, isStarting, isPaused, isPausing, position } = useLiveAgent();
2637
+ const ctx = useContext3(LiveAgentContext);
2638
+ if (!ctx) {
2639
+ throw new Error("MinimizedBubble must be used within a <LiveAgent> provider");
2640
+ }
2641
+ const {
2642
+ isConnected,
2643
+ isStarting,
2644
+ isPaused,
2645
+ isPausing,
2646
+ position,
2647
+ adoptionGoals,
2648
+ dismissAdoptionGoal,
2649
+ startAdoptionSession
2650
+ } = ctx;
2445
2651
  const inSession = isConnected || isPaused || isPausing;
2446
- return /* @__PURE__ */ jsxs4(Fragment2, {
2652
+ return /* @__PURE__ */ jsxs5(Fragment2, {
2447
2653
  children: [
2448
- /* @__PURE__ */ jsx4(LauncherStatusPill, {}),
2449
- /* @__PURE__ */ jsxs4("div", {
2654
+ /* @__PURE__ */ jsx5(LauncherStatusPill, {}),
2655
+ /* @__PURE__ */ jsxs5("div", {
2450
2656
  className: cn("skippr:fixed skippr:bottom-6 skippr:z-[9999]", "skippr:flex skippr:items-center skippr:gap-2", position === "right" ? "skippr:right-6" : "skippr:left-6"),
2451
2657
  children: [
2452
- welcomeMessage && !isConnected && !isStarting && !welcomeDismissed && /* @__PURE__ */ jsx4(WelcomeBubble, {
2658
+ !inSession && !isStarting && adoptionGoals.length > 0 && /* @__PURE__ */ jsx5("div", {
2659
+ className: cn("skippr:absolute skippr:bottom-full skippr:mb-3 skippr:flex skippr:flex-col skippr:gap-2", position === "right" ? "skippr:right-0 skippr:items-end" : "skippr:left-0 skippr:items-start"),
2660
+ children: adoptionGoals.map((goal) => /* @__PURE__ */ jsx5(AdoptionBubble, {
2661
+ goal,
2662
+ onAttend: startAdoptionSession,
2663
+ onDismiss: dismissAdoptionGoal
2664
+ }, goal.goalId))
2665
+ }),
2666
+ welcomeMessage && !isConnected && !isStarting && !welcomeDismissed && adoptionGoals.length === 0 && /* @__PURE__ */ jsx5(WelcomeBubble, {
2453
2667
  message: welcomeMessage,
2454
2668
  position,
2455
2669
  onDismiss: onDismissWelcome
2456
2670
  }),
2457
- inSession ? /* @__PURE__ */ jsx4(ConnectedLauncher, {}) : /* @__PURE__ */ jsx4(IdleLauncher, {})
2671
+ inSession ? /* @__PURE__ */ jsx5(ConnectedLauncher, {}) : /* @__PURE__ */ jsx5(IdleLauncher, {})
2458
2672
  ]
2459
2673
  })
2460
2674
  ]
2461
2675
  });
2462
2676
  }
2463
2677
 
2678
+ // src/components/PageActionHandler.tsx
2679
+ import { useDataChannel as useDataChannel2 } from "@livekit/components-react/hooks";
2680
+ import { useCallback as useCallback7, useEffect as useEffect10, useRef as useRef6, useState as useState7 } from "react";
2681
+
2682
+ // src/components/AgentActivityIndicator.tsx
2683
+ import { useEffect as useEffect9, useRef as useRef5, useState as useState6 } from "react";
2684
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
2685
+ var Z_INDEX2 = 2147483646;
2686
+ function centerOf(element) {
2687
+ const rect = getRectInTopViewport(element);
2688
+ return { left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 };
2689
+ }
2690
+ function AgentActivityIndicator({ target }) {
2691
+ const [position, setPosition] = useState6(null);
2692
+ const frameRef = useRef5(null);
2693
+ useEffect9(() => {
2694
+ if (!target || !target.element.isConnected) {
2695
+ setPosition(null);
2696
+ return;
2697
+ }
2698
+ const update = () => {
2699
+ frameRef.current = null;
2700
+ if (!target.element.isConnected)
2701
+ return;
2702
+ setPosition(centerOf(target.element));
2703
+ };
2704
+ update();
2705
+ const schedule = () => {
2706
+ if (frameRef.current !== null)
2707
+ return;
2708
+ frameRef.current = window.requestAnimationFrame(update);
2709
+ };
2710
+ window.addEventListener("scroll", schedule, { capture: true, passive: true });
2711
+ window.addEventListener("resize", schedule, { passive: true });
2712
+ return () => {
2713
+ window.removeEventListener("scroll", schedule, { capture: true });
2714
+ window.removeEventListener("resize", schedule);
2715
+ if (frameRef.current !== null) {
2716
+ window.cancelAnimationFrame(frameRef.current);
2717
+ frameRef.current = null;
2718
+ }
2719
+ };
2720
+ }, [target]);
2721
+ if (!target || !position)
2722
+ return null;
2723
+ const containerStyle = {
2724
+ position: "fixed",
2725
+ left: `${position.left}px`,
2726
+ top: `${position.top}px`,
2727
+ pointerEvents: "none",
2728
+ zIndex: Z_INDEX2,
2729
+ transition: "left 0.45s cubic-bezier(0.22, 1, 0.36, 1), top 0.45s cubic-bezier(0.22, 1, 0.36, 1)"
2730
+ };
2731
+ return /* @__PURE__ */ jsx6("div", {
2732
+ "data-skippr-private": "true",
2733
+ style: containerStyle,
2734
+ children: /* @__PURE__ */ jsxs6("div", {
2735
+ className: "skippr:relative",
2736
+ children: [
2737
+ /* @__PURE__ */ jsx6(MousePointer2, {
2738
+ "aria-hidden": "true",
2739
+ className: "skippr:h-5 skippr:w-5 skippr:text-cyan-500 skippr:drop-shadow-[0_1px_3px_rgba(0,0,0,0.35)] skippr:animate-skippr-press",
2740
+ fill: "currentColor"
2741
+ }),
2742
+ /* @__PURE__ */ jsx6("div", {
2743
+ role: "status",
2744
+ className: "skippr:absolute skippr:left-5 skippr:top-4 skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-cyan-500 skippr:px-2.5 skippr:py-1 skippr:shadow-[0_4px_12px_rgba(0,0,0,0.18)]",
2745
+ children: /* @__PURE__ */ jsx6("span", {
2746
+ className: "skippr:text-[11px] skippr:font-medium skippr:text-white skippr:whitespace-nowrap",
2747
+ children: target.label
2748
+ })
2749
+ })
2750
+ ]
2751
+ })
2752
+ });
2753
+ }
2754
+
2755
+ // src/components/PageActionHandler.tsx
2756
+ import { jsx as jsx7 } from "react/jsx-runtime";
2757
+ var INDICATOR_LINGER_MS = 1400;
2758
+ var CURSOR_LEAD_BEFORE_ACTION_MS = 350;
2759
+ var SETTLE_MS = 250;
2760
+ var textDecoder2 = new TextDecoder;
2761
+ function parsePageAction(payload) {
2762
+ try {
2763
+ const json = JSON.parse(textDecoder2.decode(payload));
2764
+ if (!json || typeof json !== "object")
2765
+ return null;
2766
+ switch (json.type) {
2767
+ case "click":
2768
+ return typeof json.ref === "string" ? { type: "click", ref: json.ref } : null;
2769
+ case "fill":
2770
+ return typeof json.ref === "string" && typeof json.value === "string" ? { type: "fill", ref: json.ref, value: json.value } : null;
2771
+ case "select":
2772
+ return typeof json.ref === "string" && typeof json.value === "string" ? { type: "select", ref: json.ref, value: json.value } : null;
2773
+ case "scroll":
2774
+ return typeof json.ref === "string" ? { type: "scroll", ref: json.ref } : null;
2775
+ case "navigate":
2776
+ return typeof json.url === "string" ? { type: "navigate", url: json.url } : null;
2777
+ default:
2778
+ return null;
2779
+ }
2780
+ } catch {
2781
+ return null;
2782
+ }
2783
+ }
2784
+ function isSameOriginHttpUrl(url) {
2785
+ try {
2786
+ const parsed = new URL(url);
2787
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
2788
+ return false;
2789
+ return parsed.origin === window.location.origin;
2790
+ } catch {
2791
+ return false;
2792
+ }
2793
+ }
2794
+ function isVisible2(element) {
2795
+ const rect = element.getBoundingClientRect();
2796
+ if (rect.width === 0 && rect.height === 0)
2797
+ return false;
2798
+ const style = element.ownerDocument.defaultView?.getComputedStyle(element);
2799
+ if (!style)
2800
+ return true;
2801
+ return style.visibility !== "hidden" && style.display !== "none";
2802
+ }
2803
+ function setReactCompatibleValue(element, value) {
2804
+ const prototype = element instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
2805
+ const setter = Object.getOwnPropertyDescriptor(prototype, "value")?.set;
2806
+ if (setter) {
2807
+ setter.call(element, value);
2808
+ } else {
2809
+ element.value = value;
2810
+ }
2811
+ element.dispatchEvent(new Event("input", { bubbles: true }));
2812
+ element.dispatchEvent(new Event("change", { bubbles: true }));
2813
+ }
2814
+ function performFill(element, value) {
2815
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
2816
+ element.focus();
2817
+ setReactCompatibleValue(element, value);
2818
+ }
2819
+ }
2820
+ function performSelect(element, value) {
2821
+ if (element instanceof HTMLSelectElement) {
2822
+ const match = Array.from(element.options).find((option) => option.value === value || option.label === value || option.text === value);
2823
+ if (match) {
2824
+ element.value = match.value;
2825
+ element.dispatchEvent(new Event("change", { bubbles: true }));
2826
+ }
2827
+ return;
2828
+ }
2829
+ if (element instanceof HTMLInputElement && (element.type === "checkbox" || element.type === "radio")) {
2830
+ const shouldCheck = value !== "false" && value !== "";
2831
+ if (element.checked !== shouldCheck)
2832
+ element.click();
2833
+ }
2834
+ }
2835
+ var INTERACTIVE_SELECTOR = 'button, a[href], [role="button"], [role="link"], input, select, [onclick]';
2836
+ function resolveClickTarget(element) {
2837
+ if (element.matches(INTERACTIVE_SELECTOR))
2838
+ return element;
2839
+ const ancestor = element.closest(INTERACTIVE_SELECTOR);
2840
+ if (ancestor)
2841
+ return ancestor;
2842
+ const descendants = element.querySelectorAll(INTERACTIVE_SELECTOR);
2843
+ const onlyDescendant = descendants.length === 1 ? descendants[0] : null;
2844
+ return onlyDescendant ?? element;
2845
+ }
2846
+ function performClick(element) {
2847
+ const rect = element.getBoundingClientRect();
2848
+ const clientX = rect.left + rect.width / 2;
2849
+ const clientY = rect.top + rect.height / 2;
2850
+ const base = { bubbles: true, cancelable: true, composed: true, clientX, clientY, button: 0 };
2851
+ if (typeof element.focus === "function") {
2852
+ try {
2853
+ element.focus({ preventScroll: true });
2854
+ } catch {}
2855
+ }
2856
+ try {
2857
+ element.dispatchEvent(new PointerEvent("pointerdown", { ...base, pointerId: 1, isPrimary: true }));
2858
+ element.dispatchEvent(new MouseEvent("mousedown", base));
2859
+ element.dispatchEvent(new PointerEvent("pointerup", { ...base, pointerId: 1, isPrimary: true }));
2860
+ element.dispatchEvent(new MouseEvent("mouseup", base));
2861
+ } catch {}
2862
+ element.click();
2863
+ }
2864
+ function performAction(action, element) {
2865
+ switch (action.type) {
2866
+ case "click": {
2867
+ const target = resolveClickTarget(element);
2868
+ target.scrollIntoView({ behavior: "smooth", block: "center" });
2869
+ performClick(target);
2870
+ return;
2871
+ }
2872
+ case "fill":
2873
+ element.scrollIntoView({ behavior: "smooth", block: "center" });
2874
+ performFill(element, action.value);
2875
+ return;
2876
+ case "select":
2877
+ element.scrollIntoView({ behavior: "smooth", block: "center" });
2878
+ performSelect(element, action.value);
2879
+ return;
2880
+ case "scroll":
2881
+ element.scrollIntoView({ behavior: "smooth", block: "center" });
2882
+ return;
2883
+ }
2884
+ }
2885
+ function labelFor(action) {
2886
+ switch (action.type) {
2887
+ case "click":
2888
+ return "Clicking…";
2889
+ case "fill":
2890
+ return "Typing…";
2891
+ case "select":
2892
+ return "Selecting…";
2893
+ case "scroll":
2894
+ return "Scrolling…";
2895
+ case "navigate":
2896
+ return "Navigating…";
2897
+ }
2898
+ }
2899
+ function PageActionHandler() {
2900
+ const [activity, setActivity] = useState7(null);
2901
+ const mountedRef = useRef6(true);
2902
+ const queueRef = useRef6([]);
2903
+ const drainingRef = useRef6(false);
2904
+ const timersRef = useRef6(new Set);
2905
+ const wakesRef = useRef6(new Set);
2906
+ const indicatorTimerRef = useRef6(null);
2907
+ const sleep = useCallback7((ms) => {
2908
+ return new Promise((resolve) => {
2909
+ const wake = () => {
2910
+ wakesRef.current.delete(wake);
2911
+ resolve();
2912
+ };
2913
+ wakesRef.current.add(wake);
2914
+ const timer = setTimeout(() => {
2915
+ timersRef.current.delete(timer);
2916
+ wake();
2917
+ }, ms);
2918
+ timersRef.current.add(timer);
2919
+ });
2920
+ }, []);
2921
+ const showActivity = useCallback7((target) => {
2922
+ if (indicatorTimerRef.current) {
2923
+ clearTimeout(indicatorTimerRef.current);
2924
+ indicatorTimerRef.current = null;
2925
+ }
2926
+ setActivity(target);
2927
+ if (target) {
2928
+ const timer = setTimeout(() => {
2929
+ indicatorTimerRef.current = null;
2930
+ if (mountedRef.current)
2931
+ setActivity(null);
2932
+ }, INDICATOR_LINGER_MS);
2933
+ indicatorTimerRef.current = timer;
2934
+ }
2935
+ }, []);
2936
+ const processOne = useCallback7(async (action) => {
2937
+ if (action.type === "navigate") {
2938
+ queueRef.current.length = 0;
2939
+ if (!isSameOriginHttpUrl(action.url))
2940
+ return;
2941
+ showActivity({ element: document.body, label: labelFor(action) });
2942
+ await sleep(CURSOR_LEAD_BEFORE_ACTION_MS);
2943
+ if (!mountedRef.current)
2944
+ return;
2945
+ window.location.assign(action.url);
2946
+ return;
2947
+ }
2948
+ const element = findElementByRef(action.ref);
2949
+ if (!element || !element.isConnected || !isVisible2(element))
2950
+ return;
2951
+ if (isActionBlocked(element))
2952
+ return;
2953
+ if (action.type === "click" && isActionBlocked(resolveClickTarget(element)))
2954
+ return;
2955
+ showActivity({ element, label: labelFor(action) });
2956
+ await sleep(CURSOR_LEAD_BEFORE_ACTION_MS);
2957
+ if (!mountedRef.current || !element.isConnected)
2958
+ return;
2959
+ runAgentAction(() => performAction(action, element));
2960
+ await sleep(SETTLE_MS);
2961
+ }, [showActivity, sleep]);
2962
+ const drain = useCallback7(async () => {
2963
+ if (drainingRef.current)
2964
+ return;
2965
+ drainingRef.current = true;
2966
+ try {
2967
+ while (mountedRef.current && queueRef.current.length > 0) {
2968
+ const action = queueRef.current.shift();
2969
+ if (!action)
2970
+ break;
2971
+ await processOne(action);
2972
+ }
2973
+ } finally {
2974
+ drainingRef.current = false;
2975
+ }
2976
+ }, [processOne]);
2977
+ const onMessage = useCallback7((msg) => {
2978
+ const action = parsePageAction(msg.payload);
2979
+ if (!action)
2980
+ return;
2981
+ queueRef.current.push(action);
2982
+ drain();
2983
+ }, [drain]);
2984
+ useEffect10(() => {
2985
+ mountedRef.current = true;
2986
+ drainingRef.current = false;
2987
+ return () => {
2988
+ mountedRef.current = false;
2989
+ for (const timer of timersRef.current)
2990
+ clearTimeout(timer);
2991
+ timersRef.current.clear();
2992
+ if (indicatorTimerRef.current) {
2993
+ clearTimeout(indicatorTimerRef.current);
2994
+ indicatorTimerRef.current = null;
2995
+ }
2996
+ for (const wake of wakesRef.current)
2997
+ wake();
2998
+ wakesRef.current.clear();
2999
+ queueRef.current.length = 0;
3000
+ };
3001
+ }, []);
3002
+ useDataChannel2(PAGE_ACTIONS_TOPIC, onMessage);
3003
+ return /* @__PURE__ */ jsx7(AgentActivityIndicator, {
3004
+ target: activity
3005
+ });
3006
+ }
3007
+
2464
3008
  // src/components/ShadowHost.tsx
2465
- import { useLayoutEffect, useRef as useRef5, useState as useState5 } from "react";
3009
+ import { useLayoutEffect, useRef as useRef7, useState as useState8 } from "react";
2466
3010
  import { createPortal } from "react-dom";
2467
- import { jsx as jsx5, Fragment as Fragment3 } from "react/jsx-runtime";
3011
+ import { jsx as jsx8, Fragment as Fragment3 } from "react/jsx-runtime";
2468
3012
  var PROPERTIES_STYLE_ID = "skippr-tw-properties";
2469
3013
  var PROPERTY_RULE = /@property\s+[^{]+\{[^}]*\}/g;
2470
3014
  function hoistTailwindProperties(css) {
@@ -2479,10 +3023,10 @@ function hoistTailwindProperties(css) {
2479
3023
  return css.replace(PROPERTY_RULE, "");
2480
3024
  }
2481
3025
  function ShadowHost({ children }) {
2482
- const hostRef = useRef5(null);
2483
- const [shadowRoot, setShadowRoot] = useState5(null);
3026
+ const hostRef = useRef7(null);
3027
+ const [shadowRoot, setShadowRoot] = useState8(null);
2484
3028
  const css = `/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2485
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-tracking-wide:.025em;--skippr-tracking-wider:.05em;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-full{top:100%}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-2{bottom:calc(var(--skippr-spacing)*-2)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-0{bottom:calc(var(--skippr-spacing)*0)}.skippr\\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[88px\\]{bottom:88px}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:col-span-2{grid-column:span 2/span 2}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:flex{display:flex}.skippr\\:grid{display:grid}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-11{width:calc(var(--skippr-spacing)*11);height:calc(var(--skippr-spacing)*11)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-\\[min\\(460px\\,calc\\(100vh-200px\\)\\)\\]{height:min(460px,100vh - 200px)}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-9{width:calc(var(--skippr-spacing)*9)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:resize-none{resize:none}.skippr\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.skippr\\:flex-col{flex-direction:column}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-destructive\\/20{border-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/15{background-color:oklab(29.9244% .0107414 -.0305411/.15)}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-destructive\\/10{background-color:oklab(61.4357% .15892 .0698893/.1)}.skippr\\:bg-destructive\\/15{background-color:oklab(61.4357% .15892 .0698893/.15)}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/15{background-color:oklab(100% 0 5.96046e-8/.15)}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.skippr\\:from-background{--tw-gradient-from:oklch(100% 0 0);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-6{padding:calc(var(--skippr-spacing)*6)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:pt-3{padding-top:calc(var(--skippr-spacing)*3)}.skippr\\:pb-5{padding-bottom:calc(var(--skippr-spacing)*5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:tracking-wide{--tw-tracking:var(--skippr-tracking-wide);letter-spacing:var(--skippr-tracking-wide)}.skippr\\:tracking-wider{--tw-tracking:var(--skippr-tracking-wider);letter-spacing:var(--skippr-tracking-wider)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-destructive-foreground{color:oklch(100% 0 0)}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white{color:var(--skippr-color-white)}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000026),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(217\\,79\\,79\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#d94f4f73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/20:hover{background-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:hover\\:bg-destructive\\/25:hover{background-color:oklab(61.4357% .15892 .0698893/.25)}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-muted\\/50:hover{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:hover\\:bg-muted\\/80:hover{background-color:oklab(97% -.000282743 .000959196/.8)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:#fff}.skippr\\:hover\\:shadow-\\[0_6px_24px_rgba\\(45\\,43\\,61\\,0\\.55\\)\\,0_4px_8px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]:hover{--tw-shadow:0 6px 24px var(--tw-shadow-color,#2d2b3d8c),0 4px 8px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
3029
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--skippr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--skippr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--skippr-color-red-50:oklch(97.1% .013 17.38);--skippr-color-red-400:oklch(70.4% .191 22.216);--skippr-color-red-700:oklch(50.5% .213 27.518);--skippr-color-amber-400:oklch(82.8% .189 84.429);--skippr-color-emerald-400:oklch(76.5% .177 163.223);--skippr-color-cyan-400:oklch(78.9% .154 211.53);--skippr-color-cyan-500:oklch(71.5% .143 215.221);--skippr-color-cyan-900:oklch(39.8% .07 227.392);--skippr-color-white:#fff;--skippr-spacing:.25rem;--skippr-text-xs:.75rem;--skippr-text-xs--line-height:calc(1/.75);--skippr-text-sm:.875rem;--skippr-text-sm--line-height:calc(1.25/.875);--skippr-font-weight-medium:500;--skippr-font-weight-semibold:600;--skippr-tracking-wide:.025em;--skippr-tracking-wider:.05em;--skippr-leading-tight:1.25;--skippr-leading-snug:1.375;--skippr-leading-relaxed:1.625;--skippr-ease-in-out:cubic-bezier(.4,0,.2,1);--skippr-animate-spin:spin 1s linear infinite;--skippr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--skippr-animate-bounce:bounce 1s infinite;--skippr-blur-sm:8px;--skippr-default-transition-duration:.15s;--skippr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--skippr-default-font-family:var(--skippr-font-sans);--skippr-default-mono-font-family:var(--skippr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--skippr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--skippr-default-font-feature-settings,normal);font-variation-settings:var(--skippr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--skippr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--skippr-default-mono-font-feature-settings,normal);font-variation-settings:var(--skippr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.skippr\\:pointer-events-none{pointer-events:none}.skippr\\:absolute{position:absolute}.skippr\\:fixed{position:fixed}.skippr\\:relative{position:relative}.skippr\\:sticky{position:sticky}.skippr\\:inset-0{inset:calc(var(--skippr-spacing)*0)}.skippr\\:top-0{top:calc(var(--skippr-spacing)*0)}.skippr\\:top-4{top:calc(var(--skippr-spacing)*4)}.skippr\\:top-full{top:100%}.skippr\\:right-0{right:calc(var(--skippr-spacing)*0)}.skippr\\:right-3{right:calc(var(--skippr-spacing)*3)}.skippr\\:right-5{right:calc(var(--skippr-spacing)*5)}.skippr\\:right-6{right:calc(var(--skippr-spacing)*6)}.skippr\\:-bottom-2{bottom:calc(var(--skippr-spacing)*-2)}.skippr\\:-bottom-9{bottom:calc(var(--skippr-spacing)*-9)}.skippr\\:bottom-0{bottom:calc(var(--skippr-spacing)*0)}.skippr\\:bottom-6{bottom:calc(var(--skippr-spacing)*6)}.skippr\\:bottom-20{bottom:calc(var(--skippr-spacing)*20)}.skippr\\:bottom-\\[88px\\]{bottom:88px}.skippr\\:bottom-full{bottom:100%}.skippr\\:left-0{left:calc(var(--skippr-spacing)*0)}.skippr\\:left-1\\/2{left:50%}.skippr\\:left-3{left:calc(var(--skippr-spacing)*3)}.skippr\\:left-5{left:calc(var(--skippr-spacing)*5)}.skippr\\:left-6{left:calc(var(--skippr-spacing)*6)}.skippr\\:z-10{z-index:10}.skippr\\:z-\\[9998\\]{z-index:9998}.skippr\\:z-\\[9999\\]{z-index:9999}.skippr\\:col-span-2{grid-column:span 2/span 2}.skippr\\:mx-auto{margin-inline:auto}.skippr\\:-mt-\\[5px\\]{margin-top:-5px}.skippr\\:mt-0\\.5{margin-top:calc(var(--skippr-spacing)*.5)}.skippr\\:mt-1{margin-top:calc(var(--skippr-spacing)*1)}.skippr\\:mt-1\\.5{margin-top:calc(var(--skippr-spacing)*1.5)}.skippr\\:mt-3{margin-top:calc(var(--skippr-spacing)*3)}.skippr\\:mb-1\\.5{margin-bottom:calc(var(--skippr-spacing)*1.5)}.skippr\\:mb-2{margin-bottom:calc(var(--skippr-spacing)*2)}.skippr\\:mb-3{margin-bottom:calc(var(--skippr-spacing)*3)}.skippr\\:mb-4{margin-bottom:calc(var(--skippr-spacing)*4)}.skippr\\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.skippr\\:flex{display:flex}.skippr\\:grid{display:grid}.skippr\\:inline-flex{display:inline-flex}.skippr\\:size-1{width:calc(var(--skippr-spacing)*1);height:calc(var(--skippr-spacing)*1)}.skippr\\:size-1\\.5{width:calc(var(--skippr-spacing)*1.5);height:calc(var(--skippr-spacing)*1.5)}.skippr\\:size-2{width:calc(var(--skippr-spacing)*2);height:calc(var(--skippr-spacing)*2)}.skippr\\:size-2\\.5{width:calc(var(--skippr-spacing)*2.5);height:calc(var(--skippr-spacing)*2.5)}.skippr\\:size-3\\.5{width:calc(var(--skippr-spacing)*3.5);height:calc(var(--skippr-spacing)*3.5)}.skippr\\:size-4{width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}.skippr\\:size-5{width:calc(var(--skippr-spacing)*5);height:calc(var(--skippr-spacing)*5)}.skippr\\:size-6{width:calc(var(--skippr-spacing)*6);height:calc(var(--skippr-spacing)*6)}.skippr\\:size-7{width:calc(var(--skippr-spacing)*7);height:calc(var(--skippr-spacing)*7)}.skippr\\:size-8{width:calc(var(--skippr-spacing)*8);height:calc(var(--skippr-spacing)*8)}.skippr\\:size-9{width:calc(var(--skippr-spacing)*9);height:calc(var(--skippr-spacing)*9)}.skippr\\:size-10{width:calc(var(--skippr-spacing)*10);height:calc(var(--skippr-spacing)*10)}.skippr\\:size-11{width:calc(var(--skippr-spacing)*11);height:calc(var(--skippr-spacing)*11)}.skippr\\:size-12{width:calc(var(--skippr-spacing)*12);height:calc(var(--skippr-spacing)*12)}.skippr\\:size-full{width:100%;height:100%}.skippr\\:h-0{height:calc(var(--skippr-spacing)*0)}.skippr\\:h-0\\.5{height:calc(var(--skippr-spacing)*.5)}.skippr\\:h-1{height:calc(var(--skippr-spacing)*1)}.skippr\\:h-1\\.5{height:calc(var(--skippr-spacing)*1.5)}.skippr\\:h-2{height:calc(var(--skippr-spacing)*2)}.skippr\\:h-3{height:calc(var(--skippr-spacing)*3)}.skippr\\:h-3\\.5{height:calc(var(--skippr-spacing)*3.5)}.skippr\\:h-4{height:calc(var(--skippr-spacing)*4)}.skippr\\:h-5{height:calc(var(--skippr-spacing)*5)}.skippr\\:h-6{height:calc(var(--skippr-spacing)*6)}.skippr\\:h-8{height:calc(var(--skippr-spacing)*8)}.skippr\\:h-9{height:calc(var(--skippr-spacing)*9)}.skippr\\:h-10{height:calc(var(--skippr-spacing)*10)}.skippr\\:h-12{height:calc(var(--skippr-spacing)*12)}.skippr\\:h-\\[min\\(460px\\,calc\\(100vh-200px\\)\\)\\]{height:min(460px,100vh - 200px)}.skippr\\:h-full{height:100%}.skippr\\:min-h-0{min-height:calc(var(--skippr-spacing)*0)}.skippr\\:w-0{width:calc(var(--skippr-spacing)*0)}.skippr\\:w-3{width:calc(var(--skippr-spacing)*3)}.skippr\\:w-4{width:calc(var(--skippr-spacing)*4)}.skippr\\:w-5{width:calc(var(--skippr-spacing)*5)}.skippr\\:w-9{width:calc(var(--skippr-spacing)*9)}.skippr\\:w-10{width:calc(var(--skippr-spacing)*10)}.skippr\\:w-\\[2px\\]{width:2px}.skippr\\:w-full{width:100%}.skippr\\:max-w-64{max-width:calc(var(--skippr-spacing)*64)}.skippr\\:max-w-72{max-width:calc(var(--skippr-spacing)*72)}.skippr\\:max-w-\\[80\\%\\]{max-width:80%}.skippr\\:min-w-0{min-width:calc(var(--skippr-spacing)*0)}.skippr\\:flex-1{flex:1}.skippr\\:shrink-0{flex-shrink:0}.skippr\\:origin-bottom-left{transform-origin:0 100%}.skippr\\:origin-bottom-right{transform-origin:100% 100%}.skippr\\:origin-center{transform-origin:50%}.skippr\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:rotate-\\[225deg\\]{rotate:225deg}.skippr\\:animate-\\[skippr-banner-look_2\\.4s_ease-in-out_infinite\\]{animation:2.4s ease-in-out infinite skippr-banner-look}.skippr\\:animate-\\[skippr-bubble-in_0\\.28s_ease-out\\]{animation:.28s ease-out skippr-bubble-in}.skippr\\:animate-\\[skippr-fade-in_0\\.3s_ease-out\\]{animation:.3s ease-out skippr-fade-in}.skippr\\:animate-\\[skippr-pill-content_0\\.22s_ease-out\\]{animation:.22s ease-out skippr-pill-content}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.3s_infinite\\]{animation:1.1s ease-in-out .3s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.6s_infinite\\]{animation:1.1s ease-in-out .6s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.15s_infinite\\]{animation:1.1s ease-in-out .15s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_0\\.45s_infinite\\]{animation:1.1s ease-in-out .45s infinite skippr-speak}.skippr\\:animate-\\[skippr-speak_1\\.1s_ease-in-out_infinite\\]{animation:1.1s ease-in-out infinite skippr-speak}.skippr\\:animate-bounce{animation:var(--skippr-animate-bounce)}.skippr\\:animate-ping{animation:var(--skippr-animate-ping)}.skippr\\:animate-skippr-annotation-pulse{animation:1.8s ease-in-out infinite skippr-annotation-pulse}.skippr\\:animate-skippr-press{animation:.5s ease-in-out skippr-press}.skippr\\:animate-skippr-tab-fade{animation:.2s ease-out skippr-tab-fade}.skippr\\:animate-skippr-thinking-dot{animation:1.2s ease-in-out infinite skippr-thinking-dot}.skippr\\:animate-spin{animation:var(--skippr-animate-spin)}.skippr\\:cursor-pointer{cursor:pointer}.skippr\\:resize-none{resize:none}.skippr\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.skippr\\:flex-col{flex-direction:column}.skippr\\:items-center{align-items:center}.skippr\\:items-end{align-items:flex-end}.skippr\\:items-start{align-items:flex-start}.skippr\\:justify-between{justify-content:space-between}.skippr\\:justify-center{justify-content:center}.skippr\\:justify-end{justify-content:flex-end}.skippr\\:gap-0\\.5{gap:calc(var(--skippr-spacing)*.5)}.skippr\\:gap-1{gap:calc(var(--skippr-spacing)*1)}.skippr\\:gap-1\\.5{gap:calc(var(--skippr-spacing)*1.5)}.skippr\\:gap-2{gap:calc(var(--skippr-spacing)*2)}.skippr\\:gap-2\\.5{gap:calc(var(--skippr-spacing)*2.5)}.skippr\\:gap-3{gap:calc(var(--skippr-spacing)*3)}.skippr\\:gap-\\[2px\\]{gap:2px}.skippr\\:gap-\\[3px\\]{gap:3px}:where(.skippr\\:space-y-0\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.skippr\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--skippr-spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--skippr-spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.skippr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.skippr\\:overflow-hidden{overflow:hidden}.skippr\\:overflow-y-auto{overflow-y:auto}.skippr\\:rounded-2xl{border-radius:1.125rem}.skippr\\:rounded-\\[1rem\\]{border-radius:1rem}.skippr\\:rounded-\\[10px\\]{border-radius:10px}.skippr\\:rounded-\\[14px\\]{border-radius:14px}.skippr\\:rounded-full{border-radius:3.40282e38px}.skippr\\:rounded-lg{border-radius:.625rem}.skippr\\:rounded-md{border-radius:.5rem}.skippr\\:rounded-sm{border-radius:.375rem}.skippr\\:rounded-xl{border-radius:.875rem}.skippr\\:border{border-style:var(--tw-border-style);border-width:1px}.skippr\\:border-0{border-style:var(--tw-border-style);border-width:0}.skippr\\:border-2{border-style:var(--tw-border-style);border-width:2px}.skippr\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.skippr\\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.skippr\\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.skippr\\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.skippr\\:border-border{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-cyan-400{border-color:var(--skippr-color-cyan-400)}.skippr\\:border-destructive\\/20{border-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:border-input{border-color:oklch(92.3% .003 48.717)}.skippr\\:border-primary\\/20{border-color:oklab(29.9244% .0107414 -.0305411/.2)}.skippr\\:border-r-border{border-right-color:oklch(92.3% .003 48.717)}.skippr\\:border-l-border{border-left-color:oklch(92.3% .003 48.717)}.skippr\\:bg-amber-400{background-color:var(--skippr-color-amber-400)}.skippr\\:bg-background{background-color:oklch(100% 0 0)}.skippr\\:bg-bubble{background-color:#2d2b3d}.skippr\\:bg-bubble\\/15{background-color:oklab(29.9244% .0107414 -.0305411/.15)}.skippr\\:bg-bubble\\/95{background-color:oklab(29.9244% .0107414 -.0305411/.95)}.skippr\\:bg-card{background-color:oklch(100% 0 0)}.skippr\\:bg-current{background-color:currentColor}.skippr\\:bg-cyan-400{background-color:var(--skippr-color-cyan-400)}.skippr\\:bg-cyan-500{background-color:var(--skippr-color-cyan-500)}.skippr\\:bg-destructive{background-color:#d94f4f}.skippr\\:bg-destructive\\/10{background-color:oklab(61.4357% .15892 .0698893/.1)}.skippr\\:bg-destructive\\/15{background-color:oklab(61.4357% .15892 .0698893/.15)}.skippr\\:bg-emerald-400{background-color:var(--skippr-color-emerald-400)}.skippr\\:bg-foreground{background-color:oklch(14.7% .004 49.25)}.skippr\\:bg-muted{background-color:oklch(97% .001 106.424)}.skippr\\:bg-muted-foreground\\/20{background-color:oklab(55.3% .00687528 .0110332/.2)}.skippr\\:bg-muted-foreground\\/40{background-color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:bg-muted\\/50{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:bg-primary{background-color:#2d2b3d}.skippr\\:bg-primary-foreground\\/15{background-color:oklab(100% 0 5.96046e-8/.15)}.skippr\\:bg-primary-foreground\\/20{background-color:oklab(100% 0 5.96046e-8/.2)}.skippr\\:bg-primary\\/10{background-color:oklab(29.9244% .0107414 -.0305411/.1)}.skippr\\:bg-red-50{background-color:var(--skippr-color-red-50)}.skippr\\:bg-red-400{background-color:var(--skippr-color-red-400)}.skippr\\:bg-secondary{background-color:#ffdfb5}.skippr\\:bg-transparent{background-color:#0000}.skippr\\:bg-white{background-color:var(--skippr-color-white)}.skippr\\:bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.skippr\\:from-background{--tw-gradient-from:oklch(100% 0 0);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.skippr\\:fill-primary\\/30{fill:oklab(29.9244% .0107414 -.0305411/.3)}.skippr\\:p-2{padding:calc(var(--skippr-spacing)*2)}.skippr\\:p-3{padding:calc(var(--skippr-spacing)*3)}.skippr\\:p-3\\.5{padding:calc(var(--skippr-spacing)*3.5)}.skippr\\:p-4{padding:calc(var(--skippr-spacing)*4)}.skippr\\:p-6{padding:calc(var(--skippr-spacing)*6)}.skippr\\:px-1{padding-inline:calc(var(--skippr-spacing)*1)}.skippr\\:px-1\\.5{padding-inline:calc(var(--skippr-spacing)*1.5)}.skippr\\:px-2{padding-inline:calc(var(--skippr-spacing)*2)}.skippr\\:px-2\\.5{padding-inline:calc(var(--skippr-spacing)*2.5)}.skippr\\:px-3{padding-inline:calc(var(--skippr-spacing)*3)}.skippr\\:px-4{padding-inline:calc(var(--skippr-spacing)*4)}.skippr\\:px-6{padding-inline:calc(var(--skippr-spacing)*6)}.skippr\\:px-8{padding-inline:calc(var(--skippr-spacing)*8)}.skippr\\:py-0\\.5{padding-block:calc(var(--skippr-spacing)*.5)}.skippr\\:py-1{padding-block:calc(var(--skippr-spacing)*1)}.skippr\\:py-1\\.5{padding-block:calc(var(--skippr-spacing)*1.5)}.skippr\\:py-2{padding-block:calc(var(--skippr-spacing)*2)}.skippr\\:py-2\\.5{padding-block:calc(var(--skippr-spacing)*2.5)}.skippr\\:py-3{padding-block:calc(var(--skippr-spacing)*3)}.skippr\\:py-4{padding-block:calc(var(--skippr-spacing)*4)}.skippr\\:pt-3{padding-top:calc(var(--skippr-spacing)*3)}.skippr\\:pr-1\\.5{padding-right:calc(var(--skippr-spacing)*1.5)}.skippr\\:pb-5{padding-bottom:calc(var(--skippr-spacing)*5)}.skippr\\:pl-3\\.5{padding-left:calc(var(--skippr-spacing)*3.5)}.skippr\\:text-center{text-align:center}.skippr\\:text-left{text-align:left}.skippr\\:font-mono{font-family:var(--skippr-font-mono)}.skippr\\:text-sm{font-size:var(--skippr-text-sm);line-height:var(--tw-leading,var(--skippr-text-sm--line-height))}.skippr\\:text-xs{font-size:var(--skippr-text-xs);line-height:var(--tw-leading,var(--skippr-text-xs--line-height))}.skippr\\:text-\\[9px\\]{font-size:9px}.skippr\\:text-\\[10px\\]{font-size:10px}.skippr\\:text-\\[11px\\]{font-size:11px}.skippr\\:leading-5{--tw-leading:calc(var(--skippr-spacing)*5);line-height:calc(var(--skippr-spacing)*5)}.skippr\\:leading-relaxed{--tw-leading:var(--skippr-leading-relaxed);line-height:var(--skippr-leading-relaxed)}.skippr\\:leading-snug{--tw-leading:var(--skippr-leading-snug);line-height:var(--skippr-leading-snug)}.skippr\\:leading-tight{--tw-leading:var(--skippr-leading-tight);line-height:var(--skippr-leading-tight)}.skippr\\:font-medium{--tw-font-weight:var(--skippr-font-weight-medium);font-weight:var(--skippr-font-weight-medium)}.skippr\\:font-semibold{--tw-font-weight:var(--skippr-font-weight-semibold);font-weight:var(--skippr-font-weight-semibold)}.skippr\\:tracking-wide{--tw-tracking:var(--skippr-tracking-wide);letter-spacing:var(--skippr-tracking-wide)}.skippr\\:tracking-wider{--tw-tracking:var(--skippr-tracking-wider);letter-spacing:var(--skippr-tracking-wider)}.skippr\\:whitespace-nowrap{white-space:nowrap}.skippr\\:text-background{color:oklch(100% 0 0)}.skippr\\:text-bubble{color:#2d2b3d}.skippr\\:text-chart-3{color:oklch(66.6% .179 58.318)}.skippr\\:text-cyan-500{color:var(--skippr-color-cyan-500)}.skippr\\:text-cyan-900{color:var(--skippr-color-cyan-900)}.skippr\\:text-destructive{color:#d94f4f}.skippr\\:text-destructive-foreground{color:oklch(100% 0 0)}.skippr\\:text-foreground{color:oklch(14.7% .004 49.25)}.skippr\\:text-muted-foreground{color:oklch(55.3% .013 58.071)}.skippr\\:text-muted-foreground\\/30{color:oklab(55.3% .00687528 .0110332/.3)}.skippr\\:text-muted-foreground\\/40{color:oklab(55.3% .00687528 .0110332/.4)}.skippr\\:text-muted-foreground\\/60{color:oklab(55.3% .00687528 .0110332/.6)}.skippr\\:text-muted-foreground\\/70{color:oklab(55.3% .00687528 .0110332/.7)}.skippr\\:text-primary{color:#2d2b3d}.skippr\\:text-primary-foreground{color:#fff}.skippr\\:text-primary-foreground\\/70{color:oklab(100% 0 5.96046e-8/.7)}.skippr\\:text-red-700{color:var(--skippr-color-red-700)}.skippr\\:text-secondary-foreground{color:#613700}.skippr\\:text-white,.skippr\\:text-white\\/70{color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:text-white\\/70{color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:uppercase{text-transform:uppercase}.skippr\\:line-through{text-decoration-line:line-through}.skippr\\:placeholder-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}.skippr\\:opacity-0{opacity:0}.skippr\\:opacity-75{opacity:.75}.skippr\\:opacity-100{opacity:1}.skippr\\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.18\\)\\]{--tw-shadow:0 4px 12px var(--tw-shadow-color,#0000002e);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#00000026),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(45\\,43\\,61\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#2d2b3d73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_4px_16px_rgba\\(217\\,79\\,79\\,0\\.45\\)\\,0_2px_4px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#d94f4f73),0 2px 4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_24px_rgba\\(45\\,43\\,61\\,0\\.35\\)\\]{--tw-shadow:0 8px 24px var(--tw-shadow-color,#2d2b3d59);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-\\[0_8px_30px_rgba\\(0\\,0\\,0\\,0\\.16\\)\\,0_4px_12px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\]{--tw-shadow:0 8px 30px var(--tw-shadow-color,#00000029),0 4px 12px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:ring-foreground\\/10{--tw-ring-color:oklab(14.7% .00261104 .00303026/.1)}.skippr\\:ring-offset-background{--tw-ring-offset-color:oklch(100% 0 0)}.skippr\\:drop-shadow-\\[0_1px_3px_rgba\\(0\\,0\\,0\\,0\\.35\\)\\]{--tw-drop-shadow-size:drop-shadow(0 1px 3px var(--tw-drop-shadow-color,#00000059));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.skippr\\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--skippr-blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.skippr\\:transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--skippr-default-transition-timing-function));transition-duration:var(--tw-duration,var(--skippr-default-transition-duration))}.skippr\\:duration-150{--tw-duration:.15s;transition-duration:.15s}.skippr\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.skippr\\:ease-in-out{--tw-ease:var(--skippr-ease-in-out);transition-timing-function:var(--skippr-ease-in-out)}.skippr\\:outline-none{--tw-outline-style:none;outline-style:none}.skippr\\:\\[animation-delay\\:0ms\\]{animation-delay:0s}.skippr\\:\\[animation-delay\\:150ms\\]{animation-delay:.15s}.skippr\\:\\[animation-delay\\:200ms\\]{animation-delay:.2s}.skippr\\:\\[animation-delay\\:300ms\\]{animation-delay:.3s}.skippr\\:\\[animation-delay\\:400ms\\]{animation-delay:.4s}.skippr\\:group-focus-within\\:scale-100:is(:where(.skippr\\:group):focus-within *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-focus-within\\:opacity-100:is(:where(.skippr\\:group):focus-within *){opacity:1}@media (hover:hover){.skippr\\:group-hover\\:scale-100:is(:where(.skippr\\:group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.skippr\\:group-hover\\:opacity-100:is(:where(.skippr\\:group):hover *){opacity:1}}.skippr\\:placeholder\\:text-muted-foreground::placeholder{color:oklch(55.3% .013 58.071)}@media (hover:hover){.skippr\\:hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--skippr-spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:hover\\:bg-accent:hover{background-color:#e7e5e4}.skippr\\:hover\\:bg-bubble:hover{background-color:#2d2b3d}.skippr\\:hover\\:bg-destructive\\/20:hover{background-color:oklab(61.4357% .15892 .0698893/.2)}.skippr\\:hover\\:bg-destructive\\/25:hover{background-color:oklab(61.4357% .15892 .0698893/.25)}.skippr\\:hover\\:bg-destructive\\/90:hover{background-color:oklab(61.4357% .15892 .0698893/.9)}.skippr\\:hover\\:bg-muted:hover{background-color:oklch(97% .001 106.424)}.skippr\\:hover\\:bg-muted\\/50:hover{background-color:oklab(97% -.000282743 .000959196/.5)}.skippr\\:hover\\:bg-muted\\/80:hover{background-color:oklab(97% -.000282743 .000959196/.8)}.skippr\\:hover\\:bg-primary-foreground\\/10:hover{background-color:oklab(100% 0 5.96046e-8/.1)}.skippr\\:hover\\:bg-primary\\/90:hover{background-color:oklab(29.9244% .0107414 -.0305411/.9)}.skippr\\:hover\\:bg-secondary\\/80:hover{background-color:oklab(91.9963% .0175391 .0626889/.8)}.skippr\\:hover\\:bg-white\\/15:hover{background-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:hover\\:bg-white\\/15:hover{background-color:color-mix(in oklab,var(--skippr-color-white)15%,transparent)}}.skippr\\:hover\\:text-accent-foreground:hover{color:oklch(21.6% .006 56.043)}.skippr\\:hover\\:text-foreground:hover{color:oklch(14.7% .004 49.25)}.skippr\\:hover\\:text-primary-foreground:hover{color:#fff}.skippr\\:hover\\:text-white:hover{color:var(--skippr-color-white)}.skippr\\:hover\\:opacity-90:hover{opacity:.9}.skippr\\:hover\\:shadow-\\[0_6px_24px_rgba\\(45\\,43\\,61\\,0\\.55\\)\\,0_4px_8px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]:hover{--tw-shadow:0 6px 24px var(--tw-shadow-color,#2d2b3d8c),0 4px 8px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.skippr\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.skippr\\:focus-visible\\:ring-ring:focus-visible{--tw-ring-color:oklch(70.9% .01 56.259)}.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:var(--skippr-color-white)}@supports (color:color-mix(in lab, red, red)){.skippr\\:focus-visible\\:ring-white\\/70:focus-visible{--tw-ring-color:color-mix(in oklab,var(--skippr-color-white)70%,transparent)}}.skippr\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.skippr\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.skippr\\:focus-visible\\:ring-inset:focus-visible{--tw-ring-inset:inset}.skippr\\:active\\:translate-y-0:active{--tw-translate-y:calc(var(--skippr-spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.skippr\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.skippr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.skippr\\:disabled\\:opacity-50:disabled{opacity:.5}.skippr\\:disabled\\:opacity-60:disabled{opacity:.6}.skippr\\:\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.skippr\\:\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.skippr\\:\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--skippr-spacing)*4);height:calc(var(--skippr-spacing)*4)}}@keyframes skippr-tap{0%{transform:scale(1)}45%{transform:scale(.7)}to{transform:scale(1)}}@keyframes skippr-press{0%{transform:scale(1)}55%{transform:scale(1)}85%{transform:scale(.68)}to{transform:scale(1)}}@keyframes skippr-tab-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-speak{0%,to{opacity:.6;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-thinking-dot{0%,80%,to{opacity:.2;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}@keyframes skippr-pulse-ring{0%,to{box-shadow:0 0 #2d2b3d66}50%{box-shadow:0 0 0 10px #2d2b3d00}}@keyframes skippr-annotation-pulse{0%,to{box-shadow:0 0 #22d3ee73}50%{box-shadow:0 0 0 10px #22d3ee00}}@keyframes skippr-speak-ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(1.8)}}@keyframes skippr-bar{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}@keyframes skippr-breathe{0%,to{opacity:.85;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}@keyframes skippr-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes skippr-wave{0%,to{opacity:.4;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes skippr-bubble-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes skippr-pill-content{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes skippr-banner-look{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}.skippr-no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.skippr-no-scrollbar::-webkit-scrollbar{display:none}:host{color:var(--color-foreground)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}`;
2486
3030
  useLayoutEffect(() => {
2487
3031
  const host = hostRef.current;
2488
3032
  if (!host || !css)
@@ -2497,20 +3041,20 @@ function ShadowHost({ children }) {
2497
3041
  setShadowRoot(root);
2498
3042
  }, [css]);
2499
3043
  if (!css)
2500
- return /* @__PURE__ */ jsx5(Fragment3, {
3044
+ return /* @__PURE__ */ jsx8(Fragment3, {
2501
3045
  children
2502
3046
  });
2503
- return /* @__PURE__ */ jsx5("div", {
3047
+ return /* @__PURE__ */ jsx8("div", {
2504
3048
  ref: hostRef,
2505
3049
  children: shadowRoot && createPortal(children, shadowRoot)
2506
3050
  });
2507
3051
  }
2508
3052
 
2509
3053
  // src/components/Sidebar.tsx
2510
- import { useContext as useContext5, useEffect as useEffect16 } from "react";
3054
+ import { useContext as useContext6, useEffect as useEffect19 } from "react";
2511
3055
 
2512
3056
  // src/hooks/useCombinedMessages.ts
2513
- import { useContext as useContext3, useMemo as useMemo4 } from "react";
3057
+ import { useContext as useContext4, useMemo as useMemo4 } from "react";
2514
3058
 
2515
3059
  // src/hooks/useChatMessages.ts
2516
3060
  import { useChat, useLocalParticipant as useLocalParticipant4 } from "@livekit/components-react/hooks";
@@ -2578,7 +3122,7 @@ function useCombinedMessages() {
2578
3122
  const { transcriptMessages } = useStreamingTranscript();
2579
3123
  const { chatMessages, sendChatMessage, isSendingChat } = useChatMessages();
2580
3124
  const { state: agentState } = useAgentVoiceState();
2581
- const historyMessages = useContext3(LiveAgentContext)?.historyMessages ?? [];
3125
+ const historyMessages = useContext4(LiveAgentContext)?.historyMessages ?? [];
2582
3126
  const liveMessages = useMemo4(() => {
2583
3127
  if (chatMessages.length === 0)
2584
3128
  return transcriptMessages;
@@ -2596,15 +3140,15 @@ function useCombinedMessages() {
2596
3140
  }
2597
3141
 
2598
3142
  // src/hooks/usePhaseUpdates.ts
2599
- import { useCallback as useCallback6, useContext as useContext4, useEffect as useEffect9 } from "react";
3143
+ import { useCallback as useCallback8, useContext as useContext5, useEffect as useEffect12 } from "react";
2600
3144
 
2601
3145
  // src/hooks/useAgentState.ts
2602
3146
  import { useRemoteParticipants } from "@livekit/components-react/hooks";
2603
- import { useEffect as useEffect8, useState as useState6 } from "react";
3147
+ import { useEffect as useEffect11, useState as useState9 } from "react";
2604
3148
  function useAgentState(attributeKey, parse, initial) {
2605
- const [value, setValue] = useState6(initial);
3149
+ const [value, setValue] = useState9(initial);
2606
3150
  const remoteParticipants = useRemoteParticipants();
2607
- useEffect8(() => {
3151
+ useEffect11(() => {
2608
3152
  const agentParticipant = remoteParticipants.find((p) => p.attributes?.[attributeKey]);
2609
3153
  if (agentParticipant) {
2610
3154
  const attr = agentParticipant.attributes?.[attributeKey];
@@ -2650,10 +3194,10 @@ function parsePhases(json) {
2650
3194
  return null;
2651
3195
  }
2652
3196
  function usePhaseUpdates() {
2653
- const parse = useCallback6(parsePhases, []);
3197
+ const parse = useCallback8(parsePhases, []);
2654
3198
  const livePhases = useAgentState("phases", parse, []);
2655
- const ctx = useContext4(LiveAgentContext);
2656
- useEffect9(() => {
3199
+ const ctx = useContext5(LiveAgentContext);
3200
+ useEffect12(() => {
2657
3201
  if (livePhases.length > 0)
2658
3202
  ctx?.setPhasesSnapshot(livePhases);
2659
3203
  }, [livePhases, ctx?.setPhasesSnapshot]);
@@ -2662,7 +3206,7 @@ function usePhaseUpdates() {
2662
3206
  }
2663
3207
 
2664
3208
  // src/hooks/useSessionRemaining.ts
2665
- import { useEffect as useEffect10, useRef as useRef6, useState as useState7 } from "react";
3209
+ import { useEffect as useEffect13, useRef as useRef8, useState as useState10 } from "react";
2666
3210
 
2667
3211
  // src/lib/format.ts
2668
3212
  function formatTime(seconds) {
@@ -2678,9 +3222,9 @@ function parseNumber(s) {
2678
3222
  // src/hooks/useSessionRemaining.ts
2679
3223
  function useSessionRemaining() {
2680
3224
  const maxCallDuration = useAgentState("maxCallDuration", parseNumber, null);
2681
- const endTimeRef = useRef6(null);
2682
- const [remaining, setRemaining] = useState7(null);
2683
- useEffect10(() => {
3225
+ const endTimeRef = useRef8(null);
3226
+ const [remaining, setRemaining] = useState10(null);
3227
+ useEffect13(() => {
2684
3228
  if (maxCallDuration === null || endTimeRef.current !== null)
2685
3229
  return;
2686
3230
  const endTime = Date.now() + maxCallDuration * 1000;
@@ -2697,10 +3241,10 @@ function useSessionRemaining() {
2697
3241
  }
2698
3242
 
2699
3243
  // src/hooks/useElapsedSeconds.ts
2700
- import { useEffect as useEffect11, useState as useState8 } from "react";
3244
+ import { useEffect as useEffect14, useState as useState11 } from "react";
2701
3245
  function useElapsedSeconds(isRunning) {
2702
- const [elapsed, setElapsed] = useState8(0);
2703
- useEffect11(() => {
3246
+ const [elapsed, setElapsed] = useState11(0);
3247
+ useEffect14(() => {
2704
3248
  if (!isRunning) {
2705
3249
  setElapsed(0);
2706
3250
  return;
@@ -2716,50 +3260,50 @@ function useElapsedSeconds(isRunning) {
2716
3260
  }
2717
3261
 
2718
3262
  // src/components/ChatHeader.tsx
2719
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
3263
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
2720
3264
  function ChatHeader() {
2721
3265
  const { isConnected, minimizePanel, minimizable } = useLiveAgent();
2722
3266
  const elapsed = useElapsedSeconds(isConnected);
2723
- return /* @__PURE__ */ jsxs5("header", {
3267
+ return /* @__PURE__ */ jsxs7("header", {
2724
3268
  className: "skippr:sticky skippr:top-0 skippr:z-10 skippr:flex skippr:shrink-0 skippr:items-center skippr:justify-between skippr:border-b skippr:border-border skippr:bg-primary skippr:px-4 skippr:py-3",
2725
3269
  children: [
2726
- /* @__PURE__ */ jsx6("p", {
3270
+ /* @__PURE__ */ jsx9("p", {
2727
3271
  className: "skippr:text-sm skippr:font-semibold skippr:text-primary-foreground",
2728
3272
  children: "Skippr"
2729
3273
  }),
2730
- /* @__PURE__ */ jsxs5("div", {
3274
+ /* @__PURE__ */ jsxs7("div", {
2731
3275
  className: "skippr:flex skippr:items-center skippr:gap-2",
2732
3276
  children: [
2733
- isConnected && /* @__PURE__ */ jsxs5("div", {
3277
+ isConnected && /* @__PURE__ */ jsxs7("div", {
2734
3278
  className: "skippr:flex skippr:items-center skippr:gap-1.5 skippr:rounded-full skippr:bg-primary-foreground/20 skippr:px-2.5 skippr:py-1",
2735
3279
  children: [
2736
- /* @__PURE__ */ jsxs5("span", {
3280
+ /* @__PURE__ */ jsxs7("span", {
2737
3281
  className: "skippr:relative skippr:flex skippr:size-1.5",
2738
3282
  children: [
2739
- /* @__PURE__ */ jsx6("span", {
3283
+ /* @__PURE__ */ jsx9("span", {
2740
3284
  className: "skippr:absolute skippr:inline-flex skippr:h-full skippr:w-full skippr:animate-ping skippr:rounded-full skippr:bg-red-400 skippr:opacity-75"
2741
3285
  }),
2742
- /* @__PURE__ */ jsx6("span", {
3286
+ /* @__PURE__ */ jsx9("span", {
2743
3287
  className: "skippr:relative skippr:inline-flex skippr:size-1.5 skippr:rounded-full skippr:bg-red-400"
2744
3288
  })
2745
3289
  ]
2746
3290
  }),
2747
- /* @__PURE__ */ jsx6("span", {
3291
+ /* @__PURE__ */ jsx9("span", {
2748
3292
  className: "skippr:text-[10px] skippr:font-medium skippr:text-primary-foreground",
2749
3293
  children: "REC"
2750
3294
  }),
2751
- /* @__PURE__ */ jsx6("span", {
3295
+ /* @__PURE__ */ jsx9("span", {
2752
3296
  className: "skippr:text-[10px] skippr:font-mono skippr:text-primary-foreground",
2753
3297
  children: formatTime(elapsed)
2754
3298
  })
2755
3299
  ]
2756
3300
  }),
2757
- minimizable && /* @__PURE__ */ jsx6("button", {
3301
+ minimizable && /* @__PURE__ */ jsx9("button", {
2758
3302
  type: "button",
2759
3303
  onClick: minimizePanel,
2760
3304
  "aria-label": "Minimize",
2761
3305
  className: "skippr:flex skippr:size-6 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-md skippr:text-primary-foreground/70 skippr:transition-colors skippr:hover:bg-primary-foreground/10 skippr:hover:text-primary-foreground",
2762
- children: /* @__PURE__ */ jsx6(Minimize2, {
3306
+ children: /* @__PURE__ */ jsx9(Minimize2, {
2763
3307
  className: "skippr:size-3.5"
2764
3308
  })
2765
3309
  })
@@ -2770,26 +3314,26 @@ function ChatHeader() {
2770
3314
  }
2771
3315
 
2772
3316
  // src/components/LoadingDots.tsx
2773
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
3317
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
2774
3318
  function LoadingDots({ label }) {
2775
- return /* @__PURE__ */ jsxs6("div", {
3319
+ return /* @__PURE__ */ jsxs8("div", {
2776
3320
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:py-4",
2777
3321
  children: [
2778
- /* @__PURE__ */ jsxs6("div", {
3322
+ /* @__PURE__ */ jsxs8("div", {
2779
3323
  className: "skippr:flex skippr:gap-1",
2780
3324
  children: [
2781
- /* @__PURE__ */ jsx7("span", {
3325
+ /* @__PURE__ */ jsx10("span", {
2782
3326
  className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:0ms]"
2783
3327
  }),
2784
- /* @__PURE__ */ jsx7("span", {
3328
+ /* @__PURE__ */ jsx10("span", {
2785
3329
  className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:150ms]"
2786
3330
  }),
2787
- /* @__PURE__ */ jsx7("span", {
3331
+ /* @__PURE__ */ jsx10("span", {
2788
3332
  className: "skippr:size-1.5 skippr:rounded-full skippr:bg-muted-foreground/40 skippr:animate-bounce skippr:[animation-delay:300ms]"
2789
3333
  })
2790
3334
  ]
2791
3335
  }),
2792
- /* @__PURE__ */ jsx7("p", {
3336
+ /* @__PURE__ */ jsx10("p", {
2793
3337
  className: "skippr:text-xs skippr:text-muted-foreground",
2794
3338
  children: label
2795
3339
  })
@@ -2798,11 +3342,11 @@ function LoadingDots({ label }) {
2798
3342
  }
2799
3343
 
2800
3344
  // src/components/LoginFlow.tsx
2801
- import { useCallback as useCallback7, useEffect as useEffect12, useRef as useRef7, useState as useState9 } from "react";
3345
+ import { useCallback as useCallback9, useEffect as useEffect15, useRef as useRef9, useState as useState12 } from "react";
2802
3346
 
2803
3347
  // src/components/ui/button.tsx
2804
3348
  import { forwardRef as forwardRef3 } from "react";
2805
- import { jsx as jsx8 } from "react/jsx-runtime";
3349
+ import { jsx as jsx11 } from "react/jsx-runtime";
2806
3350
  var variantClasses = {
2807
3351
  default: "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90",
2808
3352
  destructive: "skippr:bg-destructive skippr:text-white skippr:hover:bg-destructive/90",
@@ -2821,7 +3365,7 @@ var sizeClasses = {
2821
3365
  "icon-lg": "skippr:size-10"
2822
3366
  };
2823
3367
  var Button = forwardRef3(({ className, variant = "default", size = "default", ...props }, ref) => {
2824
- return /* @__PURE__ */ jsx8("button", {
3368
+ return /* @__PURE__ */ jsx11("button", {
2825
3369
  className: cn("skippr:inline-flex skippr:items-center skippr:justify-center skippr:gap-2 skippr:whitespace-nowrap skippr:rounded-md skippr:text-sm skippr:font-medium skippr:ring-offset-background skippr:transition-all skippr:cursor-pointer skippr:focus-visible:outline-none skippr:focus-visible:ring-2 skippr:focus-visible:ring-ring skippr:focus-visible:ring-offset-2 skippr:disabled:pointer-events-none skippr:disabled:opacity-50 skippr:shrink-0 skippr:[&_svg]:pointer-events-none skippr:[&_svg:not([class*='size-'])]:size-4 skippr:[&_svg]:shrink-0", variantClasses[variant], sizeClasses[size], className),
2826
3370
  ref,
2827
3371
  ...props
@@ -2830,28 +3374,28 @@ var Button = forwardRef3(({ className, variant = "default", size = "default", ..
2830
3374
  Button.displayName = "Button";
2831
3375
 
2832
3376
  // src/components/LoginFlow.tsx
2833
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
3377
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2834
3378
  var OTP_LENGTH = 6;
2835
3379
  var DIGIT_KEYS = ["d0", "d1", "d2", "d3", "d4", "d5"];
2836
3380
  function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
2837
- const [step, setStep] = useState9("email");
2838
- const [email, setEmail] = useState9("");
2839
- const handleRequestOtp = useCallback7(async (emailValue) => {
3381
+ const [step, setStep] = useState12("email");
3382
+ const [email, setEmail] = useState12("");
3383
+ const handleRequestOtp = useCallback9(async (emailValue) => {
2840
3384
  const success = await requestOtp(emailValue);
2841
3385
  if (success)
2842
3386
  setStep("otp");
2843
3387
  }, [requestOtp]);
2844
- const handleVerifyOtp = useCallback7(async (code) => {
3388
+ const handleVerifyOtp = useCallback9(async (code) => {
2845
3389
  await verifyOtp(email, code);
2846
3390
  }, [verifyOtp, email]);
2847
- const handleBack = useCallback7(() => {
3391
+ const handleBack = useCallback9(() => {
2848
3392
  setStep("email");
2849
3393
  }, []);
2850
- const handleResend = useCallback7(async () => {
3394
+ const handleResend = useCallback9(async () => {
2851
3395
  await requestOtp(email);
2852
3396
  }, [requestOtp, email]);
2853
3397
  if (step === "otp") {
2854
- return /* @__PURE__ */ jsx9(OtpStep, {
3398
+ return /* @__PURE__ */ jsx12(OtpStep, {
2855
3399
  email,
2856
3400
  onSubmit: handleVerifyOtp,
2857
3401
  onResend: handleResend,
@@ -2860,7 +3404,7 @@ function LoginFlow({ requestOtp, verifyOtp, error, isSubmitting }) {
2860
3404
  isSubmitting
2861
3405
  });
2862
3406
  }
2863
- return /* @__PURE__ */ jsx9(EmailStep, {
3407
+ return /* @__PURE__ */ jsx12(EmailStep, {
2864
3408
  email,
2865
3409
  onEmailChange: setEmail,
2866
3410
  onSubmit: handleRequestOtp,
@@ -2874,30 +3418,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
2874
3418
  if (email.trim())
2875
3419
  onSubmit(email.trim());
2876
3420
  }
2877
- return /* @__PURE__ */ jsxs7("div", {
3421
+ return /* @__PURE__ */ jsxs9("div", {
2878
3422
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
2879
3423
  children: [
2880
- /* @__PURE__ */ jsxs7("div", {
3424
+ /* @__PURE__ */ jsxs9("div", {
2881
3425
  className: "skippr:mb-4 skippr:text-center",
2882
3426
  children: [
2883
- /* @__PURE__ */ jsx9(Mail, {
3427
+ /* @__PURE__ */ jsx12(Mail, {
2884
3428
  className: "skippr:mx-auto skippr:mb-2 skippr:size-6 skippr:text-primary"
2885
3429
  }),
2886
- /* @__PURE__ */ jsx9("p", {
3430
+ /* @__PURE__ */ jsx12("p", {
2887
3431
  className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
2888
3432
  children: "Sign in to continue"
2889
3433
  }),
2890
- /* @__PURE__ */ jsx9("p", {
3434
+ /* @__PURE__ */ jsx12("p", {
2891
3435
  className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
2892
3436
  children: "Your email will be used to identify you across sessions"
2893
3437
  })
2894
3438
  ]
2895
3439
  }),
2896
- /* @__PURE__ */ jsxs7("form", {
3440
+ /* @__PURE__ */ jsxs9("form", {
2897
3441
  onSubmit: handleSubmit,
2898
3442
  className: "skippr:flex skippr:flex-col skippr:gap-3",
2899
3443
  children: [
2900
- /* @__PURE__ */ jsx9("input", {
3444
+ /* @__PURE__ */ jsx12("input", {
2901
3445
  type: "email",
2902
3446
  placeholder: "you@example.com",
2903
3447
  value: email,
@@ -2906,15 +3450,15 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
2906
3450
  required: true,
2907
3451
  className: "skippr:w-full skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:px-3 skippr:py-2 skippr:text-sm skippr:text-foreground skippr:placeholder-muted-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
2908
3452
  }),
2909
- /* @__PURE__ */ jsx9(Button, {
3453
+ /* @__PURE__ */ jsx12(Button, {
2910
3454
  type: "submit",
2911
3455
  disabled: isSubmitting || !email.trim(),
2912
3456
  className: "skippr:w-full",
2913
- children: isSubmitting ? /* @__PURE__ */ jsx9(LoaderCircle, {
3457
+ children: isSubmitting ? /* @__PURE__ */ jsx12(LoaderCircle, {
2914
3458
  className: "skippr:size-4 skippr:animate-spin"
2915
3459
  }) : "Continue"
2916
3460
  }),
2917
- error && /* @__PURE__ */ jsx9("p", {
3461
+ error && /* @__PURE__ */ jsx12("p", {
2918
3462
  className: "skippr:text-xs skippr:text-center skippr:text-destructive",
2919
3463
  children: error
2920
3464
  })
@@ -2924,30 +3468,30 @@ function EmailStep({ email, onEmailChange, onSubmit, error, isSubmitting }) {
2924
3468
  });
2925
3469
  }
2926
3470
  function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
2927
- const [digits, setDigits] = useState9(Array(OTP_LENGTH).fill(""));
2928
- const [resendCooldown, setResendCooldown] = useState9(0);
2929
- const inputRefs = useRef7([]);
2930
- const submittedRef = useRef7(false);
2931
- useEffect12(() => {
3471
+ const [digits, setDigits] = useState12(Array(OTP_LENGTH).fill(""));
3472
+ const [resendCooldown, setResendCooldown] = useState12(0);
3473
+ const inputRefs = useRef9([]);
3474
+ const submittedRef = useRef9(false);
3475
+ useEffect15(() => {
2932
3476
  inputRefs.current[0]?.focus();
2933
3477
  }, []);
2934
- useEffect12(() => {
3478
+ useEffect15(() => {
2935
3479
  if (error)
2936
3480
  submittedRef.current = false;
2937
3481
  }, [error]);
2938
- useEffect12(() => {
3482
+ useEffect15(() => {
2939
3483
  if (resendCooldown <= 0)
2940
3484
  return;
2941
3485
  const timer = setTimeout(() => setResendCooldown((c) => c - 1), 1000);
2942
3486
  return () => clearTimeout(timer);
2943
3487
  }, [resendCooldown]);
2944
- const submitCode = useCallback7((code) => {
3488
+ const submitCode = useCallback9((code) => {
2945
3489
  if (submittedRef.current || isSubmitting)
2946
3490
  return;
2947
3491
  submittedRef.current = true;
2948
3492
  onSubmit(code);
2949
3493
  }, [onSubmit, isSubmitting]);
2950
- const handleDigitChange = useCallback7((index2, value) => {
3494
+ const handleDigitChange = useCallback9((index2, value) => {
2951
3495
  const digit = value.replace(/\D/g, "").slice(-1);
2952
3496
  const newDigits = [...digits];
2953
3497
  newDigits[index2] = digit;
@@ -2961,12 +3505,12 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
2961
3505
  submitCode(code);
2962
3506
  }
2963
3507
  }, [digits, submitCode]);
2964
- const handleKeyDown = useCallback7((index2, e) => {
3508
+ const handleKeyDown = useCallback9((index2, e) => {
2965
3509
  if (e.key === "Backspace" && !digits[index2] && index2 > 0) {
2966
3510
  inputRefs.current[index2 - 1]?.focus();
2967
3511
  }
2968
3512
  }, [digits]);
2969
- const handlePaste = useCallback7((e) => {
3513
+ const handlePaste = useCallback9((e) => {
2970
3514
  e.preventDefault();
2971
3515
  const pasted = e.clipboardData.getData("text").replace(/\D/g, "").slice(0, OTP_LENGTH);
2972
3516
  if (pasted.length > 0) {
@@ -2994,22 +3538,22 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
2994
3538
  submittedRef.current = false;
2995
3539
  inputRefs.current[0]?.focus();
2996
3540
  }
2997
- return /* @__PURE__ */ jsxs7("div", {
3541
+ return /* @__PURE__ */ jsxs9("div", {
2998
3542
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:px-4 skippr:py-4",
2999
3543
  children: [
3000
- /* @__PURE__ */ jsxs7("div", {
3544
+ /* @__PURE__ */ jsxs9("div", {
3001
3545
  className: "skippr:mb-4 skippr:text-center",
3002
3546
  children: [
3003
- /* @__PURE__ */ jsx9("p", {
3547
+ /* @__PURE__ */ jsx12("p", {
3004
3548
  className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
3005
3549
  children: "Enter verification code"
3006
3550
  }),
3007
- /* @__PURE__ */ jsxs7("p", {
3551
+ /* @__PURE__ */ jsxs9("p", {
3008
3552
  className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
3009
3553
  children: [
3010
3554
  "We sent a 6-digit code to",
3011
3555
  " ",
3012
- /* @__PURE__ */ jsx9("span", {
3556
+ /* @__PURE__ */ jsx12("span", {
3013
3557
  className: "skippr:font-medium skippr:text-foreground",
3014
3558
  children: email
3015
3559
  })
@@ -3017,13 +3561,13 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
3017
3561
  })
3018
3562
  ]
3019
3563
  }),
3020
- /* @__PURE__ */ jsxs7("form", {
3564
+ /* @__PURE__ */ jsxs9("form", {
3021
3565
  onSubmit: handleSubmit,
3022
3566
  className: "skippr:flex skippr:flex-col skippr:gap-3",
3023
3567
  children: [
3024
- /* @__PURE__ */ jsx9("div", {
3568
+ /* @__PURE__ */ jsx12("div", {
3025
3569
  className: "skippr:flex skippr:justify-center skippr:gap-1.5",
3026
- children: digits.map((digit, index2) => /* @__PURE__ */ jsx9("input", {
3570
+ children: digits.map((digit, index2) => /* @__PURE__ */ jsx12("input", {
3027
3571
  ref: (el) => {
3028
3572
  inputRefs.current[index2] = el;
3029
3573
  },
@@ -3038,29 +3582,29 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
3038
3582
  className: "skippr:h-10 skippr:w-10 skippr:rounded-md skippr:border skippr:border-border skippr:bg-background skippr:text-center skippr:text-sm skippr:font-semibold skippr:text-foreground skippr:outline-none focus:skippr:ring-2 focus:skippr:ring-primary/30 focus:skippr:border-primary disabled:skippr:opacity-50"
3039
3583
  }, DIGIT_KEYS[index2]))
3040
3584
  }),
3041
- error && /* @__PURE__ */ jsx9("p", {
3585
+ error && /* @__PURE__ */ jsx12("p", {
3042
3586
  className: "skippr:text-xs skippr:text-center skippr:text-destructive",
3043
3587
  children: error
3044
3588
  }),
3045
- /* @__PURE__ */ jsx9(Button, {
3589
+ /* @__PURE__ */ jsx12(Button, {
3046
3590
  type: "submit",
3047
3591
  disabled: isSubmitting || digits.join("").length !== OTP_LENGTH,
3048
3592
  className: "skippr:w-full",
3049
- children: isSubmitting ? /* @__PURE__ */ jsx9(LoaderCircle, {
3593
+ children: isSubmitting ? /* @__PURE__ */ jsx12(LoaderCircle, {
3050
3594
  className: "skippr:size-4 skippr:animate-spin"
3051
3595
  }) : "Verify"
3052
3596
  }),
3053
- /* @__PURE__ */ jsxs7("div", {
3597
+ /* @__PURE__ */ jsxs9("div", {
3054
3598
  className: "skippr:flex skippr:items-center skippr:justify-between skippr:text-xs",
3055
3599
  children: [
3056
- /* @__PURE__ */ jsx9("button", {
3600
+ /* @__PURE__ */ jsx12("button", {
3057
3601
  type: "button",
3058
3602
  onClick: onBack,
3059
3603
  disabled: isSubmitting,
3060
3604
  className: "skippr:text-muted-foreground hover:skippr:text-foreground skippr:transition-colors disabled:skippr:opacity-50",
3061
3605
  children: "Change email"
3062
3606
  }),
3063
- /* @__PURE__ */ jsx9("button", {
3607
+ /* @__PURE__ */ jsx12("button", {
3064
3608
  type: "button",
3065
3609
  onClick: handleResend,
3066
3610
  disabled: isSubmitting || resendCooldown > 0,
@@ -3076,7 +3620,7 @@ function OtpStep({ email, onSubmit, onResend, onBack, error, isSubmitting }) {
3076
3620
  }
3077
3621
 
3078
3622
  // src/components/MeetingControls.tsx
3079
- import { jsx as jsx10, jsxs as jsxs8, Fragment as Fragment4 } from "react/jsx-runtime";
3623
+ import { jsx as jsx13, jsxs as jsxs10, Fragment as Fragment4 } from "react/jsx-runtime";
3080
3624
  var CONTROL_BUTTON2 = "skippr:flex skippr:size-11 skippr:cursor-pointer skippr:items-center skippr:justify-center skippr:rounded-full skippr:transition-colors skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
3081
3625
  var MUTED_BUTTON = "skippr:bg-muted skippr:text-foreground skippr:hover:bg-muted/80";
3082
3626
  function MeetingControls({
@@ -3089,68 +3633,68 @@ function MeetingControls({
3089
3633
  }) {
3090
3634
  const { isMuted, toggleMute, isScreenSharing, toggleScreenShare } = useMediaControls();
3091
3635
  const showPaused = isPaused || isPausing;
3092
- return /* @__PURE__ */ jsxs8("div", {
3636
+ return /* @__PURE__ */ jsxs10("div", {
3093
3637
  className: "skippr:shrink-0 skippr:border-t skippr:border-border skippr:bg-background skippr:px-4 skippr:py-4",
3094
3638
  children: [
3095
- /* @__PURE__ */ jsxs8("div", {
3639
+ /* @__PURE__ */ jsxs10("div", {
3096
3640
  className: "skippr:flex skippr:items-center skippr:justify-center skippr:gap-3",
3097
3641
  children: [
3098
- !showPaused && /* @__PURE__ */ jsxs8(Fragment4, {
3642
+ !showPaused && /* @__PURE__ */ jsxs10(Fragment4, {
3099
3643
  children: [
3100
- /* @__PURE__ */ jsx10("button", {
3644
+ /* @__PURE__ */ jsx13("button", {
3101
3645
  type: "button",
3102
3646
  onClick: toggleMute,
3103
3647
  "aria-label": isMuted ? "Unmute" : "Mute",
3104
3648
  className: cn(CONTROL_BUTTON2, isMuted ? "skippr:bg-destructive/15 skippr:text-destructive skippr:hover:bg-destructive/25" : MUTED_BUTTON),
3105
- children: isMuted ? /* @__PURE__ */ jsx10(MicOff, {
3649
+ children: isMuted ? /* @__PURE__ */ jsx13(MicOff, {
3106
3650
  className: "skippr:size-5"
3107
- }) : /* @__PURE__ */ jsx10(Mic, {
3651
+ }) : /* @__PURE__ */ jsx13(Mic, {
3108
3652
  className: "skippr:size-5"
3109
3653
  })
3110
3654
  }),
3111
- showScreenShareToggle && /* @__PURE__ */ jsx10("button", {
3655
+ showScreenShareToggle && /* @__PURE__ */ jsx13("button", {
3112
3656
  type: "button",
3113
3657
  onClick: toggleScreenShare,
3114
3658
  "aria-label": isScreenSharing ? "Stop sharing screen" : "Share screen",
3115
3659
  className: cn(CONTROL_BUTTON2, isScreenSharing ? "skippr:bg-bubble skippr:text-white skippr:hover:brightness-110" : MUTED_BUTTON),
3116
- children: isScreenSharing ? /* @__PURE__ */ jsx10(MonitorOff, {
3660
+ children: isScreenSharing ? /* @__PURE__ */ jsx13(MonitorOff, {
3117
3661
  className: "skippr:size-5"
3118
- }) : /* @__PURE__ */ jsx10(Monitor, {
3662
+ }) : /* @__PURE__ */ jsx13(Monitor, {
3119
3663
  className: "skippr:size-5"
3120
3664
  })
3121
3665
  })
3122
3666
  ]
3123
3667
  }),
3124
- showPaused ? onResume && /* @__PURE__ */ jsx10("button", {
3668
+ showPaused ? onResume && /* @__PURE__ */ jsx13("button", {
3125
3669
  type: "button",
3126
3670
  onClick: onResume,
3127
3671
  disabled: isPausing,
3128
3672
  "aria-label": "Resume session",
3129
3673
  className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
3130
- children: /* @__PURE__ */ jsx10(Play, {
3674
+ children: /* @__PURE__ */ jsx13(Play, {
3131
3675
  className: "skippr:size-5"
3132
3676
  })
3133
- }) : onPause && /* @__PURE__ */ jsx10("button", {
3677
+ }) : onPause && /* @__PURE__ */ jsx13("button", {
3134
3678
  type: "button",
3135
3679
  onClick: onPause,
3136
3680
  "aria-label": "Pause session",
3137
3681
  className: cn(CONTROL_BUTTON2, MUTED_BUTTON),
3138
- children: /* @__PURE__ */ jsx10(Pause, {
3682
+ children: /* @__PURE__ */ jsx13(Pause, {
3139
3683
  className: "skippr:size-5"
3140
3684
  })
3141
3685
  }),
3142
- /* @__PURE__ */ jsx10("button", {
3686
+ /* @__PURE__ */ jsx13("button", {
3143
3687
  type: "button",
3144
3688
  onClick: onHangUp,
3145
3689
  "aria-label": "End session",
3146
3690
  className: cn(CONTROL_BUTTON2, "skippr:bg-destructive skippr:text-destructive-foreground skippr:hover:bg-destructive/90"),
3147
- children: /* @__PURE__ */ jsx10(PhoneOff, {
3691
+ children: /* @__PURE__ */ jsx13(PhoneOff, {
3148
3692
  className: "skippr:size-5"
3149
3693
  })
3150
3694
  })
3151
3695
  ]
3152
3696
  }),
3153
- /* @__PURE__ */ jsx10("p", {
3697
+ /* @__PURE__ */ jsx13("p", {
3154
3698
  className: "skippr:mt-3 skippr:text-center skippr:text-[10px] skippr:text-muted-foreground",
3155
3699
  children: "Powered by Skippr"
3156
3700
  })
@@ -3159,17 +3703,17 @@ function MeetingControls({
3159
3703
  }
3160
3704
 
3161
3705
  // src/components/MessageList.tsx
3162
- import { useEffect as useEffect14, useRef as useRef9 } from "react";
3706
+ import { useEffect as useEffect17, useRef as useRef11 } from "react";
3163
3707
 
3164
3708
  // src/components/ChatInput.tsx
3165
- import { useEffect as useEffect13, useRef as useRef8, useState as useState10 } from "react";
3166
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
3709
+ import { useEffect as useEffect16, useRef as useRef10, useState as useState13 } from "react";
3710
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
3167
3711
  var MAX_INPUT_HEIGHT = 60;
3168
3712
  function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
3169
- const [inputText, setInputText] = useState10("");
3170
- const textareaRef = useRef8(null);
3713
+ const [inputText, setInputText] = useState13("");
3714
+ const textareaRef = useRef10(null);
3171
3715
  const canSend = inputText.trim().length > 0 && !isSendingChat;
3172
- useEffect13(() => {
3716
+ useEffect16(() => {
3173
3717
  if (autoFocus)
3174
3718
  textareaRef.current?.focus();
3175
3719
  }, [autoFocus]);
@@ -3200,13 +3744,13 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
3200
3744
  handleSubmit(e);
3201
3745
  }
3202
3746
  }
3203
- return /* @__PURE__ */ jsx11("form", {
3747
+ return /* @__PURE__ */ jsx14("form", {
3204
3748
  onSubmit: handleSubmit,
3205
3749
  className: "skippr:border-t skippr:border-border skippr:p-3",
3206
- children: /* @__PURE__ */ jsxs9("div", {
3750
+ children: /* @__PURE__ */ jsxs11("div", {
3207
3751
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:rounded-xl skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:px-3 skippr:py-2",
3208
3752
  children: [
3209
- /* @__PURE__ */ jsx11("textarea", {
3753
+ /* @__PURE__ */ jsx14("textarea", {
3210
3754
  ref: textareaRef,
3211
3755
  rows: 1,
3212
3756
  value: inputText,
@@ -3216,12 +3760,12 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
3216
3760
  className: "skippr:flex-1 skippr:resize-none skippr:overflow-y-auto skippr:bg-transparent skippr:text-sm skippr:leading-5 skippr:text-foreground skippr:placeholder:text-muted-foreground skippr:outline-none",
3217
3761
  style: { maxHeight: `${MAX_INPUT_HEIGHT}px` }
3218
3762
  }),
3219
- /* @__PURE__ */ jsx11("button", {
3763
+ /* @__PURE__ */ jsx14("button", {
3220
3764
  type: "submit",
3221
3765
  disabled: !canSend,
3222
3766
  "aria-label": "Send message",
3223
3767
  className: cn("skippr:flex skippr:size-8 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:transition-colors", canSend ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-muted-foreground/20 skippr:text-muted-foreground/60"),
3224
- children: /* @__PURE__ */ jsx11(Send, {
3768
+ children: /* @__PURE__ */ jsx14(Send, {
3225
3769
  className: "skippr:size-3.5"
3226
3770
  })
3227
3771
  })
@@ -3231,7 +3775,7 @@ function ChatInput({ sendChatMessage, isSendingChat, autoFocus = false }) {
3231
3775
  }
3232
3776
 
3233
3777
  // src/components/ChatMessage.tsx
3234
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
3778
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
3235
3779
  function formatTimestamp(ts) {
3236
3780
  return new Date(ts).toLocaleTimeString("en-US", {
3237
3781
  hour: "numeric",
@@ -3241,23 +3785,23 @@ function formatTimestamp(ts) {
3241
3785
  }
3242
3786
  function ChatMessage({ message }) {
3243
3787
  const isAgent = message.role === "assistant";
3244
- return /* @__PURE__ */ jsxs10("div", {
3788
+ return /* @__PURE__ */ jsxs12("div", {
3245
3789
  className: cn("skippr:flex skippr:gap-2", isAgent ? "skippr:items-start" : "skippr:justify-end"),
3246
3790
  children: [
3247
- isAgent && /* @__PURE__ */ jsx12("div", {
3791
+ isAgent && /* @__PURE__ */ jsx15("div", {
3248
3792
  className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
3249
- children: /* @__PURE__ */ jsx12(Sparkles, {
3793
+ children: /* @__PURE__ */ jsx15(Sparkles, {
3250
3794
  className: "skippr:size-3.5 skippr:text-primary-foreground"
3251
3795
  })
3252
3796
  }),
3253
- /* @__PURE__ */ jsxs10("div", {
3797
+ /* @__PURE__ */ jsxs12("div", {
3254
3798
  className: cn("skippr:flex skippr:max-w-[80%] skippr:flex-col", isAgent ? "skippr:items-start" : "skippr:items-end"),
3255
3799
  children: [
3256
- /* @__PURE__ */ jsx12("div", {
3800
+ /* @__PURE__ */ jsx15("div", {
3257
3801
  className: cn("skippr:rounded-2xl skippr:px-4 skippr:py-2.5 skippr:text-sm skippr:leading-relaxed", isAgent ? "skippr:border skippr:border-border skippr:bg-card skippr:text-foreground" : "skippr:bg-primary skippr:text-primary-foreground"),
3258
3802
  children: message.content
3259
3803
  }),
3260
- message.timestamp && /* @__PURE__ */ jsx12("span", {
3804
+ message.timestamp && /* @__PURE__ */ jsx15("span", {
3261
3805
  className: "skippr:mt-1 skippr:px-1 skippr:text-[10px] skippr:text-muted-foreground/60",
3262
3806
  children: formatTimestamp(message.timestamp)
3263
3807
  })
@@ -3268,33 +3812,33 @@ function ChatMessage({ message }) {
3268
3812
  }
3269
3813
 
3270
3814
  // src/components/TypingIndicator.tsx
3271
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
3815
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
3272
3816
  function TypingIndicator() {
3273
- return /* @__PURE__ */ jsxs11("div", {
3817
+ return /* @__PURE__ */ jsxs13("div", {
3274
3818
  className: "skippr:flex skippr:items-start skippr:gap-2 skippr:animate-skippr-tab-fade",
3275
3819
  children: [
3276
- /* @__PURE__ */ jsx13("div", {
3820
+ /* @__PURE__ */ jsx16("div", {
3277
3821
  className: "skippr:mt-0.5 skippr:flex skippr:size-7 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-md skippr:bg-primary",
3278
- children: /* @__PURE__ */ jsx13(Sparkles, {
3822
+ children: /* @__PURE__ */ jsx16(Sparkles, {
3279
3823
  className: "skippr:size-3.5 skippr:text-primary-foreground"
3280
3824
  })
3281
3825
  }),
3282
- /* @__PURE__ */ jsxs11("div", {
3826
+ /* @__PURE__ */ jsxs13("div", {
3283
3827
  className: "skippr:inline-flex skippr:items-center skippr:gap-1 skippr:rounded-2xl skippr:border skippr:border-primary/20 skippr:bg-primary/10 skippr:px-4 skippr:py-2 skippr:text-xs skippr:text-primary",
3284
3828
  children: [
3285
- /* @__PURE__ */ jsx13("span", {
3829
+ /* @__PURE__ */ jsx16("span", {
3286
3830
  children: "Agent is analyzing your screen"
3287
3831
  }),
3288
- /* @__PURE__ */ jsxs11("span", {
3832
+ /* @__PURE__ */ jsxs13("span", {
3289
3833
  className: "skippr:inline-flex skippr:items-center skippr:gap-[2px]",
3290
3834
  children: [
3291
- /* @__PURE__ */ jsx13("span", {
3835
+ /* @__PURE__ */ jsx16("span", {
3292
3836
  className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:0ms]"
3293
3837
  }),
3294
- /* @__PURE__ */ jsx13("span", {
3838
+ /* @__PURE__ */ jsx16("span", {
3295
3839
  className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:200ms]"
3296
3840
  }),
3297
- /* @__PURE__ */ jsx13("span", {
3841
+ /* @__PURE__ */ jsx16("span", {
3298
3842
  className: "skippr:size-1 skippr:rounded-full skippr:bg-primary skippr:animate-skippr-thinking-dot skippr:[animation-delay:400ms]"
3299
3843
  })
3300
3844
  ]
@@ -3306,7 +3850,7 @@ function TypingIndicator() {
3306
3850
  }
3307
3851
 
3308
3852
  // src/components/MessageList.tsx
3309
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
3853
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
3310
3854
  function MessageList({
3311
3855
  messages,
3312
3856
  isStreaming,
@@ -3314,31 +3858,31 @@ function MessageList({
3314
3858
  isSendingChat,
3315
3859
  autoFocus = false
3316
3860
  }) {
3317
- const scrollRef = useRef9(null);
3861
+ const scrollRef = useRef11(null);
3318
3862
  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
3319
- useEffect14(() => {
3863
+ useEffect17(() => {
3320
3864
  scrollRef.current?.scrollIntoView({ behavior: "smooth" });
3321
3865
  }, [messages.length, lastMessage?.content]);
3322
3866
  const showTyping = isStreaming && lastMessage?.role === "assistant" && lastMessage.content === "";
3323
- return /* @__PURE__ */ jsxs12("div", {
3867
+ return /* @__PURE__ */ jsxs14("div", {
3324
3868
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
3325
3869
  children: [
3326
- /* @__PURE__ */ jsxs12("div", {
3870
+ /* @__PURE__ */ jsxs14("div", {
3327
3871
  className: "skippr:min-h-0 skippr:flex-1 skippr:space-y-4 skippr:overflow-y-auto skippr:p-4",
3328
3872
  children: [
3329
- messages.length === 0 && !showTyping && /* @__PURE__ */ jsx14(LoadingDots, {
3873
+ messages.length === 0 && !showTyping && /* @__PURE__ */ jsx17(LoadingDots, {
3330
3874
  label: "Waiting for conversation to begin..."
3331
3875
  }),
3332
- messages.map((message) => /* @__PURE__ */ jsx14(ChatMessage, {
3876
+ messages.map((message) => /* @__PURE__ */ jsx17(ChatMessage, {
3333
3877
  message
3334
3878
  }, message.id)),
3335
- showTyping && /* @__PURE__ */ jsx14(TypingIndicator, {}),
3336
- /* @__PURE__ */ jsx14("div", {
3879
+ showTyping && /* @__PURE__ */ jsx17(TypingIndicator, {}),
3880
+ /* @__PURE__ */ jsx17("div", {
3337
3881
  ref: scrollRef
3338
3882
  })
3339
3883
  ]
3340
3884
  }),
3341
- /* @__PURE__ */ jsx14(ChatInput, {
3885
+ /* @__PURE__ */ jsx17(ChatInput, {
3342
3886
  sendChatMessage,
3343
3887
  isSendingChat,
3344
3888
  autoFocus
@@ -3348,8 +3892,8 @@ function MessageList({
3348
3892
  }
3349
3893
 
3350
3894
  // src/components/ModuleSelector.tsx
3351
- import { useEffect as useEffect15, useRef as useRef10, useState as useState11 } from "react";
3352
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
3895
+ import { useEffect as useEffect18, useRef as useRef12, useState as useState14 } from "react";
3896
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
3353
3897
  var AGENT_TYPE_ICONS = {
3354
3898
  onboarding: UserPlus,
3355
3899
  demo: Rocket,
@@ -3371,10 +3915,10 @@ function ModuleSelector() {
3371
3915
  error
3372
3916
  } = useLiveAgent();
3373
3917
  const isBusy = isStarting || isDisconnecting;
3374
- const scrollRef = useRef10(null);
3375
- const [showScrollHint, setShowScrollHint] = useState11(false);
3376
- const [isScrolled, setIsScrolled] = useState11(false);
3377
- useEffect15(() => {
3918
+ const scrollRef = useRef12(null);
3919
+ const [showScrollHint, setShowScrollHint] = useState14(false);
3920
+ const [isScrolled, setIsScrolled] = useState14(false);
3921
+ useEffect18(() => {
3378
3922
  const el = scrollRef.current;
3379
3923
  if (!el)
3380
3924
  return;
@@ -3396,26 +3940,26 @@ function ModuleSelector() {
3396
3940
  };
3397
3941
  }, []);
3398
3942
  if (isLoadingModules && availableModules.length === 0) {
3399
- return /* @__PURE__ */ jsx15("div", {
3943
+ return /* @__PURE__ */ jsx18("div", {
3400
3944
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6",
3401
- children: /* @__PURE__ */ jsx15(LoadingDots, {
3945
+ children: /* @__PURE__ */ jsx18(LoadingDots, {
3402
3946
  label: "Loading modules..."
3403
3947
  })
3404
3948
  });
3405
3949
  }
3406
3950
  if (modulesError) {
3407
- return /* @__PURE__ */ jsxs13("div", {
3951
+ return /* @__PURE__ */ jsxs15("div", {
3408
3952
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:p-6 skippr:text-center",
3409
3953
  children: [
3410
- /* @__PURE__ */ jsx15("p", {
3954
+ /* @__PURE__ */ jsx18("p", {
3411
3955
  className: "skippr:text-sm skippr:text-foreground",
3412
3956
  children: "Couldn't load modules."
3413
3957
  }),
3414
- /* @__PURE__ */ jsx15("p", {
3958
+ /* @__PURE__ */ jsx18("p", {
3415
3959
  className: "skippr:text-xs skippr:text-muted-foreground",
3416
3960
  children: modulesError
3417
3961
  }),
3418
- /* @__PURE__ */ jsx15("button", {
3962
+ /* @__PURE__ */ jsx18("button", {
3419
3963
  type: "button",
3420
3964
  onClick: () => void refetchModules(),
3421
3965
  className: "skippr:cursor-pointer skippr:rounded-lg skippr:bg-foreground skippr:px-3 skippr:py-1.5 skippr:text-xs skippr:font-medium skippr:text-background",
@@ -3425,34 +3969,34 @@ function ModuleSelector() {
3425
3969
  });
3426
3970
  }
3427
3971
  if (availableModules.length === 0) {
3428
- return /* @__PURE__ */ jsx15("div", {
3972
+ return /* @__PURE__ */ jsx18("div", {
3429
3973
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center skippr:p-6 skippr:text-center",
3430
- children: /* @__PURE__ */ jsx15("p", {
3974
+ children: /* @__PURE__ */ jsx18("p", {
3431
3975
  className: "skippr:text-sm skippr:text-muted-foreground",
3432
3976
  children: "No experts available."
3433
3977
  })
3434
3978
  });
3435
3979
  }
3436
- return /* @__PURE__ */ jsxs13("div", {
3980
+ return /* @__PURE__ */ jsxs15("div", {
3437
3981
  className: "skippr:relative skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
3438
3982
  children: [
3439
- /* @__PURE__ */ jsxs13("div", {
3983
+ /* @__PURE__ */ jsxs15("div", {
3440
3984
  ref: scrollRef,
3441
3985
  className: "skippr-no-scrollbar skippr:flex-1 skippr:overflow-y-auto",
3442
3986
  children: [
3443
- /* @__PURE__ */ jsx15("h3", {
3987
+ /* @__PURE__ */ jsx18("h3", {
3444
3988
  className: `skippr:sticky skippr:top-0 skippr:z-10 skippr:bg-background skippr:px-4 skippr:py-3 skippr:text-xs skippr:font-medium skippr:uppercase skippr:tracking-wider skippr:text-muted-foreground skippr:transition-shadow ${isScrolled ? "skippr:border-b skippr:border-border" : ""}`,
3445
3989
  children: "Choose an agent"
3446
3990
  }),
3447
- /* @__PURE__ */ jsxs13("div", {
3991
+ /* @__PURE__ */ jsxs15("div", {
3448
3992
  className: "skippr:px-4 skippr:pt-3 skippr:pb-5",
3449
3993
  children: [
3450
- error && /* @__PURE__ */ jsx15("div", {
3994
+ error && /* @__PURE__ */ jsx18("div", {
3451
3995
  role: "alert",
3452
3996
  className: "skippr:mb-3 skippr:rounded-lg skippr:border skippr:border-destructive/20 skippr:bg-destructive/10 skippr:px-3 skippr:py-2 skippr:text-xs skippr:text-destructive",
3453
3997
  children: error
3454
3998
  }),
3455
- /* @__PURE__ */ jsx15("div", {
3999
+ /* @__PURE__ */ jsx18("div", {
3456
4000
  className: "skippr:grid skippr:grid-cols-2 skippr:gap-2.5",
3457
4001
  children: availableModules.map((module, index2) => {
3458
4002
  const isFeatured = index2 === 0;
@@ -3464,50 +4008,50 @@ function ModuleSelector() {
3464
4008
  const layout = isWide ? "skippr:items-center skippr:p-3.5 skippr:pb-5" : "skippr:flex-col skippr:items-start skippr:p-3.5";
3465
4009
  const variant = isFeatured ? "skippr:bg-primary skippr:text-primary-foreground skippr:hover:bg-primary/90" : "skippr:bg-background skippr:ring-1 skippr:ring-foreground/10 skippr:hover:bg-muted/50";
3466
4010
  const span = isWide ? "skippr:col-span-2" : "";
3467
- return /* @__PURE__ */ jsxs13("button", {
4011
+ return /* @__PURE__ */ jsxs15("button", {
3468
4012
  type: "button",
3469
4013
  disabled: isBusy || isTerminal,
3470
4014
  onClick: () => selectModule(module.id),
3471
4015
  className: `${base} ${layout} ${variant} ${span}`,
3472
4016
  children: [
3473
- /* @__PURE__ */ jsx15("div", {
4017
+ /* @__PURE__ */ jsx18("div", {
3474
4018
  className: isFeatured ? "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-primary-foreground/15" : "skippr:flex skippr:h-9 skippr:w-9 skippr:shrink-0 skippr:items-center skippr:justify-center skippr:rounded-lg skippr:bg-muted",
3475
- children: /* @__PURE__ */ jsx15(Icon2, {
4019
+ children: /* @__PURE__ */ jsx18(Icon2, {
3476
4020
  className: isFeatured ? "skippr:h-4 skippr:w-4" : "skippr:h-4 skippr:w-4 skippr:text-muted-foreground"
3477
4021
  })
3478
4022
  }),
3479
- /* @__PURE__ */ jsxs13("div", {
4023
+ /* @__PURE__ */ jsxs15("div", {
3480
4024
  className: "skippr:min-w-0 skippr:w-full skippr:space-y-0.5",
3481
4025
  children: [
3482
- /* @__PURE__ */ jsxs13("div", {
4026
+ /* @__PURE__ */ jsxs15("div", {
3483
4027
  className: "skippr:flex skippr:items-center skippr:gap-1.5",
3484
4028
  children: [
3485
- /* @__PURE__ */ jsx15("p", {
4029
+ /* @__PURE__ */ jsx18("p", {
3486
4030
  className: "skippr:line-clamp-1 skippr:text-sm skippr:font-semibold",
3487
4031
  children: module.name
3488
4032
  }),
3489
- sessionState === "resume" && /* @__PURE__ */ jsxs13("span", {
4033
+ sessionState === "resume" && /* @__PURE__ */ jsxs15("span", {
3490
4034
  className: `skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide ${isFeatured ? "skippr:bg-primary-foreground/20 skippr:text-primary-foreground" : "skippr:bg-bubble/15 skippr:text-bubble"}`,
3491
4035
  children: [
3492
- /* @__PURE__ */ jsx15(Play, {
4036
+ /* @__PURE__ */ jsx18(Play, {
3493
4037
  className: "skippr:size-2.5"
3494
4038
  }),
3495
4039
  "Resume"
3496
4040
  ]
3497
4041
  }),
3498
- sessionState === "completed" && /* @__PURE__ */ jsxs13("span", {
4042
+ sessionState === "completed" && /* @__PURE__ */ jsxs15("span", {
3499
4043
  className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
3500
4044
  children: [
3501
- /* @__PURE__ */ jsx15(CircleCheck, {
4045
+ /* @__PURE__ */ jsx18(CircleCheck, {
3502
4046
  className: "skippr:size-2.5"
3503
4047
  }),
3504
4048
  "Completed"
3505
4049
  ]
3506
4050
  }),
3507
- sessionState === "expired" && /* @__PURE__ */ jsxs13("span", {
4051
+ sessionState === "expired" && /* @__PURE__ */ jsxs15("span", {
3508
4052
  className: "skippr:inline-flex skippr:shrink-0 skippr:items-center skippr:gap-0.5 skippr:rounded-full skippr:bg-muted skippr:px-1.5 skippr:py-0.5 skippr:text-[9px] skippr:font-medium skippr:uppercase skippr:tracking-wide skippr:text-muted-foreground",
3509
4053
  children: [
3510
- /* @__PURE__ */ jsx15(Clock, {
4054
+ /* @__PURE__ */ jsx18(Clock, {
3511
4055
  className: "skippr:size-2.5"
3512
4056
  }),
3513
4057
  "Expired"
@@ -3515,7 +4059,7 @@ function ModuleSelector() {
3515
4059
  })
3516
4060
  ]
3517
4061
  }),
3518
- module.description && /* @__PURE__ */ jsx15("p", {
4062
+ module.description && /* @__PURE__ */ jsx18("p", {
3519
4063
  className: isFeatured ? "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-primary-foreground/70" : "skippr:line-clamp-2 skippr:text-[11px] skippr:leading-snug skippr:text-muted-foreground",
3520
4064
  children: module.description
3521
4065
  })
@@ -3529,7 +4073,7 @@ function ModuleSelector() {
3529
4073
  })
3530
4074
  ]
3531
4075
  }),
3532
- showScrollHint && /* @__PURE__ */ jsx15("div", {
4076
+ showScrollHint && /* @__PURE__ */ jsx18("div", {
3533
4077
  className: "skippr:pointer-events-none skippr:absolute skippr:bottom-0 skippr:left-0 skippr:right-0 skippr:h-12 skippr:bg-gradient-to-t skippr:from-background skippr:to-transparent"
3534
4078
  })
3535
4079
  ]
@@ -3537,49 +4081,49 @@ function ModuleSelector() {
3537
4081
  }
3538
4082
 
3539
4083
  // src/components/SessionAgenda.tsx
3540
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
4084
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
3541
4085
  function SessionAgenda({ phases, hasStarted }) {
3542
4086
  if (phases.length === 0 || !hasStarted) {
3543
- return /* @__PURE__ */ jsx16("div", {
4087
+ return /* @__PURE__ */ jsx19("div", {
3544
4088
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
3545
- children: /* @__PURE__ */ jsx16(LoadingDots, {
4089
+ children: /* @__PURE__ */ jsx19(LoadingDots, {
3546
4090
  label: "Waiting for agenda to load..."
3547
4091
  })
3548
4092
  });
3549
4093
  }
3550
- return /* @__PURE__ */ jsx16("div", {
4094
+ return /* @__PURE__ */ jsx19("div", {
3551
4095
  className: "skippr:flex-1 skippr:overflow-y-auto skippr:px-4 skippr:py-4",
3552
- children: /* @__PURE__ */ jsx16("div", {
4096
+ children: /* @__PURE__ */ jsx19("div", {
3553
4097
  className: "skippr:space-y-1",
3554
4098
  children: phases.map((phase) => {
3555
4099
  const isActive = phase.status === "active";
3556
4100
  const isCompleted = phase.status === "completed";
3557
- return /* @__PURE__ */ jsxs14("div", {
4101
+ return /* @__PURE__ */ jsxs16("div", {
3558
4102
  className: cn("skippr:flex skippr:items-start skippr:gap-2.5 skippr:rounded-lg skippr:p-2 skippr:transition-colors", isActive && "skippr:bg-primary/10"),
3559
4103
  children: [
3560
- /* @__PURE__ */ jsx16("div", {
4104
+ /* @__PURE__ */ jsx19("div", {
3561
4105
  className: "skippr:mt-0.5",
3562
- children: isCompleted ? /* @__PURE__ */ jsx16(CircleCheck, {
4106
+ children: isCompleted ? /* @__PURE__ */ jsx19(CircleCheck, {
3563
4107
  className: "skippr:size-4 skippr:text-chart-3"
3564
- }) : isActive ? /* @__PURE__ */ jsx16(Circle, {
4108
+ }) : isActive ? /* @__PURE__ */ jsx19(Circle, {
3565
4109
  className: "skippr:size-4 skippr:fill-primary/30 skippr:text-primary"
3566
- }) : /* @__PURE__ */ jsx16(Circle, {
4110
+ }) : /* @__PURE__ */ jsx19(Circle, {
3567
4111
  className: "skippr:size-4 skippr:text-muted-foreground/30"
3568
4112
  })
3569
4113
  }),
3570
- /* @__PURE__ */ jsxs14("div", {
4114
+ /* @__PURE__ */ jsxs16("div", {
3571
4115
  className: "skippr:min-w-0 skippr:flex-1",
3572
4116
  children: [
3573
- /* @__PURE__ */ jsx16("p", {
4117
+ /* @__PURE__ */ jsx19("p", {
3574
4118
  className: cn("skippr:text-sm", isCompleted && "skippr:text-muted-foreground skippr:line-through", isActive && "skippr:font-medium skippr:text-foreground", phase.status === "pending" && "skippr:text-muted-foreground"),
3575
4119
  children: phase.name
3576
4120
  }),
3577
- phase.highlights.length > 0 && /* @__PURE__ */ jsx16("ul", {
4121
+ phase.highlights.length > 0 && /* @__PURE__ */ jsx19("ul", {
3578
4122
  className: "skippr:mt-1 skippr:space-y-0.5",
3579
- children: phase.highlights.map((text) => /* @__PURE__ */ jsxs14("li", {
4123
+ children: phase.highlights.map((text) => /* @__PURE__ */ jsxs16("li", {
3580
4124
  className: cn("skippr:flex skippr:items-center skippr:gap-1.5 skippr:text-[11px] skippr:leading-tight", isCompleted ? "skippr:text-muted-foreground/40 skippr:line-through" : "skippr:text-muted-foreground/70"),
3581
4125
  children: [
3582
- /* @__PURE__ */ jsx16("span", {
4126
+ /* @__PURE__ */ jsx19("span", {
3583
4127
  className: "skippr:size-1 skippr:shrink-0 skippr:rounded-full skippr:bg-current"
3584
4128
  }),
3585
4129
  text
@@ -3596,12 +4140,12 @@ function SessionAgenda({ phases, hasStarted }) {
3596
4140
  }
3597
4141
 
3598
4142
  // src/components/SessionWarningBanner.tsx
3599
- import { jsx as jsx17 } from "react/jsx-runtime";
4143
+ import { jsx as jsx20 } from "react/jsx-runtime";
3600
4144
  var SESSION_WARNING_THRESHOLD_SECS = 60;
3601
4145
  function SessionWarningBanner({ remaining }) {
3602
4146
  if (remaining === null || remaining <= 0 || remaining > SESSION_WARNING_THRESHOLD_SECS)
3603
4147
  return null;
3604
- return /* @__PURE__ */ jsx17("div", {
4148
+ return /* @__PURE__ */ jsx20("div", {
3605
4149
  "data-testid": "session-warning-banner",
3606
4150
  className: "skippr:bg-red-50 skippr:px-4 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:font-medium skippr:text-red-700",
3607
4151
  children: "Session ending soon"
@@ -3609,7 +4153,7 @@ function SessionWarningBanner({ remaining }) {
3609
4153
  }
3610
4154
 
3611
4155
  // src/components/StartSessionPrompt.tsx
3612
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
4156
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
3613
4157
  var PROMPT_BUTTON = "skippr:cursor-pointer skippr:rounded-xl skippr:bg-primary skippr:px-8 skippr:py-3 skippr:text-sm skippr:font-medium skippr:text-primary-foreground skippr:transition-all skippr:hover:bg-primary/90 skippr:disabled:cursor-not-allowed skippr:disabled:opacity-60";
3614
4158
  function StartSessionPrompt({
3615
4159
  onStartSession,
@@ -3621,16 +4165,16 @@ function StartSessionPrompt({
3621
4165
  canResume = false,
3622
4166
  onResume
3623
4167
  }) {
3624
- return /* @__PURE__ */ jsxs15("div", {
4168
+ return /* @__PURE__ */ jsxs17("div", {
3625
4169
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:gap-3 skippr:px-4",
3626
4170
  children: [
3627
- canResume && onResume ? /* @__PURE__ */ jsx18("button", {
4171
+ canResume && onResume ? /* @__PURE__ */ jsx21("button", {
3628
4172
  type: "button",
3629
4173
  onClick: onResume,
3630
4174
  disabled: isStarting,
3631
4175
  className: PROMPT_BUTTON,
3632
4176
  children: isStarting ? "Resuming..." : "Resume session"
3633
- }) : /* @__PURE__ */ jsx18("button", {
4177
+ }) : /* @__PURE__ */ jsx21("button", {
3634
4178
  type: "button",
3635
4179
  onClick: () => {
3636
4180
  if (!agentId)
@@ -3641,7 +4185,7 @@ function StartSessionPrompt({
3641
4185
  className: PROMPT_BUTTON,
3642
4186
  children: isStarting ? "Starting..." : label
3643
4187
  }),
3644
- error && /* @__PURE__ */ jsx18("p", {
4188
+ error && /* @__PURE__ */ jsx21("p", {
3645
4189
  className: "skippr:text-xs skippr:text-destructive",
3646
4190
  children: error
3647
4191
  })
@@ -3650,7 +4194,7 @@ function StartSessionPrompt({
3650
4194
  }
3651
4195
 
3652
4196
  // src/components/Sidebar.tsx
3653
- import { jsx as jsx19, jsxs as jsxs16, Fragment as Fragment5 } from "react/jsx-runtime";
4197
+ import { jsx as jsx22, jsxs as jsxs18, Fragment as Fragment5 } from "react/jsx-runtime";
3654
4198
  function Sidebar({
3655
4199
  hideControls = false,
3656
4200
  hideHeader = false,
@@ -3686,13 +4230,13 @@ function Sidebar({
3686
4230
  agentMode,
3687
4231
  agentControls
3688
4232
  } = useLiveAgent();
3689
- const internalCtx = useContext5(LiveAgentContext);
4233
+ const internalCtx = useContext6(LiveAgentContext);
3690
4234
  const usesHostAuth = internalCtx?.usesHostAuth ?? false;
3691
4235
  const authFailed = internalCtx?.authFailed ?? false;
3692
4236
  const showAgenda = agentMode !== AGENT_MODE.AlwaysOn;
3693
4237
  const isFloating = variant === "floating";
3694
4238
  const isSidebar = variant === "sidebar";
3695
- useEffect16(() => {
4239
+ useEffect19(() => {
3696
4240
  if (!isSidebar)
3697
4241
  return;
3698
4242
  const prop = position === "right" ? "marginRight" : "marginLeft";
@@ -3706,12 +4250,12 @@ function Sidebar({
3706
4250
  document.body.style.transition = "";
3707
4251
  };
3708
4252
  }, [isSidebar, isPanelOpen, position]);
3709
- return /* @__PURE__ */ jsxs16("div", {
4253
+ return /* @__PURE__ */ jsxs18("div", {
3710
4254
  className: cn("skippr:fixed skippr:z-[9999]", "skippr:bg-card", "skippr:flex skippr:flex-col", "skippr:overflow-hidden", isFloating && "skippr:border skippr:border-border skippr:bottom-[88px] skippr:h-[min(460px,calc(100vh-200px))] skippr:rounded-2xl skippr:shadow-[0_8px_30px_rgba(0,0,0,0.16),0_4px_12px_rgba(0,0,0,0.08)]", isFloating && (position === "right" ? "skippr:right-6" : "skippr:left-6"), isFloating && "skippr:transition-[opacity,transform] skippr:duration-300 skippr:ease-in-out", isFloating && (position === "right" ? "skippr:origin-bottom-right" : "skippr:origin-bottom-left"), isFloating && !isPanelOpen && "skippr:scale-0 skippr:opacity-0 skippr:pointer-events-none", isFloating && isPanelOpen && "skippr:scale-100 skippr:opacity-100", isSidebar && "skippr:top-0 skippr:h-full", isSidebar && "skippr:transition-[width] skippr:duration-300 skippr:ease-in-out", isSidebar && position === "right" && "skippr:right-0 skippr:border-l skippr:border-l-border", isSidebar && position === "left" && "skippr:left-0 skippr:border-r skippr:border-r-border", isSidebar && !isPanelOpen && "skippr:w-0 skippr:border-0"),
3711
4255
  style: { width: isPanelOpen ? SIDEBAR_WIDTH : undefined },
3712
4256
  children: [
3713
- !hideHeader && /* @__PURE__ */ jsx19(ChatHeader, {}),
3714
- authFailed ? /* @__PURE__ */ jsx19(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx19(AuthenticatedContent, {
4257
+ !hideHeader && /* @__PURE__ */ jsx22(ChatHeader, {}),
4258
+ authFailed ? /* @__PURE__ */ jsx22(AuthError, {}) : isAuthenticated ? /* @__PURE__ */ jsx22(AuthenticatedContent, {
3715
4259
  isConnected,
3716
4260
  isPaused,
3717
4261
  isPausing,
@@ -3733,12 +4277,12 @@ function Sidebar({
3733
4277
  agentId,
3734
4278
  agentControls,
3735
4279
  showAgenda
3736
- }) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx19("div", {
4280
+ }) : usesHostAuth || isValidating ? /* @__PURE__ */ jsx22("div", {
3737
4281
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
3738
- children: /* @__PURE__ */ jsx19(LoadingDots, {
4282
+ children: /* @__PURE__ */ jsx22(LoadingDots, {
3739
4283
  label: "Loading..."
3740
4284
  })
3741
- }) : /* @__PURE__ */ jsx19(LoginFlow, {
4285
+ }) : /* @__PURE__ */ jsx22(LoginFlow, {
3742
4286
  requestOtp,
3743
4287
  verifyOtp,
3744
4288
  error: authError,
@@ -3782,63 +4326,63 @@ function AuthenticatedContent({
3782
4326
  } else if (isPaused) {
3783
4327
  transitionLabel = "Paused";
3784
4328
  }
3785
- return /* @__PURE__ */ jsxs16(Fragment5, {
4329
+ return /* @__PURE__ */ jsxs18(Fragment5, {
3786
4330
  children: [
3787
- isConnected && /* @__PURE__ */ jsx19(ConnectedBanner, {}),
3788
- showTabBar && /* @__PURE__ */ jsxs16("div", {
4331
+ isConnected && /* @__PURE__ */ jsx22(ConnectedBanner, {}),
4332
+ showTabBar && /* @__PURE__ */ jsxs18("div", {
3789
4333
  className: "skippr:flex skippr:items-center skippr:gap-2 skippr:border-b skippr:border-border skippr:px-3 skippr:py-2",
3790
4334
  children: [
3791
- /* @__PURE__ */ jsxs16("button", {
4335
+ /* @__PURE__ */ jsxs18("button", {
3792
4336
  type: "button",
3793
4337
  className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "chat" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
3794
4338
  onClick: () => onTabChange("chat"),
3795
4339
  children: [
3796
- /* @__PURE__ */ jsx19(MessageCircle, {
4340
+ /* @__PURE__ */ jsx22(MessageCircle, {
3797
4341
  className: "skippr:size-3.5"
3798
4342
  }),
3799
4343
  "Chat",
3800
- activeTab === "chat" && /* @__PURE__ */ jsx19("span", {
4344
+ activeTab === "chat" && /* @__PURE__ */ jsx22("span", {
3801
4345
  className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
3802
4346
  })
3803
4347
  ]
3804
4348
  }),
3805
- showAgenda && /* @__PURE__ */ jsxs16("button", {
4349
+ showAgenda && /* @__PURE__ */ jsxs18("button", {
3806
4350
  type: "button",
3807
4351
  className: cn("skippr:relative skippr:inline-flex skippr:cursor-pointer skippr:items-center skippr:gap-1.5 skippr:rounded-lg skippr:px-3 skippr:py-2 skippr:text-sm skippr:font-medium skippr:transition-all", activeTab === "agenda" ? "skippr:text-foreground" : "skippr:text-muted-foreground skippr:hover:text-foreground"),
3808
4352
  onClick: () => onTabChange("agenda"),
3809
4353
  children: [
3810
- /* @__PURE__ */ jsx19(Calendar, {
4354
+ /* @__PURE__ */ jsx22(Calendar, {
3811
4355
  className: "skippr:size-3.5"
3812
4356
  }),
3813
4357
  "Agenda",
3814
- activeTab === "agenda" && /* @__PURE__ */ jsx19("span", {
4358
+ activeTab === "agenda" && /* @__PURE__ */ jsx22("span", {
3815
4359
  className: "skippr:absolute skippr:-bottom-2 skippr:left-3 skippr:right-3 skippr:h-0.5 skippr:rounded-full skippr:bg-foreground"
3816
4360
  })
3817
4361
  ]
3818
4362
  })
3819
4363
  ]
3820
4364
  }),
3821
- /* @__PURE__ */ jsx19("div", {
4365
+ /* @__PURE__ */ jsx22("div", {
3822
4366
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col",
3823
- children: isDisconnecting ? /* @__PURE__ */ jsx19("div", {
4367
+ children: isDisconnecting ? /* @__PURE__ */ jsx22("div", {
3824
4368
  className: "skippr:flex skippr:flex-1 skippr:items-center skippr:justify-center",
3825
- children: /* @__PURE__ */ jsx19(LoadingDots, {
4369
+ children: /* @__PURE__ */ jsx22(LoadingDots, {
3826
4370
  label: "Ending session..."
3827
4371
  })
3828
- }) : showSelectorAsPrompt ? /* @__PURE__ */ jsx19(ModuleSelector, {}) : inSession ? /* @__PURE__ */ jsxs16(Fragment5, {
4372
+ }) : showSelectorAsPrompt ? /* @__PURE__ */ jsx22(ModuleSelector, {}) : inSession ? /* @__PURE__ */ jsxs18(Fragment5, {
3829
4373
  children: [
3830
- transitionLabel && /* @__PURE__ */ jsx19("div", {
4374
+ transitionLabel && /* @__PURE__ */ jsx22("div", {
3831
4375
  className: "skippr:shrink-0 skippr:border-b skippr:border-border skippr:bg-muted/50 skippr:px-3 skippr:py-1.5 skippr:text-center skippr:text-xs skippr:text-muted-foreground",
3832
4376
  children: transitionLabel
3833
4377
  }),
3834
- /* @__PURE__ */ jsx19(ConnectedBody, {
4378
+ /* @__PURE__ */ jsx22(ConnectedBody, {
3835
4379
  activeTab: effectiveTab,
3836
4380
  autoFocusChat
3837
4381
  })
3838
4382
  ]
3839
- }) : /* @__PURE__ */ jsx19("div", {
4383
+ }) : /* @__PURE__ */ jsx22("div", {
3840
4384
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
3841
- children: /* @__PURE__ */ jsx19(StartSessionPrompt, {
4385
+ children: /* @__PURE__ */ jsx22(StartSessionPrompt, {
3842
4386
  onStartSession,
3843
4387
  agentId,
3844
4388
  agentControls,
@@ -3850,7 +4394,7 @@ function AuthenticatedContent({
3850
4394
  })
3851
4395
  }, `${activeTab}-empty`)
3852
4396
  }),
3853
- (isConnected || isPaused) && !isDisconnecting && !hideControls && /* @__PURE__ */ jsx19(MeetingControls, {
4397
+ (isConnected || isPaused) && !isDisconnecting && !hideControls && /* @__PURE__ */ jsx22(MeetingControls, {
3854
4398
  onHangUp: onDisconnect,
3855
4399
  onPause,
3856
4400
  onResume,
@@ -3862,17 +4406,17 @@ function AuthenticatedContent({
3862
4406
  });
3863
4407
  }
3864
4408
  function AuthError() {
3865
- return /* @__PURE__ */ jsxs16("div", {
4409
+ return /* @__PURE__ */ jsxs18("div", {
3866
4410
  className: "skippr:flex skippr:flex-1 skippr:flex-col skippr:items-center skippr:justify-center skippr:px-6 skippr:py-4 skippr:text-center",
3867
4411
  children: [
3868
- /* @__PURE__ */ jsx19(CircleAlert, {
4412
+ /* @__PURE__ */ jsx22(CircleAlert, {
3869
4413
  className: "skippr:mb-3 skippr:size-7 skippr:text-destructive"
3870
4414
  }),
3871
- /* @__PURE__ */ jsx19("p", {
4415
+ /* @__PURE__ */ jsx22("p", {
3872
4416
  className: "skippr:text-sm skippr:font-medium skippr:text-foreground",
3873
4417
  children: "We couldn't verify your session"
3874
4418
  }),
3875
- /* @__PURE__ */ jsx19("p", {
4419
+ /* @__PURE__ */ jsx22("p", {
3876
4420
  className: "skippr:mt-1 skippr:text-xs skippr:text-muted-foreground",
3877
4421
  children: "Please contact administrator."
3878
4422
  })
@@ -3881,7 +4425,7 @@ function AuthError() {
3881
4425
  }
3882
4426
  function ConnectedBanner() {
3883
4427
  const remaining = useSessionRemaining();
3884
- return /* @__PURE__ */ jsx19(SessionWarningBanner, {
4428
+ return /* @__PURE__ */ jsx22(SessionWarningBanner, {
3885
4429
  remaining
3886
4430
  });
3887
4431
  }
@@ -3892,17 +4436,17 @@ function ConnectedBody({
3892
4436
  const { allMessages, agentState, sendChatMessage, isSendingChat } = useCombinedMessages();
3893
4437
  const { phases } = usePhaseUpdates();
3894
4438
  if (activeTab === "agenda") {
3895
- return /* @__PURE__ */ jsx19("div", {
4439
+ return /* @__PURE__ */ jsx22("div", {
3896
4440
  className: "skippr:min-h-0 skippr:flex-1 skippr:overflow-y-auto skippr:animate-skippr-tab-fade",
3897
- children: /* @__PURE__ */ jsx19(SessionAgenda, {
4441
+ children: /* @__PURE__ */ jsx22(SessionAgenda, {
3898
4442
  phases,
3899
4443
  hasStarted: allMessages.length > 0 || agentState === "speaking"
3900
4444
  })
3901
4445
  }, "agenda");
3902
4446
  }
3903
- return /* @__PURE__ */ jsx19("div", {
4447
+ return /* @__PURE__ */ jsx22("div", {
3904
4448
  className: "skippr:flex skippr:min-h-0 skippr:flex-1 skippr:flex-col skippr:animate-skippr-tab-fade",
3905
- children: /* @__PURE__ */ jsx19(MessageList, {
4449
+ children: /* @__PURE__ */ jsx22(MessageList, {
3906
4450
  messages: allMessages,
3907
4451
  isStreaming: agentState === "speaking",
3908
4452
  sendChatMessage,
@@ -3913,28 +4457,28 @@ function ConnectedBody({
3913
4457
  }
3914
4458
 
3915
4459
  // src/components/SidebarTrigger.tsx
3916
- import { jsx as jsx20 } from "react/jsx-runtime";
4460
+ import { jsx as jsx23 } from "react/jsx-runtime";
3917
4461
  function SidebarTrigger() {
3918
4462
  const { isPanelOpen, togglePanel, minimizePanel, minimizable, position, isMinimized } = useLiveAgent();
3919
4463
  if (isMinimized)
3920
4464
  return null;
3921
4465
  const handleClick = isPanelOpen && minimizable ? minimizePanel : togglePanel;
3922
- return /* @__PURE__ */ jsx20("button", {
4466
+ return /* @__PURE__ */ jsx23("button", {
3923
4467
  type: "button",
3924
4468
  onClick: handleClick,
3925
4469
  title: isPanelOpen ? "Close chat" : "Open chat",
3926
4470
  "aria-label": isPanelOpen ? "Close chat" : "Open chat",
3927
4471
  className: cn("skippr:fixed skippr:bottom-6 skippr:z-[9998]", "skippr:flex skippr:size-12 skippr:items-center skippr:justify-center", "skippr:shadow-[0_4px_16px_rgba(45,43,61,0.45),0_2px_4px_rgba(0,0,0,0.1)] skippr:transition-all", "skippr:cursor-pointer skippr:hover:brightness-110 skippr:hover:-translate-y-0.5 skippr:active:translate-y-0", isPanelOpen ? "skippr:rounded-[14px] skippr:bg-bubble skippr:text-white" : "skippr:rounded-[10px] skippr:overflow-hidden", position === "right" ? "skippr:right-6" : "skippr:left-6"),
3928
- children: isPanelOpen ? /* @__PURE__ */ jsx20(ChevronDown, {
4472
+ children: isPanelOpen ? /* @__PURE__ */ jsx23(ChevronDown, {
3929
4473
  className: "skippr:size-5"
3930
- }) : /* @__PURE__ */ jsx20(Logo, {
4474
+ }) : /* @__PURE__ */ jsx23(Logo, {
3931
4475
  className: "skippr:size-12"
3932
4476
  })
3933
4477
  });
3934
4478
  }
3935
4479
 
3936
4480
  // src/components/LiveAgent.tsx
3937
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
4481
+ import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
3938
4482
  function LiveAgent(props) {
3939
4483
  const {
3940
4484
  agentId: hostAgentId,
@@ -3966,24 +4510,24 @@ function LiveAgent(props) {
3966
4510
  const usesHostAuth = !!getUserToken || !!userToken || !!authTokenProp;
3967
4511
  const effectiveAuthToken = usesHostAuth ? authTokenProp : auth.authToken ?? undefined;
3968
4512
  const hasModuleSelector = !hostAgentId;
3969
- const [activeModule, setActiveModule] = useState12(null);
4513
+ const [activeModule, setActiveModule] = useState15(null);
3970
4514
  const agentId = hasModuleSelector ? activeModule?.id ?? null : hostAgentId;
3971
4515
  const agentControls = hasModuleSelector ? activeModule?.controls : hostAgentControls;
3972
- const minimizeOnSessionStart = useCallback8(() => {
4516
+ const minimizeOnSessionStart = useCallback10(() => {
3973
4517
  if (minimizable) {
3974
4518
  setIsMinimized(true);
3975
4519
  setIsPanelOpen(false);
3976
4520
  }
3977
4521
  }, [minimizable]);
3978
- const expandOnSessionStartError = useCallback8(() => {
4522
+ const expandOnSessionStartError = useCallback10(() => {
3979
4523
  setIsMinimized(false);
3980
4524
  setIsPanelOpen(true);
3981
4525
  }, []);
3982
- const minimizeOnSessionDisconnect = useCallback8(() => {
4526
+ const minimizeOnSessionDisconnect = useCallback10(() => {
3983
4527
  if (hasModuleSelector) {
3984
4528
  setActiveModule(null);
3985
4529
  }
3986
- if (minimizable && !hasModuleSelector) {
4530
+ if (minimizable) {
3987
4531
  setIsMinimized(true);
3988
4532
  setIsPanelOpen(false);
3989
4533
  }
@@ -4015,24 +4559,35 @@ function LiveAgent(props) {
4015
4559
  onStartError: expandOnSessionStartError,
4016
4560
  onDisconnect: minimizeOnSessionDisconnect
4017
4561
  });
4018
- const teardownInFlightRef = useRef11(false);
4562
+ const teardownInFlightRef = useRef13(false);
4019
4563
  teardownInFlightRef.current = isPaused || isPausing || isDisconnecting;
4020
- const handleRoomDisconnected = useCallback8(() => {
4564
+ const handleRoomDisconnected = useCallback10(() => {
4021
4565
  if (teardownInFlightRef.current)
4022
4566
  return;
4023
4567
  disconnect();
4024
4568
  }, [disconnect]);
4025
- const [isPanelOpen, setIsPanelOpen] = useState12(defaultOpen);
4026
- const [isMinimized, setIsMinimized] = useState12(minimizable && !defaultOpen);
4027
- const [sidebarTab, setSidebarTab] = useState12("agenda");
4028
- const [phasesSnapshot, setPhasesSnapshot] = useState12([]);
4569
+ const inSession = connection !== null || isStarting || isPaused || isPausing || isDisconnecting;
4570
+ const [isPanelOpen, setIsPanelOpen] = useState15(defaultOpen);
4571
+ const [isMinimized, setIsMinimized] = useState15(minimizable && !defaultOpen);
4572
+ const [sidebarTab, setSidebarTab] = useState15("agenda");
4573
+ const [phasesSnapshot, setPhasesSnapshot] = useState15([]);
4029
4574
  const {
4030
4575
  modules: availableModules,
4031
4576
  isLoading: isLoadingModules,
4032
4577
  error: modulesError,
4033
4578
  refetch: refetchModules
4034
4579
  } = useAvailableModules({
4035
- enabled: hasModuleSelector && isPanelOpen,
4580
+ enabled: !inSession,
4581
+ bearerToken,
4582
+ authedFetch
4583
+ });
4584
+ const hasAlwaysOnModule = availableModules.some((m) => m.mode === AGENT_MODE.AlwaysOn);
4585
+ const {
4586
+ goals: adoptionGoals,
4587
+ dismissGoal: dismissAdoptionGoal,
4588
+ attendGoal
4589
+ } = useAdoptionGoals({
4590
+ enabled: !inSession && hasAlwaysOnModule,
4036
4591
  bearerToken,
4037
4592
  authedFetch
4038
4593
  });
@@ -4045,7 +4600,7 @@ function LiveAgent(props) {
4045
4600
  }, [activeModule, hostAgentId, availableModules]);
4046
4601
  const agentMode = activeModuleForAgent?.mode ?? null;
4047
4602
  const resumableSession = useMemo5(() => getResumableSession(activeModuleForAgent), [activeModuleForAgent]);
4048
- const resumeSession = useCallback8(async () => {
4603
+ const resumeSession = useCallback10(async () => {
4049
4604
  if (!resumableSession)
4050
4605
  return;
4051
4606
  await startSession({
@@ -4054,7 +4609,7 @@ function LiveAgent(props) {
4054
4609
  existingSessionId: resumableSession.id
4055
4610
  });
4056
4611
  }, [resumableSession, startSession, agentControls]);
4057
- const selectModule = useCallback8((moduleId) => {
4612
+ const selectModule = useCallback10((moduleId) => {
4058
4613
  const found = availableModules.find((m) => m.id === moduleId);
4059
4614
  if (!found)
4060
4615
  return;
@@ -4065,9 +4620,20 @@ function LiveAgent(props) {
4065
4620
  existingSessionId: getResumableSessionId(found.currentSession, found.mode)
4066
4621
  });
4067
4622
  }, [availableModules, startSession]);
4068
- const [welcomeDismissed, setWelcomeDismissed] = useState12(false);
4069
- const dismissWelcome = useCallback8(() => setWelcomeDismissed(true), []);
4070
- const [currentPosition, setCurrentPosition] = useState12(() => {
4623
+ const startAdoptionSession = useCallback10((goal) => {
4624
+ attendGoal(goal.goalId);
4625
+ const found = availableModules.find((m) => m.id === goal.agentId);
4626
+ if (found)
4627
+ setActiveModule(found);
4628
+ startSession({
4629
+ agentId: goal.agentId,
4630
+ agentControls: found?.controls,
4631
+ adoptionGoalId: goal.goalId
4632
+ });
4633
+ }, [attendGoal, availableModules, startSession]);
4634
+ const [welcomeDismissed, setWelcomeDismissed] = useState15(false);
4635
+ const dismissWelcome = useCallback10(() => setWelcomeDismissed(true), []);
4636
+ const [currentPosition, setCurrentPosition] = useState15(() => {
4071
4637
  try {
4072
4638
  const saved = localStorage.getItem("skippr_widget_position");
4073
4639
  if (saved === "left" || saved === "right")
@@ -4075,20 +4641,20 @@ function LiveAgent(props) {
4075
4641
  } catch {}
4076
4642
  return position;
4077
4643
  });
4078
- const setPositionWithPersist = useCallback8((pos) => {
4644
+ const setPositionWithPersist = useCallback10((pos) => {
4079
4645
  setCurrentPosition(pos);
4080
4646
  try {
4081
4647
  localStorage.setItem("skippr_widget_position", pos);
4082
4648
  } catch {}
4083
4649
  }, []);
4084
- const openPanel = useCallback8(() => setIsPanelOpen(true), []);
4085
- const closePanel = useCallback8(() => setIsPanelOpen(false), []);
4086
- const togglePanel = useCallback8(() => setIsPanelOpen((prev) => !prev), []);
4087
- const expandPanel = useCallback8(() => {
4650
+ const openPanel = useCallback10(() => setIsPanelOpen(true), []);
4651
+ const closePanel = useCallback10(() => setIsPanelOpen(false), []);
4652
+ const togglePanel = useCallback10(() => setIsPanelOpen((prev) => !prev), []);
4653
+ const expandPanel = useCallback10(() => {
4088
4654
  setIsMinimized(false);
4089
4655
  setIsPanelOpen(true);
4090
4656
  }, []);
4091
- const minimizePanel = useCallback8(() => {
4657
+ const minimizePanel = useCallback10(() => {
4092
4658
  if (!minimizable)
4093
4659
  return;
4094
4660
  setIsMinimized(true);
@@ -4147,7 +4713,10 @@ function LiveAgent(props) {
4147
4713
  isLoadingModules,
4148
4714
  modulesError,
4149
4715
  refetchModules,
4150
- selectModule
4716
+ selectModule,
4717
+ adoptionGoals,
4718
+ dismissAdoptionGoal,
4719
+ startAdoptionSession
4151
4720
  }), [
4152
4721
  connection,
4153
4722
  shouldConnect,
@@ -4197,35 +4766,39 @@ function LiveAgent(props) {
4197
4766
  isLoadingModules,
4198
4767
  modulesError,
4199
4768
  refetchModules,
4200
- selectModule
4769
+ selectModule,
4770
+ adoptionGoals,
4771
+ dismissAdoptionGoal,
4772
+ startAdoptionSession
4201
4773
  ]);
4202
- return /* @__PURE__ */ jsx21(LiveAgentContext.Provider, {
4774
+ return /* @__PURE__ */ jsx24(LiveAgentContext.Provider, {
4203
4775
  value: ctx,
4204
- children: /* @__PURE__ */ jsxs17(LiveKitRoom, {
4776
+ children: /* @__PURE__ */ jsxs19(LiveKitRoom, {
4205
4777
  serverUrl: connection?.livekitUrl,
4206
4778
  token: connection?.token,
4207
4779
  connect: shouldConnect,
4208
4780
  audio: true,
4209
4781
  onDisconnected: handleRoomDisconnected,
4210
4782
  children: [
4211
- connection && /* @__PURE__ */ jsx21(RoomAudioRenderer, {}),
4212
- connection && captureMode === "screenshare" && /* @__PURE__ */ jsx21(AutoStartMedia, {
4783
+ connection && /* @__PURE__ */ jsx24(RoomAudioRenderer, {}),
4784
+ connection && captureMode === "screenshare" && /* @__PURE__ */ jsx24(AutoStartMedia, {
4213
4785
  pendingScreenStream
4214
4786
  }),
4215
- connection && captureMode === "auto" && /* @__PURE__ */ jsx21(DomCapture, {}),
4216
- /* @__PURE__ */ jsxs17(ShadowHost, {
4787
+ connection && captureMode === "auto" && /* @__PURE__ */ jsx24(DomCapture, {}),
4788
+ /* @__PURE__ */ jsxs19(ShadowHost, {
4217
4789
  children: [
4218
- connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */ jsx21(HighlightOverlay, {}),
4219
- /* @__PURE__ */ jsxs17("div", {
4790
+ connection && captureMode === "auto" && agentControls?.highlight && /* @__PURE__ */ jsx24(HighlightOverlay, {}),
4791
+ connection && captureMode === "auto" && agentControls?.actions && /* @__PURE__ */ jsx24(PageActionHandler, {}),
4792
+ /* @__PURE__ */ jsxs19("div", {
4220
4793
  id: WIDGET_ROOT_ID,
4221
4794
  children: [
4222
- isMinimized && /* @__PURE__ */ jsx21(MinimizedBubble, {
4795
+ isMinimized && /* @__PURE__ */ jsx24(MinimizedBubble, {
4223
4796
  welcomeMessage,
4224
4797
  welcomeDismissed,
4225
4798
  onDismissWelcome: dismissWelcome
4226
4799
  }),
4227
- /* @__PURE__ */ jsx21(SidebarTrigger, {}),
4228
- /* @__PURE__ */ jsx21(Sidebar, {
4800
+ /* @__PURE__ */ jsx24(SidebarTrigger, {}),
4801
+ /* @__PURE__ */ jsx24(Sidebar, {
4229
4802
  hideControls,
4230
4803
  hideHeader,
4231
4804
  startSessionLabel