@usecrow/ui 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  var React3 = require('react');
4
4
  var framerMotion = require('framer-motion');
5
+ var client = require('@usecrow/client');
5
6
  var jsxRuntime = require('react/jsx-runtime');
6
7
  var reactDom = require('react-dom');
7
8
  var lucideReact = require('lucide-react');
8
9
  var ReactMarkdown = require('react-markdown');
9
10
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
10
- var client = require('@usecrow/client');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
@@ -71,7 +71,7 @@ var getConversationStorageKey = (productId) => `crow_conv_${productId}`;
71
71
  function useChat({
72
72
  productId,
73
73
  apiUrl = "",
74
- persistAnonymousConversations: _persistAnonymousConversations,
74
+ persistAnonymousConversations,
75
75
  welcomeMessage,
76
76
  onVerificationStatus,
77
77
  onConversationId,
@@ -90,16 +90,10 @@ function useChat({
90
90
  ]);
91
91
  const [isLoading, setIsLoading] = React3.useState(false);
92
92
  const [activeToolCalls, setActiveToolCalls] = React3.useState([]);
93
- const [conversationId, setConversationId] = React3.useState(() => {
94
- try {
95
- return localStorage.getItem(getConversationStorageKey(productId));
96
- } catch {
97
- return null;
98
- }
99
- });
93
+ const [conversationId, setConversationId] = React3.useState(null);
100
94
  const [selectedModel, setSelectedModel] = React3.useState(DEFAULT_MODEL);
101
95
  const abortControllerRef = React3.useRef(null);
102
- const hasRestoredRef = React3.useRef(false);
96
+ const hasCheckedPersistRef = React3.useRef(false);
103
97
  React3.useEffect(() => {
104
98
  if (messages.length === 1 && messages[0].id === "welcome" && !conversationId) {
105
99
  setMessages([
@@ -113,11 +107,26 @@ function useChat({
113
107
  }
114
108
  }, [effectiveWelcomeMessage]);
115
109
  React3.useEffect(() => {
116
- if (conversationId && onRestoredConversation && !hasRestoredRef.current) {
117
- hasRestoredRef.current = true;
118
- onRestoredConversation(conversationId);
110
+ if (persistAnonymousConversations === void 0 || hasCheckedPersistRef.current) {
111
+ return;
119
112
  }
120
- }, []);
113
+ hasCheckedPersistRef.current = true;
114
+ if (persistAnonymousConversations) {
115
+ try {
116
+ const storedId = localStorage.getItem(getConversationStorageKey(productId));
117
+ if (storedId) {
118
+ setConversationId(storedId);
119
+ onRestoredConversation?.(storedId);
120
+ }
121
+ } catch {
122
+ }
123
+ } else {
124
+ try {
125
+ localStorage.removeItem(getConversationStorageKey(productId));
126
+ } catch {
127
+ }
128
+ }
129
+ }, [persistAnonymousConversations, productId, onRestoredConversation]);
121
130
  const streamFromBackend = React3.useCallback(
122
131
  async (message, botMsgId) => {
123
132
  let accumulatedText = "";
@@ -175,12 +184,14 @@ function useChat({
175
184
  case "conversation_id":
176
185
  if (parsed.conversation_id) {
177
186
  setConversationId(parsed.conversation_id);
178
- try {
179
- localStorage.setItem(
180
- getConversationStorageKey(productId),
181
- parsed.conversation_id
182
- );
183
- } catch {
187
+ if (persistAnonymousConversations === true) {
188
+ try {
189
+ localStorage.setItem(
190
+ getConversationStorageKey(productId),
191
+ parsed.conversation_id
192
+ );
193
+ } catch {
194
+ }
184
195
  }
185
196
  onConversationId?.(parsed.conversation_id);
186
197
  }
@@ -318,7 +329,7 @@ function useChat({
318
329
  abortControllerRef.current = null;
319
330
  }
320
331
  },
321
- [apiUrl, productId, conversationId, selectedModel, onVerificationStatus, onConversationId, onWorkflowEvent, onToolCall]
332
+ [apiUrl, productId, conversationId, selectedModel, persistAnonymousConversations, onVerificationStatus, onConversationId, onWorkflowEvent, onToolCall]
322
333
  );
323
334
  const sendMessage = React3.useCallback(
324
335
  (content) => {
@@ -474,6 +485,37 @@ function useChat({
474
485
  },
475
486
  [apiUrl, productId, conversationId, selectedModel]
476
487
  );
488
+ const addMessage = React3.useCallback(
489
+ async (role, content) => {
490
+ const msgId = generateMessageId(role === "user" ? "user" : "bot");
491
+ const newMessage = {
492
+ id: msgId,
493
+ content,
494
+ isBot: role === "assistant",
495
+ timestamp: /* @__PURE__ */ new Date()
496
+ };
497
+ setMessages((prev) => [...prev, newMessage]);
498
+ if (conversationId) {
499
+ try {
500
+ const identityToken = window.__crow_identity_token;
501
+ await fetch(`${apiUrl}/api/chat/conversations/${conversationId}/messages`, {
502
+ method: "POST",
503
+ headers: { "Content-Type": "application/json" },
504
+ body: JSON.stringify({
505
+ product_id: productId,
506
+ conversation_id: conversationId,
507
+ role,
508
+ content,
509
+ identity_token: identityToken
510
+ })
511
+ });
512
+ } catch (e) {
513
+ console.warn("[Crow] Failed to persist message:", e);
514
+ }
515
+ }
516
+ },
517
+ [apiUrl, productId, conversationId]
518
+ );
477
519
  return {
478
520
  messages,
479
521
  isLoading,
@@ -486,7 +528,8 @@ function useChat({
486
528
  stopGeneration,
487
529
  resetMessages,
488
530
  loadMessages,
489
- submitToolResult
531
+ submitToolResult,
532
+ addMessage
490
533
  };
491
534
  }
492
535
  function useConversations({ productId, apiUrl = "" }) {
@@ -667,16 +710,6 @@ function useWorkflow({
667
710
  exitWorkflow
668
711
  };
669
712
  }
670
- var SDK_DEFAULT_TOOLS = {
671
- refreshPage: async () => {
672
- try {
673
- window.location.reload();
674
- return { status: "success", data: { message: "Page refresh initiated" } };
675
- } catch (error) {
676
- return { status: "error", error: String(error) };
677
- }
678
- }
679
- };
680
713
  function useCrowAPI({ onIdentified, onReset } = {}) {
681
714
  const onIdentifiedRef = React3.useRef(onIdentified);
682
715
  const onResetRef = React3.useRef(onReset);
@@ -689,7 +722,7 @@ function useCrowAPI({ onIdentified, onReset } = {}) {
689
722
  if (!window.__crow_client_tools) {
690
723
  window.__crow_client_tools = {};
691
724
  }
692
- for (const [toolName, handler] of Object.entries(SDK_DEFAULT_TOOLS)) {
725
+ for (const [toolName, handler] of Object.entries(client.DEFAULT_TOOLS)) {
693
726
  if (!window.__crow_client_tools[toolName]) {
694
727
  window.__crow_client_tools[toolName] = handler;
695
728
  console.log(`[Crow] Registered default tool: ${toolName}`);
@@ -2165,7 +2198,8 @@ var PromptInput = React3__default.default.forwardRef(
2165
2198
  onValueChange,
2166
2199
  onSubmit,
2167
2200
  children,
2168
- disabled = false
2201
+ disabled = false,
2202
+ style
2169
2203
  }, ref) => {
2170
2204
  const [internalValue, setInternalValue] = React3__default.default.useState(value || "");
2171
2205
  const handleChange = (newValue) => {
@@ -2192,6 +2226,7 @@ var PromptInput = React3__default.default.forwardRef(
2192
2226
  isLoading && "crow-border-red-500",
2193
2227
  className
2194
2228
  ),
2229
+ style,
2195
2230
  children
2196
2231
  }
2197
2232
  )
@@ -2264,11 +2299,13 @@ var PromptInputBox = React3__default.default.forwardRef(
2264
2299
  },
2265
2300
  onStop,
2266
2301
  isLoading = false,
2302
+ showStopButton = false,
2267
2303
  placeholder = "Type your message here...",
2268
2304
  className,
2269
2305
  selectedModel = "gpt-4o",
2270
2306
  onModelChange,
2271
- availableModels = []
2307
+ availableModels = [],
2308
+ highlighted = false
2272
2309
  }, ref) => {
2273
2310
  const [input, setInput] = React3__default.default.useState("");
2274
2311
  const promptBoxRef = React3__default.default.useRef(null);
@@ -2288,8 +2325,13 @@ var PromptInputBox = React3__default.default.forwardRef(
2288
2325
  onSubmit: handleSubmit,
2289
2326
  className: cn(
2290
2327
  "crow-w-full crow-shadow-lg crow-transition-all crow-duration-300 crow-ease-in-out",
2328
+ highlighted && "crow-ring-4 crow-ring-offset-2 crow-animate-pulse crow-shadow-[0_0_20px_rgba(0,0,0,0.25)]",
2291
2329
  className
2292
2330
  ),
2331
+ style: highlighted ? {
2332
+ "--tw-ring-color": "var(--crow-user-bubble, #000)",
2333
+ "--tw-ring-offset-color": "var(--crow-background, #fff)"
2334
+ } : void 0,
2293
2335
  disabled: isLoading,
2294
2336
  ref: ref || promptBoxRef,
2295
2337
  children: [
@@ -2313,7 +2355,7 @@ var PromptInputBox = React3__default.default.forwardRef(
2313
2355
  /* @__PURE__ */ jsxRuntime.jsx(
2314
2356
  PromptInputAction,
2315
2357
  {
2316
- tooltip: isLoading ? "Stop generation" : hasContent ? "Send message" : "Type a message",
2358
+ tooltip: isLoading || showStopButton ? "Stop generation" : hasContent ? "Send message" : "Type a message",
2317
2359
  children: /* @__PURE__ */ jsxRuntime.jsx(
2318
2360
  Button,
2319
2361
  {
@@ -2321,18 +2363,18 @@ var PromptInputBox = React3__default.default.forwardRef(
2321
2363
  size: "icon",
2322
2364
  className: cn(
2323
2365
  "crow-h-7 crow-w-7 crow-rounded-full crow-transition-all crow-duration-200",
2324
- isLoading && "crow-bg-red-500 hover:crow-bg-red-500",
2325
- hasContent && !isLoading && "crow-bg-black hover:crow-bg-gray-800",
2326
- !hasContent && !isLoading && "crow-bg-transparent"
2366
+ (isLoading || showStopButton) && "crow-bg-red-500 hover:crow-bg-red-500",
2367
+ hasContent && !isLoading && !showStopButton && "crow-bg-black hover:crow-bg-gray-800",
2368
+ !hasContent && !isLoading && !showStopButton && "crow-bg-transparent"
2327
2369
  ),
2328
2370
  onClick: () => {
2329
- if (isLoading && onStop) {
2371
+ if ((isLoading || showStopButton) && onStop) {
2330
2372
  onStop();
2331
2373
  } else if (hasContent) {
2332
2374
  handleSubmit();
2333
2375
  }
2334
2376
  },
2335
- children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(
2377
+ children: isLoading || showStopButton ? /* @__PURE__ */ jsxRuntime.jsx(
2336
2378
  lucideReact.Square,
2337
2379
  {
2338
2380
  className: "crow-h-3.5 crow-w-3.5 crow-text-white",
@@ -2358,6 +2400,176 @@ var PromptInputBox = React3__default.default.forwardRef(
2358
2400
  }
2359
2401
  );
2360
2402
  PromptInputBox.displayName = "PromptInputBox";
2403
+ function BrowserUseConfirmation({
2404
+ instruction,
2405
+ onAllow,
2406
+ onDeny
2407
+ }) {
2408
+ const styles = useWidgetStyles2();
2409
+ return /* @__PURE__ */ jsxRuntime.jsx(
2410
+ "div",
2411
+ {
2412
+ className: "crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]",
2413
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
2414
+ "div",
2415
+ {
2416
+ className: "crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border",
2417
+ style: {
2418
+ background: styles.colors.botBubble,
2419
+ borderColor: styles.colors.primary
2420
+ },
2421
+ children: [
2422
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-flex crow-items-center crow-gap-2 crow-mb-2", children: [
2423
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-lg", children: "\u{1F5B1}\uFE0F" }),
2424
+ /* @__PURE__ */ jsxRuntime.jsx(
2425
+ "span",
2426
+ {
2427
+ className: "crow-font-medium crow-text-sm",
2428
+ style: { color: styles.colors.primary },
2429
+ children: "Browser Agent"
2430
+ }
2431
+ )
2432
+ ] }),
2433
+ /* @__PURE__ */ jsxRuntime.jsx(
2434
+ "p",
2435
+ {
2436
+ className: "crow-text-sm crow-font-medium crow-mb-2",
2437
+ style: { color: styles.colors.botText },
2438
+ children: "Wants to automate your browser:"
2439
+ }
2440
+ ),
2441
+ /* @__PURE__ */ jsxRuntime.jsxs(
2442
+ "p",
2443
+ {
2444
+ className: "crow-text-sm crow-mb-4 crow-bg-black/5 crow-rounded crow-p-2 crow-italic",
2445
+ style: { color: styles.colors.botText },
2446
+ children: [
2447
+ '"',
2448
+ instruction,
2449
+ '"'
2450
+ ]
2451
+ }
2452
+ ),
2453
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-flex crow-gap-2 crow-justify-end", children: [
2454
+ /* @__PURE__ */ jsxRuntime.jsx(
2455
+ "button",
2456
+ {
2457
+ onClick: onDeny,
2458
+ className: "crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80",
2459
+ style: {
2460
+ background: "transparent",
2461
+ color: styles.colors.botText,
2462
+ border: `1px solid ${styles.colors.border}`
2463
+ },
2464
+ children: "Deny"
2465
+ }
2466
+ ),
2467
+ /* @__PURE__ */ jsxRuntime.jsx(
2468
+ "button",
2469
+ {
2470
+ onClick: onAllow,
2471
+ className: "crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90",
2472
+ style: {
2473
+ background: styles.colors.primary,
2474
+ color: "#fff"
2475
+ },
2476
+ children: "Allow"
2477
+ }
2478
+ )
2479
+ ] })
2480
+ ]
2481
+ }
2482
+ )
2483
+ }
2484
+ );
2485
+ }
2486
+ function BrowserUseQuestion({
2487
+ question,
2488
+ onSubmit
2489
+ }) {
2490
+ const styles = useWidgetStyles2();
2491
+ const [answer, setAnswer] = React3.useState("");
2492
+ const [isSubmitting, setIsSubmitting] = React3.useState(false);
2493
+ const handleSubmit = React3.useCallback(() => {
2494
+ if (answer.trim() && !isSubmitting) {
2495
+ setIsSubmitting(true);
2496
+ onSubmit(answer.trim());
2497
+ }
2498
+ }, [answer, isSubmitting, onSubmit]);
2499
+ const handleKeyDown = React3.useCallback(
2500
+ (e) => {
2501
+ if (e.key === "Enter" && !e.shiftKey) {
2502
+ e.preventDefault();
2503
+ handleSubmit();
2504
+ }
2505
+ },
2506
+ [handleSubmit]
2507
+ );
2508
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]", children: /* @__PURE__ */ jsxRuntime.jsxs(
2509
+ "div",
2510
+ {
2511
+ className: "crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border",
2512
+ style: {
2513
+ background: styles.colors.botBubble,
2514
+ borderColor: styles.colors.primary
2515
+ },
2516
+ children: [
2517
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-flex crow-items-center crow-gap-2 crow-mb-2", children: [
2518
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-lg", children: "\u{1F916}" }),
2519
+ /* @__PURE__ */ jsxRuntime.jsx(
2520
+ "span",
2521
+ {
2522
+ className: "crow-font-medium crow-text-sm",
2523
+ style: { color: styles.colors.primary },
2524
+ children: "Browser Agent asks:"
2525
+ }
2526
+ )
2527
+ ] }),
2528
+ /* @__PURE__ */ jsxRuntime.jsx(
2529
+ "p",
2530
+ {
2531
+ className: "crow-text-sm crow-mb-3",
2532
+ style: { color: styles.colors.botText },
2533
+ children: question
2534
+ }
2535
+ ),
2536
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-flex crow-gap-2", children: [
2537
+ /* @__PURE__ */ jsxRuntime.jsx(
2538
+ "input",
2539
+ {
2540
+ type: "text",
2541
+ value: answer,
2542
+ onChange: (e) => setAnswer(e.target.value),
2543
+ onKeyDown: handleKeyDown,
2544
+ placeholder: "Type your response...",
2545
+ disabled: isSubmitting,
2546
+ className: "crow-flex-1 crow-px-3 crow-py-2 crow-rounded-lg crow-text-sm crow-border crow-outline-none focus:crow-ring-2 disabled:crow-opacity-50",
2547
+ style: {
2548
+ background: styles.colors.background,
2549
+ color: styles.colors.text,
2550
+ borderColor: styles.colors.border
2551
+ },
2552
+ autoFocus: true
2553
+ }
2554
+ ),
2555
+ /* @__PURE__ */ jsxRuntime.jsx(
2556
+ "button",
2557
+ {
2558
+ onClick: handleSubmit,
2559
+ disabled: !answer.trim() || isSubmitting,
2560
+ className: "crow-px-4 crow-py-2 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90 disabled:crow-opacity-50 disabled:crow-cursor-not-allowed",
2561
+ style: {
2562
+ background: styles.colors.primary,
2563
+ color: "#fff"
2564
+ },
2565
+ children: isSubmitting ? "Sending..." : "Send"
2566
+ }
2567
+ )
2568
+ ] })
2569
+ ]
2570
+ }
2571
+ ) });
2572
+ }
2361
2573
 
2362
2574
  // src/styles/cssVars.ts
2363
2575
  var CSS_VAR_NAMES = {
@@ -2461,7 +2673,7 @@ function getCssVar(varName, element = document.documentElement) {
2461
2673
  var STYLE_ID = "crow-ui-styles";
2462
2674
  var WIDGET_CSS = `*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
2463
2675
 
2464
- /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.crow-pointer-events-none{pointer-events:none}.crow-pointer-events-auto{pointer-events:auto}.crow-fixed{position:fixed}.crow-absolute{position:absolute}.crow-relative{position:relative}.crow-sticky{position:sticky}.crow-bottom-0{bottom:0}.crow-bottom-full{bottom:100%}.crow-left-0{left:0}.crow-right-0{right:0}.crow-top-0{top:0}.crow-z-50{z-index:50}.crow-z-\\[999999\\]{z-index:999999}.crow-m-0{margin:0}.crow-my-1{margin-top:.25rem;margin-bottom:.25rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-2{margin-bottom:.5rem}.crow-mb-3{margin-bottom:.75rem}.crow-ml-0{margin-left:0}.crow-ml-0\\.5{margin-left:.125rem}.crow-ml-2{margin-left:.5rem}.crow-ml-4{margin-left:1rem}.crow-mt-0{margin-top:0}.crow-mt-0\\.5{margin-top:.125rem}.crow-mt-1{margin-top:.25rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-inline-block{display:inline-block}.crow-flex{display:flex}.crow-inline-flex{display:inline-flex}.crow-h-10{height:2.5rem}.crow-h-12{height:3rem}.crow-h-2{height:.5rem}.crow-h-3{height:.75rem}.crow-h-3\\.5{height:.875rem}.crow-h-4{height:1rem}.crow-h-7{height:1.75rem}.crow-h-8{height:2rem}.crow-h-full{height:100%}.crow-max-h-32{max-height:8rem}.crow-max-h-\\[200px\\]{max-height:200px}.crow-min-h-0{min-height:0}.crow-min-h-\\[32px\\]{min-height:32px}.crow-w-0{width:0}.crow-w-0\\.5{width:.125rem}.crow-w-2{width:.5rem}.crow-w-3{width:.75rem}.crow-w-3\\.5{width:.875rem}.crow-w-4{width:1rem}.crow-w-7{width:1.75rem}.crow-w-8{width:2rem}.crow-w-full{width:100%}.crow-min-w-0{min-width:0}.crow-min-w-\\[180px\\]{min-width:180px}.crow-max-w-\\[80\\%\\]{max-width:80%}.crow-max-w-\\[90\\%\\]{max-width:90%}.crow-max-w-full{max-width:100%}.crow-flex-1{flex:1 1 0%}.crow-flex-shrink-0{flex-shrink:0}.crow-rotate-180{--tw-rotate:180deg}.crow-rotate-180,.crow-scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-scale-100{--tw-scale-x:1;--tw-scale-y:1}.crow-scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-pulse{animation:crow-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}@keyframes crow-spin{to{transform:rotate(1turn)}}.crow-animate-spin{animation:crow-spin 1s linear infinite}.crow-cursor-default{cursor:default}.crow-cursor-not-allowed{cursor:not-allowed}.crow-cursor-pointer{cursor:pointer}.crow-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.crow-resize-none{resize:none}.crow-list-decimal{list-style-type:decimal}.crow-list-disc{list-style-type:disc}.crow-flex-row{flex-direction:row}.crow-flex-col{flex-direction:column}.crow-items-start{align-items:flex-start}.crow-items-end{align-items:flex-end}.crow-items-center{align-items:center}.crow-justify-start{justify-content:flex-start}.crow-justify-end{justify-content:flex-end}.crow-justify-center{justify-content:center}.crow-justify-between{justify-content:space-between}.crow-gap-1{gap:.25rem}.crow-gap-1\\.5{gap:.375rem}.crow-gap-2{gap:.5rem}.crow-gap-3{gap:.75rem}.crow-gap-4{gap:1rem}.crow-gap-6{gap:1.5rem}.crow-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.crow-space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.crow-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.crow-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.crow-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.crow-overflow-hidden{overflow:hidden}.crow-overflow-visible{overflow:visible}.crow-overflow-x-auto{overflow-x:auto}.crow-overflow-y-auto{overflow-y:auto}.crow-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crow-whitespace-pre-wrap{white-space:pre-wrap}.crow-break-words{overflow-wrap:break-word}.crow-rounded{border-radius:.25rem}.crow-rounded-2xl{border-radius:1rem}.crow-rounded-3xl{border-radius:1.5rem}.crow-rounded-full{border-radius:9999px}.crow-rounded-lg{border-radius:.5rem}.crow-rounded-md{border-radius:.375rem}.crow-rounded-xl{border-radius:.75rem}.crow-border{border-width:1px}.crow-border-b{border-bottom-width:1px}.crow-border-l{border-left-width:1px}.crow-border-l-2{border-left-width:2px}.crow-border-r{border-right-width:1px}.crow-border-t{border-top-width:1px}.crow-border-none{border-style:none}.crow-border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.crow-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.crow-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.crow-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.crow-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.crow-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.crow-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.crow-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.crow-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.crow-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.crow-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.crow-bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.crow-bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.crow-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.crow-bg-transparent{background-color:transparent}.crow-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.crow-p-0{padding:0}.crow-p-1{padding:.25rem}.crow-p-1\\.5{padding:.375rem}.crow-p-2{padding:.5rem}.crow-p-3{padding:.75rem}.crow-p-4{padding:1rem}.crow-p-6{padding:1.5rem}.crow-px-1{padding-left:.25rem;padding-right:.25rem}.crow-px-1\\.5{padding-left:.375rem;padding-right:.375rem}.crow-px-2{padding-left:.5rem;padding-right:.5rem}.crow-px-3{padding-left:.75rem;padding-right:.75rem}.crow-px-4{padding-left:1rem;padding-right:1rem}.crow-px-6{padding-left:1.5rem;padding-right:1.5rem}.crow-py-0{padding-top:0;padding-bottom:0}.crow-py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.crow-py-1{padding-top:.25rem;padding-bottom:.25rem}.crow-py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.crow-py-2{padding-top:.5rem;padding-bottom:.5rem}.crow-py-3{padding-top:.75rem;padding-bottom:.75rem}.crow-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.crow-py-8{padding-top:2rem;padding-bottom:2rem}.crow-pb-2{padding-bottom:.5rem}.crow-pl-3{padding-left:.75rem}.crow-pl-4{padding-left:1rem}.crow-pl-5{padding-left:1.25rem}.crow-pr-4{padding-right:1rem}.crow-pt-1{padding-top:.25rem}.crow-text-left{text-align:left}.crow-text-center{text-align:center}.crow-text-right{text-align:right}.crow-align-text-bottom{vertical-align:text-bottom}.crow-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.crow-text-base{font-size:1rem;line-height:1.5rem}.crow-text-lg{font-size:1.125rem;line-height:1.75rem}.crow-text-sm{font-size:.875rem;line-height:1.25rem}.crow-text-xs{font-size:.75rem;line-height:1rem}.crow-font-bold{font-weight:700}.crow-font-medium{font-weight:500}.crow-font-semibold{font-weight:600}.crow-uppercase{text-transform:uppercase}.crow-leading-relaxed{line-height:1.625}.crow-tracking-wide{letter-spacing:.025em}.crow-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.crow-text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.crow-text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.crow-text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.crow-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.crow-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.crow-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.crow-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.crow-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.crow-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.crow-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.crow-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.crow-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.crow-underline{text-decoration-line:underline}.crow-opacity-0{opacity:0}.crow-opacity-100{opacity:1}.crow-opacity-50{opacity:.5}.crow-opacity-60{opacity:.6}.crow-shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.crow-shadow-2xl,.crow-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.crow-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.crow-backdrop-blur-md,.crow-backdrop-blur-sm{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)}.crow-backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.crow-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-duration-150{transition-duration:.15s}.crow-duration-200{transition-duration:.2s}.crow-duration-300{transition-duration:.3s}.crow-duration-500{transition-duration:.5s}.crow-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}.crow-animate-pulse{animation:crow-pulse 1.5s ease-in-out infinite}.crow-animation-delay-100{animation-delay:.1s}.crow-animation-delay-200{animation-delay:.2s}@keyframes crow-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes crow-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes crow-pulse{0%,to{opacity:1}50%{opacity:.4}}.crow-overflow-y-auto::-webkit-scrollbar{width:6px}.crow-overflow-y-auto::-webkit-scrollbar-track{background:transparent}.crow-overflow-y-auto::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.crow-overflow-y-auto::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}.crow-focus-visible\\:crow-outline-none:focus-visible{outline:none}.crow-focus-visible\\:crow-ring-2:focus-visible{box-shadow:0 0 0 2px var(--crow-primary,#6366f1)}:host{--crow-primary:#6366f1;--crow-primary-dark:#4f46e5;--crow-secondary:#f1f5f9;--crow-accent:#10b981}@media (prefers-color-scheme:dark){:host{--crow-primary:#818cf8;--crow-primary-dark:#6366f1}}.placeholder\\:crow-text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\\:crow-text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\\:crow-mb-0:last-child{margin-bottom:0}.last\\:crow-border-0:last-child{border-width:0}.hover\\:crow-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\:crow-bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\\:crow-bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.hover\\:crow-text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\\:crow-text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\\:crow-text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.hover\\:crow-opacity-100:hover{opacity:1}.focus\\:crow-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\:crow-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\:crow-ring-0:focus,.focus\\:crow-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\\:crow-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\:crow-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\\:crow-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:crow-ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.disabled\\:crow-pointer-events-none:disabled{pointer-events:none}.disabled\\:crow-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:crow-opacity-50:disabled{opacity:.5}`;
2676
+ /*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.crow-pointer-events-none{pointer-events:none}.crow-pointer-events-auto{pointer-events:auto}.crow-fixed{position:fixed}.crow-absolute{position:absolute}.crow-relative{position:relative}.crow-sticky{position:sticky}.crow-bottom-0{bottom:0}.crow-bottom-full{bottom:100%}.crow-left-0{left:0}.crow-right-0{right:0}.crow-top-0{top:0}.crow-z-50{z-index:50}.crow-z-\\[999999\\]{z-index:999999}.crow-m-0{margin:0}.crow-my-1{margin-top:.25rem;margin-bottom:.25rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-2{margin-bottom:.5rem}.crow-mb-3{margin-bottom:.75rem}.crow-mb-4{margin-bottom:1rem}.crow-ml-0{margin-left:0}.crow-ml-0\\.5{margin-left:.125rem}.crow-ml-2{margin-left:.5rem}.crow-ml-4{margin-left:1rem}.crow-mt-0{margin-top:0}.crow-mt-0\\.5{margin-top:.125rem}.crow-mt-1{margin-top:.25rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-inline-block{display:inline-block}.crow-flex{display:flex}.crow-inline-flex{display:inline-flex}.crow-h-10{height:2.5rem}.crow-h-12{height:3rem}.crow-h-2{height:.5rem}.crow-h-3{height:.75rem}.crow-h-3\\.5{height:.875rem}.crow-h-4{height:1rem}.crow-h-7{height:1.75rem}.crow-h-8{height:2rem}.crow-h-full{height:100%}.crow-max-h-32{max-height:8rem}.crow-max-h-\\[200px\\]{max-height:200px}.crow-min-h-0{min-height:0}.crow-min-h-\\[32px\\]{min-height:32px}.crow-w-0{width:0}.crow-w-0\\.5{width:.125rem}.crow-w-2{width:.5rem}.crow-w-3{width:.75rem}.crow-w-3\\.5{width:.875rem}.crow-w-4{width:1rem}.crow-w-7{width:1.75rem}.crow-w-8{width:2rem}.crow-w-full{width:100%}.crow-min-w-0{min-width:0}.crow-min-w-\\[180px\\]{min-width:180px}.crow-max-w-\\[80\\%\\]{max-width:80%}.crow-max-w-\\[90\\%\\]{max-width:90%}.crow-max-w-full{max-width:100%}.crow-flex-1{flex:1 1 0%}.crow-flex-shrink-0{flex-shrink:0}.crow-rotate-180{--tw-rotate:180deg}.crow-rotate-180,.crow-scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-scale-100{--tw-scale-x:1;--tw-scale-y:1}.crow-scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-pulse{animation:crow-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}@keyframes crow-spin{to{transform:rotate(1turn)}}.crow-animate-spin{animation:crow-spin 1s linear infinite}.crow-cursor-default{cursor:default}.crow-cursor-not-allowed{cursor:not-allowed}.crow-cursor-pointer{cursor:pointer}.crow-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.crow-resize-none{resize:none}.crow-list-decimal{list-style-type:decimal}.crow-list-disc{list-style-type:disc}.crow-flex-row{flex-direction:row}.crow-flex-col{flex-direction:column}.crow-items-start{align-items:flex-start}.crow-items-end{align-items:flex-end}.crow-items-center{align-items:center}.crow-justify-start{justify-content:flex-start}.crow-justify-end{justify-content:flex-end}.crow-justify-center{justify-content:center}.crow-justify-between{justify-content:space-between}.crow-gap-1{gap:.25rem}.crow-gap-1\\.5{gap:.375rem}.crow-gap-2{gap:.5rem}.crow-gap-3{gap:.75rem}.crow-gap-4{gap:1rem}.crow-gap-6{gap:1.5rem}.crow-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.crow-space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.crow-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.crow-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.crow-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.crow-overflow-hidden{overflow:hidden}.crow-overflow-visible{overflow:visible}.crow-overflow-x-auto{overflow-x:auto}.crow-overflow-y-auto{overflow-y:auto}.crow-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crow-whitespace-pre-wrap{white-space:pre-wrap}.crow-break-words{overflow-wrap:break-word}.crow-rounded{border-radius:.25rem}.crow-rounded-2xl{border-radius:1rem}.crow-rounded-3xl{border-radius:1.5rem}.crow-rounded-full{border-radius:9999px}.crow-rounded-lg{border-radius:.5rem}.crow-rounded-md{border-radius:.375rem}.crow-rounded-xl{border-radius:.75rem}.crow-border{border-width:1px}.crow-border-b{border-bottom-width:1px}.crow-border-l{border-left-width:1px}.crow-border-l-2{border-left-width:2px}.crow-border-r{border-right-width:1px}.crow-border-t{border-top-width:1px}.crow-border-none{border-style:none}.crow-border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.crow-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.crow-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.crow-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.crow-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.crow-bg-black\\/5{background-color:rgba(0,0,0,.05)}.crow-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.crow-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.crow-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.crow-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.crow-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.crow-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.crow-bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.crow-bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.crow-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.crow-bg-transparent{background-color:transparent}.crow-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.crow-p-0{padding:0}.crow-p-1{padding:.25rem}.crow-p-1\\.5{padding:.375rem}.crow-p-2{padding:.5rem}.crow-p-3{padding:.75rem}.crow-p-4{padding:1rem}.crow-p-6{padding:1.5rem}.crow-px-1{padding-left:.25rem;padding-right:.25rem}.crow-px-1\\.5{padding-left:.375rem;padding-right:.375rem}.crow-px-2{padding-left:.5rem;padding-right:.5rem}.crow-px-3{padding-left:.75rem;padding-right:.75rem}.crow-px-4{padding-left:1rem;padding-right:1rem}.crow-px-6{padding-left:1.5rem;padding-right:1.5rem}.crow-py-0{padding-top:0;padding-bottom:0}.crow-py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.crow-py-1{padding-top:.25rem;padding-bottom:.25rem}.crow-py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.crow-py-2{padding-top:.5rem;padding-bottom:.5rem}.crow-py-3{padding-top:.75rem;padding-bottom:.75rem}.crow-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.crow-py-8{padding-top:2rem;padding-bottom:2rem}.crow-pb-2{padding-bottom:.5rem}.crow-pl-3{padding-left:.75rem}.crow-pl-4{padding-left:1rem}.crow-pl-5{padding-left:1.25rem}.crow-pr-4{padding-right:1rem}.crow-pt-1{padding-top:.25rem}.crow-text-left{text-align:left}.crow-text-center{text-align:center}.crow-text-right{text-align:right}.crow-align-text-bottom{vertical-align:text-bottom}.crow-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.crow-text-base{font-size:1rem;line-height:1.5rem}.crow-text-lg{font-size:1.125rem;line-height:1.75rem}.crow-text-sm{font-size:.875rem;line-height:1.25rem}.crow-text-xs{font-size:.75rem;line-height:1rem}.crow-font-bold{font-weight:700}.crow-font-medium{font-weight:500}.crow-font-semibold{font-weight:600}.crow-uppercase{text-transform:uppercase}.crow-italic{font-style:italic}.crow-leading-relaxed{line-height:1.625}.crow-tracking-wide{letter-spacing:.025em}.crow-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.crow-text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.crow-text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.crow-text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.crow-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.crow-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.crow-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.crow-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.crow-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.crow-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.crow-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.crow-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.crow-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.crow-underline{text-decoration-line:underline}.crow-opacity-0{opacity:0}.crow-opacity-100{opacity:1}.crow-opacity-50{opacity:.5}.crow-opacity-60{opacity:.6}.crow-shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.crow-shadow-2xl,.crow-shadow-\\[0_0_20px_rgba\\(0\\,0\\,0\\,0\\.25\\)\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-\\[0_0_20px_rgba\\(0\\,0\\,0\\,0\\.25\\)\\]{--tw-shadow:0 0 20px rgba(0,0,0,.25);--tw-shadow-colored:0 0 20px var(--tw-shadow-color)}.crow-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.crow-shadow-lg,.crow-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.crow-outline-none{outline:2px solid transparent;outline-offset:2px}.crow-ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.crow-ring-offset-2{--tw-ring-offset-width:2px}.crow-backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.crow-backdrop-blur-md,.crow-backdrop-blur-sm{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)}.crow-backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.crow-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-duration-150{transition-duration:.15s}.crow-duration-200{transition-duration:.2s}.crow-duration-300{transition-duration:.3s}.crow-duration-500{transition-duration:.5s}.crow-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}.crow-animate-pulse{animation:crow-pulse 1.5s ease-in-out infinite}.crow-animation-delay-100{animation-delay:.1s}.crow-animation-delay-200{animation-delay:.2s}@keyframes crow-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes crow-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes crow-pulse{0%,to{opacity:1}50%{opacity:.4}}.crow-overflow-y-auto::-webkit-scrollbar{width:6px}.crow-overflow-y-auto::-webkit-scrollbar-track{background:transparent}.crow-overflow-y-auto::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.crow-overflow-y-auto::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}.crow-focus-visible\\:crow-outline-none:focus-visible{outline:none}.crow-focus-visible\\:crow-ring-2:focus-visible{box-shadow:0 0 0 2px var(--crow-primary,#6366f1)}:host{--crow-primary:#6366f1;--crow-primary-dark:#4f46e5;--crow-secondary:#f1f5f9;--crow-accent:#10b981}@media (prefers-color-scheme:dark){:host{--crow-primary:#818cf8;--crow-primary-dark:#6366f1}}.placeholder\\:crow-text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\\:crow-text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\\:crow-mb-0:last-child{margin-bottom:0}.last\\:crow-border-0:last-child{border-width:0}.hover\\:crow-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\:crow-bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\\:crow-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\\:crow-bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.hover\\:crow-text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\\:crow-text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\\:crow-text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.hover\\:crow-opacity-100:hover{opacity:1}.hover\\:crow-opacity-80:hover{opacity:.8}.hover\\:crow-opacity-90:hover{opacity:.9}.focus\\:crow-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\:crow-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\:crow-ring-0:focus,.focus\\:crow-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\\:crow-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\:crow-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\\:crow-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\:crow-ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.disabled\\:crow-pointer-events-none:disabled{pointer-events:none}.disabled\\:crow-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:crow-opacity-50:disabled{opacity:.5}`;
2465
2677
  var injected = false;
2466
2678
  function injectStyles(target = document) {
2467
2679
  if (target === document && injected) return;
@@ -2510,7 +2722,6 @@ function CrowWidget({
2510
2722
  });
2511
2723
  const agentName = agentNameProp ?? agentNameFromAPI;
2512
2724
  const welcomeMessage = welcomeMessageProp ?? welcomeMessageFromAPI;
2513
- console.log("[Crow Widget] persistAnonymousConversations from API:", persistAnonymousConversations, "isLoading:", isLoadingStyles);
2514
2725
  const showThinking = showThinkingProp ?? showThinkingFromAPI;
2515
2726
  const [autoTools, setAutoTools] = React3.useState({});
2516
2727
  const cssVars = stylesToCssVars(styles);
@@ -2520,6 +2731,9 @@ function CrowWidget({
2520
2731
  const [isCollapsed, setIsCollapsed] = React3.useState(variant === "floating");
2521
2732
  const [showConversationList, setShowConversationList] = React3.useState(false);
2522
2733
  const [isVerifiedUser, setIsVerifiedUser] = React3.useState(false);
2734
+ const [isBrowserUseActive, setIsBrowserUseActive] = React3.useState(false);
2735
+ const [pendingConfirmation, setPendingConfirmation] = React3.useState(null);
2736
+ const [askUserResolver, setAskUserResolver] = React3.useState(null);
2523
2737
  const {
2524
2738
  activeWorkflow,
2525
2739
  startWorkflow,
@@ -2572,6 +2786,13 @@ function CrowWidget({
2572
2786
  event.toolName,
2573
2787
  event.arguments || {}
2574
2788
  );
2789
+ const resultObj = result;
2790
+ const dataObj = resultObj?.data;
2791
+ const wasUserCancelled = dataObj?.declined === true || typeof resultObj?.error === "string" && resultObj.error.includes("cancelled by user") || typeof resultObj?.error === "string" && resultObj.error.includes("declined");
2792
+ if (wasUserCancelled) {
2793
+ console.log("[Crow Widget] Tool was cancelled by user - not sending result to agent");
2794
+ return;
2795
+ }
2575
2796
  if (result && submitToolResultRef.current) {
2576
2797
  await submitToolResultRef.current(
2577
2798
  event.toolCallId,
@@ -2598,7 +2819,10 @@ function CrowWidget({
2598
2819
  React3.useEffect(() => {
2599
2820
  if (shouldRestoreHistory && chat.conversationId && !hasRestoredHistoryRef.current) {
2600
2821
  hasRestoredHistoryRef.current = true;
2601
- console.log("[Crow Widget] Restoring conversation history:", chat.conversationId);
2822
+ console.log(
2823
+ "[Crow Widget] Restoring conversation history:",
2824
+ chat.conversationId
2825
+ );
2602
2826
  conversations.loadAnonymousConversationHistory(chat.conversationId).then((historyMessages) => {
2603
2827
  if (historyMessages.length > 0) {
2604
2828
  chat.loadMessages(historyMessages);
@@ -2652,6 +2876,41 @@ function CrowWidget({
2652
2876
  onIdentify(identify);
2653
2877
  }
2654
2878
  }, [isLoadingStyles, onIdentify]);
2879
+ const handleBrowserConfirmation = React3.useCallback(
2880
+ (instruction) => {
2881
+ return new Promise((resolve) => {
2882
+ setPendingConfirmation({ instruction, resolve });
2883
+ });
2884
+ },
2885
+ []
2886
+ );
2887
+ const handleBrowserQuestion = React3.useCallback(
2888
+ (question) => {
2889
+ return new Promise((resolve, reject) => {
2890
+ chat.addMessage("assistant", question);
2891
+ setAskUserResolver({ resolve, reject });
2892
+ });
2893
+ },
2894
+ [chat]
2895
+ );
2896
+ const handleBrowserProgress = React3.useCallback(
2897
+ (step, maxSteps) => {
2898
+ if (step >= maxSteps || step === -1) {
2899
+ setIsBrowserUseActive(false);
2900
+ }
2901
+ },
2902
+ []
2903
+ );
2904
+ React3.useEffect(() => {
2905
+ window.__crow_browser_callbacks = {
2906
+ onConfirmation: handleBrowserConfirmation,
2907
+ onQuestion: handleBrowserQuestion,
2908
+ onProgress: handleBrowserProgress
2909
+ };
2910
+ return () => {
2911
+ delete window.__crow_browser_callbacks;
2912
+ };
2913
+ }, [handleBrowserConfirmation, handleBrowserQuestion, handleBrowserProgress]);
2655
2914
  React3.useEffect(() => {
2656
2915
  if (browserUseEnabled && !isLoadingStyles && Object.keys(autoTools).length === 0) {
2657
2916
  import('@usecrow/client/browser').then(({ createBrowserUseTool }) => {
@@ -2664,7 +2923,7 @@ function CrowWidget({
2664
2923
  });
2665
2924
  }
2666
2925
  }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, autoTools]);
2667
- const mergedTools = { ...autoTools, ...tools };
2926
+ const mergedTools = React3.useMemo(() => ({ ...autoTools, ...tools }), [autoTools, tools]);
2668
2927
  React3.useEffect(() => {
2669
2928
  if (Object.keys(mergedTools).length > 0) {
2670
2929
  window.crow?.("registerTools", mergedTools);
@@ -2673,8 +2932,37 @@ function CrowWidget({
2673
2932
  const handleSend = (message) => {
2674
2933
  if (!message.trim()) return;
2675
2934
  setIsCollapsed(false);
2935
+ if (askUserResolver) {
2936
+ chat.addMessage("user", message);
2937
+ askUserResolver.resolve(message);
2938
+ setAskUserResolver(null);
2939
+ return;
2940
+ }
2676
2941
  chat.sendMessage(message);
2677
2942
  };
2943
+ const handleStop = () => {
2944
+ chat.stopGeneration();
2945
+ if (browserUseEnabled && isBrowserUseActive) {
2946
+ import('@usecrow/client/browser').then(({ stopActiveBrowserUse }) => {
2947
+ stopActiveBrowserUse();
2948
+ if (askUserResolver) {
2949
+ askUserResolver.reject();
2950
+ setAskUserResolver(null);
2951
+ }
2952
+ }).catch(() => {
2953
+ });
2954
+ setIsBrowserUseActive(false);
2955
+ } else {
2956
+ if (askUserResolver) {
2957
+ askUserResolver.reject();
2958
+ setAskUserResolver(null);
2959
+ }
2960
+ }
2961
+ if (pendingConfirmation) {
2962
+ pendingConfirmation.resolve(false);
2963
+ setPendingConfirmation(null);
2964
+ }
2965
+ };
2678
2966
  const handleNewChat = () => {
2679
2967
  chat.resetMessages();
2680
2968
  setShowConversationList(false);
@@ -2730,24 +3018,43 @@ function CrowWidget({
2730
3018
  onExit: handleExitWorkflow
2731
3019
  }
2732
3020
  ) }),
2733
- /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: (chat.messages.length > 0 || conversations.isLoadingHistory) && /* @__PURE__ */ jsxRuntime.jsx(MessagesContainer, { ref: messagesContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(
2734
- MessageList,
2735
- {
2736
- messages: chat.messages,
2737
- activeToolCalls: chat.activeToolCalls,
2738
- isLoadingHistory: conversations.isLoadingHistory,
2739
- isGenerating: chat.isLoading
2740
- }
2741
- ) }) }),
3021
+ /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: (chat.messages.length > 0 || conversations.isLoadingHistory || pendingConfirmation) && /* @__PURE__ */ jsxRuntime.jsxs(MessagesContainer, { ref: messagesContainerRef, children: [
3022
+ /* @__PURE__ */ jsxRuntime.jsx(
3023
+ MessageList,
3024
+ {
3025
+ messages: chat.messages,
3026
+ activeToolCalls: chat.activeToolCalls,
3027
+ isLoadingHistory: conversations.isLoadingHistory,
3028
+ isGenerating: chat.isLoading
3029
+ }
3030
+ ),
3031
+ pendingConfirmation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
3032
+ BrowserUseConfirmation,
3033
+ {
3034
+ instruction: pendingConfirmation.instruction,
3035
+ onAllow: () => {
3036
+ setIsBrowserUseActive(true);
3037
+ pendingConfirmation.resolve(true);
3038
+ setPendingConfirmation(null);
3039
+ },
3040
+ onDeny: () => {
3041
+ pendingConfirmation.resolve(false);
3042
+ setPendingConfirmation(null);
3043
+ }
3044
+ }
3045
+ ) })
3046
+ ] }) }),
2742
3047
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-mt-auto crow-w-full", children: [
2743
3048
  /* @__PURE__ */ jsxRuntime.jsx(PoweredByBadge, { apiUrl }),
2744
3049
  /* @__PURE__ */ jsxRuntime.jsx(
2745
3050
  PromptInputBox,
2746
3051
  {
2747
3052
  onSend: handleSend,
2748
- onStop: chat.stopGeneration,
3053
+ onStop: handleStop,
2749
3054
  placeholder: "Type your message...",
2750
3055
  isLoading: chat.isLoading,
3056
+ showStopButton: isBrowserUseActive || !!askUserResolver || !!pendingConfirmation,
3057
+ highlighted: !!askUserResolver,
2751
3058
  className: "crow-backdrop-blur-md"
2752
3059
  }
2753
3060
  )
@@ -2763,7 +3070,13 @@ function CrowWidget({
2763
3070
  showThinking,
2764
3071
  children: [
2765
3072
  variant === "floating" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2766
- /* @__PURE__ */ jsxRuntime.jsx(ChatBubble, { isExpanded: !isCollapsed, onClick: handleBubbleClick }),
3073
+ /* @__PURE__ */ jsxRuntime.jsx(
3074
+ ChatBubble,
3075
+ {
3076
+ isExpanded: !isCollapsed,
3077
+ onClick: handleBubbleClick
3078
+ }
3079
+ ),
2767
3080
  !isCollapsed && /* @__PURE__ */ jsxRuntime.jsx(WidgetShell, { children: renderWidgetContent() })
2768
3081
  ] }),
2769
3082
  variant === "embedded" && /* @__PURE__ */ jsxRuntime.jsx(WidgetShell, { children: renderWidgetContent() })
@@ -2786,7 +3099,13 @@ function CrowCopilot({
2786
3099
  className,
2787
3100
  onReady
2788
3101
  }) {
2789
- const { styles, isLoading: isLoadingStyles, agentName: agentNameFromAPI, persistAnonymousConversations, welcomeMessage: welcomeMessageFromAPI } = useCopilotStyles({
3102
+ const {
3103
+ styles,
3104
+ isLoading: isLoadingStyles,
3105
+ agentName: agentNameFromAPI,
3106
+ persistAnonymousConversations,
3107
+ welcomeMessage: welcomeMessageFromAPI
3108
+ } = useCopilotStyles({
2790
3109
  productId,
2791
3110
  apiUrl,
2792
3111
  propStyles,
@@ -2798,6 +3117,8 @@ function CrowCopilot({
2798
3117
  const executeClientToolRef = React3.useRef(null);
2799
3118
  const [showConversationList, setShowConversationList] = React3.useState(false);
2800
3119
  const [isVerifiedUser, setIsVerifiedUser] = React3.useState(false);
3120
+ const [pendingConfirmation, setPendingConfirmation] = React3.useState(null);
3121
+ const [pendingQuestion, setPendingQuestion] = React3.useState(null);
2801
3122
  const conversations = useConversations({ productId, apiUrl });
2802
3123
  const [shouldRestoreHistory, setShouldRestoreHistory] = React3.useState(false);
2803
3124
  const hasRestoredHistoryRef = React3.useRef(false);
@@ -2813,8 +3134,15 @@ function CrowCopilot({
2813
3134
  },
2814
3135
  onToolCall: (event) => {
2815
3136
  if (event.type === "client_call" && event.toolName) {
2816
- console.log("[Crow Copilot] Executing client tool:", event.toolName, event.arguments);
2817
- const result = executeClientToolRef.current?.(event.toolName, event.arguments || {});
3137
+ console.log(
3138
+ "[Crow Copilot] Executing client tool:",
3139
+ event.toolName,
3140
+ event.arguments
3141
+ );
3142
+ const result = executeClientToolRef.current?.(
3143
+ event.toolName,
3144
+ event.arguments || {}
3145
+ );
2818
3146
  result?.then((r) => console.log("[Crow Copilot] Tool result:", r)).catch((e) => console.error("[Crow Copilot] Tool error:", e));
2819
3147
  }
2820
3148
  },
@@ -2843,6 +3171,31 @@ function CrowCopilot({
2843
3171
  }
2844
3172
  });
2845
3173
  executeClientToolRef.current = executeClientTool;
3174
+ const handleBrowserConfirmation = React3.useCallback(
3175
+ (instruction) => {
3176
+ return new Promise((resolve) => {
3177
+ setPendingConfirmation({ instruction, resolve });
3178
+ });
3179
+ },
3180
+ []
3181
+ );
3182
+ const handleBrowserQuestion = React3.useCallback(
3183
+ (question) => {
3184
+ return new Promise((resolve) => {
3185
+ setPendingQuestion({ question, resolve });
3186
+ });
3187
+ },
3188
+ []
3189
+ );
3190
+ React3.useEffect(() => {
3191
+ window.__crow_browser_callbacks = {
3192
+ onConfirmation: handleBrowserConfirmation,
3193
+ onQuestion: handleBrowserQuestion
3194
+ };
3195
+ return () => {
3196
+ delete window.__crow_browser_callbacks;
3197
+ };
3198
+ }, [handleBrowserConfirmation, handleBrowserQuestion]);
2846
3199
  React3.useEffect(() => {
2847
3200
  if (!isLoadingStyles) {
2848
3201
  onReady?.();
@@ -2960,27 +3313,60 @@ function CrowCopilot({
2960
3313
  onClose: handleCloseConversationList
2961
3314
  }
2962
3315
  ) }),
2963
- /* @__PURE__ */ jsxRuntime.jsx(MessagesContainer, { ref: messagesContainerRef, children: /* @__PURE__ */ jsxRuntime.jsx(
2964
- MessageList,
2965
- {
2966
- messages: chat.messages,
2967
- activeToolCalls: chat.activeToolCalls,
2968
- isLoadingHistory: conversations.isLoadingHistory,
2969
- isGenerating: chat.isLoading
2970
- }
2971
- ) }),
2972
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-p-3 crow-border-t", style: { borderColor: styles.colors.border }, children: [
2973
- styles.branding.showPoweredBy && /* @__PURE__ */ jsxRuntime.jsx(PoweredByBadge, { apiUrl }),
3316
+ /* @__PURE__ */ jsxRuntime.jsxs(MessagesContainer, { ref: messagesContainerRef, children: [
2974
3317
  /* @__PURE__ */ jsxRuntime.jsx(
2975
- PromptInputBox,
3318
+ MessageList,
2976
3319
  {
2977
- onSend: handleSend,
2978
- onStop: chat.stopGeneration,
2979
- placeholder: "Ask anything...",
2980
- isLoading: chat.isLoading
3320
+ messages: chat.messages,
3321
+ activeToolCalls: chat.activeToolCalls,
3322
+ isLoadingHistory: conversations.isLoadingHistory,
3323
+ isGenerating: chat.isLoading
2981
3324
  }
2982
- )
2983
- ] })
3325
+ ),
3326
+ pendingConfirmation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
3327
+ BrowserUseConfirmation,
3328
+ {
3329
+ instruction: pendingConfirmation.instruction,
3330
+ onAllow: () => {
3331
+ pendingConfirmation.resolve(true);
3332
+ setPendingConfirmation(null);
3333
+ },
3334
+ onDeny: () => {
3335
+ pendingConfirmation.resolve(false);
3336
+ setPendingConfirmation(null);
3337
+ }
3338
+ }
3339
+ ) }),
3340
+ pendingQuestion && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
3341
+ BrowserUseQuestion,
3342
+ {
3343
+ question: pendingQuestion.question,
3344
+ onSubmit: (answer) => {
3345
+ pendingQuestion.resolve(answer);
3346
+ setPendingQuestion(null);
3347
+ }
3348
+ }
3349
+ ) })
3350
+ ] }),
3351
+ /* @__PURE__ */ jsxRuntime.jsxs(
3352
+ "div",
3353
+ {
3354
+ className: "crow-p-3 crow-border-t",
3355
+ style: { borderColor: styles.colors.border },
3356
+ children: [
3357
+ styles.branding.showPoweredBy && /* @__PURE__ */ jsxRuntime.jsx(PoweredByBadge, { apiUrl }),
3358
+ /* @__PURE__ */ jsxRuntime.jsx(
3359
+ PromptInputBox,
3360
+ {
3361
+ onSend: handleSend,
3362
+ onStop: chat.stopGeneration,
3363
+ placeholder: "Ask anything...",
3364
+ isLoading: chat.isLoading
3365
+ }
3366
+ )
3367
+ ]
3368
+ }
3369
+ )
2984
3370
  ]
2985
3371
  }
2986
3372
  )