@frontera-sdk/chat-ui 1.50.78 → 1.50.80

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.
Files changed (46) hide show
  1. package/dist/agent-picker.js +6 -6
  2. package/dist/{capture-NO5ZIGP6.js → capture-G4CDPSBH.js} +1 -1
  3. package/dist/chat.d.ts +1 -1
  4. package/dist/chat.js +4594 -941
  5. package/dist/{chunk-V44YVBRX.js → chunk-2P4IEVOQ.js} +29 -12
  6. package/dist/{chunk-WMN6BPPS.js → chunk-4FRTPVJT.js} +2 -2
  7. package/dist/{chunk-UTKQ6G2A.js → chunk-5B25DNOG.js} +7 -7
  8. package/dist/{chunk-FTLVGUG5.js → chunk-7AT2LRVW.js} +2640 -153
  9. package/dist/{chunk-FNIHHKOZ.js → chunk-C2TZSGKK.js} +1374 -186
  10. package/dist/{chunk-BDJFVRYR.js → chunk-C3HW5S2Z.js} +57 -18
  11. package/dist/chunk-CWAOLMFS.js +32 -0
  12. package/dist/{chunk-26L3ST3H.js → chunk-EFFOOCIK.js} +5975 -639
  13. package/dist/{chunk-J7EWRXEC.js → chunk-EXPHCRFP.js} +3 -3
  14. package/dist/{chunk-PH7AYVSS.js → chunk-FLOAEPRU.js} +4 -4
  15. package/dist/chunk-LGVMMBL3.js +33 -0
  16. package/dist/{chunk-IQXJEZM7.js → chunk-LOBDKA2D.js} +328 -32
  17. package/dist/{chunk-FDGBZFGN.js → chunk-PKNEC4LJ.js} +528 -12
  18. package/dist/{chunk-TSKFBMGC.js → chunk-PUMRNN3R.js} +117 -66
  19. package/dist/{chunk-S3ECTKA3.js → chunk-QBV7MAFV.js} +30 -4
  20. package/dist/{chunk-F6PEZE7A.js → chunk-T5SANYSX.js} +3 -10
  21. package/dist/{chunk-AFVU5VT6.js → chunk-TUDJ35AB.js} +1071 -87
  22. package/dist/{chunk-ROJM44GB.js → chunk-UWKO24VT.js} +28 -2
  23. package/dist/{chunk-KHF7OM3F.js → chunk-UZ6RDWCT.js} +4 -4
  24. package/dist/chunk-X3QVICX7.js +32 -0
  25. package/dist/client.d.ts +3 -3
  26. package/dist/client.js +1 -1
  27. package/dist/header.d.ts +1 -1
  28. package/dist/header.js +15 -15
  29. package/dist/message.js +14 -15
  30. package/dist/new-session.d.ts +1 -1
  31. package/dist/new-session.js +7 -8
  32. package/dist/parts.js +6 -6
  33. package/dist/{pdf-deck-view-inner-AY4FYDAJ.js → pdf-deck-view-inner-KW6RIALH.js} +7 -8
  34. package/dist/{pdf-document-view-inner-NC5MBN7X.js → pdf-document-view-inner-AJEP5IJC.js} +6 -7
  35. package/dist/{pdf-viewer-inner-GPES3KG2.js → pdf-viewer-inner-CXWPRACH.js} +2 -2
  36. package/dist/pending-cards.js +7 -7
  37. package/dist/platform.css +1 -1
  38. package/package.json +7 -4
  39. package/dist/chunk-6BPHEBCF.js +0 -639
  40. package/dist/chunk-IXDM5R55.js +0 -23
  41. package/dist/chunk-XLX3L3P4.js +0 -43
  42. package/dist/vega-chart-block-NQADYNWQ.js +0 -2857
  43. package/dist/{chunk-7ADM3CKD.js → chunk-6JLWE7M3.js} +0 -0
  44. package/dist/{pdf-cover-thumbnail-inner-4N2Q5AAG.js → pdf-cover-thumbnail-inner-B2P6S25B.js} +0 -0
  45. package/dist/{types-BDqLaBfH.d.ts → types-BZhoOcz2.d.ts} +3 -3
  46. /package/dist/{univer-workbook-LSBVETAQ.js → univer-workbook-PENO65OQ.js} +0 -0
@@ -1,18 +1,17 @@
1
1
  'use client';
2
- import { usePlugins, useChatCapabilityEnabled, resolvePluginLanguage, renderPluginBlock, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ActionMenu, useArtifactStore, ArtifactActionsMenu, useArtifact, resolveArtifactIconFormat, artifactFormatIcon, useArtifactFileObjectUrl, artifactFormatSubtitle, ChatImageLightbox, useClient, processMessageParts, getMessageDisplayTimestampValue, extractCitationsFromSteps, useSourcesEnrichment, extractImagesFromSteps, dedupeImageResults, getDocumentStreamArtifacts, getToolOutput, useCanvasStore, ImageResultsGallery, MessageDecisionCards, MessageStepsGroup, getToolState, getToolInput, getToolErrorText, dynamic, useChatCapabilities, useOptionalWorkspaceContext, useCitationViewer, useChatOverviewStore, dedup, extractDomain, sourceKind, SourceFavicon, Input, exportDocumentPdf, useAgentPanelStore, AgentRoutineForm, formatFileSize, FileThumbnail, MobileScreenSheet, useAgentHistorySource, treatyErrorMessage, useRouter, useBasePath, unwrap, agentRoutineKeys, getFileCategory, unwrapData, useOptionalAgentsContext, avatarMotionForStream, AGENT_AVATAR_SIZE } from './chunk-26L3ST3H.js';
3
- import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription, Popover, PopoverTrigger, PopoverContent } from './chunk-F6PEZE7A.js';
4
- import { useTranslation } from './chunk-FTLVGUG5.js';
5
- import { MessageToolbar, MessageResponse, Shimmer, Message, MessageContent, deferDuringLayoutMotion, HoverCard, HoverCardTrigger, HoverCardContent, Icon } from './chunk-FDGBZFGN.js';
6
- import { Button, ScrollArea, Skeleton } from './chunk-ROJM44GB.js';
7
- import { useIsMobile } from './chunk-IXDM5R55.js';
8
- import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent } from './chunk-BDJFVRYR.js';
9
- import { HISTORY_CITATION_PREFIX, historyCitationReference, AgentAvatar } from './chunk-TSKFBMGC.js';
10
- import { cn } from './chunk-XLX3L3P4.js';
11
- import { ThumbsUpIcon, ThumbsDownIcon, ArrowRotateClockwiseIcon, ForkCodeIcon, CircleInfoIcon, SquareArrowTopRightIcon, ChevronDownMediumIcon, DotGrid1x3HorizontalTightIcon, SidebarSimpleRightWideIcon, ChevronTopMediumIcon, FileTextIcon, Checkmark1Icon, ClipboardIcon, ArrowsShowIcon, FileDownloadIcon, PencilIcon, LayoutLeftRightIcon, StopIcon, VolumeFullIcon, DotGrid1x3HorizontalIcon, CrossMediumIcon, SendIcon, FilePdfIcon, StudioDisplayIcon, WorldIcon, FloppyDisk1Icon, WarningSignIcon, Email1Icon, ArrowRightIcon, TextSelectIcon, BubblePlusIcon, BrainIcon, CheckCircle2Icon, CircleQuestionmarkIcon, ArrowUpRightIcon, CircleXIcon, ClockIcon, CircleCheckIcon, UserAddedIcon, LoaderIcon } from './chunk-AFVU5VT6.js';
12
- import { useChatClientOptional } from './chunk-7ADM3CKD.js';
13
- import { createContext, memo, useMemo, isValidElement, cloneElement, useState, useCallback, useRef, useEffect, useId, useLayoutEffect, useContext } from 'react';
14
- import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
2
+ import { usePlugins, useChatCapabilityEnabled, resolvePluginLanguage, renderPluginBlock, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ActionMenu, useArtifactStore, ArtifactActionsMenu, DotGrid1x3HorizontalTightIcon, useArtifact, resolveArtifactIconFormat, artifactFormatIcon, useArtifactFileObjectUrl, artifactFormatSubtitle, ChatImageLightbox, ArrowsShowIcon, FileDownloadIcon, useClient, processMessageParts, getMessageDisplayTimestampValue, getMessageCreatedAtMs, isApprovalRequested, extractCitationsFromSteps, useSourcesEnrichment, extractImagesFromSteps, dedupeImageResults, getDocumentStreamArtifacts, getToolOutput, useCanvasStore, ImageResultsGallery, MessageDecisionCards, useChatCapabilities, useOptionalWorkspaceContext, useCitationViewer, useChatOverviewStore, dedup, extractDomain, sourceKind, SourceFavicon, Input, exportDocumentPdf, FilePdfIcon, StudioDisplayIcon, WorldIcon, MessageStepsGroup, getToolState, getToolInput, getToolErrorText, useChatOptInEnabled, ArrowRightIcon, formatFileSize, FileThumbnail, MobileScreenSheet, useAgentHistorySource, treatyErrorMessage, useRouter, useBasePath, useAgentPanelStore, AgentRoutineForm, getFileCategory, unwrap, unwrapData, CircleCheckIcon, agentRoutineKeys, LoaderIcon, useOptionalAgentsContext, avatarMotionForStream, AGENT_AVATAR_SIZE } from './chunk-EFFOOCIK.js';
3
+ import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription, Popover, PopoverTrigger, PopoverContent } from './chunk-T5SANYSX.js';
4
+ import { useIsMobile, useTranslation } from './chunk-7AT2LRVW.js';
5
+ import { MessageToolbar, MessageResponse, SquareArrowTopRightIcon, FileTextIcon, Shimmer, ClipboardIcon, Message, MessageContent, PencilIcon, deferDuringLayoutMotion, HoverCard, HoverCardTrigger, HoverCardContent, Collapse, Icon, CircleXIcon, ClockIcon } from './chunk-PKNEC4LJ.js';
6
+ import { ChevronDownMediumIcon, Button, ScrollArea, Skeleton } from './chunk-UWKO24VT.js';
7
+ import { CrossMediumIcon } from './chunk-2P4IEVOQ.js';
8
+ import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent } from './chunk-C3HW5S2Z.js';
9
+ import { HISTORY_CITATION_PREFIX, historyCitationReference, AgentAvatar } from './chunk-PUMRNN3R.js';
10
+ import { cn, Checkmark1Icon } from './chunk-LGVMMBL3.js';
11
+ import { useChatClientOptional } from './chunk-6JLWE7M3.js';
12
+ import { createContext, memo, useMemo, isValidElement, cloneElement, useState, useCallback, useRef, useEffect, useId, useLayoutEffect, lazy, Suspense, useContext } from 'react';
15
13
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
14
+ import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
16
15
  import { cva } from 'class-variance-authority';
17
16
  import '@radix-ui/react-separator';
18
17
  import { Slot } from '@radix-ui/react-slot';
@@ -20,6 +19,90 @@ import { CodeBlock, defaultUrlTransform } from 'streamdown';
20
19
  import { create } from 'zustand';
21
20
  import { toast } from 'sonner';
22
21
 
22
+ function formatElapsed(ms) {
23
+ const total = Math.max(0, Math.round(ms / 1e3));
24
+ if (total < 60) return `${total}s`;
25
+ const minutes = Math.floor(total / 60);
26
+ if (minutes < 60) {
27
+ const seconds = total % 60;
28
+ return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`;
29
+ }
30
+ const hours = Math.floor(minutes / 60);
31
+ const rest = minutes % 60;
32
+ return rest === 0 ? `${hours}h` : `${hours}h ${rest}m`;
33
+ }
34
+ function MessageWorkFold({
35
+ isStreaming,
36
+ forceOpen = false,
37
+ persistedDurationMs = null,
38
+ startedAtMs = null,
39
+ children
40
+ }) {
41
+ const expandedByDefault = useChatOptInEnabled("expandedWorkDetails");
42
+ const mountedAt = useRef(isStreaming ? Date.now() : null);
43
+ const anchorRef = useRef(null);
44
+ if (startedAtMs != null && (anchorRef.current === null || startedAtMs < anchorRef.current)) {
45
+ anchorRef.current = startedAtMs;
46
+ }
47
+ const anchor = anchorRef.current;
48
+ const [elapsed, setElapsed] = useState(null);
49
+ useEffect(() => {
50
+ if (!isStreaming) return;
51
+ if (mountedAt.current === null) mountedAt.current = Date.now();
52
+ const tick = () => {
53
+ const from = anchor ?? mountedAt.current ?? Date.now();
54
+ setElapsed(Math.max(0, Date.now() - from));
55
+ };
56
+ tick();
57
+ const id = setInterval(tick, 1e3);
58
+ return () => {
59
+ clearInterval(id);
60
+ tick();
61
+ };
62
+ }, [isStreaming, anchor]);
63
+ const [collapsed, setCollapsed] = useState(
64
+ () => !isStreaming && !expandedByDefault
65
+ );
66
+ const wasStreaming = useRef(isStreaming);
67
+ useEffect(() => {
68
+ if (isStreaming === wasStreaming.current) return;
69
+ wasStreaming.current = isStreaming;
70
+ if (!isStreaming && !expandedByDefault) setCollapsed(true);
71
+ }, [isStreaming, expandedByDefault]);
72
+ const settled = elapsed ?? persistedDurationMs;
73
+ const open = forceOpen || expandedByDefault || !collapsed;
74
+ return /* @__PURE__ */ jsxs("div", { className: "my-1 w-full min-w-0", children: [
75
+ /* @__PURE__ */ jsxs(
76
+ "button",
77
+ {
78
+ type: "button",
79
+ onClick: () => setCollapsed((c) => !c),
80
+ "aria-expanded": open,
81
+ disabled: forceOpen,
82
+ className: cn(
83
+ "flex w-full items-center gap-1.5 py-1.5 text-left text-sm text-muted-foreground transition-colors",
84
+ // The rule under the label runs the full width of the message
85
+ // column, separating the turn's work from the answer below it.
86
+ "border-b border-border",
87
+ !forceOpen && "hover:text-foreground"
88
+ ),
89
+ children: [
90
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 shrink overflow-hidden", children: isStreaming ? /* @__PURE__ */ jsx(Shimmer, { as: "span", className: "text-sm", children: elapsed === null ? "Working\u2026" : `Working for ${formatElapsed(elapsed)}` }) : /* @__PURE__ */ jsx("span", { className: "truncate", children: settled === null ? "Worked" : `Worked for ${formatElapsed(settled)}` }) }),
91
+ /* @__PURE__ */ jsx(
92
+ ChevronDownMediumIcon,
93
+ {
94
+ className: cn(
95
+ "size-3.5 shrink-0 transition-transform duration-200",
96
+ !open && "-rotate-90"
97
+ )
98
+ }
99
+ )
100
+ ]
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx(Collapse, { open, unmountClosed: true, children: /* @__PURE__ */ jsx("div", { className: "w-full min-w-0", children }) })
104
+ ] });
105
+ }
23
106
  var agentRoutineOfferKeys = {
24
107
  all: ["agentRoutineOffers"],
25
108
  result: (workspaceId, conversationId, messageId) => ["agentRoutineOffers", "result", workspaceId, conversationId, messageId],
@@ -106,6 +189,90 @@ function AgentRoutineOfferFooter({ conversationId, messageId }) {
106
189
  (accept.isError || dismiss.isError) && /* @__PURE__ */ jsx("p", { role: "alert", className: "mt-2 text-destructive", children: t("agentMode.routines.suggestions.error") })
107
190
  ] });
108
191
  }
192
+ function UserAddedIcon(props) {
193
+ return /* @__PURE__ */ jsxs(
194
+ "svg",
195
+ {
196
+ "aria-hidden": "true",
197
+ role: "img",
198
+ "aria-label": "user-added, people, person, member, checked",
199
+ width: "24px",
200
+ height: "24px",
201
+ viewBox: "0 0 24 24",
202
+ fill: "none",
203
+ xmlns: "http://www.w3.org/2000/svg",
204
+ ...props,
205
+ children: [
206
+ /* @__PURE__ */ jsx(
207
+ "circle",
208
+ {
209
+ cx: "12",
210
+ cy: "7.75",
211
+ r: "4.5",
212
+ stroke: "currentColor",
213
+ strokeWidth: "1.5",
214
+ strokeLinecap: "round",
215
+ strokeLinejoin: "round"
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsx(
219
+ "path",
220
+ {
221
+ d: "M12.0018 12.25C8.22236 12.25 5.87133 14.4212 4.94874 17.2952C4.44232 18.8728 5.84498 20.25 7.50184 20.25H11.252",
222
+ stroke: "currentColor",
223
+ strokeWidth: "1.5",
224
+ strokeLinecap: "round",
225
+ strokeLinejoin: "round"
226
+ }
227
+ ),
228
+ /* @__PURE__ */ jsx(
229
+ "path",
230
+ {
231
+ d: "M14.75 18.5543L16.9318 20.25L20.75 14.25",
232
+ stroke: "currentColor",
233
+ strokeWidth: "1.5",
234
+ strokeLinecap: "round",
235
+ strokeLinejoin: "round"
236
+ }
237
+ )
238
+ ]
239
+ }
240
+ );
241
+ }
242
+ function Email1Icon(props) {
243
+ return /* @__PURE__ */ jsxs(
244
+ "svg",
245
+ {
246
+ "aria-hidden": "true",
247
+ role: "img",
248
+ "aria-label": "email-1, envelope",
249
+ width: "24px",
250
+ height: "24px",
251
+ viewBox: "0 0 24 24",
252
+ fill: "none",
253
+ xmlns: "http://www.w3.org/2000/svg",
254
+ ...props,
255
+ children: [
256
+ /* @__PURE__ */ jsx(
257
+ "path",
258
+ {
259
+ d: "M21.25 14.45V9.55C21.25 7.86984 21.25 7.02976 20.923 6.38803C20.6354 5.82354 20.1765 5.3646 19.612 5.07698C18.9702 4.75 18.1302 4.75 16.45 4.75H7.55C5.86984 4.75 5.02976 4.75 4.38803 5.07698C3.82354 5.3646 3.3646 5.82354 3.07698 6.38803C2.75 7.02976 2.75 7.86984 2.75 9.55V14.45C2.75 16.1302 2.75 16.9702 3.07698 17.612C3.3646 18.1765 3.82354 18.6354 4.38803 18.923C5.02976 19.25 5.86984 19.25 7.55 19.25H16.45C18.1302 19.25 18.9702 19.25 19.612 18.923C20.1765 18.6354 20.6354 18.1765 20.923 17.612C21.25 16.9702 21.25 16.1302 21.25 14.45Z",
260
+ stroke: "currentColor",
261
+ strokeWidth: "1.5"
262
+ }
263
+ ),
264
+ /* @__PURE__ */ jsx(
265
+ "path",
266
+ {
267
+ d: "M21 6L13.8418 11.5675C12.7585 12.4101 11.2415 12.4101 10.1582 11.5675L3 6",
268
+ stroke: "currentColor",
269
+ strokeWidth: "1.5"
270
+ }
271
+ )
272
+ ]
273
+ }
274
+ );
275
+ }
109
276
  function FieldGroup({ className, ...props }) {
110
277
  return /* @__PURE__ */ jsx(
111
278
  "div",
@@ -177,7 +344,7 @@ function FieldValue({ className, ...props }) {
177
344
  );
178
345
  }
179
346
 
180
- // src/vendor/ui/chat/supervisor-approval-card/utils.ts
347
+ // ../chat/src/ui/chat/supervisor-approval-card/utils.ts
181
348
  function parseKeyValueDescription(text) {
182
349
  const trimmed = text.trim();
183
350
  if (!trimmed) return [];
@@ -428,6 +595,206 @@ function SupervisorApprovalCard({
428
595
  ] }) })
429
596
  ] });
430
597
  }
598
+ function ForkCodeIcon(props) {
599
+ return /* @__PURE__ */ jsxs(
600
+ "svg",
601
+ {
602
+ "aria-hidden": "true",
603
+ role: "img",
604
+ "aria-label": "fork-code",
605
+ width: "24px",
606
+ height: "24px",
607
+ viewBox: "0 0 24 24",
608
+ fill: "none",
609
+ xmlns: "http://www.w3.org/2000/svg",
610
+ ...props,
611
+ children: [
612
+ /* @__PURE__ */ jsx(
613
+ "circle",
614
+ {
615
+ cx: "6",
616
+ cy: "6",
617
+ r: "2.25",
618
+ stroke: "currentColor",
619
+ strokeWidth: "1.5",
620
+ strokeLinecap: "round",
621
+ strokeLinejoin: "round"
622
+ }
623
+ ),
624
+ /* @__PURE__ */ jsx(
625
+ "circle",
626
+ {
627
+ cx: "12",
628
+ cy: "18",
629
+ r: "2.25",
630
+ stroke: "currentColor",
631
+ strokeWidth: "1.5",
632
+ strokeLinecap: "round",
633
+ strokeLinejoin: "round"
634
+ }
635
+ ),
636
+ /* @__PURE__ */ jsx(
637
+ "circle",
638
+ {
639
+ cx: "18",
640
+ cy: "6",
641
+ r: "2.25",
642
+ stroke: "currentColor",
643
+ strokeWidth: "1.5",
644
+ strokeLinecap: "round",
645
+ strokeLinejoin: "round"
646
+ }
647
+ ),
648
+ /* @__PURE__ */ jsx(
649
+ "path",
650
+ {
651
+ d: "M6 8.25V9C6 10.6569 7.34315 12 9 12C10.6569 12 12 13.3431 12 15V15.75",
652
+ stroke: "currentColor",
653
+ strokeWidth: "1.5",
654
+ strokeLinecap: "round",
655
+ strokeLinejoin: "round"
656
+ }
657
+ ),
658
+ /* @__PURE__ */ jsx(
659
+ "path",
660
+ {
661
+ d: "M18 8.25V9C18 10.6569 16.6569 12 15 12C13.3431 12 12 13.3431 12 15V15.75",
662
+ stroke: "currentColor",
663
+ strokeWidth: "1.5",
664
+ strokeLinecap: "round",
665
+ strokeLinejoin: "round"
666
+ }
667
+ )
668
+ ]
669
+ }
670
+ );
671
+ }
672
+ function CircleInfoIcon(props) {
673
+ return /* @__PURE__ */ jsxs(
674
+ "svg",
675
+ {
676
+ "aria-hidden": "true",
677
+ role: "img",
678
+ "aria-label": "circle-info, info circle, tooltip, information",
679
+ width: "24px",
680
+ height: "24px",
681
+ viewBox: "0 0 24 24",
682
+ fill: "none",
683
+ xmlns: "http://www.w3.org/2000/svg",
684
+ ...props,
685
+ children: [
686
+ /* @__PURE__ */ jsx(
687
+ "path",
688
+ {
689
+ d: "M10.75 11H12L12 16.25M21.25 12C21.25 17.1086 17.1086 21.25 12 21.25C6.89137 21.25 2.75 17.1086 2.75 12C2.75 6.89137 6.89137 2.75 12 2.75C17.1086 2.75 21.25 6.89137 21.25 12Z",
690
+ stroke: "currentColor",
691
+ strokeWidth: "1.5",
692
+ strokeLinecap: "round",
693
+ strokeLinejoin: "round"
694
+ }
695
+ ),
696
+ /* @__PURE__ */ jsx(
697
+ "path",
698
+ {
699
+ d: "M12 7.375C11.6548 7.375 11.375 7.65482 11.375 8C11.375 8.34518 11.6548 8.625 12 8.625C12.3452 8.625 12.625 8.34518 12.625 8C12.625 7.65482 12.3452 7.375 12 7.375Z",
700
+ fill: "currentColor",
701
+ stroke: "currentColor",
702
+ strokeWidth: "0.25"
703
+ }
704
+ )
705
+ ]
706
+ }
707
+ );
708
+ }
709
+ function ArrowRotateClockwiseIcon(props) {
710
+ return /* @__PURE__ */ jsxs(
711
+ "svg",
712
+ {
713
+ "aria-hidden": "true",
714
+ role: "img",
715
+ "aria-label": "arrow-rotate-clockwise, rotate-right",
716
+ width: "24px",
717
+ height: "24px",
718
+ viewBox: "0 0 24 24",
719
+ fill: "none",
720
+ xmlns: "http://www.w3.org/2000/svg",
721
+ ...props,
722
+ children: [
723
+ /* @__PURE__ */ jsx(
724
+ "path",
725
+ {
726
+ d: "M18.5 7.00891C16.6791 4.95438 14.7962 3.75 11.979 3.75C7.42266 3.75 3.729 7.44365 3.729 12C3.729 16.5563 7.42266 20.25 11.979 20.25C15.5711 20.25 18.627 17.9543 19.7596 14.75",
727
+ stroke: "currentColor",
728
+ strokeWidth: "1.5",
729
+ strokeLinecap: "round",
730
+ strokeLinejoin: "round"
731
+ }
732
+ ),
733
+ /* @__PURE__ */ jsx(
734
+ "path",
735
+ {
736
+ d: "M19.25 4V8H15.25",
737
+ stroke: "currentColor",
738
+ strokeWidth: "1.5",
739
+ strokeLinecap: "round",
740
+ strokeLinejoin: "round"
741
+ }
742
+ )
743
+ ]
744
+ }
745
+ );
746
+ }
747
+ function ThumbsUpIcon(props) {
748
+ return /* @__PURE__ */ jsx(
749
+ "svg",
750
+ {
751
+ "aria-hidden": "true",
752
+ role: "img",
753
+ "aria-label": "thumbs-up, thumb, hand, yes, pro",
754
+ width: "24px",
755
+ height: "24px",
756
+ viewBox: "0 0 24 24",
757
+ fill: "none",
758
+ xmlns: "http://www.w3.org/2000/svg",
759
+ ...props,
760
+ children: /* @__PURE__ */ jsx(
761
+ "path",
762
+ {
763
+ d: "M6.75 10.75H3.75C3.19772 10.75 2.75 11.1977 2.75 11.75V19.25C2.75 19.8023 3.19772 20.25 3.75 20.25H6.75M6.75 20.25V11L10.7208 3.29204C10.8922 2.95918 11.2365 2.75 11.611 2.75C12.8384 2.75 13.7808 3.84535 13.5917 5.0581L13.0161 8.75H18.2589C20.0956 8.75 21.5011 10.3856 21.2248 12.2013L20.3878 17.7013C20.1648 19.167 18.9046 20.25 17.422 20.25H6.75Z",
764
+ stroke: "currentColor",
765
+ strokeWidth: "1.5",
766
+ strokeLinecap: "round",
767
+ strokeLinejoin: "round"
768
+ }
769
+ )
770
+ }
771
+ );
772
+ }
773
+ function ThumbsDownIcon(props) {
774
+ return /* @__PURE__ */ jsx(
775
+ "svg",
776
+ {
777
+ "aria-hidden": "true",
778
+ role: "img",
779
+ "aria-label": "thumbs-down, thumb, hand, no, contra",
780
+ width: "24px",
781
+ height: "24px",
782
+ viewBox: "0 0 24 24",
783
+ fill: "none",
784
+ xmlns: "http://www.w3.org/2000/svg",
785
+ ...props,
786
+ children: /* @__PURE__ */ jsx(
787
+ "path",
788
+ {
789
+ d: "M17.2521 13.25H20.25C20.8023 13.25 21.25 12.8023 21.25 12.25V4.75C21.25 4.19772 20.8023 3.75 20.25 3.75H17.2521M17.2521 3.75V13L13.2835 20.7078C13.112 21.0407 12.7635 21.25 12.389 21.25V21.25C11.1622 21.25 10.2249 20.1546 10.4139 18.9419L10.9892 15.25H5.74908C3.91335 15.25 2.50859 13.6144 2.78476 11.7987L3.62128 6.29867C3.84421 4.83298 5.1038 3.75 6.5856 3.75H17.2521Z",
790
+ stroke: "currentColor",
791
+ strokeWidth: "1.5",
792
+ strokeLinejoin: "round"
793
+ }
794
+ )
795
+ }
796
+ );
797
+ }
431
798
  function useStreamingStickToBottom(isStreaming, viewportSelector = "[data-slot=scroll-area-viewport]") {
432
799
  const containerRef = useRef(null);
433
800
  useEffect(() => {
@@ -492,6 +859,58 @@ function CopyButton({ text, className }) {
492
859
  /* @__PURE__ */ jsx(TooltipContent, { side: "bottom", className: "text-xs", children: copied ? "Copied!" : "Copy" })
493
860
  ] });
494
861
  }
862
+ function VolumeFullIcon(props) {
863
+ return /* @__PURE__ */ jsx(
864
+ "svg",
865
+ {
866
+ "aria-hidden": "true",
867
+ role: "img",
868
+ "aria-label": "volume-full, speaker, loud, sound",
869
+ width: "24px",
870
+ height: "24px",
871
+ viewBox: "0 0 24 24",
872
+ fill: "none",
873
+ xmlns: "http://www.w3.org/2000/svg",
874
+ ...props,
875
+ children: /* @__PURE__ */ jsx(
876
+ "path",
877
+ {
878
+ d: "M19.2478 4.75194C21.1027 6.60683 22.25 9.16933 22.25 11.9998C22.25 14.8302 21.1027 17.3927 19.2478 19.2476M15.8891 8.11132C16.8844 9.10662 17.5 10.4816 17.5 12.0004C17.5 13.5192 16.8844 14.8942 15.8891 15.8895M3.75 7.74999H5.29844C5.75258 7.74999 6.1932 7.59543 6.54783 7.31173L10.6253 4.04974C11.2801 3.52593 12.25 3.99211 12.25 4.83061V19.1694C12.25 20.0079 11.2801 20.474 10.6253 19.9502L6.54783 16.6883C6.1932 16.4045 5.75258 16.25 5.29844 16.25H3.75C2.64543 16.25 1.75 15.3546 1.75 14.25V9.74999C1.75 8.64542 2.64543 7.74999 3.75 7.74999Z",
879
+ stroke: "currentColor",
880
+ strokeWidth: "1.5",
881
+ strokeLinecap: "round",
882
+ strokeLinejoin: "round"
883
+ }
884
+ )
885
+ }
886
+ );
887
+ }
888
+ function StopIcon(props) {
889
+ return /* @__PURE__ */ jsx(
890
+ "svg",
891
+ {
892
+ "aria-hidden": "true",
893
+ role: "img",
894
+ "aria-label": "stop",
895
+ width: "24px",
896
+ height: "24px",
897
+ viewBox: "0 0 24 24",
898
+ fill: "none",
899
+ xmlns: "http://www.w3.org/2000/svg",
900
+ ...props,
901
+ children: /* @__PURE__ */ jsx(
902
+ "path",
903
+ {
904
+ d: "M20.25 15.45V8.55C20.25 6.86984 20.25 6.02976 19.923 5.38803C19.6354 4.82354 19.1765 4.3646 18.612 4.07698C17.9702 3.75 17.1302 3.75 15.45 3.75H8.55C6.86984 3.75 6.02976 3.75 5.38803 4.07698C4.82354 4.3646 4.3646 4.82354 4.07698 5.38803C3.75 6.02976 3.75 6.86984 3.75 8.55V15.45C3.75 17.1302 3.75 17.9702 4.07698 18.612C4.3646 19.1765 4.82354 19.6354 5.38803 19.923C6.02976 20.25 6.86984 20.25 8.55 20.25H15.45C17.1302 20.25 17.9702 20.25 18.612 19.923C19.1765 19.6354 19.6354 19.1765 19.923 18.612C20.25 17.9702 20.25 17.1302 20.25 15.45Z",
905
+ stroke: "currentColor",
906
+ strokeWidth: "1.5",
907
+ strokeLinecap: "round",
908
+ strokeLinejoin: "round"
909
+ }
910
+ )
911
+ }
912
+ );
913
+ }
495
914
  var SILENT = {
496
915
  available: false,
497
916
  speakingMessageId: null,
@@ -529,7 +948,7 @@ function SpeakButton({ messageId, text, className, iconClassName }) {
529
948
  ] });
530
949
  }
531
950
 
532
- // src/vendor/lib/language-meta.ts
951
+ // ../chat/src/lib/language-meta.ts
533
952
  var ALIASES = {
534
953
  ts: "typescript",
535
954
  tsx: "tsx",
@@ -687,6 +1106,133 @@ function ActionSheetRow({
687
1106
  }
688
1107
  );
689
1108
  }
1109
+ function BrainIcon(props) {
1110
+ return /* @__PURE__ */ jsxs(
1111
+ "svg",
1112
+ {
1113
+ "aria-hidden": "true",
1114
+ role: "img",
1115
+ "aria-label": "brain, thinking, human, clever",
1116
+ width: "24px",
1117
+ height: "24px",
1118
+ viewBox: "0 0 24 24",
1119
+ fill: "none",
1120
+ xmlns: "http://www.w3.org/2000/svg",
1121
+ ...props,
1122
+ children: [
1123
+ /* @__PURE__ */ jsx(
1124
+ "path",
1125
+ {
1126
+ d: "M4.08682 11C3.87085 10.5454 3.75 10.0368 3.75 9.50002C3.75 7.82446 4.92741 6.4239 6.5 6.08057",
1127
+ stroke: "currentColor",
1128
+ strokeWidth: "1.5",
1129
+ strokeLinecap: "round"
1130
+ }
1131
+ ),
1132
+ /* @__PURE__ */ jsx(
1133
+ "path",
1134
+ {
1135
+ d: "M4.08682 11C3.87085 10.5454 3.75 10.0368 3.75 9.50002C3.75 7.82446 4.92741 6.4239 6.5 6.08057",
1136
+ stroke: "currentColor",
1137
+ strokeWidth: "1.5",
1138
+ strokeLinecap: "round"
1139
+ }
1140
+ ),
1141
+ /* @__PURE__ */ jsx(
1142
+ "path",
1143
+ {
1144
+ d: "M4.08682 11C3.87085 10.5454 3.75 10.0368 3.75 9.50002C3.75 7.82446 4.92741 6.4239 6.5 6.08057",
1145
+ stroke: "currentColor",
1146
+ strokeWidth: "1.5",
1147
+ strokeLinecap: "round"
1148
+ }
1149
+ ),
1150
+ /* @__PURE__ */ jsx(
1151
+ "path",
1152
+ {
1153
+ d: "M19.9132 11C20.1292 10.5454 20.25 10.0368 20.25 9.50002C20.25 7.82446 19.0726 6.4239 17.5 6.08057",
1154
+ stroke: "currentColor",
1155
+ strokeWidth: "1.5",
1156
+ strokeLinecap: "round"
1157
+ }
1158
+ ),
1159
+ /* @__PURE__ */ jsx(
1160
+ "path",
1161
+ {
1162
+ d: "M19.9132 11C20.1292 10.5454 20.25 10.0368 20.25 9.50002C20.25 7.82446 19.0726 6.4239 17.5 6.08057",
1163
+ stroke: "currentColor",
1164
+ strokeWidth: "1.5",
1165
+ strokeLinecap: "round"
1166
+ }
1167
+ ),
1168
+ /* @__PURE__ */ jsx(
1169
+ "path",
1170
+ {
1171
+ d: "M19.9132 11C20.1292 10.5454 20.25 10.0368 20.25 9.50002C20.25 7.82446 19.0726 6.4239 17.5 6.08057",
1172
+ stroke: "currentColor",
1173
+ strokeWidth: "1.5",
1174
+ strokeLinecap: "round"
1175
+ }
1176
+ ),
1177
+ /* @__PURE__ */ jsx(
1178
+ "path",
1179
+ {
1180
+ d: "M7 16.7282C6.61947 16.9028 6.19611 17.0002 5.75 17.0002C4.09315 17.0002 2.75 15.6571 2.75 14.0002C2.75 12.6023 3.70608 11.4278 5 11.0947",
1181
+ stroke: "currentColor",
1182
+ strokeWidth: "1.5",
1183
+ strokeLinecap: "round"
1184
+ }
1185
+ ),
1186
+ /* @__PURE__ */ jsx(
1187
+ "path",
1188
+ {
1189
+ d: "M17 16.7282C17.3805 16.9028 17.8039 17.0002 18.25 17.0002C19.9069 17.0002 21.25 15.6571 21.25 14.0002C21.25 12.6023 20.2939 11.4278 19 11.0947",
1190
+ stroke: "currentColor",
1191
+ strokeWidth: "1.5",
1192
+ strokeLinecap: "round"
1193
+ }
1194
+ ),
1195
+ /* @__PURE__ */ jsx(
1196
+ "path",
1197
+ {
1198
+ d: "M12 5.375C12 3.92525 10.8247 2.75 9.375 2.75C7.92525 2.75 6.75 3.92525 6.75 5.375C6.75 5.98861 6.96054 6.55304 7.31331 7",
1199
+ stroke: "currentColor",
1200
+ strokeWidth: "1.5",
1201
+ strokeLinecap: "round"
1202
+ }
1203
+ ),
1204
+ /* @__PURE__ */ jsx(
1205
+ "path",
1206
+ {
1207
+ d: "M12 5.375C12 3.92525 13.1753 2.75 14.625 2.75C16.0747 2.75 17.25 3.92525 17.25 5.375C17.25 5.98861 17.0395 6.55304 16.6867 7",
1208
+ stroke: "currentColor",
1209
+ strokeWidth: "1.5",
1210
+ strokeLinecap: "round"
1211
+ }
1212
+ ),
1213
+ /* @__PURE__ */ jsx("path", { d: "M12 5.25V17.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }),
1214
+ /* @__PURE__ */ jsx(
1215
+ "path",
1216
+ {
1217
+ d: "M12 17.5C12 19.5711 10.3211 21.25 8.25 21.25C6.17893 21.25 4.5 19.5711 4.5 17.5V17",
1218
+ stroke: "currentColor",
1219
+ strokeWidth: "1.5",
1220
+ strokeLinecap: "round"
1221
+ }
1222
+ ),
1223
+ /* @__PURE__ */ jsx(
1224
+ "path",
1225
+ {
1226
+ d: "M12 17.5C12 19.5711 13.6789 21.25 15.75 21.25C17.8211 21.25 19.5 19.5711 19.5 17.5V17",
1227
+ stroke: "currentColor",
1228
+ strokeWidth: "1.5",
1229
+ strokeLinecap: "round"
1230
+ }
1231
+ )
1232
+ ]
1233
+ }
1234
+ );
1235
+ }
690
1236
  var BRAND_PATTERNS = [
691
1237
  // Order is load-bearing. Anthropic-on-Vertex must beat generic Vertex.
692
1238
  { match: /anthropic|claude/, icon: "logos:claude-icon", brand: "Anthropic" },
@@ -755,6 +1301,17 @@ var BRAND_PATTERNS = [
755
1301
  { match: /moonshot|kimi/, icon: "hugeicons:kimi-ai", brand: "Moonshot" },
756
1302
  { match: /z-ai|zhipu|(^|[\W_])glm/, icon: "@brand/zai", brand: "Z.ai" },
757
1303
  { match: /openrouter/, icon: "simple-icons:openrouter", brand: "OpenRouter" },
1304
+ // Azure (`azure`, `azure:<slug>`) is a PLATFORM: a deployment whose
1305
+ // name or upstream model names a brand shows that brand (model pass);
1306
+ // only an opaque deployment on a bare Azure row lands here.
1307
+ { match: /(^|[\W_])azure([\W_:]|$)/, icon: "logos:microsoft-azure", brand: "Azure" },
1308
+ // Netra is an OpenAI-compatible endpoint registered under the slug
1309
+ // `netra`: matched by its provider id only, never by label text. Before
1310
+ // the generic custom rule; a recognizable model id still wins (model pass).
1311
+ { match: /^custom:netra$/, icon: "@brand/netra", brand: "Netra" },
1312
+ // ElevenLabs (voice and transcription) is a provider id only, never a
1313
+ // model id — matched exactly, like Netra.
1314
+ { match: /^elevenlabs$/, icon: "@brand/elevenlabs", brand: "ElevenLabs" },
758
1315
  // Admin-registered OpenAI-compatible endpoints (`custom:<slug>`) have no
759
1316
  // brand of their own — LAST, so a recognizable model id inside a custom
760
1317
  // provider (e.g. custom:acme + deepseek-v4) still wins its own glyph.
@@ -767,10 +1324,24 @@ var LOCAL_BRAND_ICONS = {
767
1324
  }, viewBox: "0 0 24 24", className, children: [
768
1325
  /* @__PURE__ */ jsx("title", { children: "Z.ai" }),
769
1326
  /* @__PURE__ */ jsx("path", { d: "M12.105 2L9.927 4.953H.653L2.83 2h9.276zM23.254 19.048L21.078 22h-9.242l2.174-2.952h9.244zM24 2L9.264 22H0L14.736 2H24z" })
1327
+ ] }),
1328
+ // Simple Icons "elevenlabs" mark (CC0). currentColor, so it takes the
1329
+ // caller's text colour in both themes. Decorative, like Netra's.
1330
+ "@brand/elevenlabs": ({ className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", viewBox: "0 0 24 24", style: { flex: "none" }, "aria-hidden": true, className, children: /* @__PURE__ */ jsx("path", { d: "M4.6035 0v24h4.9317V0zm9.8613 0v24h4.9317V0z" }) }),
1331
+ // The mark from netraruntime.com (wordmark dropped). Fixed brand colours,
1332
+ // like the other full-colour logos: a dark tile with a white N reads on
1333
+ // both themes. Decorative: it always sits beside the provider's name.
1334
+ "@brand/netra": ({ className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", style: { flex: "none" }, "aria-hidden": true, className, children: [
1335
+ /* @__PURE__ */ jsx("rect", { width: "24", height: "24", fill: "#0A0A0A" }),
1336
+ /* @__PURE__ */ jsx("path", { d: "M7.1 17.6V6.4L5 6.05V5H9.2L15.5 13.75V6.4L13.4 6.05V5H19V6.05L16.9 6.4V19H15.5L8.5 9.2V17.6L10.6 17.95V19H5V17.95L7.1 17.6Z", fill: "white" })
770
1337
  ] })
771
1338
  };
772
1339
  function matchBrand(row) {
773
- const model = [(row.modelId ?? "").toLowerCase(), (row.slug ?? "").toLowerCase()].join("|");
1340
+ const model = [
1341
+ (row.upstreamModelId ?? "").toLowerCase(),
1342
+ (row.modelId ?? "").toLowerCase(),
1343
+ (row.slug ?? "").toLowerCase()
1344
+ ].join("|");
774
1345
  const provider = (row.provider ?? "").toLowerCase();
775
1346
  for (const hay of [model, provider]) {
776
1347
  if (!hay.replace(/\|/g, "")) continue;
@@ -798,15 +1369,15 @@ function modeToBrandRow(mode) {
798
1369
  A mode key is frozen when the mode is created; the model behind it can be
799
1370
  changed afterwards, and several agents carry `key: 'deepseek-v4-pro'` with
800
1371
  `name: 'Claude Sonnet 5'`. On the platform the stale key is harmless
801
- because a real `modelId` sits ahead of it in the haystack. `/v1/chat-agents`
802
- withholds `modelId` — it names the checkpoint the deployment runs — and
803
- `chat-input-bar` then fills the field with the key itself, so the stale
804
- key became the only signal and drew a DeepSeek glyph beside a Claude
805
- label.
1372
+ because a real `modelId` sits ahead of it in the haystack. The embedded
1373
+ chat's agent list withholds `modelId` — it names the checkpoint the
1374
+ deployment runs — and the composer then fills the field with the key
1375
+ itself, so the stale key became the only signal and drew a DeepSeek glyph
1376
+ beside a Claude label.
806
1377
 
807
1378
  Nothing new is disclosed: the name is already rendered next to the icon.
808
- A mode named "Fast" resolves to the generic glyph, which is the honest
809
- outcome — this resolver returns null rather than guessing.
1379
+ A name that names no model ("Fast") changes nothing: the key stays in
1380
+ the haystack as `slug`, so the brand resolves from it exactly as before.
810
1381
  */
811
1382
  modelId: mode.modelId && mode.modelId !== mode.key ? mode.modelId : mode.model ?? mode.name ?? mode.key,
812
1383
  slug: mode.key
@@ -823,7 +1394,7 @@ function ModelIcon({
823
1394
  return /* @__PURE__ */ jsx(Icon, { icon: name, className });
824
1395
  }
825
1396
 
826
- // src/vendor/ui/chat/message-text-block/utils.ts
1397
+ // ../chat/src/ui/chat/message-text-block/utils.ts
827
1398
  function extractTextContent(node) {
828
1399
  if (node.type === "text") return node.value ?? "";
829
1400
  if (node.children)
@@ -1036,7 +1607,7 @@ function MessageActionsSheet({
1036
1607
  ) });
1037
1608
  }
1038
1609
 
1039
- // src/vendor/ui/chat/message-actions/utils.ts
1610
+ // ../chat/src/ui/chat/message-actions/utils.ts
1040
1611
  var MESSAGE_CONTROLS_REVEAL_CLASS = "transition-opacity duration-150 [@media(hover:hover)]:pointer-events-none [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/message:pointer-events-auto [@media(hover:hover)]:group-hover/message:opacity-100 group-focus-within/message:pointer-events-auto group-focus-within/message:opacity-100";
1041
1612
  var CHIP_CLASS = "inline-flex items-center rounded-md border border-border bg-secondary px-1.5 py-0.5 text-xs font-medium text-muted-foreground no-underline hover:bg-accent hover:text-foreground cursor-pointer ml-0.5 whitespace-nowrap transition-colors align-baseline";
1042
1613
  function CitationChip({
@@ -1144,7 +1715,7 @@ function CitationChip({
1144
1715
  ] });
1145
1716
  }
1146
1717
 
1147
- // src/vendor/ui/chat/history-citation/copy.ts
1718
+ // ../chat/src/ui/chat/history-citation/copy.ts
1148
1719
  var historyCitationCopy = {
1149
1720
  title: "Earlier exchange",
1150
1721
  description: "Retained text from this conversation.",
@@ -1247,7 +1818,34 @@ function HistoryCitation({ href, label }) {
1247
1818
  )
1248
1819
  ] });
1249
1820
  }
1821
+ function BubblePlusIcon(props) {
1822
+ return /* @__PURE__ */ jsx(
1823
+ "svg",
1824
+ {
1825
+ "aria-hidden": "true",
1826
+ role: "img",
1827
+ "aria-label": "bubble-plus, comment, feedback",
1828
+ width: "24px",
1829
+ height: "24px",
1830
+ viewBox: "0 0 24 24",
1831
+ fill: "none",
1832
+ xmlns: "http://www.w3.org/2000/svg",
1833
+ ...props,
1834
+ children: /* @__PURE__ */ jsx(
1835
+ "path",
1836
+ {
1837
+ d: "M12 7.75L12 11M12 11V14.25M12 11H8.75M12 11H15.25M9.29422 18.4836L11.3593 20.2147C11.7292 20.5248 12.2679 20.5263 12.6397 20.2183L14.738 18.4799C14.9173 18.3313 15.143 18.25 15.3759 18.25H17.25C18.9069 18.25 20.25 16.9069 20.25 15.25V6.75C20.25 5.09315 18.9069 3.75 17.25 3.75H6.75C5.09315 3.75 3.75 5.09315 3.75 6.75V15.25C3.75 16.9069 5.09315 18.25 6.75 18.25H8.65182C8.88675 18.25 9.11418 18.3327 9.29422 18.4836Z",
1838
+ stroke: "currentColor",
1839
+ strokeWidth: "1.5",
1840
+ strokeLinecap: "round",
1841
+ strokeLinejoin: "round"
1842
+ }
1843
+ )
1844
+ }
1845
+ );
1846
+ }
1250
1847
  var COMPOSER_ID_MAIN = "main";
1848
+ var COMPOSER_ID_COPILOT = "copilot";
1251
1849
  var useComposerStore = create((set) => ({
1252
1850
  modes: [],
1253
1851
  readingHistory: false,
@@ -1655,6 +2253,75 @@ function MessageDetailsContent({ metadata }) {
1655
2253
  ] })
1656
2254
  ] });
1657
2255
  }
2256
+ function DotGrid1x3HorizontalIcon(props) {
2257
+ return /* @__PURE__ */ jsxs(
2258
+ "svg",
2259
+ {
2260
+ "aria-hidden": "true",
2261
+ role: "img",
2262
+ "aria-label": "dot-grid-1x3-horizontal, menu, drag, grab",
2263
+ width: "24px",
2264
+ height: "24px",
2265
+ viewBox: "0 0 24 24",
2266
+ fill: "none",
2267
+ xmlns: "http://www.w3.org/2000/svg",
2268
+ ...props,
2269
+ children: [
2270
+ /* @__PURE__ */ jsx(
2271
+ "path",
2272
+ {
2273
+ d: "M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z",
2274
+ fill: "currentColor"
2275
+ }
2276
+ ),
2277
+ /* @__PURE__ */ jsx(
2278
+ "path",
2279
+ {
2280
+ d: "M20.25 13C20.8023 13 21.25 12.5523 21.25 12C21.25 11.4477 20.8023 11 20.25 11C19.6977 11 19.25 11.4477 19.25 12C19.25 12.5523 19.6977 13 20.25 13Z",
2281
+ fill: "currentColor"
2282
+ }
2283
+ ),
2284
+ /* @__PURE__ */ jsx(
2285
+ "path",
2286
+ {
2287
+ d: "M3.75 13C4.30228 13 4.75 12.5523 4.75 12C4.75 11.4477 4.30228 11 3.75 11C3.19772 11 2.75 11.4477 2.75 12C2.75 12.5523 3.19772 13 3.75 13Z",
2288
+ fill: "currentColor"
2289
+ }
2290
+ ),
2291
+ /* @__PURE__ */ jsx(
2292
+ "path",
2293
+ {
2294
+ d: "M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z",
2295
+ stroke: "currentColor",
2296
+ strokeWidth: "1.5",
2297
+ strokeLinecap: "round",
2298
+ strokeLinejoin: "round"
2299
+ }
2300
+ ),
2301
+ /* @__PURE__ */ jsx(
2302
+ "path",
2303
+ {
2304
+ d: "M20.25 13C20.8023 13 21.25 12.5523 21.25 12C21.25 11.4477 20.8023 11 20.25 11C19.6977 11 19.25 11.4477 19.25 12C19.25 12.5523 19.6977 13 20.25 13Z",
2305
+ stroke: "currentColor",
2306
+ strokeWidth: "1.5",
2307
+ strokeLinecap: "round",
2308
+ strokeLinejoin: "round"
2309
+ }
2310
+ ),
2311
+ /* @__PURE__ */ jsx(
2312
+ "path",
2313
+ {
2314
+ d: "M3.75 13C4.30228 13 4.75 12.5523 4.75 12C4.75 11.4477 4.30228 11 3.75 11C3.19772 11 2.75 11.4477 2.75 12C2.75 12.5523 3.19772 13 3.75 13Z",
2315
+ stroke: "currentColor",
2316
+ strokeWidth: "1.5",
2317
+ strokeLinecap: "round",
2318
+ strokeLinejoin: "round"
2319
+ }
2320
+ )
2321
+ ]
2322
+ }
2323
+ );
2324
+ }
1658
2325
  function MessageMoreMenu({
1659
2326
  text,
1660
2327
  onRegenerate,
@@ -1745,6 +2412,32 @@ function MessageMoreMenu({
1745
2412
  ] })
1746
2413
  ] });
1747
2414
  }
2415
+ function SendIcon(props) {
2416
+ return /* @__PURE__ */ jsx(
2417
+ "svg",
2418
+ {
2419
+ "aria-hidden": "true",
2420
+ role: "img",
2421
+ "aria-label": "send, email, paper-plane, arrow",
2422
+ width: "24px",
2423
+ height: "24px",
2424
+ viewBox: "0 0 24 24",
2425
+ fill: "none",
2426
+ xmlns: "http://www.w3.org/2000/svg",
2427
+ ...props,
2428
+ children: /* @__PURE__ */ jsx(
2429
+ "path",
2430
+ {
2431
+ d: "M12.7568 21.1941C13.0831 22.7171 15.2274 22.7951 15.6635 21.2998L20.235 5.6259C20.5666 4.48906 19.5119 3.43432 18.375 3.7659L2.70115 8.33745C1.20587 8.77357 1.28384 10.9178 2.80686 11.2442L10.0519 12.7967C10.6294 12.9204 11.0805 13.3715 11.2043 13.9491L12.7568 21.1941Z",
2432
+ stroke: "currentColor",
2433
+ strokeWidth: "1.5",
2434
+ strokeLinecap: "round",
2435
+ strokeLinejoin: "round"
2436
+ }
2437
+ )
2438
+ }
2439
+ );
2440
+ }
1748
2441
  var DOMAIN = "failure-categories";
1749
2442
  var failureCategoryKeys = {
1750
2443
  all: [DOMAIN],
@@ -2479,6 +3172,34 @@ function useUploadComputerFile(computerId) {
2479
3172
  }
2480
3173
  });
2481
3174
  }
3175
+ function SidebarSimpleRightWideIcon(props) {
3176
+ return /* @__PURE__ */ jsxs(
3177
+ "svg",
3178
+ {
3179
+ "aria-hidden": "true",
3180
+ role: "img",
3181
+ "aria-label": "sidebar-simple-right-wide",
3182
+ width: "24px",
3183
+ height: "24px",
3184
+ viewBox: "0 0 24 24",
3185
+ fill: "none",
3186
+ xmlns: "http://www.w3.org/2000/svg",
3187
+ ...props,
3188
+ children: [
3189
+ /* @__PURE__ */ jsx("path", { d: "M15.75 5V19", stroke: "currentColor", strokeWidth: "1.5", strokeLinejoin: "round" }),
3190
+ /* @__PURE__ */ jsx(
3191
+ "path",
3192
+ {
3193
+ d: "M2.75 7.75C2.75 6.09315 4.09315 4.75 5.75 4.75H18.25C19.9069 4.75 21.25 6.09315 21.25 7.75V16.25C21.25 17.9069 19.9069 19.25 18.25 19.25H5.75C4.09315 19.25 2.75 17.9069 2.75 16.25V7.75Z",
3194
+ stroke: "currentColor",
3195
+ strokeWidth: "1.5",
3196
+ strokeLinejoin: "round"
3197
+ }
3198
+ )
3199
+ ]
3200
+ }
3201
+ );
3202
+ }
2482
3203
  var AppOpenInButton = memo(function AppOpenInButton2({
2483
3204
  href,
2484
3205
  onOpenPanel
@@ -2560,6 +3281,120 @@ function AppCard({ title, computerId, appId, onClick }) {
2560
3281
  }
2561
3282
  );
2562
3283
  }
3284
+ function ArrowUpRightIcon(props) {
3285
+ return /* @__PURE__ */ jsx(
3286
+ "svg",
3287
+ {
3288
+ "aria-hidden": "true",
3289
+ role: "img",
3290
+ "aria-label": "arrow-up-right",
3291
+ width: "24px",
3292
+ height: "24px",
3293
+ viewBox: "0 0 24 24",
3294
+ fill: "none",
3295
+ xmlns: "http://www.w3.org/2000/svg",
3296
+ ...props,
3297
+ children: /* @__PURE__ */ jsx(
3298
+ "path",
3299
+ {
3300
+ d: "M18.25 15.25V5.75M18.25 5.75H8.75M18.25 5.75L6 18",
3301
+ stroke: "currentColor",
3302
+ strokeWidth: "1.5",
3303
+ strokeLinecap: "round",
3304
+ strokeLinejoin: "round"
3305
+ }
3306
+ )
3307
+ }
3308
+ );
3309
+ }
3310
+ function CheckCircle2Icon(props) {
3311
+ return /* @__PURE__ */ jsxs(
3312
+ "svg",
3313
+ {
3314
+ "aria-hidden": "true",
3315
+ role: "img",
3316
+ "aria-label": "check-circle-2, done, confirm, save, success",
3317
+ width: "24px",
3318
+ height: "24px",
3319
+ viewBox: "0 0 24 24",
3320
+ fill: "none",
3321
+ xmlns: "http://www.w3.org/2000/svg",
3322
+ ...props,
3323
+ children: [
3324
+ /* @__PURE__ */ jsx(
3325
+ "circle",
3326
+ {
3327
+ cx: "12",
3328
+ cy: "12",
3329
+ r: "9.25",
3330
+ stroke: "currentColor",
3331
+ strokeWidth: "1.5",
3332
+ strokeLinecap: "round",
3333
+ strokeLinejoin: "round"
3334
+ }
3335
+ ),
3336
+ /* @__PURE__ */ jsx(
3337
+ "path",
3338
+ {
3339
+ d: "M7.75 12.9231L10.5625 15.75L15.25 8.75",
3340
+ stroke: "currentColor",
3341
+ strokeWidth: "1.5",
3342
+ strokeLinecap: "round",
3343
+ strokeLinejoin: "round"
3344
+ }
3345
+ )
3346
+ ]
3347
+ }
3348
+ );
3349
+ }
3350
+ function CircleQuestionmarkIcon(props) {
3351
+ return /* @__PURE__ */ jsxs(
3352
+ "svg",
3353
+ {
3354
+ "aria-hidden": "true",
3355
+ role: "img",
3356
+ "aria-label": "circle-questionmark, faq, help, questionaire",
3357
+ width: "24px",
3358
+ height: "24px",
3359
+ viewBox: "0 0 24 24",
3360
+ fill: "none",
3361
+ xmlns: "http://www.w3.org/2000/svg",
3362
+ ...props,
3363
+ children: [
3364
+ /* @__PURE__ */ jsx(
3365
+ "path",
3366
+ {
3367
+ d: "M12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25Z",
3368
+ stroke: "currentColor",
3369
+ strokeWidth: "1.5",
3370
+ strokeLinecap: "round",
3371
+ strokeLinejoin: "round"
3372
+ }
3373
+ ),
3374
+ /* @__PURE__ */ jsx(
3375
+ "path",
3376
+ {
3377
+ d: "M12 16V15.99M12.25 16C12.25 16.1381 12.1381 16.25 12 16.25C11.8619 16.25 11.75 16.1381 11.75 16C11.75 15.8619 11.8619 15.75 12 15.75C12.1381 15.75 12.25 15.8619 12.25 16Z",
3378
+ stroke: "currentColor",
3379
+ strokeWidth: "1.5",
3380
+ strokeLinecap: "round",
3381
+ strokeLinejoin: "round"
3382
+ }
3383
+ ),
3384
+ /* @__PURE__ */ jsx(
3385
+ "path",
3386
+ {
3387
+ d: "M9.75 9.25001C10.5 7.00001 14.25 7.19157 14.25 9.54133C14.25 11.2008 12 11.4614 12 13.25",
3388
+ stroke: "currentColor",
3389
+ strokeWidth: "1.5",
3390
+ strokeLinecap: "round",
3391
+ strokeLinejoin: "round"
3392
+ }
3393
+ )
3394
+ ]
3395
+ }
3396
+ );
3397
+ }
2563
3398
  var NEW_CHAT_EFFORT_KEY = "__new__";
2564
3399
  var useChatStreamStore = create((set, get) => ({
2565
3400
  streams: {},
@@ -2570,6 +3405,7 @@ var useChatStreamStore = create((set, get) => ({
2570
3405
  messageWebSearchAugment: {},
2571
3406
  messageFileAttachments: {},
2572
3407
  messageQueue: {},
3408
+ turnOutcomes: {},
2573
3409
  agentMessageDelivery: {},
2574
3410
  thinkingEnabled: true,
2575
3411
  reasoningEffortBySession: {},
@@ -2592,6 +3428,17 @@ var useChatStreamStore = create((set, get) => ({
2592
3428
  }
2593
3429
  }
2594
3430
  ),
3431
+ setAwaitingApprovalToolCalls: (sessionId, calls) => set((state) => {
3432
+ const prev = state.streams[sessionId];
3433
+ const prevCalls = prev?.awaitingApprovalToolCalls;
3434
+ if (prevCalls ? shallowSameCalls(prevCalls, calls) : Object.keys(calls).length === 0) return {};
3435
+ return {
3436
+ streams: {
3437
+ ...state.streams,
3438
+ [sessionId]: { ...prev, status: prev?.status ?? "idle", awaitingApprovalToolCalls: calls }
3439
+ }
3440
+ };
3441
+ }),
2595
3442
  setInflightToolCalls: (sessionId, calls) => set((state) => {
2596
3443
  const prev = state.streams[sessionId];
2597
3444
  const prevCalls = prev?.inflightToolCalls;
@@ -2712,6 +3559,7 @@ var useChatStreamStore = create((set, get) => ({
2712
3559
  }
2713
3560
  }
2714
3561
  }),
3562
+ setTurnOutcome: (sessionId, outcome) => set((state) => ({ turnOutcomes: { ...state.turnOutcomes, [sessionId]: { outcome, at: Date.now() } } })),
2715
3563
  enqueueMessage: (sessionId, msg) => set((state) => ({
2716
3564
  messageQueue: {
2717
3565
  ...state.messageQueue,
@@ -2873,35 +3721,46 @@ function shallowEqualInput(a, b) {
2873
3721
  return true;
2874
3722
  }
2875
3723
 
2876
- // src/vendor/ui/shell/new-session-prompt/utils.ts
2877
- function stagePendingNewSessionPrompt(text, fileAttachments, modelMode, conversationId) {
3724
+ // ../chat/src/ui/shell/new-session-prompt/utils.ts
3725
+ function stagePendingNewSessionPrompt(text, fileAttachments, modelMode, conversationId, effortKey = NEW_CHAT_EFFORT_KEY, composer) {
2878
3726
  const store = useChatStreamStore.getState();
2879
- const effort = store.reasoningEffortBySession[NEW_CHAT_EFFORT_KEY];
3727
+ const effort = store.reasoningEffortBySession[effortKey];
2880
3728
  store.setPendingChat({
2881
3729
  ...conversationId ? { conversationId } : {},
2882
3730
  prompt: text,
2883
3731
  ...{},
2884
3732
  ...{},
2885
- ...effort ? { reasoningEffort: effort } : {}
3733
+ ...effort ? { reasoningEffort: effort } : {},
3734
+ ...{},
3735
+ ...{},
3736
+ ...{},
3737
+ ...{},
3738
+ ...{}
2886
3739
  });
2887
- if (effort) store.setReasoningEffort(NEW_CHAT_EFFORT_KEY, null);
3740
+ if (effort) store.setReasoningEffort(effortKey, null);
2888
3741
  }
2889
3742
  var DOMAIN2 = "sessions";
2890
3743
  var sessionKeys = {
2891
- list: (params) => [DOMAIN2, "list", params],
3744
+ // The active workspace is part of both list keys. It scopes the response
3745
+ // (the server reads `x-workspace-id`, and answers a request without one by
3746
+ // flattening across every membership) but travels as a header, so without it
3747
+ // in the key one cache entry holds two different answers: the pre-selection
3748
+ // list renders, then the scoped refetch silently replaces it and the sidebar
3749
+ // visibly collapses from every workspace's history to the active one's.
3750
+ list: (params, workspaceId) => [DOMAIN2, "list", params, workspaceId ?? null],
2892
3751
  // Infinite list MUST NOT share a key with `list`: react-query stores one cache
2893
3752
  // entry per key, and the infinite shape (`{ pages, pageParams }`) is incompatible
2894
3753
  // with the plain query shape (`{ data, nextCursor, counts }`). Sharing corrupts
2895
3754
  // whichever hook reads after the other writes — crashing the infinite reader in
2896
3755
  // `getNextPageParam` (`pages.length` on undefined). Keep the `[DOMAIN, 'list']`
2897
3756
  // prefix so existing prefix-invalidations cover both keys.
2898
- infiniteList: (params) => [DOMAIN2, "list", "infinite", params],
3757
+ infiniteList: (params, workspaceId) => [DOMAIN2, "list", "infinite", params, workspaceId ?? null],
2899
3758
  detail: (id) => [DOMAIN2, "detail", id],
2900
3759
  messages: (id) => [DOMAIN2, "messages", id],
2901
3760
  share: (id) => [DOMAIN2, "share", id]
2902
3761
  };
2903
3762
 
2904
- // src/vendor/lib/services/session-handoff/session-handoff-hooks.ts
3763
+ // ../chat/src/lib/services/session-handoff/session-handoff-hooks.ts
2905
3764
  var DOMAIN3 = "sessionHandoff";
2906
3765
  var sessionHandoffKeys = {
2907
3766
  all: [DOMAIN3],
@@ -3153,6 +4012,32 @@ function PublishedCard({ details }) {
3153
4012
  }
3154
4013
  );
3155
4014
  }
4015
+ function ChevronTopMediumIcon(props) {
4016
+ return /* @__PURE__ */ jsx(
4017
+ "svg",
4018
+ {
4019
+ "aria-hidden": "true",
4020
+ role: "img",
4021
+ "aria-label": "chevron-top-medium",
4022
+ width: "24px",
4023
+ height: "24px",
4024
+ viewBox: "0 0 24 24",
4025
+ fill: "none",
4026
+ xmlns: "http://www.w3.org/2000/svg",
4027
+ ...props,
4028
+ children: /* @__PURE__ */ jsx(
4029
+ "path",
4030
+ {
4031
+ d: "M5.75 14.5L12 8.25L18.25 14.5",
4032
+ stroke: "currentColor",
4033
+ strokeWidth: "1.5",
4034
+ strokeLinecap: "round",
4035
+ strokeLinejoin: "round"
4036
+ }
4037
+ )
4038
+ }
4039
+ );
4040
+ }
3156
4041
  var ArtifactOpenInButton = memo(function ArtifactOpenInButton2({
3157
4042
  artifactId,
3158
4043
  title,
@@ -3395,7 +4280,7 @@ var MessageArtifactList = memo(function MessageArtifactList2({
3395
4280
  ] });
3396
4281
  });
3397
4282
 
3398
- // src/vendor/lib/csv-to-workbook.ts
4283
+ // ../platform-kit/src/lib/csv-to-workbook.ts
3399
4284
  var CSV_PREVIEW_MAX_ROWS = 1e3;
3400
4285
  function coerceNumeric(c) {
3401
4286
  if (typeof c === "string") {
@@ -3770,6 +4655,80 @@ var DocumentStreamCard = memo(function DocumentStreamCard2({
3770
4655
  }
3771
4656
  );
3772
4657
  });
4658
+ function WarningSignIcon(props) {
4659
+ return /* @__PURE__ */ jsx(
4660
+ "svg",
4661
+ {
4662
+ "aria-hidden": "true",
4663
+ role: "img",
4664
+ "aria-label": "warning-sign,attention,coution",
4665
+ width: "24px",
4666
+ height: "24px",
4667
+ viewBox: "0 0 24 24",
4668
+ fill: "none",
4669
+ xmlns: "http://www.w3.org/2000/svg",
4670
+ ...props,
4671
+ children: /* @__PURE__ */ jsx(
4672
+ "path",
4673
+ {
4674
+ d: "M2.75 20.25L6.19407 6.0432C6.52028 4.69758 7.72503 3.75 9.10962 3.75H14.0715M14.0715 3.75H14.8904C16.275 3.75 17.4797 4.69758 17.8059 6.0432L21.25 20.25M14.0715 3.75C15.6906 3.75 16.8826 5.26551 16.5012 6.839L14.0985 16.75M13.25 20.25L14.0985 16.75M14.0985 16.75H4M14.0985 16.75H20",
4675
+ stroke: "currentColor",
4676
+ strokeWidth: "1.5",
4677
+ strokeLinecap: "round",
4678
+ strokeLinejoin: "round"
4679
+ }
4680
+ )
4681
+ }
4682
+ );
4683
+ }
4684
+ function FloppyDisk1Icon(props) {
4685
+ return /* @__PURE__ */ jsxs(
4686
+ "svg",
4687
+ {
4688
+ "aria-hidden": "true",
4689
+ role: "img",
4690
+ "aria-label": "floppy-disk-1, save",
4691
+ width: "24px",
4692
+ height: "24px",
4693
+ viewBox: "0 0 24 24",
4694
+ fill: "none",
4695
+ xmlns: "http://www.w3.org/2000/svg",
4696
+ ...props,
4697
+ children: [
4698
+ /* @__PURE__ */ jsx(
4699
+ "path",
4700
+ {
4701
+ d: "M3.75 6.75C3.75 5.09315 5.09315 3.75 6.75 3.75H16.0074C16.803 3.75 17.5661 4.06607 18.1287 4.62868L19.3713 5.87132C19.9339 6.43393 20.25 7.19699 20.25 7.99264V17.25C20.25 18.9069 18.9069 20.25 17.25 20.25H6.75C5.09315 20.25 3.75 18.9069 3.75 17.25V6.75Z",
4702
+ stroke: "currentColor",
4703
+ strokeWidth: "1.5",
4704
+ strokeLinecap: "round",
4705
+ strokeLinejoin: "round"
4706
+ }
4707
+ ),
4708
+ /* @__PURE__ */ jsx(
4709
+ "path",
4710
+ {
4711
+ d: "M7.75 19.25V13.75C7.75 13.1977 8.19772 12.75 8.75 12.75H15.25C15.8023 12.75 16.25 13.1977 16.25 13.75V19.25C16.25 19.8023 15.8023 20.25 15.25 20.25H8.75C8.19772 20.25 7.75 19.8023 7.75 19.25Z",
4712
+ stroke: "currentColor",
4713
+ strokeWidth: "1.5",
4714
+ strokeLinecap: "round",
4715
+ strokeLinejoin: "round"
4716
+ }
4717
+ ),
4718
+ /* @__PURE__ */ jsx(
4719
+ "path",
4720
+ {
4721
+ d: "M7.75 3.75V7.25C7.75 7.80228 8.19772 8.25 8.75 8.25H15.25C15.8023 8.25 16.25 7.80228 16.25 7.25V3.75",
4722
+ stroke: "currentColor",
4723
+ strokeWidth: "1.5",
4724
+ strokeLinecap: "round",
4725
+ strokeLinejoin: "round"
4726
+ }
4727
+ )
4728
+ ]
4729
+ }
4730
+ );
4731
+ }
3773
4732
  function useCreateCanvasArtifact() {
3774
4733
  const client = useClient();
3775
4734
  return useCallback(
@@ -3783,7 +4742,7 @@ function useCreateCanvasArtifact() {
3783
4742
  );
3784
4743
  }
3785
4744
 
3786
- // src/vendor/lib/canvas/canvas-protocol.ts
4745
+ // ../chat/src/lib/canvas/canvas-protocol.ts
3787
4746
  function isCanvasRuntimeMessage(d) {
3788
4747
  if (!d || typeof d !== "object") return false;
3789
4748
  const m = d;
@@ -3801,7 +4760,7 @@ function isCanvasRuntimeMessage(d) {
3801
4760
  }
3802
4761
  }
3803
4762
 
3804
- // src/vendor/lib/tokens.ts
4763
+ // ../platform-kit/src/lib/tokens.ts
3805
4764
  var hsl = (name) => `hsl(var(${name}))`;
3806
4765
  var v = (name) => `var(${name})`;
3807
4766
  var tokens = {
@@ -3884,7 +4843,7 @@ var tokens = {
3884
4843
  chart12: v("--chart-12")
3885
4844
  };
3886
4845
 
3887
- // src/vendor/lib/canvas/resolve-canvas-tokens.ts
4846
+ // ../chat/src/lib/canvas/resolve-canvas-tokens.ts
3888
4847
  var TOKEN_KEYS = [
3889
4848
  "background",
3890
4849
  "foreground",
@@ -4230,7 +5189,7 @@ function CanvasCard({
4230
5189
  ] });
4231
5190
  }
4232
5191
 
4233
- // src/vendor/ui/chat/follow-up-polling.ts
5192
+ // ../chat/src/ui/chat/follow-up-polling.ts
4234
5193
  var DEFAULT_ATTEMPTS = 10;
4235
5194
  var DEFAULT_INITIAL_DELAY_MS = 1e3;
4236
5195
  var DEFAULT_RETRY_DELAY_MS = 1e3;
@@ -4276,7 +5235,8 @@ var AssistantMessage = memo(function AssistantMessage2({
4276
5235
  onFeedback,
4277
5236
  onFeedbackDetail,
4278
5237
  feedbackRating,
4279
- timestamp
5238
+ timestamp,
5239
+ turnStartedAtMs
4280
5240
  }) {
4281
5241
  const client = useClient();
4282
5242
  const openViewer = useArtifactStore((s) => s.openViewer);
@@ -4292,6 +5252,8 @@ var AssistantMessage = memo(function AssistantMessage2({
4292
5252
  const followUpsEnabled = useChatCapabilityEnabled("followUps");
4293
5253
  const workDetailsEnabled = useChatCapabilityEnabled("workDetails");
4294
5254
  const richTextEnabled = useChatCapabilityEnabled("richText");
5255
+ const webSearchImageResultsEnabled = useChatCapabilityEnabled("webSearchImageResults");
5256
+ const workFoldEnabled = useChatCapabilityEnabled("workFold");
4295
5257
  const persistedFollowUps = useMemo(() => {
4296
5258
  const part = parts.find((p) => p.type === "follow-ups");
4297
5259
  return part?.suggestions ?? null;
@@ -4364,6 +5326,18 @@ var AssistantMessage = memo(function AssistantMessage2({
4364
5326
  metadata
4365
5327
  });
4366
5328
  const displayTimestamp = displayTimestampValue ? new Date(displayTimestampValue) : void 0;
5329
+ const startedAtMs = useMemo(
5330
+ () => getMessageCreatedAtMs(message) ?? turnStartedAtMs ?? null,
5331
+ [message, turnStartedAtMs]
5332
+ );
5333
+ const persistedDurationMs = useMemo(() => {
5334
+ const completedAt = metadata?.completedAt;
5335
+ if (completedAt == null || startedAtMs == null) return null;
5336
+ const end = new Date(completedAt).getTime();
5337
+ if (!Number.isFinite(end)) return null;
5338
+ const elapsed = end - startedAtMs;
5339
+ return elapsed >= 1e3 ? elapsed : null;
5340
+ }, [metadata, startedAtMs]);
4367
5341
  const followUps = persistedFollowUps ?? polledFollowUps;
4368
5342
  const showFollowUps = followUpsEnabled && isLastMessage && followUps && followUps.length > 0 && onFollowUpClick && status !== "streaming";
4369
5343
  const messageText = useMemo(
@@ -4388,6 +5362,28 @@ var AssistantMessage = memo(function AssistantMessage2({
4388
5362
  ),
4389
5363
  [processedParts]
4390
5364
  );
5365
+ const hasWorkParts = useMemo(
5366
+ () => processedParts.some((p) => p.kind !== "text"),
5367
+ [processedParts]
5368
+ );
5369
+ const workSplitIndex = !workFoldEnabled || !hasWorkParts ? -1 : isStreamingMessage ? processedParts.length : lastTextIndex > 0 ? lastTextIndex : -1;
5370
+ const canvasesWithAnswer = !isStreamingMessage && workSplitIndex !== -1;
5371
+ const foldPartIndices = useMemo(() => {
5372
+ const indices = /* @__PURE__ */ new Set();
5373
+ if (workSplitIndex === -1) return indices;
5374
+ processedParts.forEach((processed, index) => {
5375
+ if (canvasesWithAnswer && processed.kind === "canvas") return;
5376
+ if (index < workSplitIndex) indices.add(index);
5377
+ else if (index > workSplitIndex && processed.kind !== "text") indices.add(index);
5378
+ });
5379
+ return indices;
5380
+ }, [processedParts, workSplitIndex, canvasesWithAnswer]);
5381
+ const hasPendingDecision = useMemo(
5382
+ () => processedParts.some(
5383
+ (p) => p.kind === "steps-group" && p.items.some((item) => isApprovalRequested(item.part))
5384
+ ),
5385
+ [processedParts]
5386
+ );
4391
5387
  const allCitations = useMemo(() => {
4392
5388
  const citations = [];
4393
5389
  for (const part of processedParts) {
@@ -4401,16 +5397,17 @@ var AssistantMessage = memo(function AssistantMessage2({
4401
5397
  const imageResults = useMemo(() => {
4402
5398
  const galleryImages = [];
4403
5399
  const inlineImageUrls = /* @__PURE__ */ new Set();
5400
+ const visibleImageTool = webSearchImageResultsEnabled ? void 0 : "display_image";
4404
5401
  for (const part of processedParts) {
4405
5402
  if (part.kind === "steps-group") {
4406
- galleryImages.push(...extractImagesFromSteps(part.items, "gallery"));
4407
- for (const image of extractImagesFromSteps(part.items, "inline")) {
5403
+ galleryImages.push(...extractImagesFromSteps(part.items, "gallery", visibleImageTool));
5404
+ for (const image of extractImagesFromSteps(part.items, "inline", visibleImageTool)) {
4408
5405
  inlineImageUrls.add(image.url);
4409
5406
  }
4410
5407
  }
4411
5408
  }
4412
5409
  return dedupeImageResults(galleryImages).filter((image) => !inlineImageUrls.has(image.url));
4413
- }, [processedParts]);
5410
+ }, [processedParts, webSearchImageResultsEnabled]);
4414
5411
  const documentArtifactIds = useMemo(() => {
4415
5412
  const ids = /* @__PURE__ */ new Set();
4416
5413
  for (const part of processedParts) {
@@ -4464,6 +5461,17 @@ var AssistantMessage = memo(function AssistantMessage2({
4464
5461
  [processedParts]
4465
5462
  );
4466
5463
  const handoffCards = handoffParts.length > 0 ? /* @__PURE__ */ jsx(Fragment, { children: handoffParts.map((p) => /* @__PURE__ */ jsx(SessionHandoffCard, { output: getToolOutput(p.part) }, `${message.id}-handoff-${p.index}`)) }) : null;
5464
+ const canvasCards = canvasesWithAnswer && richTextEnabled ? processedParts.map(
5465
+ (p) => p.kind === "canvas" ? /* @__PURE__ */ jsx(
5466
+ CanvasCard,
5467
+ {
5468
+ canvas: p.canvas,
5469
+ isStreaming: isStreamingMessage,
5470
+ conversationId
5471
+ },
5472
+ `${message.id}-canvas-${p.index}`
5473
+ ) : null
5474
+ ) : null;
4467
5475
  const hasTrailingCards = appParts.length > 0 || siteParts.length > 0;
4468
5476
  const showArtifactList = !isStreamingMessage && (messageArtifactListItems.length > 0 || hasTrailingCards);
4469
5477
  const latestAppId = appParts.length > 0 ? appParts[appParts.length - 1].part.appId : null;
@@ -4516,156 +5524,198 @@ var AssistantMessage = memo(function AssistantMessage2({
4516
5524
  {
4517
5525
  className: cn("gap-1 w-full max-w-none min-w-0"),
4518
5526
  children: [
4519
- richTextEnabled && /* @__PURE__ */ jsx(ImageResultsGallery, { images: imageResults, size: "compact" }),
4520
- processedParts.map((processed, groupIndex) => {
4521
- if (processed.kind === "steps-group") {
4522
- if (!workDetailsEnabled) {
5527
+ richTextEnabled && (!isStreamingMessage || workSplitIndex === -1) && /* @__PURE__ */ jsx(ImageResultsGallery, { images: imageResults, size: "compact" }),
5528
+ (() => {
5529
+ const renderPart = (processed, groupIndex) => {
5530
+ const insideFold = foldPartIndices.has(groupIndex);
5531
+ if (processed.kind === "steps-group") {
5532
+ if (!workDetailsEnabled) {
5533
+ if (insideFold) return null;
5534
+ return /* @__PURE__ */ jsx(
5535
+ MessageDecisionCards,
5536
+ {
5537
+ messageId: message.id,
5538
+ items: processed.items,
5539
+ conversationId,
5540
+ isStreamingMessage,
5541
+ hasLaterStepsGroup: groupIndex < lastStepsGroupIndex
5542
+ },
5543
+ `${message.id}-dc-${groupIndex}`
5544
+ );
5545
+ }
4523
5546
  return /* @__PURE__ */ jsx(
4524
- MessageDecisionCards,
5547
+ MessageStepsGroup,
4525
5548
  {
4526
5549
  messageId: message.id,
4527
5550
  items: processed.items,
4528
- conversationId,
4529
5551
  isStreamingMessage,
4530
- hasLaterStepsGroup: groupIndex < lastStepsGroupIndex
5552
+ hasLaterStepsGroup: groupIndex < lastStepsGroupIndex,
5553
+ onToolApproval,
5554
+ conversationId,
5555
+ hasResponseImageGroup
4531
5556
  },
4532
- `${message.id}-dc-${groupIndex}`
5557
+ `${message.id}-sg-${groupIndex}`
4533
5558
  );
4534
5559
  }
4535
- return /* @__PURE__ */ jsx(
4536
- MessageStepsGroup,
4537
- {
4538
- messageId: message.id,
4539
- items: processed.items,
4540
- isStreamingMessage,
4541
- hasLaterStepsGroup: groupIndex < lastStepsGroupIndex,
4542
- onToolApproval,
4543
- conversationId,
4544
- hasResponseImageGroup
4545
- },
4546
- `${message.id}-sg-${groupIndex}`
4547
- );
4548
- }
4549
- if (processed.kind === "plan") {
4550
- return null;
4551
- }
4552
- if (processed.kind === "document-stream") {
4553
- if (!richTextEnabled) return null;
4554
- return /* @__PURE__ */ jsx(
4555
- DocumentStreamCard,
4556
- {
4557
- title: processed.document.title,
4558
- content: processed.document.content,
4559
- mimeType: processed.document.mimeType,
4560
- state: processed.document.state,
4561
- action: processed.document.action,
4562
- artifactId: processed.document.artifactId,
4563
- version: processed.document.version,
4564
- errorText: processed.document.errorText,
4565
- onOpen: processed.document.artifactId ? () => openViewer(processed.document.artifactId, processed.document.version) : void 0
4566
- },
4567
- `${message.id}-doc-${processed.index}`
4568
- );
4569
- }
4570
- if (processed.kind === "canvas") {
4571
- if (!richTextEnabled) return null;
4572
- return /* @__PURE__ */ jsx(
4573
- CanvasCard,
4574
- {
4575
- canvas: processed.canvas,
4576
- isStreaming: isStreamingMessage,
4577
- conversationId
4578
- },
4579
- `${message.id}-canvas-${processed.index}`
4580
- );
4581
- }
4582
- if (processed.kind === "session-handoff") {
4583
- if (lastTextIndex !== -1) return null;
4584
- return /* @__PURE__ */ jsx(
4585
- SessionHandoffCard,
4586
- {
4587
- output: getToolOutput(processed.part)
4588
- },
4589
- `${message.id}-handoff-${processed.index}`
4590
- );
4591
- }
4592
- if (processed.kind === "supervisor-approval") {
4593
- const toolState = getToolState(processed.part);
4594
- const input = getToolInput(processed.part);
4595
- const output = getToolOutput(processed.part);
4596
- let cardState = "waiting";
4597
- if (toolState === "input-streaming" || toolState === "input-available" || toolState === "partial-call" || toolState === "call") {
4598
- cardState = "waiting";
4599
- } else if (toolState === "output-error" || toolState === "error") {
4600
- cardState = "error";
4601
- } else if (output) {
4602
- if (output.success === false) cardState = "error";
4603
- else if (output.timedOut || output.status === "timed_out") cardState = "timeout";
4604
- else if (output.status === "approved") cardState = "approved";
4605
- else if (output.status === "rejected") cardState = "rejected";
4606
- else cardState = "waiting";
5560
+ if (processed.kind === "plan") {
5561
+ return null;
5562
+ }
5563
+ if (processed.kind === "document-stream") {
5564
+ if (!richTextEnabled) return null;
5565
+ return /* @__PURE__ */ jsx(
5566
+ DocumentStreamCard,
5567
+ {
5568
+ title: processed.document.title,
5569
+ content: processed.document.content,
5570
+ mimeType: processed.document.mimeType,
5571
+ state: processed.document.state,
5572
+ action: processed.document.action,
5573
+ artifactId: processed.document.artifactId,
5574
+ version: processed.document.version,
5575
+ errorText: processed.document.errorText,
5576
+ onOpen: processed.document.artifactId ? () => openViewer(processed.document.artifactId, processed.document.version) : void 0
5577
+ },
5578
+ `${message.id}-doc-${processed.index}`
5579
+ );
5580
+ }
5581
+ if (processed.kind === "canvas") {
5582
+ if (!richTextEnabled) return null;
5583
+ if (canvasesWithAnswer) return null;
5584
+ return /* @__PURE__ */ jsx(
5585
+ CanvasCard,
5586
+ {
5587
+ canvas: processed.canvas,
5588
+ isStreaming: isStreamingMessage,
5589
+ conversationId
5590
+ },
5591
+ `${message.id}-canvas-${processed.index}`
5592
+ );
5593
+ }
5594
+ if (processed.kind === "session-handoff") {
5595
+ if (lastTextIndex !== -1) return null;
5596
+ return /* @__PURE__ */ jsx(
5597
+ SessionHandoffCard,
5598
+ {
5599
+ output: getToolOutput(processed.part)
5600
+ },
5601
+ `${message.id}-handoff-${processed.index}`
5602
+ );
5603
+ }
5604
+ if (processed.kind === "supervisor-approval") {
5605
+ const toolState = getToolState(processed.part);
5606
+ const input = getToolInput(processed.part);
5607
+ const output = getToolOutput(processed.part);
5608
+ let cardState = "waiting";
5609
+ if (toolState === "input-streaming" || toolState === "input-available" || toolState === "partial-call" || toolState === "call") {
5610
+ cardState = "waiting";
5611
+ } else if (toolState === "output-error" || toolState === "error") {
5612
+ cardState = "error";
5613
+ } else if (output) {
5614
+ if (output.success === false) cardState = "error";
5615
+ else if (output.timedOut || output.status === "timed_out") cardState = "timeout";
5616
+ else if (output.status === "approved") cardState = "approved";
5617
+ else if (output.status === "rejected") cardState = "rejected";
5618
+ else cardState = "waiting";
5619
+ }
5620
+ const toolCallId = processed.part.toolCallId;
5621
+ return /* @__PURE__ */ jsx(
5622
+ SupervisorApprovalCard,
5623
+ {
5624
+ state: cardState,
5625
+ toolCallId,
5626
+ input,
5627
+ output,
5628
+ errorText: getToolErrorText(processed.part)
5629
+ },
5630
+ `${message.id}-sup-${processed.index}`
5631
+ );
5632
+ }
5633
+ if (processed.kind === "artifact") {
5634
+ return null;
5635
+ }
5636
+ if (processed.kind === "text") {
5637
+ const isLast = groupIndex === lastTextIndex;
5638
+ const artifactList = isLast && showArtifactList ? /* @__PURE__ */ jsx(
5639
+ MessageArtifactList,
5640
+ {
5641
+ items: messageArtifactListItems,
5642
+ extraRows: trailingCards,
5643
+ presentation
5644
+ }
5645
+ ) : void 0;
5646
+ return /* @__PURE__ */ jsx(
5647
+ MessageTextBlock,
5648
+ {
5649
+ messageId: message.id,
5650
+ partIndex: processed.index,
5651
+ animateArrival: presentation === "bubble" && processed.index >= animateTextFromIndex,
5652
+ text: processed.part.text,
5653
+ fullMessageText: messageText,
5654
+ isLastTextBlock: isLast,
5655
+ bubbleTopFull: bubbleRunFirst && groupIndex === firstTextIndex,
5656
+ bubbleBottomFull: bubbleRunLast && isLast,
5657
+ presentation,
5658
+ isStreaming: isStreamingMessage,
5659
+ onFork: onFork ? () => onFork(message.id) : void 0,
5660
+ timestamp: displayTimestamp,
5661
+ feedbackRating,
5662
+ onFeedback,
5663
+ onFeedbackDetail,
5664
+ onRegenerate: onRegenerate ? () => onRegenerate(message.id) : void 0,
5665
+ isLastMessage,
5666
+ citations: isLast ? allCitations : void 0,
5667
+ enriched: isLast ? enriched : void 0,
5668
+ metadata: isLast ? metadata : void 0,
5669
+ beforeToolbar: isLast ? /* @__PURE__ */ jsxs(Fragment, { children: [
5670
+ canvasCards,
5671
+ artifactList,
5672
+ handoffCards,
5673
+ !isStreamingMessage && conversationId && /* @__PURE__ */ jsx(AgentRoutineOfferFooter, { conversationId, messageId: message.id })
5674
+ ] }) : artifactList
5675
+ },
5676
+ `${message.id}-txt-${processed.index}-container`
5677
+ );
4607
5678
  }
4608
- const toolCallId = processed.part.toolCallId;
4609
- return /* @__PURE__ */ jsx(
4610
- SupervisorApprovalCard,
4611
- {
4612
- state: cardState,
4613
- toolCallId,
4614
- input,
4615
- output,
4616
- errorText: getToolErrorText(processed.part)
4617
- },
4618
- `${message.id}-sup-${processed.index}`
4619
- );
4620
- }
4621
- if (processed.kind === "artifact") {
4622
5679
  return null;
5680
+ };
5681
+ if (workSplitIndex === -1) {
5682
+ return processedParts.map(renderPart);
4623
5683
  }
4624
- if (processed.kind === "text") {
4625
- const isLast = groupIndex === lastTextIndex;
4626
- const artifactList = isLast && showArtifactList ? /* @__PURE__ */ jsx(
4627
- MessageArtifactList,
4628
- {
4629
- items: messageArtifactListItems,
4630
- extraRows: trailingCards,
4631
- presentation
4632
- }
4633
- ) : void 0;
4634
- return /* @__PURE__ */ jsx(
4635
- MessageTextBlock,
5684
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
5685
+ /* @__PURE__ */ jsxs(
5686
+ MessageWorkFold,
4636
5687
  {
4637
- messageId: message.id,
4638
- partIndex: processed.index,
4639
- animateArrival: presentation === "bubble" && processed.index >= animateTextFromIndex,
4640
- text: processed.part.text,
4641
- fullMessageText: messageText,
4642
- isLastTextBlock: isLast,
4643
- bubbleTopFull: bubbleRunFirst && groupIndex === firstTextIndex,
4644
- bubbleBottomFull: bubbleRunLast && isLast,
4645
- presentation,
4646
5688
  isStreaming: isStreamingMessage,
4647
- onFork: onFork ? () => onFork(message.id) : void 0,
4648
- timestamp: displayTimestamp,
4649
- feedbackRating,
4650
- onFeedback,
4651
- onFeedbackDetail,
4652
- onRegenerate: onRegenerate ? () => onRegenerate(message.id) : void 0,
4653
- isLastMessage,
4654
- citations: isLast ? allCitations : void 0,
4655
- enriched: isLast ? enriched : void 0,
4656
- metadata: isLast ? metadata : void 0,
4657
- beforeToolbar: isLast ? /* @__PURE__ */ jsxs(Fragment, { children: [
4658
- artifactList,
4659
- handoffCards,
4660
- !isStreamingMessage && conversationId && /* @__PURE__ */ jsx(AgentRoutineOfferFooter, { conversationId, messageId: message.id })
4661
- ] }) : artifactList
4662
- },
4663
- `${message.id}-txt-${processed.index}-container`
4664
- );
4665
- }
4666
- return null;
4667
- }),
4668
- lastTextIndex === -1 && showArtifactList && /* @__PURE__ */ jsx(
5689
+ forceOpen: hasPendingDecision,
5690
+ persistedDurationMs,
5691
+ startedAtMs,
5692
+ children: [
5693
+ richTextEnabled && isStreamingMessage ? /* @__PURE__ */ jsx(ImageResultsGallery, { images: imageResults, size: "compact", collapsible: true }) : null,
5694
+ processedParts.map(
5695
+ (processed, i) => foldPartIndices.has(i) ? renderPart(processed, i) : null
5696
+ )
5697
+ ]
5698
+ }
5699
+ ),
5700
+ processedParts.map(
5701
+ (processed, i) => foldPartIndices.has(i) && processed.kind === "steps-group" ? /* @__PURE__ */ jsx(
5702
+ MessageDecisionCards,
5703
+ {
5704
+ messageId: message.id,
5705
+ items: processed.items,
5706
+ conversationId,
5707
+ isStreamingMessage,
5708
+ hasLaterStepsGroup: i < lastStepsGroupIndex
5709
+ },
5710
+ `${message.id}-dc-hoist-${i}`
5711
+ ) : null
5712
+ ),
5713
+ processedParts.map(
5714
+ (processed, i) => foldPartIndices.has(i) ? null : renderPart(processed, i)
5715
+ )
5716
+ ] });
5717
+ })(),
5718
+ lastTextIndex === -1 && showArtifactList && (!isStreamingMessage || workSplitIndex === -1) && /* @__PURE__ */ jsx(
4669
5719
  MessageArtifactList,
4670
5720
  {
4671
5721
  items: messageArtifactListItems,
@@ -4686,7 +5736,7 @@ var AssistantMessage = memo(function AssistantMessage2({
4686
5736
  );
4687
5737
  });
4688
5738
 
4689
- // src/vendor/ui/chat/message-thread/utils.ts
5739
+ // ../chat/src/ui/chat/message-thread/utils.ts
4690
5740
  var PROCESSING_MESSAGES = [
4691
5741
  "Thinking...",
4692
5742
  "Pondering...",
@@ -4770,6 +5820,7 @@ function ProcessingIndicator({
4770
5820
  agentName: agentNameProp,
4771
5821
  avatarSeed,
4772
5822
  avatarConfig,
5823
+ showAvatar = true,
4773
5824
  status,
4774
5825
  activity,
4775
5826
  phase
@@ -4791,7 +5842,7 @@ function ProcessingIndicator({
4791
5842
  const phrase = phase === "tool" && activity ? `${activity}${/(?:…|\.\.\.)$/.test(activity) ? "" : "\u2026"}` : generalPhase ? t(`chat.activity.${generalPhase}${agentName ? "" : "Unnamed"}`, { agent: agentName ?? "" }) : activity ?? PROCESSING_MESSAGES[phraseIndex];
4792
5843
  const visiblePhrase = useMinimumPhraseDuration(phrase);
4793
5844
  return /* @__PURE__ */ jsx(Message, { from: "assistant", className: "max-w-none", children: /* @__PURE__ */ jsx(MessageContent, { className: "w-full max-w-none min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-2 text-sm animate-in fade-in slide-in-from-bottom-1 duration-300", children: [
4794
- /* @__PURE__ */ jsx(
5845
+ showAvatar && /* @__PURE__ */ jsx(
4795
5846
  AgentAvatar,
4796
5847
  {
4797
5848
  name: agentName,
@@ -4806,6 +5857,54 @@ function ProcessingIndicator({
4806
5857
  /* @__PURE__ */ jsx(Shimmer, { as: "span", children: visiblePhrase }, visiblePhrase)
4807
5858
  ] }) }) });
4808
5859
  }
5860
+ function LayoutLeftRightIcon(props) {
5861
+ return /* @__PURE__ */ jsxs(
5862
+ "svg",
5863
+ {
5864
+ "aria-hidden": "true",
5865
+ role: "img",
5866
+ "aria-label": "layout-left-right, margin, padding",
5867
+ width: "24px",
5868
+ height: "24px",
5869
+ viewBox: "0 0 24 24",
5870
+ fill: "none",
5871
+ xmlns: "http://www.w3.org/2000/svg",
5872
+ ...props,
5873
+ children: [
5874
+ /* @__PURE__ */ jsx(
5875
+ "path",
5876
+ {
5877
+ d: "M7.75 6.75C7.75 5.09315 9.09315 3.75 10.75 3.75L13.25 3.75C14.9069 3.75 16.25 5.09315 16.25 6.75L16.25 17.25C16.25 18.9069 14.9069 20.25 13.25 20.25H10.75C9.09315 20.25 7.75 18.9069 7.75 17.25L7.75 6.75Z",
5878
+ stroke: "currentColor",
5879
+ strokeWidth: "1.5",
5880
+ strokeLinecap: "round",
5881
+ strokeLinejoin: "round"
5882
+ }
5883
+ ),
5884
+ /* @__PURE__ */ jsx(
5885
+ "path",
5886
+ {
5887
+ d: "M20.25 3.75V20.25",
5888
+ stroke: "currentColor",
5889
+ strokeWidth: "1.5",
5890
+ strokeLinecap: "round",
5891
+ strokeLinejoin: "round"
5892
+ }
5893
+ ),
5894
+ /* @__PURE__ */ jsx(
5895
+ "path",
5896
+ {
5897
+ d: "M3.75 3.75V20.25",
5898
+ stroke: "currentColor",
5899
+ strokeWidth: "1.5",
5900
+ strokeLinecap: "round",
5901
+ strokeLinejoin: "round"
5902
+ }
5903
+ )
5904
+ ]
5905
+ }
5906
+ );
5907
+ }
4809
5908
  function ActionButton({
4810
5909
  onClick,
4811
5910
  title,
@@ -4907,7 +6006,7 @@ function InlineEdit({ initialText, onSubmit, onCancel }) {
4907
6006
  ] });
4908
6007
  }
4909
6008
 
4910
- // src/vendor/ui/stores/pending-files.ts
6009
+ // ../chat/src/ui/stores/pending-files.ts
4911
6010
  var pendingFiles = /* @__PURE__ */ new Map();
4912
6011
  function setPendingFiles(text, files) {
4913
6012
  pendingFiles.set(text, files);
@@ -4954,8 +6053,15 @@ function useUploadFile() {
4954
6053
  }
4955
6054
  };
4956
6055
  }
6056
+ function dynamic(load, options = {}) {
6057
+ const Lazy = lazy(load);
6058
+ const fallback = options.loading?.() ?? null;
6059
+ return function DynamicComponent(props) {
6060
+ return /* @__PURE__ */ jsx(Suspense, { fallback, children: /* @__PURE__ */ jsx(Lazy, { ...props }) });
6061
+ };
6062
+ }
4957
6063
  var PdfCoverThumbnailInner = dynamic(
4958
- () => import('./pdf-cover-thumbnail-inner-4N2Q5AAG.js'),
6064
+ () => import('./pdf-cover-thumbnail-inner-B2P6S25B.js'),
4959
6065
  { ssr: false, loading: () => null }
4960
6066
  );
4961
6067
  function PdfCoverThumbnail({
@@ -5042,7 +6148,7 @@ function previewKind(ref) {
5042
6148
  if (/\.(jpe?g|png|gif|webp|bmp|svg|avif|heic|heif)$/i.test(ref.filename)) return "image";
5043
6149
  return "link";
5044
6150
  }
5045
- var Pdf = dynamic(() => import('./pdf-viewer-inner-GPES3KG2.js'), {
6151
+ var Pdf = dynamic(() => import('./pdf-viewer-inner-CXWPRACH.js'), {
5046
6152
  ssr: false,
5047
6153
  loading: () => /* @__PURE__ */ jsx("div", { className: "p-6 text-sm text-muted-foreground", children: "Loading preview\u2026" })
5048
6154
  });
@@ -5378,6 +6484,88 @@ function useBackDismiss({
5378
6484
  };
5379
6485
  }, [active]);
5380
6486
  }
6487
+ function TextSelectIcon(props) {
6488
+ return /* @__PURE__ */ jsxs(
6489
+ "svg",
6490
+ {
6491
+ "aria-hidden": "true",
6492
+ role: "img",
6493
+ "aria-label": "text-select, lollipops",
6494
+ width: "24px",
6495
+ height: "24px",
6496
+ viewBox: "0 0 24 24",
6497
+ fill: "none",
6498
+ xmlns: "http://www.w3.org/2000/svg",
6499
+ ...props,
6500
+ children: [
6501
+ /* @__PURE__ */ jsx(
6502
+ "path",
6503
+ {
6504
+ d: "M4.25 7.25V15.75C4.25 17.4069 5.59315 18.75 7.25 18.75H13.25",
6505
+ stroke: "currentColor",
6506
+ strokeWidth: "1.5",
6507
+ strokeLinecap: "round",
6508
+ strokeLinejoin: "round"
6509
+ }
6510
+ ),
6511
+ /* @__PURE__ */ jsx(
6512
+ "path",
6513
+ {
6514
+ d: "M19.75 16.75V8.25C19.75 6.59315 18.4069 5.25 16.75 5.25H10.75",
6515
+ stroke: "currentColor",
6516
+ strokeWidth: "1.5",
6517
+ strokeLinecap: "round",
6518
+ strokeLinejoin: "round"
6519
+ }
6520
+ ),
6521
+ /* @__PURE__ */ jsx(
6522
+ "circle",
6523
+ {
6524
+ cx: "4.25",
6525
+ cy: "5",
6526
+ r: "2.25",
6527
+ stroke: "currentColor",
6528
+ strokeWidth: "1.5",
6529
+ strokeLinecap: "round",
6530
+ strokeLinejoin: "round"
6531
+ }
6532
+ ),
6533
+ /* @__PURE__ */ jsx(
6534
+ "circle",
6535
+ {
6536
+ cx: "19.75",
6537
+ cy: "19",
6538
+ r: "2.25",
6539
+ stroke: "currentColor",
6540
+ strokeWidth: "1.5",
6541
+ strokeLinecap: "round",
6542
+ strokeLinejoin: "round"
6543
+ }
6544
+ ),
6545
+ /* @__PURE__ */ jsx(
6546
+ "path",
6547
+ {
6548
+ d: "M9.25 10.25H14.75",
6549
+ stroke: "currentColor",
6550
+ strokeWidth: "1.5",
6551
+ strokeLinecap: "round",
6552
+ strokeLinejoin: "round"
6553
+ }
6554
+ ),
6555
+ /* @__PURE__ */ jsx(
6556
+ "path",
6557
+ {
6558
+ d: "M9.25 13.75H12.75",
6559
+ stroke: "currentColor",
6560
+ strokeWidth: "1.5",
6561
+ strokeLinecap: "round",
6562
+ strokeLinejoin: "round"
6563
+ }
6564
+ )
6565
+ ]
6566
+ }
6567
+ );
6568
+ }
5381
6569
  function UserMessageActionsSheet({
5382
6570
  open,
5383
6571
  onOpenChange,
@@ -5906,4 +7094,4 @@ function Thinking({
5906
7094
  ) });
5907
7095
  }
5908
7096
 
5909
- export { COMPOSER_ID_MAIN, CSV_PREVIEW_MAX_ROWS, CanvasWidget, CopyButton, Message2 as Message, ModelIcon, PdfViewer, Spinner, Thinking, brandLabel, csvTextToWorkbookJson, isPlainTextLanguage, modeToBrandRow, setPendingFiles, useBackDismiss, useChatStreamStore, useComposerStore, useComputer, useComputerFiles, useContextWindowInfo, useIsCompacting, useLivePreviewUrl, useQueuedMessages, useUploadComputerFile, useUploadFile };
7097
+ export { ArrowRotateClockwiseIcon, COMPOSER_ID_COPILOT, COMPOSER_ID_MAIN, CSV_PREVIEW_MAX_ROWS, CanvasWidget, CopyButton, Message2 as Message, ModelIcon, PdfViewer, Spinner, Thinking, VolumeFullIcon, WarningSignIcon, brandLabel, csvTextToWorkbookJson, dynamic, isPlainTextLanguage, modeToBrandRow, setPendingFiles, useBackDismiss, useChatStreamStore, useComposerStore, useComputer, useComputerFiles, useContextWindowInfo, useIsCompacting, useLivePreviewUrl, useQueuedMessages, useUploadComputerFile, useUploadFile };