@usecrow/ui 0.1.48 → 0.1.50

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
@@ -90,6 +90,7 @@ function useChat({
90
90
  const [activeToolCalls, setActiveToolCalls] = React3.useState([]);
91
91
  const [conversationId, setConversationId] = React3.useState(null);
92
92
  const [selectedModel, setSelectedModel] = React3.useState(initialSelectedModel);
93
+ const [suggestedActions, setSuggestedActions] = React3.useState([]);
93
94
  const abortControllerRef = React3.useRef(null);
94
95
  const hasCheckedPersistRef = React3.useRef(false);
95
96
  const streamingToolCallsRef = React3.useRef([]);
@@ -350,7 +351,7 @@ function useChat({
350
351
  arguments: parsed.arguments
351
352
  });
352
353
  const clientToolCall = {
353
- id: `tool-${Date.now()}`,
354
+ id: parsed.tool_call_id || `tool-${Date.now()}`,
354
355
  name: parsed.tool_name,
355
356
  displayName: parsed.display_name || void 0,
356
357
  arguments: parsed.arguments || {},
@@ -365,6 +366,47 @@ function useChat({
365
366
  arguments: parsed.arguments
366
367
  });
367
368
  break;
369
+ case "tool_consent_required":
370
+ onToolCall?.({
371
+ type: "consent_required",
372
+ toolName: parsed.tool_name,
373
+ arguments: parsed.arguments
374
+ });
375
+ {
376
+ const existingIdx = streamingToolCallsRef.current.findIndex(
377
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing"
378
+ );
379
+ if (existingIdx >= 0) {
380
+ const existing = streamingToolCallsRef.current[existingIdx];
381
+ const updatedTc = {
382
+ ...existing,
383
+ status: "awaiting_consent",
384
+ requiresConsent: true,
385
+ serverSideExecution: true,
386
+ arguments: parsed.arguments || existing.arguments
387
+ };
388
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
389
+ (tc, i) => i === existingIdx ? updatedTc : tc
390
+ );
391
+ setActiveToolCalls(
392
+ (prev) => prev.map((tc) => tc.id === existing.id ? updatedTc : tc)
393
+ );
394
+ } else {
395
+ const consentToolCall = {
396
+ id: `consent-${Date.now()}`,
397
+ name: parsed.tool_name,
398
+ displayName: parsed.display_name || void 0,
399
+ arguments: parsed.arguments || {},
400
+ status: "awaiting_consent",
401
+ requiresConsent: true,
402
+ serverSideExecution: true,
403
+ timestamp: /* @__PURE__ */ new Date()
404
+ };
405
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentToolCall];
406
+ setActiveToolCalls((prev) => [...prev, consentToolCall]);
407
+ }
408
+ }
409
+ break;
368
410
  case "workflow_started":
369
411
  onWorkflowEvent?.({
370
412
  type: "started",
@@ -385,6 +427,11 @@ function useChat({
385
427
  case "workflow_complete_prompt":
386
428
  onWorkflowEvent?.({ type: "complete_prompt" });
387
429
  break;
430
+ case "suggested_actions":
431
+ if (parsed.actions && Array.isArray(parsed.actions)) {
432
+ setSuggestedActions(parsed.actions);
433
+ }
434
+ break;
388
435
  }
389
436
  } catch (e) {
390
437
  console.error("[Crow] Parse error:", e);
@@ -426,6 +473,7 @@ function useChat({
426
473
  }
427
474
  setActiveToolCalls([]);
428
475
  streamingToolCallsRef.current = [];
476
+ setSuggestedActions([]);
429
477
  const userMsgId = generateMessageId("user");
430
478
  const botMsgId = generateMessageId("bot");
431
479
  setMessages((prev) => [
@@ -533,6 +581,22 @@ function useChat({
533
581
  const data = line.slice(6).trim();
534
582
  if (data === "[DONE]") {
535
583
  setIsLoading(false);
584
+ const finalToolCalls = [...streamingToolCallsRef.current];
585
+ if (finalToolCalls.length > 0) {
586
+ setMessages(
587
+ (prev) => prev.map(
588
+ (msg) => msg.id === botMsgId ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true } : msg
589
+ )
590
+ );
591
+ } else {
592
+ setMessages(
593
+ (prev) => prev.map(
594
+ (msg) => msg.id === botMsgId ? { ...msg, thinkingComplete: true } : msg
595
+ )
596
+ );
597
+ }
598
+ setActiveToolCalls([]);
599
+ streamingToolCallsRef.current = [];
536
600
  for (const tool of pendingClientTools) {
537
601
  onToolCall?.({
538
602
  type: "client_call",
@@ -545,19 +609,196 @@ function useChat({
545
609
  }
546
610
  try {
547
611
  const parsed = JSON.parse(data);
548
- if (parsed.type === "content") {
549
- accumulatedText += parsed.content;
550
- setMessages(
551
- (prev) => prev.map(
552
- (msg) => msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg
553
- )
554
- );
555
- } else if (parsed.type === "client_tool_call") {
556
- pendingClientTools.push({
557
- toolName: parsed.tool_name,
558
- toolCallId: parsed.tool_call_id,
559
- arguments: parsed.arguments
560
- });
612
+ switch (parsed.type) {
613
+ case "content":
614
+ accumulatedText += parsed.content;
615
+ setMessages(
616
+ (prev) => prev.map(
617
+ (msg) => msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg
618
+ )
619
+ );
620
+ break;
621
+ case "thinking":
622
+ if (parsed.status === "complete") {
623
+ setMessages(
624
+ (prev) => prev.map(
625
+ (msg) => msg.id === botMsgId ? { ...msg, thinkingComplete: true } : msg
626
+ )
627
+ );
628
+ }
629
+ break;
630
+ case "thinking_token":
631
+ if (parsed.content) {
632
+ setMessages(
633
+ (prev) => prev.map(
634
+ (msg) => msg.id === botMsgId ? { ...msg, thinking: (msg.thinking || "") + parsed.content } : msg
635
+ )
636
+ );
637
+ }
638
+ break;
639
+ case "citations":
640
+ if (parsed.citations) {
641
+ setMessages(
642
+ (prev) => prev.map(
643
+ (msg) => msg.id === botMsgId ? { ...msg, citations: parsed.citations } : msg
644
+ )
645
+ );
646
+ }
647
+ break;
648
+ case "tool_call_start":
649
+ onToolCall?.({
650
+ type: "start",
651
+ toolName: parsed.tool_name,
652
+ arguments: parsed.arguments
653
+ });
654
+ {
655
+ const newTc = {
656
+ id: `tool-${Date.now()}`,
657
+ name: parsed.tool_name,
658
+ displayName: parsed.display_name || void 0,
659
+ arguments: parsed.arguments || {},
660
+ status: "executing",
661
+ timestamp: /* @__PURE__ */ new Date()
662
+ };
663
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, newTc];
664
+ setActiveToolCalls((prev) => [...prev, newTc]);
665
+ }
666
+ break;
667
+ case "tool_call_complete":
668
+ onToolCall?.({
669
+ type: "complete",
670
+ toolName: parsed.tool_name,
671
+ success: parsed.success
672
+ });
673
+ {
674
+ const completeStatus = parsed.success ? "complete" : "error";
675
+ let tcUpdated = false;
676
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {
677
+ if (!tcUpdated && tool.name === parsed.tool_name && tool.status === "executing") {
678
+ tcUpdated = true;
679
+ return { ...tool, status: completeStatus };
680
+ }
681
+ return tool;
682
+ });
683
+ setActiveToolCalls((prev) => {
684
+ let updated = false;
685
+ return prev.map((tool) => {
686
+ if (!updated && tool.name === parsed.tool_name && tool.status === "executing") {
687
+ updated = true;
688
+ return { ...tool, status: completeStatus };
689
+ }
690
+ return tool;
691
+ });
692
+ });
693
+ setMessages(
694
+ (prev) => prev.map(
695
+ (msg) => msg.toolCalls ? {
696
+ ...msg,
697
+ toolCalls: msg.toolCalls.map(
698
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing" ? { ...tc, status: completeStatus } : tc
699
+ )
700
+ } : msg
701
+ )
702
+ );
703
+ }
704
+ break;
705
+ case "tool_result":
706
+ if (parsed.tool_name && parsed.result) {
707
+ onToolResult?.(parsed.tool_name, parsed.result);
708
+ let resultUpdated = false;
709
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {
710
+ if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {
711
+ resultUpdated = true;
712
+ return { ...tool, result: parsed.result };
713
+ }
714
+ return tool;
715
+ });
716
+ setActiveToolCalls((prev) => {
717
+ let updated = false;
718
+ return prev.map((tool) => {
719
+ if (!updated && tool.name === parsed.tool_name && !tool.result) {
720
+ updated = true;
721
+ return { ...tool, result: parsed.result };
722
+ }
723
+ return tool;
724
+ });
725
+ });
726
+ setMessages(
727
+ (prev) => prev.map(
728
+ (msg) => msg.toolCalls ? {
729
+ ...msg,
730
+ toolCalls: msg.toolCalls.map(
731
+ (tc) => tc.name === parsed.tool_name && !tc.result ? { ...tc, result: parsed.result } : tc
732
+ )
733
+ } : msg
734
+ )
735
+ );
736
+ }
737
+ break;
738
+ case "tool_result_links":
739
+ if (parsed.links && Array.isArray(parsed.links)) {
740
+ setMessages(
741
+ (prev) => prev.map(
742
+ (msg) => msg.id === botMsgId ? { ...msg, links: [...msg.links || [], ...parsed.links] } : msg
743
+ )
744
+ );
745
+ }
746
+ break;
747
+ case "client_tool_call":
748
+ {
749
+ const toolCallEntry = {
750
+ id: parsed.tool_call_id || `tool-${Date.now()}`,
751
+ name: parsed.tool_name,
752
+ displayName: parsed.display_name || void 0,
753
+ arguments: parsed.arguments || {},
754
+ status: "executing",
755
+ timestamp: /* @__PURE__ */ new Date()
756
+ };
757
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, toolCallEntry];
758
+ setActiveToolCalls((prev) => [...prev, toolCallEntry]);
759
+ pendingClientTools.push({
760
+ toolName: parsed.tool_name,
761
+ toolCallId: parsed.tool_call_id,
762
+ arguments: parsed.arguments
763
+ });
764
+ }
765
+ break;
766
+ case "tool_consent_required":
767
+ {
768
+ const existingIdx2 = streamingToolCallsRef.current.findIndex(
769
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing"
770
+ );
771
+ if (existingIdx2 >= 0) {
772
+ const existing2 = streamingToolCallsRef.current[existingIdx2];
773
+ const updated2 = {
774
+ ...existing2,
775
+ status: "awaiting_consent",
776
+ requiresConsent: true,
777
+ serverSideExecution: true,
778
+ arguments: parsed.arguments || existing2.arguments
779
+ };
780
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
781
+ (tc, i) => i === existingIdx2 ? updated2 : tc
782
+ );
783
+ setActiveToolCalls(
784
+ (prev) => prev.map((tc) => tc.id === existing2.id ? updated2 : tc)
785
+ );
786
+ } else {
787
+ const consentEntry = {
788
+ id: `consent-${Date.now()}`,
789
+ name: parsed.tool_name,
790
+ displayName: parsed.display_name || void 0,
791
+ arguments: parsed.arguments || {},
792
+ status: "awaiting_consent",
793
+ requiresConsent: true,
794
+ serverSideExecution: true,
795
+ timestamp: /* @__PURE__ */ new Date()
796
+ };
797
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry];
798
+ setActiveToolCalls((prev) => [...prev, consentEntry]);
799
+ }
800
+ }
801
+ break;
561
802
  }
562
803
  } catch (e) {
563
804
  console.error("[Crow] Parse error in tool result response:", e);
@@ -610,12 +851,35 @@ function useChat({
610
851
  },
611
852
  [apiUrl, productId, conversationId]
612
853
  );
854
+ const updateToolCallStatus = React3.useCallback(
855
+ (toolCallId, status) => {
856
+ setActiveToolCalls(
857
+ (prev) => prev.map((tc) => tc.id === toolCallId ? { ...tc, status } : tc)
858
+ );
859
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
860
+ (tc) => tc.id === toolCallId ? { ...tc, status } : tc
861
+ );
862
+ setMessages(
863
+ (prev) => prev.map(
864
+ (msg) => msg.toolCalls ? {
865
+ ...msg,
866
+ toolCalls: msg.toolCalls.map(
867
+ (tc) => tc.id === toolCallId ? { ...tc, status } : tc
868
+ )
869
+ } : msg
870
+ )
871
+ );
872
+ },
873
+ []
874
+ );
613
875
  return {
614
876
  messages,
615
877
  isLoading,
616
878
  activeToolCalls,
617
879
  conversationId,
618
880
  selectedModel,
881
+ suggestedActions,
882
+ setSuggestedActions,
619
883
  setSelectedModel,
620
884
  setConversationId,
621
885
  sendMessage,
@@ -623,7 +887,8 @@ function useChat({
623
887
  resetMessages,
624
888
  loadMessages,
625
889
  submitToolResult,
626
- addMessage
890
+ addMessage,
891
+ updateToolCallStatus
627
892
  };
628
893
  }
629
894
  function useConversations({ productId, apiUrl = "" }) {
@@ -927,6 +1192,16 @@ function useCrowAPI({ onIdentified, onReset } = {}) {
927
1192
  case "close":
928
1193
  window.dispatchEvent(new CustomEvent("crow:close"));
929
1194
  break;
1195
+ case "setSuggestedActions":
1196
+ if (!Array.isArray(options)) {
1197
+ console.error("[Crow] setSuggestedActions() requires an array of { label, message }");
1198
+ return;
1199
+ }
1200
+ window.__crow_suggested_actions = options;
1201
+ window.dispatchEvent(
1202
+ new CustomEvent("crow:setSuggestedActions", { detail: options })
1203
+ );
1204
+ break;
930
1205
  case "registerToolRenderers":
931
1206
  if (!opts || typeof opts !== "object") {
932
1207
  console.error("[Crow] registerToolRenderers() requires an object");
@@ -1249,6 +1524,9 @@ function useWidgetStyles({
1249
1524
  const [dbStyles, setDbStyles] = React3.useState(
1250
1525
  styleCache.get(key)?.widgetStyles
1251
1526
  );
1527
+ const [initialSuggestions, setInitialSuggestions] = React3.useState(
1528
+ styleCache.get(key)?.initialSuggestions || []
1529
+ );
1252
1530
  const [agentName, setAgentName] = React3.useState(
1253
1531
  styleCache.get(key)?.agentName || "Assistant"
1254
1532
  );
@@ -1288,6 +1566,7 @@ function useWidgetStyles({
1288
1566
  setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);
1289
1567
  setWelcomeMessage(config.welcomeMessage ?? void 0);
1290
1568
  setSelectedModel(config.model ?? void 0);
1569
+ setInitialSuggestions(config.initialSuggestions || []);
1291
1570
  } catch (err) {
1292
1571
  console.error("[CrowWidget] Failed to fetch styles:", err);
1293
1572
  setError(err instanceof Error ? err : new Error(String(err)));
@@ -1325,6 +1604,7 @@ function useWidgetStyles({
1325
1604
  persistAnonymousConversations,
1326
1605
  welcomeMessage,
1327
1606
  selectedModel,
1607
+ initialSuggestions,
1328
1608
  refetch: fetchStyles
1329
1609
  };
1330
1610
  }
@@ -1880,11 +2160,12 @@ function ReasoningTrace({
1880
2160
  toolCalls = [],
1881
2161
  isWaiting = false,
1882
2162
  showDetails = true,
1883
- toolRenderers
2163
+ toolRenderers,
2164
+ onToolConsent
1884
2165
  }) {
1885
2166
  const hasThinking = !!thinking && thinking.trim().length > 0;
1886
2167
  const hasToolCalls = toolCalls.length > 0;
1887
- const isActive = isWaiting || hasThinking && !isComplete || toolCalls.some((t) => t.status === "executing");
2168
+ const isActive = isWaiting || hasThinking && !isComplete || toolCalls.some((t) => t.status === "executing" || t.status === "awaiting_consent");
1888
2169
  if (!isWaiting && !hasThinking && !hasToolCalls) return null;
1889
2170
  if (!showDetails) {
1890
2171
  if (!isActive) return null;
@@ -1897,7 +2178,8 @@ function ReasoningTrace({
1897
2178
  ToolCallBlock,
1898
2179
  {
1899
2180
  toolCall: tool,
1900
- toolRenderers
2181
+ toolRenderers,
2182
+ onToolConsent
1901
2183
  },
1902
2184
  tool.id
1903
2185
  ))
@@ -1999,40 +2281,70 @@ function RenderedToolResult({ renderer, result, status }) {
1999
2281
  }
2000
2282
  function ToolCallBlock({
2001
2283
  toolCall,
2002
- toolRenderers
2284
+ toolRenderers,
2285
+ onToolConsent
2003
2286
  }) {
2004
2287
  const [expanded, setExpanded] = React3.useState(false);
2005
2288
  const hasArgs = Object.keys(toolCall.arguments || {}).length > 0;
2006
2289
  const isExecuting = toolCall.status === "executing";
2007
2290
  const isComplete = toolCall.status === "complete";
2008
2291
  const isError = toolCall.status === "error";
2292
+ const isAwaitingConsent = toolCall.status === "awaiting_consent";
2293
+ const isDenied = toolCall.status === "denied";
2009
2294
  const customRenderer = toolRenderers?.[toolCall.name];
2010
2295
  const hasCustomRender = isComplete && customRenderer && toolCall.result != null;
2011
2296
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-flex crow-flex-col crow-gap-1 crow-text-xs", children: [
2012
2297
  /* @__PURE__ */ jsxRuntime.jsxs(
2013
- "button",
2298
+ "div",
2014
2299
  {
2015
- onClick: () => hasArgs && setExpanded(!expanded),
2016
- className: `crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${hasArgs ? "crow-cursor-pointer hover:crow-text-gray-800" : "crow-cursor-default"} ${isExecuting ? "crow-text-gray-500" : "crow-text-gray-600"}`,
2017
- disabled: !hasArgs,
2300
+ className: `crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${isExecuting || isAwaitingConsent ? "crow-text-gray-500" : "crow-text-gray-600"}`,
2018
2301
  children: [
2019
- hasArgs && /* @__PURE__ */ jsxRuntime.jsx(
2020
- framerMotion.motion.div,
2302
+ hasArgs && !isAwaitingConsent && /* @__PURE__ */ jsxRuntime.jsx(
2303
+ "button",
2021
2304
  {
2022
- animate: { rotate: expanded ? 90 : 0 },
2023
- transition: { duration: 0.15 },
2024
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "crow-w-3 crow-h-3" })
2305
+ onClick: () => setExpanded(!expanded),
2306
+ className: "crow-cursor-pointer hover:crow-text-gray-800",
2307
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2308
+ framerMotion.motion.div,
2309
+ {
2310
+ animate: { rotate: expanded ? 90 : 0 },
2311
+ transition: { duration: 0.15 },
2312
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "crow-w-3 crow-h-3" })
2313
+ }
2314
+ )
2025
2315
  }
2026
2316
  ),
2317
+ isAwaitingConsent && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "crow-w-3 crow-h-3 crow-animate-spin crow-text-amber-500" }),
2027
2318
  isExecuting && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "crow-w-3 crow-h-3 crow-animate-spin crow-text-blue-500" }),
2028
2319
  isComplete && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "crow-w-3 crow-h-3 crow-text-green-500" }),
2029
2320
  isError && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-w-3 crow-h-3 crow-text-red-500", children: "\u2715" }),
2321
+ isDenied && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-w-3 crow-h-3 crow-text-gray-400", children: "\u2715" }),
2030
2322
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-font-medium", children: toolCall.displayName || toolCall.name }),
2031
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "crow-text-gray-400", children: [
2032
- isExecuting && "running...",
2033
- isComplete && "done",
2034
- isError && "failed"
2035
- ] })
2323
+ isAwaitingConsent && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2324
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-amber-500", children: "needs permission" }),
2325
+ /* @__PURE__ */ jsxRuntime.jsx(
2326
+ "button",
2327
+ {
2328
+ onClick: () => onToolConsent?.(toolCall.id, true),
2329
+ className: "crow-px-2 crow-py-0.5 crow-rounded crow-text-xs crow-font-medium crow-text-white crow-cursor-pointer",
2330
+ style: { backgroundColor: "#2563eb" },
2331
+ children: "Allow"
2332
+ }
2333
+ ),
2334
+ /* @__PURE__ */ jsxRuntime.jsx(
2335
+ "button",
2336
+ {
2337
+ onClick: () => onToolConsent?.(toolCall.id, false),
2338
+ className: "crow-px-2 crow-py-0.5 crow-rounded crow-border crow-text-xs crow-font-medium crow-text-gray-500 crow-cursor-pointer",
2339
+ style: { borderColor: "#d1d5db", backgroundColor: "transparent" },
2340
+ children: "Deny"
2341
+ }
2342
+ )
2343
+ ] }),
2344
+ isExecuting && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-gray-400", children: "running..." }),
2345
+ isComplete && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-gray-400", children: "done" }),
2346
+ isError && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-gray-400", children: "failed" }),
2347
+ isDenied && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "crow-text-gray-400", children: "denied" })
2036
2348
  ]
2037
2349
  }
2038
2350
  ),
@@ -2054,7 +2366,8 @@ function MessageBubble({
2054
2366
  message,
2055
2367
  toolCalls = [],
2056
2368
  isLoading = false,
2057
- toolRenderers
2369
+ toolRenderers,
2370
+ onToolConsent
2058
2371
  }) {
2059
2372
  const styles = useWidgetStyles2();
2060
2373
  const showThinkingSetting = useShowThinking();
@@ -2078,7 +2391,8 @@ function MessageBubble({
2078
2391
  toolCalls,
2079
2392
  isWaiting: isWaiting && !hasThinking,
2080
2393
  showDetails: showThinkingSetting,
2081
- toolRenderers
2394
+ toolRenderers,
2395
+ onToolConsent
2082
2396
  }
2083
2397
  ),
2084
2398
  hasContent && /* @__PURE__ */ jsxRuntime.jsx(
@@ -2144,7 +2458,8 @@ function MessageList({
2144
2458
  activeToolCalls,
2145
2459
  isLoadingHistory,
2146
2460
  isGenerating = false,
2147
- toolRenderers
2461
+ toolRenderers,
2462
+ onToolConsent
2148
2463
  }) {
2149
2464
  if (isLoadingHistory) {
2150
2465
  return /* @__PURE__ */ jsxRuntime.jsx(LoadingHistory, {});
@@ -2162,7 +2477,8 @@ function MessageList({
2162
2477
  message: msg,
2163
2478
  toolCalls: toolCallsToShow,
2164
2479
  isLoading: isLastBot && isGenerating,
2165
- toolRenderers
2480
+ toolRenderers,
2481
+ onToolConsent
2166
2482
  },
2167
2483
  msg.id
2168
2484
  );
@@ -2832,6 +3148,26 @@ function BrowserUseQuestion({
2832
3148
  }
2833
3149
  ) });
2834
3150
  }
3151
+ function SuggestedActions({
3152
+ actions,
3153
+ onActionClick
3154
+ }) {
3155
+ const styles = useWidgetStyles2();
3156
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-flex crow-flex-wrap crow-gap-2 crow-px-1 crow-pb-2", children: actions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
3157
+ "button",
3158
+ {
3159
+ onClick: () => onActionClick(action),
3160
+ className: "crow-rounded-full crow-border crow-px-3 crow-py-1.5 crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80 crow-cursor-pointer",
3161
+ style: {
3162
+ borderColor: styles.colors.primary,
3163
+ color: styles.colors.primary,
3164
+ background: "transparent"
3165
+ },
3166
+ children: action.label
3167
+ },
3168
+ idx
3169
+ )) });
3170
+ }
2835
3171
 
2836
3172
  // src/styles/cssVars.ts
2837
3173
  var CSS_VAR_NAMES = {
@@ -2960,7 +3296,7 @@ function injectCopilotBodyStyles() {
2960
3296
  }
2961
3297
  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: }
2962
3298
 
2963
- /*! 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-1\\.5{margin-top:.375rem;margin-bottom:.375rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-0{margin-bottom:0}.crow-mb-0\\.5{margin-bottom:.125rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-1\\.5{margin-bottom:.375rem}.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-1\\.5{margin-top:.375rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-block{display:block}.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-min-h-\\[40px\\]{min-height:40px}.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-items-stretch{align-items:stretch}.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-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.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-0\\.5{padding:.125rem}.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-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.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-pt-3{padding-top:.75rem}.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-\\[13px\\]{font-size:13px}.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-leading-tight{line-height:1.25}.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-40{opacity:.4}.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}}.crow-copilot-toggle{position:fixed;top:50%;transform:translateY(-50%);z-index:999998;width:24px;height:64px;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid #e5e7eb;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(0,0,0,.1)}.crow-copilot-toggle:hover{background:#f9fafb;box-shadow:0 4px 12px rgba(0,0,0,.15)}.crow-copilot-toggle-right{right:0;border-radius:8px 0 0 8px;border-right:none}.crow-copilot-toggle-left{left:0;border-radius:0 8px 8px 0;border-left:none}.crow-copilot-toggle.open.crow-copilot-toggle-right{right:var(--crow-copilot-width,400px)}.crow-copilot-toggle.open.crow-copilot-toggle-left{left:var(--crow-copilot-width,400px)}.crow-copilot-toggle svg{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.crow-copilot-toggle:hover svg{color:#374151}.crow-copilot-sidebar{position:fixed;top:0;bottom:0;z-index:999997;background:#fff;box-shadow:-4px 0 20px rgba(0,0,0,.1);transition:transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden}.crow-copilot-sidebar-right{right:0;border-left:1px solid #e5e7eb}.crow-copilot-sidebar-left{left:0;border-right:1px solid #e5e7eb}.crow-copilot-sidebar.closed.crow-copilot-sidebar-right{transform:translateX(100%)}.crow-copilot-sidebar.closed.crow-copilot-sidebar-left{transform:translateX(-100%)}body.crow-copilot-open-right{margin-right:var(--crow-copilot-width,400px)!important;transition:margin .3s cubic-bezier(.4,0,.2,1)}body.crow-copilot-open-left{margin-left:var(--crow-copilot-width,400px)!important}body,body.crow-copilot-open-left{transition:margin .3s cubic-bezier(.4,0,.2,1)}.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-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/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-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/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}`;
3299
+ /*! 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-1\\.5{margin-top:.375rem;margin-bottom:.375rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-0{margin-bottom:0}.crow-mb-0\\.5{margin-bottom:.125rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-1\\.5{margin-bottom:.375rem}.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-1\\.5{margin-top:.375rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-block{display:block}.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-min-h-\\[40px\\]{min-height:40px}.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-flex-wrap{flex-wrap:wrap}.crow-items-start{align-items:flex-start}.crow-items-end{align-items:flex-end}.crow-items-center{align-items:center}.crow-items-stretch{align-items:stretch}.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-auto{overflow:auto}.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-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.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-0\\.5{padding:.125rem}.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-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.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-pt-3{padding-top:.75rem}.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-\\[13px\\]{font-size:13px}.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-leading-tight{line-height:1.25}.crow-tracking-wide{letter-spacing:.025em}.crow-text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.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-40{opacity:.4}.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}}.crow-copilot-toggle{position:fixed;top:50%;transform:translateY(-50%);z-index:999998;width:24px;height:64px;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid #e5e7eb;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(0,0,0,.1)}.crow-copilot-toggle:hover{background:#f9fafb;box-shadow:0 4px 12px rgba(0,0,0,.15)}.crow-copilot-toggle-right{right:0;border-radius:8px 0 0 8px;border-right:none}.crow-copilot-toggle-left{left:0;border-radius:0 8px 8px 0;border-left:none}.crow-copilot-toggle.open.crow-copilot-toggle-right{right:var(--crow-copilot-width,400px)}.crow-copilot-toggle.open.crow-copilot-toggle-left{left:var(--crow-copilot-width,400px)}.crow-copilot-toggle svg{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.crow-copilot-toggle:hover svg{color:#374151}.crow-copilot-sidebar{position:fixed;top:0;bottom:0;z-index:999997;background:#fff;box-shadow:-4px 0 20px rgba(0,0,0,.1);transition:transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden}.crow-copilot-sidebar-right{right:0;border-left:1px solid #e5e7eb}.crow-copilot-sidebar-left{left:0;border-right:1px solid #e5e7eb}.crow-copilot-sidebar.closed.crow-copilot-sidebar-right{transform:translateX(100%)}.crow-copilot-sidebar.closed.crow-copilot-sidebar-left{transform:translateX(-100%)}body.crow-copilot-open-right{margin-right:var(--crow-copilot-width,400px)!important;transition:margin .3s cubic-bezier(.4,0,.2,1)}body.crow-copilot-open-left{margin-left:var(--crow-copilot-width,400px)!important}body,body.crow-copilot-open-left{transition:margin .3s cubic-bezier(.4,0,.2,1)}.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-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/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-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/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}`;
2964
3300
  var injected = false;
2965
3301
  function injectStyles(target = document) {
2966
3302
  if (target === document && injected) return;
@@ -3011,7 +3347,8 @@ function CrowWidget({
3011
3347
  showThinking: showThinkingFromAPI,
3012
3348
  persistAnonymousConversations,
3013
3349
  welcomeMessage: welcomeMessageFromAPI,
3014
- selectedModel: selectedModelFromAPI
3350
+ selectedModel: selectedModelFromAPI,
3351
+ initialSuggestions
3015
3352
  } = useWidgetStyles({
3016
3353
  productId,
3017
3354
  apiUrl,
@@ -3117,6 +3454,11 @@ function CrowWidget({
3117
3454
  setShouldRestoreHistory(true);
3118
3455
  }
3119
3456
  });
3457
+ React3.useEffect(() => {
3458
+ if (initialSuggestions.length > 0 && chat.suggestedActions.length === 0) {
3459
+ chat.setSuggestedActions(initialSuggestions);
3460
+ }
3461
+ }, [initialSuggestions]);
3120
3462
  React3.useEffect(() => {
3121
3463
  if (shouldRestoreHistory && chat.conversationId && !hasRestoredHistoryRef.current) {
3122
3464
  hasRestoredHistoryRef.current = true;
@@ -3348,14 +3690,52 @@ function CrowWidget({
3348
3690
  const handleExitWorkflow = async () => {
3349
3691
  await workflowActions.exitWorkflow();
3350
3692
  };
3693
+ const handleToolConsent = async (toolCallId, approved) => {
3694
+ const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId) || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);
3695
+ if (!toolCall) return;
3696
+ if (approved) {
3697
+ chat.updateToolCallStatus(toolCallId, "executing");
3698
+ if (submitToolResultRef.current) {
3699
+ await submitToolResultRef.current(
3700
+ toolCallId,
3701
+ toolCall.name,
3702
+ { consent_approved: true, tool_arguments: toolCall.arguments || {} }
3703
+ );
3704
+ }
3705
+ } else {
3706
+ chat.updateToolCallStatus(toolCallId, "denied");
3707
+ if (submitToolResultRef.current) {
3708
+ await submitToolResultRef.current(
3709
+ toolCallId,
3710
+ toolCall.name,
3711
+ { status: "denied", error: "User denied permission to execute this tool." }
3712
+ );
3713
+ }
3714
+ }
3715
+ };
3716
+ const defaultSuggestedActionsRef = React3.useRef([]);
3351
3717
  React3.useEffect(() => {
3352
3718
  const handleOpen = () => setIsCollapsed(false);
3353
3719
  const handleClose = () => setIsCollapsed(true);
3720
+ const handleSetSuggestions = (e) => {
3721
+ const actions = e.detail;
3722
+ if (Array.isArray(actions)) {
3723
+ defaultSuggestedActionsRef.current = actions;
3724
+ chat.setSuggestedActions(actions);
3725
+ }
3726
+ };
3354
3727
  window.addEventListener("crow:open", handleOpen);
3355
3728
  window.addEventListener("crow:close", handleClose);
3729
+ window.addEventListener("crow:setSuggestedActions", handleSetSuggestions);
3730
+ const pending = window.__crow_suggested_actions;
3731
+ if (Array.isArray(pending) && pending.length > 0) {
3732
+ defaultSuggestedActionsRef.current = pending;
3733
+ chat.setSuggestedActions(pending);
3734
+ }
3356
3735
  return () => {
3357
3736
  window.removeEventListener("crow:open", handleOpen);
3358
3737
  window.removeEventListener("crow:close", handleClose);
3738
+ window.removeEventListener("crow:setSuggestedActions", handleSetSuggestions);
3359
3739
  };
3360
3740
  }, []);
3361
3741
  const handleBubbleClick = () => {
@@ -3395,7 +3775,8 @@ function CrowWidget({
3395
3775
  activeToolCalls: chat.activeToolCalls,
3396
3776
  isLoadingHistory: conversations.isLoadingHistory,
3397
3777
  isGenerating: chat.isLoading,
3398
- toolRenderers: effectiveToolRenderers
3778
+ toolRenderers: effectiveToolRenderers,
3779
+ onToolConsent: handleToolConsent
3399
3780
  }
3400
3781
  ),
3401
3782
  pendingConfirmation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -3415,6 +3796,13 @@ function CrowWidget({
3415
3796
  ) })
3416
3797
  ] }) }),
3417
3798
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "crow-mt-auto crow-w-full", children: [
3799
+ (chat.suggestedActions.length > 0 || !chat.isLoading && defaultSuggestedActionsRef.current.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
3800
+ SuggestedActions,
3801
+ {
3802
+ actions: chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current,
3803
+ onActionClick: (action) => handleSend(action.message)
3804
+ }
3805
+ ),
3418
3806
  /* @__PURE__ */ jsxRuntime.jsx(PoweredByBadge, { apiUrl }),
3419
3807
  /* @__PURE__ */ jsxRuntime.jsx(
3420
3808
  PromptInputBox,
@@ -3872,14 +4260,29 @@ function CrowCopilot({
3872
4260
  setIsCollapsed(false);
3873
4261
  }
3874
4262
  }, [isCollapsed]);
4263
+ const defaultSuggestedActionsRef = React3.useRef([]);
3875
4264
  React3.useEffect(() => {
3876
4265
  const handleOpen = () => setIsCollapsed(false);
3877
4266
  const handleClose = () => setIsCollapsed(true);
4267
+ const handleSetSuggestions = (e) => {
4268
+ const actions = e.detail;
4269
+ if (Array.isArray(actions)) {
4270
+ defaultSuggestedActionsRef.current = actions;
4271
+ chat.setSuggestedActions(actions);
4272
+ }
4273
+ };
3878
4274
  window.addEventListener("crow:open", handleOpen);
3879
4275
  window.addEventListener("crow:close", handleClose);
4276
+ window.addEventListener("crow:setSuggestedActions", handleSetSuggestions);
4277
+ const pending = window.__crow_suggested_actions;
4278
+ if (Array.isArray(pending) && pending.length > 0) {
4279
+ defaultSuggestedActionsRef.current = pending;
4280
+ chat.setSuggestedActions(pending);
4281
+ }
3880
4282
  return () => {
3881
4283
  window.removeEventListener("crow:open", handleOpen);
3882
4284
  window.removeEventListener("crow:close", handleClose);
4285
+ window.removeEventListener("crow:setSuggestedActions", handleSetSuggestions);
3883
4286
  };
3884
4287
  }, []);
3885
4288
  const messagesContainerRef = React3.useRef(null);
@@ -4112,6 +4515,29 @@ function CrowCopilot({
4112
4515
  const handleExitWorkflow = async () => {
4113
4516
  await exitWorkflow();
4114
4517
  };
4518
+ const handleToolConsent = async (toolCallId, approved) => {
4519
+ const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId) || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);
4520
+ if (!toolCall) return;
4521
+ if (approved) {
4522
+ chat.updateToolCallStatus(toolCallId, "executing");
4523
+ if (submitToolResultRef.current) {
4524
+ await submitToolResultRef.current(
4525
+ toolCallId,
4526
+ toolCall.name,
4527
+ { consent_approved: true, tool_arguments: toolCall.arguments || {} }
4528
+ );
4529
+ }
4530
+ } else {
4531
+ chat.updateToolCallStatus(toolCallId, "denied");
4532
+ if (submitToolResultRef.current) {
4533
+ await submitToolResultRef.current(
4534
+ toolCallId,
4535
+ toolCall.name,
4536
+ { status: "denied", error: "User denied permission to execute this tool." }
4537
+ );
4538
+ }
4539
+ }
4540
+ };
4115
4541
  React3.useEffect(() => {
4116
4542
  window.__crow_browser_callbacks = {
4117
4543
  onConfirmation: handleBrowserConfirmation,
@@ -4510,7 +4936,8 @@ function CrowCopilot({
4510
4936
  activeToolCalls: chat.activeToolCalls,
4511
4937
  isLoadingHistory: conversations.isLoadingHistory,
4512
4938
  isGenerating: chat.isLoading,
4513
- toolRenderers: effectiveToolRenderers
4939
+ toolRenderers: effectiveToolRenderers,
4940
+ onToolConsent: handleToolConsent
4514
4941
  }
4515
4942
  ),
4516
4943
  pendingConfirmation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -4545,6 +4972,13 @@ function CrowCopilot({
4545
4972
  className: "crow-p-3 crow-border-t",
4546
4973
  style: { borderColor: styles.colors.border },
4547
4974
  children: [
4975
+ (chat.suggestedActions.length > 0 || !chat.isLoading && defaultSuggestedActionsRef.current.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(
4976
+ SuggestedActions,
4977
+ {
4978
+ actions: chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current,
4979
+ onActionClick: (action) => handleSend(action.message)
4980
+ }
4981
+ ),
4548
4982
  styles.branding.showPoweredBy && /* @__PURE__ */ jsxRuntime.jsx(PoweredByBadge, { apiUrl }),
4549
4983
  /* @__PURE__ */ jsxRuntime.jsx(
4550
4984
  PromptInputBox,