@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.js CHANGED
@@ -64,6 +64,7 @@ function useChat({
64
64
  const [activeToolCalls, setActiveToolCalls] = useState([]);
65
65
  const [conversationId, setConversationId] = useState(null);
66
66
  const [selectedModel, setSelectedModel] = useState(initialSelectedModel);
67
+ const [suggestedActions, setSuggestedActions] = useState([]);
67
68
  const abortControllerRef = useRef(null);
68
69
  const hasCheckedPersistRef = useRef(false);
69
70
  const streamingToolCallsRef = useRef([]);
@@ -324,7 +325,7 @@ function useChat({
324
325
  arguments: parsed.arguments
325
326
  });
326
327
  const clientToolCall = {
327
- id: `tool-${Date.now()}`,
328
+ id: parsed.tool_call_id || `tool-${Date.now()}`,
328
329
  name: parsed.tool_name,
329
330
  displayName: parsed.display_name || void 0,
330
331
  arguments: parsed.arguments || {},
@@ -339,6 +340,47 @@ function useChat({
339
340
  arguments: parsed.arguments
340
341
  });
341
342
  break;
343
+ case "tool_consent_required":
344
+ onToolCall?.({
345
+ type: "consent_required",
346
+ toolName: parsed.tool_name,
347
+ arguments: parsed.arguments
348
+ });
349
+ {
350
+ const existingIdx = streamingToolCallsRef.current.findIndex(
351
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing"
352
+ );
353
+ if (existingIdx >= 0) {
354
+ const existing = streamingToolCallsRef.current[existingIdx];
355
+ const updatedTc = {
356
+ ...existing,
357
+ status: "awaiting_consent",
358
+ requiresConsent: true,
359
+ serverSideExecution: true,
360
+ arguments: parsed.arguments || existing.arguments
361
+ };
362
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
363
+ (tc, i) => i === existingIdx ? updatedTc : tc
364
+ );
365
+ setActiveToolCalls(
366
+ (prev) => prev.map((tc) => tc.id === existing.id ? updatedTc : tc)
367
+ );
368
+ } else {
369
+ const consentToolCall = {
370
+ id: `consent-${Date.now()}`,
371
+ name: parsed.tool_name,
372
+ displayName: parsed.display_name || void 0,
373
+ arguments: parsed.arguments || {},
374
+ status: "awaiting_consent",
375
+ requiresConsent: true,
376
+ serverSideExecution: true,
377
+ timestamp: /* @__PURE__ */ new Date()
378
+ };
379
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentToolCall];
380
+ setActiveToolCalls((prev) => [...prev, consentToolCall]);
381
+ }
382
+ }
383
+ break;
342
384
  case "workflow_started":
343
385
  onWorkflowEvent?.({
344
386
  type: "started",
@@ -359,6 +401,11 @@ function useChat({
359
401
  case "workflow_complete_prompt":
360
402
  onWorkflowEvent?.({ type: "complete_prompt" });
361
403
  break;
404
+ case "suggested_actions":
405
+ if (parsed.actions && Array.isArray(parsed.actions)) {
406
+ setSuggestedActions(parsed.actions);
407
+ }
408
+ break;
362
409
  }
363
410
  } catch (e) {
364
411
  console.error("[Crow] Parse error:", e);
@@ -400,6 +447,7 @@ function useChat({
400
447
  }
401
448
  setActiveToolCalls([]);
402
449
  streamingToolCallsRef.current = [];
450
+ setSuggestedActions([]);
403
451
  const userMsgId = generateMessageId("user");
404
452
  const botMsgId = generateMessageId("bot");
405
453
  setMessages((prev) => [
@@ -507,6 +555,22 @@ function useChat({
507
555
  const data = line.slice(6).trim();
508
556
  if (data === "[DONE]") {
509
557
  setIsLoading(false);
558
+ const finalToolCalls = [...streamingToolCallsRef.current];
559
+ if (finalToolCalls.length > 0) {
560
+ setMessages(
561
+ (prev) => prev.map(
562
+ (msg) => msg.id === botMsgId ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true } : msg
563
+ )
564
+ );
565
+ } else {
566
+ setMessages(
567
+ (prev) => prev.map(
568
+ (msg) => msg.id === botMsgId ? { ...msg, thinkingComplete: true } : msg
569
+ )
570
+ );
571
+ }
572
+ setActiveToolCalls([]);
573
+ streamingToolCallsRef.current = [];
510
574
  for (const tool of pendingClientTools) {
511
575
  onToolCall?.({
512
576
  type: "client_call",
@@ -519,19 +583,196 @@ function useChat({
519
583
  }
520
584
  try {
521
585
  const parsed = JSON.parse(data);
522
- if (parsed.type === "content") {
523
- accumulatedText += parsed.content;
524
- setMessages(
525
- (prev) => prev.map(
526
- (msg) => msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg
527
- )
528
- );
529
- } else if (parsed.type === "client_tool_call") {
530
- pendingClientTools.push({
531
- toolName: parsed.tool_name,
532
- toolCallId: parsed.tool_call_id,
533
- arguments: parsed.arguments
534
- });
586
+ switch (parsed.type) {
587
+ case "content":
588
+ accumulatedText += parsed.content;
589
+ setMessages(
590
+ (prev) => prev.map(
591
+ (msg) => msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg
592
+ )
593
+ );
594
+ break;
595
+ case "thinking":
596
+ if (parsed.status === "complete") {
597
+ setMessages(
598
+ (prev) => prev.map(
599
+ (msg) => msg.id === botMsgId ? { ...msg, thinkingComplete: true } : msg
600
+ )
601
+ );
602
+ }
603
+ break;
604
+ case "thinking_token":
605
+ if (parsed.content) {
606
+ setMessages(
607
+ (prev) => prev.map(
608
+ (msg) => msg.id === botMsgId ? { ...msg, thinking: (msg.thinking || "") + parsed.content } : msg
609
+ )
610
+ );
611
+ }
612
+ break;
613
+ case "citations":
614
+ if (parsed.citations) {
615
+ setMessages(
616
+ (prev) => prev.map(
617
+ (msg) => msg.id === botMsgId ? { ...msg, citations: parsed.citations } : msg
618
+ )
619
+ );
620
+ }
621
+ break;
622
+ case "tool_call_start":
623
+ onToolCall?.({
624
+ type: "start",
625
+ toolName: parsed.tool_name,
626
+ arguments: parsed.arguments
627
+ });
628
+ {
629
+ const newTc = {
630
+ id: `tool-${Date.now()}`,
631
+ name: parsed.tool_name,
632
+ displayName: parsed.display_name || void 0,
633
+ arguments: parsed.arguments || {},
634
+ status: "executing",
635
+ timestamp: /* @__PURE__ */ new Date()
636
+ };
637
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, newTc];
638
+ setActiveToolCalls((prev) => [...prev, newTc]);
639
+ }
640
+ break;
641
+ case "tool_call_complete":
642
+ onToolCall?.({
643
+ type: "complete",
644
+ toolName: parsed.tool_name,
645
+ success: parsed.success
646
+ });
647
+ {
648
+ const completeStatus = parsed.success ? "complete" : "error";
649
+ let tcUpdated = false;
650
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {
651
+ if (!tcUpdated && tool.name === parsed.tool_name && tool.status === "executing") {
652
+ tcUpdated = true;
653
+ return { ...tool, status: completeStatus };
654
+ }
655
+ return tool;
656
+ });
657
+ setActiveToolCalls((prev) => {
658
+ let updated = false;
659
+ return prev.map((tool) => {
660
+ if (!updated && tool.name === parsed.tool_name && tool.status === "executing") {
661
+ updated = true;
662
+ return { ...tool, status: completeStatus };
663
+ }
664
+ return tool;
665
+ });
666
+ });
667
+ setMessages(
668
+ (prev) => prev.map(
669
+ (msg) => msg.toolCalls ? {
670
+ ...msg,
671
+ toolCalls: msg.toolCalls.map(
672
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing" ? { ...tc, status: completeStatus } : tc
673
+ )
674
+ } : msg
675
+ )
676
+ );
677
+ }
678
+ break;
679
+ case "tool_result":
680
+ if (parsed.tool_name && parsed.result) {
681
+ onToolResult?.(parsed.tool_name, parsed.result);
682
+ let resultUpdated = false;
683
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {
684
+ if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {
685
+ resultUpdated = true;
686
+ return { ...tool, result: parsed.result };
687
+ }
688
+ return tool;
689
+ });
690
+ setActiveToolCalls((prev) => {
691
+ let updated = false;
692
+ return prev.map((tool) => {
693
+ if (!updated && tool.name === parsed.tool_name && !tool.result) {
694
+ updated = true;
695
+ return { ...tool, result: parsed.result };
696
+ }
697
+ return tool;
698
+ });
699
+ });
700
+ setMessages(
701
+ (prev) => prev.map(
702
+ (msg) => msg.toolCalls ? {
703
+ ...msg,
704
+ toolCalls: msg.toolCalls.map(
705
+ (tc) => tc.name === parsed.tool_name && !tc.result ? { ...tc, result: parsed.result } : tc
706
+ )
707
+ } : msg
708
+ )
709
+ );
710
+ }
711
+ break;
712
+ case "tool_result_links":
713
+ if (parsed.links && Array.isArray(parsed.links)) {
714
+ setMessages(
715
+ (prev) => prev.map(
716
+ (msg) => msg.id === botMsgId ? { ...msg, links: [...msg.links || [], ...parsed.links] } : msg
717
+ )
718
+ );
719
+ }
720
+ break;
721
+ case "client_tool_call":
722
+ {
723
+ const toolCallEntry = {
724
+ id: parsed.tool_call_id || `tool-${Date.now()}`,
725
+ name: parsed.tool_name,
726
+ displayName: parsed.display_name || void 0,
727
+ arguments: parsed.arguments || {},
728
+ status: "executing",
729
+ timestamp: /* @__PURE__ */ new Date()
730
+ };
731
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, toolCallEntry];
732
+ setActiveToolCalls((prev) => [...prev, toolCallEntry]);
733
+ pendingClientTools.push({
734
+ toolName: parsed.tool_name,
735
+ toolCallId: parsed.tool_call_id,
736
+ arguments: parsed.arguments
737
+ });
738
+ }
739
+ break;
740
+ case "tool_consent_required":
741
+ {
742
+ const existingIdx2 = streamingToolCallsRef.current.findIndex(
743
+ (tc) => tc.name === parsed.tool_name && tc.status === "executing"
744
+ );
745
+ if (existingIdx2 >= 0) {
746
+ const existing2 = streamingToolCallsRef.current[existingIdx2];
747
+ const updated2 = {
748
+ ...existing2,
749
+ status: "awaiting_consent",
750
+ requiresConsent: true,
751
+ serverSideExecution: true,
752
+ arguments: parsed.arguments || existing2.arguments
753
+ };
754
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
755
+ (tc, i) => i === existingIdx2 ? updated2 : tc
756
+ );
757
+ setActiveToolCalls(
758
+ (prev) => prev.map((tc) => tc.id === existing2.id ? updated2 : tc)
759
+ );
760
+ } else {
761
+ const consentEntry = {
762
+ id: `consent-${Date.now()}`,
763
+ name: parsed.tool_name,
764
+ displayName: parsed.display_name || void 0,
765
+ arguments: parsed.arguments || {},
766
+ status: "awaiting_consent",
767
+ requiresConsent: true,
768
+ serverSideExecution: true,
769
+ timestamp: /* @__PURE__ */ new Date()
770
+ };
771
+ streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry];
772
+ setActiveToolCalls((prev) => [...prev, consentEntry]);
773
+ }
774
+ }
775
+ break;
535
776
  }
536
777
  } catch (e) {
537
778
  console.error("[Crow] Parse error in tool result response:", e);
@@ -584,12 +825,35 @@ function useChat({
584
825
  },
585
826
  [apiUrl, productId, conversationId]
586
827
  );
828
+ const updateToolCallStatus = useCallback(
829
+ (toolCallId, status) => {
830
+ setActiveToolCalls(
831
+ (prev) => prev.map((tc) => tc.id === toolCallId ? { ...tc, status } : tc)
832
+ );
833
+ streamingToolCallsRef.current = streamingToolCallsRef.current.map(
834
+ (tc) => tc.id === toolCallId ? { ...tc, status } : tc
835
+ );
836
+ setMessages(
837
+ (prev) => prev.map(
838
+ (msg) => msg.toolCalls ? {
839
+ ...msg,
840
+ toolCalls: msg.toolCalls.map(
841
+ (tc) => tc.id === toolCallId ? { ...tc, status } : tc
842
+ )
843
+ } : msg
844
+ )
845
+ );
846
+ },
847
+ []
848
+ );
587
849
  return {
588
850
  messages,
589
851
  isLoading,
590
852
  activeToolCalls,
591
853
  conversationId,
592
854
  selectedModel,
855
+ suggestedActions,
856
+ setSuggestedActions,
593
857
  setSelectedModel,
594
858
  setConversationId,
595
859
  sendMessage,
@@ -597,7 +861,8 @@ function useChat({
597
861
  resetMessages,
598
862
  loadMessages,
599
863
  submitToolResult,
600
- addMessage
864
+ addMessage,
865
+ updateToolCallStatus
601
866
  };
602
867
  }
603
868
  function useConversations({ productId, apiUrl = "" }) {
@@ -901,6 +1166,16 @@ function useCrowAPI({ onIdentified, onReset } = {}) {
901
1166
  case "close":
902
1167
  window.dispatchEvent(new CustomEvent("crow:close"));
903
1168
  break;
1169
+ case "setSuggestedActions":
1170
+ if (!Array.isArray(options)) {
1171
+ console.error("[Crow] setSuggestedActions() requires an array of { label, message }");
1172
+ return;
1173
+ }
1174
+ window.__crow_suggested_actions = options;
1175
+ window.dispatchEvent(
1176
+ new CustomEvent("crow:setSuggestedActions", { detail: options })
1177
+ );
1178
+ break;
904
1179
  case "registerToolRenderers":
905
1180
  if (!opts || typeof opts !== "object") {
906
1181
  console.error("[Crow] registerToolRenderers() requires an object");
@@ -1223,6 +1498,9 @@ function useWidgetStyles({
1223
1498
  const [dbStyles, setDbStyles] = useState(
1224
1499
  styleCache.get(key)?.widgetStyles
1225
1500
  );
1501
+ const [initialSuggestions, setInitialSuggestions] = useState(
1502
+ styleCache.get(key)?.initialSuggestions || []
1503
+ );
1226
1504
  const [agentName, setAgentName] = useState(
1227
1505
  styleCache.get(key)?.agentName || "Assistant"
1228
1506
  );
@@ -1262,6 +1540,7 @@ function useWidgetStyles({
1262
1540
  setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);
1263
1541
  setWelcomeMessage(config.welcomeMessage ?? void 0);
1264
1542
  setSelectedModel(config.model ?? void 0);
1543
+ setInitialSuggestions(config.initialSuggestions || []);
1265
1544
  } catch (err) {
1266
1545
  console.error("[CrowWidget] Failed to fetch styles:", err);
1267
1546
  setError(err instanceof Error ? err : new Error(String(err)));
@@ -1299,6 +1578,7 @@ function useWidgetStyles({
1299
1578
  persistAnonymousConversations,
1300
1579
  welcomeMessage,
1301
1580
  selectedModel,
1581
+ initialSuggestions,
1302
1582
  refetch: fetchStyles
1303
1583
  };
1304
1584
  }
@@ -1854,11 +2134,12 @@ function ReasoningTrace({
1854
2134
  toolCalls = [],
1855
2135
  isWaiting = false,
1856
2136
  showDetails = true,
1857
- toolRenderers
2137
+ toolRenderers,
2138
+ onToolConsent
1858
2139
  }) {
1859
2140
  const hasThinking = !!thinking && thinking.trim().length > 0;
1860
2141
  const hasToolCalls = toolCalls.length > 0;
1861
- const isActive = isWaiting || hasThinking && !isComplete || toolCalls.some((t) => t.status === "executing");
2142
+ const isActive = isWaiting || hasThinking && !isComplete || toolCalls.some((t) => t.status === "executing" || t.status === "awaiting_consent");
1862
2143
  if (!isWaiting && !hasThinking && !hasToolCalls) return null;
1863
2144
  if (!showDetails) {
1864
2145
  if (!isActive) return null;
@@ -1871,7 +2152,8 @@ function ReasoningTrace({
1871
2152
  ToolCallBlock,
1872
2153
  {
1873
2154
  toolCall: tool,
1874
- toolRenderers
2155
+ toolRenderers,
2156
+ onToolConsent
1875
2157
  },
1876
2158
  tool.id
1877
2159
  ))
@@ -1973,40 +2255,70 @@ function RenderedToolResult({ renderer, result, status }) {
1973
2255
  }
1974
2256
  function ToolCallBlock({
1975
2257
  toolCall,
1976
- toolRenderers
2258
+ toolRenderers,
2259
+ onToolConsent
1977
2260
  }) {
1978
2261
  const [expanded, setExpanded] = useState(false);
1979
2262
  const hasArgs = Object.keys(toolCall.arguments || {}).length > 0;
1980
2263
  const isExecuting = toolCall.status === "executing";
1981
2264
  const isComplete = toolCall.status === "complete";
1982
2265
  const isError = toolCall.status === "error";
2266
+ const isAwaitingConsent = toolCall.status === "awaiting_consent";
2267
+ const isDenied = toolCall.status === "denied";
1983
2268
  const customRenderer = toolRenderers?.[toolCall.name];
1984
2269
  const hasCustomRender = isComplete && customRenderer && toolCall.result != null;
1985
2270
  return /* @__PURE__ */ jsxs("div", { className: "crow-flex crow-flex-col crow-gap-1 crow-text-xs", children: [
1986
2271
  /* @__PURE__ */ jsxs(
1987
- "button",
2272
+ "div",
1988
2273
  {
1989
- onClick: () => hasArgs && setExpanded(!expanded),
1990
- 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"}`,
1991
- disabled: !hasArgs,
2274
+ 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"}`,
1992
2275
  children: [
1993
- hasArgs && /* @__PURE__ */ jsx(
1994
- motion.div,
2276
+ hasArgs && !isAwaitingConsent && /* @__PURE__ */ jsx(
2277
+ "button",
1995
2278
  {
1996
- animate: { rotate: expanded ? 90 : 0 },
1997
- transition: { duration: 0.15 },
1998
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "crow-w-3 crow-h-3" })
2279
+ onClick: () => setExpanded(!expanded),
2280
+ className: "crow-cursor-pointer hover:crow-text-gray-800",
2281
+ children: /* @__PURE__ */ jsx(
2282
+ motion.div,
2283
+ {
2284
+ animate: { rotate: expanded ? 90 : 0 },
2285
+ transition: { duration: 0.15 },
2286
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "crow-w-3 crow-h-3" })
2287
+ }
2288
+ )
1999
2289
  }
2000
2290
  ),
2291
+ isAwaitingConsent && /* @__PURE__ */ jsx(Loader2, { className: "crow-w-3 crow-h-3 crow-animate-spin crow-text-amber-500" }),
2001
2292
  isExecuting && /* @__PURE__ */ jsx(Loader2, { className: "crow-w-3 crow-h-3 crow-animate-spin crow-text-blue-500" }),
2002
2293
  isComplete && /* @__PURE__ */ jsx(Check, { className: "crow-w-3 crow-h-3 crow-text-green-500" }),
2003
2294
  isError && /* @__PURE__ */ jsx("span", { className: "crow-w-3 crow-h-3 crow-text-red-500", children: "\u2715" }),
2295
+ isDenied && /* @__PURE__ */ jsx("span", { className: "crow-w-3 crow-h-3 crow-text-gray-400", children: "\u2715" }),
2004
2296
  /* @__PURE__ */ jsx("span", { className: "crow-font-medium", children: toolCall.displayName || toolCall.name }),
2005
- /* @__PURE__ */ jsxs("span", { className: "crow-text-gray-400", children: [
2006
- isExecuting && "running...",
2007
- isComplete && "done",
2008
- isError && "failed"
2009
- ] })
2297
+ isAwaitingConsent && /* @__PURE__ */ jsxs(Fragment, { children: [
2298
+ /* @__PURE__ */ jsx("span", { className: "crow-text-amber-500", children: "needs permission" }),
2299
+ /* @__PURE__ */ jsx(
2300
+ "button",
2301
+ {
2302
+ onClick: () => onToolConsent?.(toolCall.id, true),
2303
+ className: "crow-px-2 crow-py-0.5 crow-rounded crow-text-xs crow-font-medium crow-text-white crow-cursor-pointer",
2304
+ style: { backgroundColor: "#2563eb" },
2305
+ children: "Allow"
2306
+ }
2307
+ ),
2308
+ /* @__PURE__ */ jsx(
2309
+ "button",
2310
+ {
2311
+ onClick: () => onToolConsent?.(toolCall.id, false),
2312
+ 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",
2313
+ style: { borderColor: "#d1d5db", backgroundColor: "transparent" },
2314
+ children: "Deny"
2315
+ }
2316
+ )
2317
+ ] }),
2318
+ isExecuting && /* @__PURE__ */ jsx("span", { className: "crow-text-gray-400", children: "running..." }),
2319
+ isComplete && /* @__PURE__ */ jsx("span", { className: "crow-text-gray-400", children: "done" }),
2320
+ isError && /* @__PURE__ */ jsx("span", { className: "crow-text-gray-400", children: "failed" }),
2321
+ isDenied && /* @__PURE__ */ jsx("span", { className: "crow-text-gray-400", children: "denied" })
2010
2322
  ]
2011
2323
  }
2012
2324
  ),
@@ -2028,7 +2340,8 @@ function MessageBubble({
2028
2340
  message,
2029
2341
  toolCalls = [],
2030
2342
  isLoading = false,
2031
- toolRenderers
2343
+ toolRenderers,
2344
+ onToolConsent
2032
2345
  }) {
2033
2346
  const styles = useWidgetStyles2();
2034
2347
  const showThinkingSetting = useShowThinking();
@@ -2052,7 +2365,8 @@ function MessageBubble({
2052
2365
  toolCalls,
2053
2366
  isWaiting: isWaiting && !hasThinking,
2054
2367
  showDetails: showThinkingSetting,
2055
- toolRenderers
2368
+ toolRenderers,
2369
+ onToolConsent
2056
2370
  }
2057
2371
  ),
2058
2372
  hasContent && /* @__PURE__ */ jsx(
@@ -2118,7 +2432,8 @@ function MessageList({
2118
2432
  activeToolCalls,
2119
2433
  isLoadingHistory,
2120
2434
  isGenerating = false,
2121
- toolRenderers
2435
+ toolRenderers,
2436
+ onToolConsent
2122
2437
  }) {
2123
2438
  if (isLoadingHistory) {
2124
2439
  return /* @__PURE__ */ jsx(LoadingHistory, {});
@@ -2136,7 +2451,8 @@ function MessageList({
2136
2451
  message: msg,
2137
2452
  toolCalls: toolCallsToShow,
2138
2453
  isLoading: isLastBot && isGenerating,
2139
- toolRenderers
2454
+ toolRenderers,
2455
+ onToolConsent
2140
2456
  },
2141
2457
  msg.id
2142
2458
  );
@@ -2806,6 +3122,26 @@ function BrowserUseQuestion({
2806
3122
  }
2807
3123
  ) });
2808
3124
  }
3125
+ function SuggestedActions({
3126
+ actions,
3127
+ onActionClick
3128
+ }) {
3129
+ const styles = useWidgetStyles2();
3130
+ return /* @__PURE__ */ jsx("div", { className: "crow-flex crow-flex-wrap crow-gap-2 crow-px-1 crow-pb-2", children: actions.map((action, idx) => /* @__PURE__ */ jsx(
3131
+ "button",
3132
+ {
3133
+ onClick: () => onActionClick(action),
3134
+ 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",
3135
+ style: {
3136
+ borderColor: styles.colors.primary,
3137
+ color: styles.colors.primary,
3138
+ background: "transparent"
3139
+ },
3140
+ children: action.label
3141
+ },
3142
+ idx
3143
+ )) });
3144
+ }
2809
3145
 
2810
3146
  // src/styles/cssVars.ts
2811
3147
  var CSS_VAR_NAMES = {
@@ -2934,7 +3270,7 @@ function injectCopilotBodyStyles() {
2934
3270
  }
2935
3271
  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: }
2936
3272
 
2937
- /*! 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}`;
3273
+ /*! 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}`;
2938
3274
  var injected = false;
2939
3275
  function injectStyles(target = document) {
2940
3276
  if (target === document && injected) return;
@@ -2985,7 +3321,8 @@ function CrowWidget({
2985
3321
  showThinking: showThinkingFromAPI,
2986
3322
  persistAnonymousConversations,
2987
3323
  welcomeMessage: welcomeMessageFromAPI,
2988
- selectedModel: selectedModelFromAPI
3324
+ selectedModel: selectedModelFromAPI,
3325
+ initialSuggestions
2989
3326
  } = useWidgetStyles({
2990
3327
  productId,
2991
3328
  apiUrl,
@@ -3091,6 +3428,11 @@ function CrowWidget({
3091
3428
  setShouldRestoreHistory(true);
3092
3429
  }
3093
3430
  });
3431
+ useEffect(() => {
3432
+ if (initialSuggestions.length > 0 && chat.suggestedActions.length === 0) {
3433
+ chat.setSuggestedActions(initialSuggestions);
3434
+ }
3435
+ }, [initialSuggestions]);
3094
3436
  useEffect(() => {
3095
3437
  if (shouldRestoreHistory && chat.conversationId && !hasRestoredHistoryRef.current) {
3096
3438
  hasRestoredHistoryRef.current = true;
@@ -3322,14 +3664,52 @@ function CrowWidget({
3322
3664
  const handleExitWorkflow = async () => {
3323
3665
  await workflowActions.exitWorkflow();
3324
3666
  };
3667
+ const handleToolConsent = async (toolCallId, approved) => {
3668
+ const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId) || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);
3669
+ if (!toolCall) return;
3670
+ if (approved) {
3671
+ chat.updateToolCallStatus(toolCallId, "executing");
3672
+ if (submitToolResultRef.current) {
3673
+ await submitToolResultRef.current(
3674
+ toolCallId,
3675
+ toolCall.name,
3676
+ { consent_approved: true, tool_arguments: toolCall.arguments || {} }
3677
+ );
3678
+ }
3679
+ } else {
3680
+ chat.updateToolCallStatus(toolCallId, "denied");
3681
+ if (submitToolResultRef.current) {
3682
+ await submitToolResultRef.current(
3683
+ toolCallId,
3684
+ toolCall.name,
3685
+ { status: "denied", error: "User denied permission to execute this tool." }
3686
+ );
3687
+ }
3688
+ }
3689
+ };
3690
+ const defaultSuggestedActionsRef = useRef([]);
3325
3691
  useEffect(() => {
3326
3692
  const handleOpen = () => setIsCollapsed(false);
3327
3693
  const handleClose = () => setIsCollapsed(true);
3694
+ const handleSetSuggestions = (e) => {
3695
+ const actions = e.detail;
3696
+ if (Array.isArray(actions)) {
3697
+ defaultSuggestedActionsRef.current = actions;
3698
+ chat.setSuggestedActions(actions);
3699
+ }
3700
+ };
3328
3701
  window.addEventListener("crow:open", handleOpen);
3329
3702
  window.addEventListener("crow:close", handleClose);
3703
+ window.addEventListener("crow:setSuggestedActions", handleSetSuggestions);
3704
+ const pending = window.__crow_suggested_actions;
3705
+ if (Array.isArray(pending) && pending.length > 0) {
3706
+ defaultSuggestedActionsRef.current = pending;
3707
+ chat.setSuggestedActions(pending);
3708
+ }
3330
3709
  return () => {
3331
3710
  window.removeEventListener("crow:open", handleOpen);
3332
3711
  window.removeEventListener("crow:close", handleClose);
3712
+ window.removeEventListener("crow:setSuggestedActions", handleSetSuggestions);
3333
3713
  };
3334
3714
  }, []);
3335
3715
  const handleBubbleClick = () => {
@@ -3369,7 +3749,8 @@ function CrowWidget({
3369
3749
  activeToolCalls: chat.activeToolCalls,
3370
3750
  isLoadingHistory: conversations.isLoadingHistory,
3371
3751
  isGenerating: chat.isLoading,
3372
- toolRenderers: effectiveToolRenderers
3752
+ toolRenderers: effectiveToolRenderers,
3753
+ onToolConsent: handleToolConsent
3373
3754
  }
3374
3755
  ),
3375
3756
  pendingConfirmation && /* @__PURE__ */ jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsx(
@@ -3389,6 +3770,13 @@ function CrowWidget({
3389
3770
  ) })
3390
3771
  ] }) }),
3391
3772
  /* @__PURE__ */ jsxs("div", { className: "crow-mt-auto crow-w-full", children: [
3773
+ (chat.suggestedActions.length > 0 || !chat.isLoading && defaultSuggestedActionsRef.current.length > 0) && /* @__PURE__ */ jsx(
3774
+ SuggestedActions,
3775
+ {
3776
+ actions: chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current,
3777
+ onActionClick: (action) => handleSend(action.message)
3778
+ }
3779
+ ),
3392
3780
  /* @__PURE__ */ jsx(PoweredByBadge, { apiUrl }),
3393
3781
  /* @__PURE__ */ jsx(
3394
3782
  PromptInputBox,
@@ -3846,14 +4234,29 @@ function CrowCopilot({
3846
4234
  setIsCollapsed(false);
3847
4235
  }
3848
4236
  }, [isCollapsed]);
4237
+ const defaultSuggestedActionsRef = useRef([]);
3849
4238
  useEffect(() => {
3850
4239
  const handleOpen = () => setIsCollapsed(false);
3851
4240
  const handleClose = () => setIsCollapsed(true);
4241
+ const handleSetSuggestions = (e) => {
4242
+ const actions = e.detail;
4243
+ if (Array.isArray(actions)) {
4244
+ defaultSuggestedActionsRef.current = actions;
4245
+ chat.setSuggestedActions(actions);
4246
+ }
4247
+ };
3852
4248
  window.addEventListener("crow:open", handleOpen);
3853
4249
  window.addEventListener("crow:close", handleClose);
4250
+ window.addEventListener("crow:setSuggestedActions", handleSetSuggestions);
4251
+ const pending = window.__crow_suggested_actions;
4252
+ if (Array.isArray(pending) && pending.length > 0) {
4253
+ defaultSuggestedActionsRef.current = pending;
4254
+ chat.setSuggestedActions(pending);
4255
+ }
3854
4256
  return () => {
3855
4257
  window.removeEventListener("crow:open", handleOpen);
3856
4258
  window.removeEventListener("crow:close", handleClose);
4259
+ window.removeEventListener("crow:setSuggestedActions", handleSetSuggestions);
3857
4260
  };
3858
4261
  }, []);
3859
4262
  const messagesContainerRef = useRef(null);
@@ -4086,6 +4489,29 @@ function CrowCopilot({
4086
4489
  const handleExitWorkflow = async () => {
4087
4490
  await exitWorkflow();
4088
4491
  };
4492
+ const handleToolConsent = async (toolCallId, approved) => {
4493
+ const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId) || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);
4494
+ if (!toolCall) return;
4495
+ if (approved) {
4496
+ chat.updateToolCallStatus(toolCallId, "executing");
4497
+ if (submitToolResultRef.current) {
4498
+ await submitToolResultRef.current(
4499
+ toolCallId,
4500
+ toolCall.name,
4501
+ { consent_approved: true, tool_arguments: toolCall.arguments || {} }
4502
+ );
4503
+ }
4504
+ } else {
4505
+ chat.updateToolCallStatus(toolCallId, "denied");
4506
+ if (submitToolResultRef.current) {
4507
+ await submitToolResultRef.current(
4508
+ toolCallId,
4509
+ toolCall.name,
4510
+ { status: "denied", error: "User denied permission to execute this tool." }
4511
+ );
4512
+ }
4513
+ }
4514
+ };
4089
4515
  useEffect(() => {
4090
4516
  window.__crow_browser_callbacks = {
4091
4517
  onConfirmation: handleBrowserConfirmation,
@@ -4484,7 +4910,8 @@ function CrowCopilot({
4484
4910
  activeToolCalls: chat.activeToolCalls,
4485
4911
  isLoadingHistory: conversations.isLoadingHistory,
4486
4912
  isGenerating: chat.isLoading,
4487
- toolRenderers: effectiveToolRenderers
4913
+ toolRenderers: effectiveToolRenderers,
4914
+ onToolConsent: handleToolConsent
4488
4915
  }
4489
4916
  ),
4490
4917
  pendingConfirmation && /* @__PURE__ */ jsx("div", { className: "crow-px-4 crow-py-2", children: /* @__PURE__ */ jsx(
@@ -4519,6 +4946,13 @@ function CrowCopilot({
4519
4946
  className: "crow-p-3 crow-border-t",
4520
4947
  style: { borderColor: styles.colors.border },
4521
4948
  children: [
4949
+ (chat.suggestedActions.length > 0 || !chat.isLoading && defaultSuggestedActionsRef.current.length > 0) && /* @__PURE__ */ jsx(
4950
+ SuggestedActions,
4951
+ {
4952
+ actions: chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current,
4953
+ onActionClick: (action) => handleSend(action.message)
4954
+ }
4955
+ ),
4522
4956
  styles.branding.showPoweredBy && /* @__PURE__ */ jsx(PoweredByBadge, { apiUrl }),
4523
4957
  /* @__PURE__ */ jsx(
4524
4958
  PromptInputBox,