@frontera-sdk/chat-ui 1.52.19 → 1.52.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
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, 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-QFVBVBUR.js';
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, unwrapDataDeep, formatDecisionTime, DecisionCard, LoaderIcon, formatRelativeTime, CircleCheckIcon, agentRoutineKeys, useOptionalAgentsContext, avatarMotionForStream, AGENT_AVATAR_SIZE } from './chunk-OMOIIMNG.js';
3
3
  import { Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription, Popover, PopoverTrigger, PopoverContent } from './chunk-T5SANYSX.js';
4
- import { useIsMobile, useTranslation } from './chunk-I5NAI7HP.js';
4
+ import { useIsMobile, useTranslation } from './chunk-AVSAEPHS.js';
5
5
  import { MessageToolbar, MessageResponse, SquareArrowTopRightIcon, FileTextIcon, Shimmer, ClipboardIcon, Message, MessageContent, PencilIcon, deferDuringLayoutMotion, HoverCard, HoverCardTrigger, HoverCardContent, Collapse, Icon, CircleXIcon, ClockIcon } from './chunk-PKNEC4LJ.js';
6
6
  import { ChevronDownMediumIcon, Button, ScrollArea, Skeleton } from './chunk-UWKO24VT.js';
7
7
  import { CrossMediumIcon } from './chunk-2P4IEVOQ.js';
@@ -19,6 +19,23 @@ import { CodeBlock, defaultUrlTransform } from 'streamdown';
19
19
  import { create } from 'zustand';
20
20
  import { toast } from 'sonner';
21
21
 
22
+ // ../chat/src/ui/chat/fold-part-indices.ts
23
+ function foldPartIndices(kinds, workSplitIndex, canvasesWithAnswer) {
24
+ const indices = /* @__PURE__ */ new Set();
25
+ if (workSplitIndex === -1) return indices;
26
+ kinds.forEach((kind, index) => {
27
+ if (kind === "person-confirmation" || kind === "scripted-text") return;
28
+ if (canvasesWithAnswer && kind === "canvas") return;
29
+ if (index < workSplitIndex) indices.add(index);
30
+ else if (index > workSplitIndex && kind !== "text") indices.add(index);
31
+ });
32
+ return indices;
33
+ }
34
+ function foldKind(processed) {
35
+ if (processed.kind !== "text") return processed.kind;
36
+ const meta = processed.part?.providerMetadata;
37
+ return meta?.frontera?.scripted === true ? "scripted-text" : "text";
38
+ }
22
39
  function formatElapsed(ms) {
23
40
  const total = Math.max(0, Math.round(ms / 1e3));
24
41
  if (total < 60) return `${total}s`;
@@ -3959,6 +3976,143 @@ function SessionHandoffCard({ output }) {
3959
3976
  if (!details.offered || !details.handoffId) return null;
3960
3977
  return /* @__PURE__ */ jsx(SessionHandoffOffer, { handoffId: details.handoffId });
3961
3978
  }
3979
+ var personConfirmationKeys = {
3980
+ all: ["person-confirmation"],
3981
+ list: (conversationId) => ["person-confirmation", "list", conversationId]
3982
+ };
3983
+ function usePersonConfirmations(conversationId, { poll }) {
3984
+ const client = useClient();
3985
+ return useQuery({
3986
+ queryKey: personConfirmationKeys.list(conversationId),
3987
+ enabled: !!conversationId,
3988
+ refetchInterval: (query) => poll(query.state.data ?? {}) ? 2e3 : false,
3989
+ queryFn: async () => {
3990
+ const { data, error } = await client.v1.chat.confirmations.get({ query: { conversationId } });
3991
+ if (error) throw error;
3992
+ const confirmations = unwrapDataDeep(data);
3993
+ if (!Array.isArray(confirmations)) return {};
3994
+ return Object.fromEntries(confirmations.map((confirmation) => [confirmation.id, confirmation]));
3995
+ }
3996
+ });
3997
+ }
3998
+ function useDecidePersonConfirmation(conversationId) {
3999
+ const client = useClient();
4000
+ const queryClient = useQueryClient();
4001
+ return useMutation({
4002
+ mutationFn: async ({ id, decision }) => {
4003
+ const { data, error } = await client.v1.chat.confirmations[id].post({ decision });
4004
+ if (error) throw error;
4005
+ return unwrapDataDeep(data);
4006
+ },
4007
+ onSettled: () => {
4008
+ queryClient.invalidateQueries({ queryKey: personConfirmationKeys.list(conversationId) });
4009
+ }
4010
+ });
4011
+ }
4012
+
4013
+ // ../chat/src/ui/chat/person-confirmation-card/utils/confirmation-state.ts
4014
+ function confirmationState(confirmation, local, now = /* @__PURE__ */ new Date()) {
4015
+ if (confirmation.status !== "pending") return confirmation.status;
4016
+ if (local?.phase === "sent") return local.decision === "confirm" ? "confirmed" : "cancelled";
4017
+ if (local?.phase === "sending") return "sending";
4018
+ const expires = confirmation.expiresAt ? new Date(confirmation.expiresAt).getTime() : Number.NaN;
4019
+ if (Number.isFinite(expires) && expires <= now.getTime()) return "expired";
4020
+ return "pending";
4021
+ }
4022
+ function PersonConfirmationCard({
4023
+ confirmation,
4024
+ onDecide
4025
+ }) {
4026
+ const { t, locale } = useTranslation();
4027
+ const [local, setLocal] = useState(null);
4028
+ const [answeredAt, setAnsweredAt] = useState(null);
4029
+ const [, setTick] = useState(0);
4030
+ useEffect(() => {
4031
+ if (confirmation.status !== "pending" || !confirmation.expiresAt) return;
4032
+ const wait2 = new Date(confirmation.expiresAt).getTime() - Date.now();
4033
+ if (!Number.isFinite(wait2) || wait2 <= 0) return;
4034
+ const timer = setTimeout(() => setTick((n) => n + 1), Math.min(wait2 + 50, 2 ** 31 - 1));
4035
+ return () => clearTimeout(timer);
4036
+ }, [confirmation.status, confirmation.expiresAt]);
4037
+ const state = confirmationState(confirmation, local);
4038
+ async function decide(decision) {
4039
+ setLocal({ phase: "sending", decision });
4040
+ try {
4041
+ await onDecide(decision);
4042
+ setAnsweredAt((/* @__PURE__ */ new Date()).toISOString());
4043
+ setLocal({ phase: "sent", decision });
4044
+ } catch {
4045
+ setLocal({ phase: "failed", decision });
4046
+ }
4047
+ }
4048
+ const when = confirmation.answeredAt ?? answeredAt;
4049
+ const time = when ? formatDecisionTime(when, locale) : "";
4050
+ const pressed = state === "confirmed" ? confirmation.confirmLabel || t("chat.personConfirmation.confirm") : state === "cancelled" ? confirmation.cancelLabel || t("chat.personConfirmation.cancel") : null;
4051
+ const settled = pressed ? time ? t("chat.personConfirmation.choseAt", { label: pressed, time }) : t("chat.personConfirmation.chose", { label: pressed }) : state === "expired" ? t("chat.personConfirmation.expired") : void 0;
4052
+ const tone = state === "confirmed" ? "ok" : state === "cancelled" || state === "expired" ? "warn" : "idle";
4053
+ const sending = state === "sending";
4054
+ return /* @__PURE__ */ jsxs(
4055
+ DecisionCard,
4056
+ {
4057
+ testId: "person-confirmation-card",
4058
+ tone,
4059
+ icon: /* @__PURE__ */ jsx(CheckCircle2Icon, { "aria-hidden": true }),
4060
+ kind: t("chat.personConfirmation.kind"),
4061
+ settled,
4062
+ question: confirmation.summary,
4063
+ note: sending ? t("chat.personConfirmation.sending") : confirmation.expiresAt ? t("chat.personConfirmation.expires", { when: formatRelativeTime(confirmation.expiresAt) }) : void 0,
4064
+ actions: /* @__PURE__ */ jsxs(Fragment, { children: [
4065
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "outline", disabled: sending, onClick: () => void decide("cancel"), children: confirmation.cancelLabel || t("chat.personConfirmation.cancel") }),
4066
+ /* @__PURE__ */ jsxs(Button, { size: "sm", disabled: sending, onClick: () => void decide("confirm"), children: [
4067
+ sending && local?.decision === "confirm" && /* @__PURE__ */ jsx(LoaderIcon, { className: "size-3.5 animate-spin", "aria-hidden": true }),
4068
+ confirmation.confirmLabel || t("chat.personConfirmation.confirm")
4069
+ ] })
4070
+ ] }),
4071
+ children: [
4072
+ settled == null && confirmation.details && /* @__PURE__ */ jsx("p", { className: "mt-1 whitespace-pre-line break-words text-sm text-muted-foreground", children: confirmation.details }),
4073
+ settled == null && local?.phase === "failed" && /* @__PURE__ */ jsx("p", { role: "alert", className: "mt-2 text-xs text-destructive", children: t("chat.personConfirmation.failed") })
4074
+ ]
4075
+ }
4076
+ );
4077
+ }
4078
+
4079
+ // ../chat/src/ui/chat/person-confirmation-card/utils/read-confirmation.ts
4080
+ function withServerStatus(confirmation, server) {
4081
+ if (!server || server.status === confirmation.status || server.status === "pending") return confirmation;
4082
+ return { ...confirmation, status: server.status };
4083
+ }
4084
+ function unshownPendingConfirmations(confirmations, messages, keep = /* @__PURE__ */ new Set()) {
4085
+ const shown = /* @__PURE__ */ new Set();
4086
+ for (const message of messages) {
4087
+ for (const part of message.parts ?? []) {
4088
+ if (part?.type !== "data-person-confirmation") continue;
4089
+ const id = part.data?.id;
4090
+ if (typeof id === "string") shown.add(id);
4091
+ }
4092
+ }
4093
+ return Object.values(confirmations ?? {}).filter(
4094
+ (confirmation) => !shown.has(confirmation.id) && (confirmation.status === "pending" || keep.has(confirmation.id))
4095
+ );
4096
+ }
4097
+ function ConversationConfirmationCard({
4098
+ confirmation,
4099
+ conversationId
4100
+ }) {
4101
+ const server = usePersonConfirmations(conversationId, {
4102
+ poll: (all) => withServerStatus(confirmation, all[confirmation.id]).status === "pending"
4103
+ });
4104
+ const view = withServerStatus(confirmation, server.data?.[confirmation.id]);
4105
+ const decide = useDecidePersonConfirmation(conversationId);
4106
+ return /* @__PURE__ */ jsx(
4107
+ PersonConfirmationCard,
4108
+ {
4109
+ confirmation: view,
4110
+ onDecide: async (decision) => {
4111
+ await decide.mutateAsync({ id: confirmation.id, decision });
4112
+ }
4113
+ }
4114
+ );
4115
+ }
3962
4116
  function PublishedCard({ details }) {
3963
4117
  const [copied, setCopied] = useState(false);
3964
4118
  const copy = () => {
@@ -5368,19 +5522,13 @@ var AssistantMessage = memo(function AssistantMessage2({
5368
5522
  );
5369
5523
  const workSplitIndex = !workFoldEnabled || !hasWorkParts ? -1 : isStreamingMessage ? processedParts.length : lastTextIndex > 0 ? lastTextIndex : -1;
5370
5524
  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]);
5525
+ const foldPartIndices2 = useMemo(
5526
+ () => foldPartIndices(processedParts.map(foldKind), workSplitIndex, canvasesWithAnswer),
5527
+ [processedParts, workSplitIndex, canvasesWithAnswer]
5528
+ );
5381
5529
  const hasPendingDecision = useMemo(
5382
5530
  () => processedParts.some(
5383
- (p) => p.kind === "steps-group" && p.items.some((item) => isApprovalRequested(item.part))
5531
+ (p) => p.kind === "person-confirmation" && p.confirmation.status === "pending" || p.kind === "steps-group" && p.items.some((item) => isApprovalRequested(item.part))
5384
5532
  ),
5385
5533
  [processedParts]
5386
5534
  );
@@ -5481,7 +5629,7 @@ var AssistantMessage = memo(function AssistantMessage2({
5481
5629
  useCanvasStore.getState().openComputer({ computerId: latest.computerId, appId: latest.appId, appDir: latest.appDir ?? null, title: latest.title });
5482
5630
  }, [latestAppId]);
5483
5631
  processedParts.length > 0 && processedParts.some(
5484
- (p) => p.kind === "text" && !!p.part.text?.trim() || p.kind === "steps-group" || p.kind === "artifact" || p.kind === "document-stream" || p.kind === "supervisor-approval" || p.kind === "session-handoff" || p.kind === "canvas"
5632
+ (p) => p.kind === "text" && !!p.part.text?.trim() || p.kind === "steps-group" || p.kind === "artifact" || p.kind === "document-stream" || p.kind === "supervisor-approval" || p.kind === "session-handoff" || p.kind === "canvas" || p.kind === "person-confirmation"
5485
5633
  );
5486
5634
  const trailingCards = appParts.length > 0 || siteParts.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
5487
5635
  appParts.map((p) => /* @__PURE__ */ jsx(
@@ -5527,7 +5675,7 @@ var AssistantMessage = memo(function AssistantMessage2({
5527
5675
  richTextEnabled && (!isStreamingMessage || workSplitIndex === -1) && /* @__PURE__ */ jsx(ImageResultsGallery, { images: imageResults, size: "compact" }),
5528
5676
  (() => {
5529
5677
  const renderPart = (processed, groupIndex) => {
5530
- const insideFold = foldPartIndices.has(groupIndex);
5678
+ const insideFold = foldPartIndices2.has(groupIndex);
5531
5679
  if (processed.kind === "steps-group") {
5532
5680
  if (!workDetailsEnabled) {
5533
5681
  if (insideFold) return null;
@@ -5560,6 +5708,16 @@ var AssistantMessage = memo(function AssistantMessage2({
5560
5708
  if (processed.kind === "plan") {
5561
5709
  return null;
5562
5710
  }
5711
+ if (processed.kind === "person-confirmation") {
5712
+ return /* @__PURE__ */ jsx(
5713
+ ConversationConfirmationCard,
5714
+ {
5715
+ confirmation: processed.confirmation,
5716
+ conversationId
5717
+ },
5718
+ `${message.id}-confirmation-${processed.confirmation.id}`
5719
+ );
5720
+ }
5563
5721
  if (processed.kind === "document-stream") {
5564
5722
  if (!richTextEnabled) return null;
5565
5723
  return /* @__PURE__ */ jsx(
@@ -5692,13 +5850,13 @@ var AssistantMessage = memo(function AssistantMessage2({
5692
5850
  children: [
5693
5851
  richTextEnabled && isStreamingMessage ? /* @__PURE__ */ jsx(ImageResultsGallery, { images: imageResults, size: "compact", collapsible: true }) : null,
5694
5852
  processedParts.map(
5695
- (processed, i) => foldPartIndices.has(i) ? renderPart(processed, i) : null
5853
+ (processed, i) => foldPartIndices2.has(i) ? renderPart(processed, i) : null
5696
5854
  )
5697
5855
  ]
5698
5856
  }
5699
5857
  ),
5700
5858
  processedParts.map(
5701
- (processed, i) => foldPartIndices.has(i) && processed.kind === "steps-group" ? /* @__PURE__ */ jsx(
5859
+ (processed, i) => foldPartIndices2.has(i) && processed.kind === "steps-group" ? /* @__PURE__ */ jsx(
5702
5860
  MessageDecisionCards,
5703
5861
  {
5704
5862
  messageId: message.id,
@@ -5711,7 +5869,7 @@ var AssistantMessage = memo(function AssistantMessage2({
5711
5869
  ) : null
5712
5870
  ),
5713
5871
  processedParts.map(
5714
- (processed, i) => foldPartIndices.has(i) ? null : renderPart(processed, i)
5872
+ (processed, i) => foldPartIndices2.has(i) ? null : renderPart(processed, i)
5715
5873
  )
5716
5874
  ] });
5717
5875
  })(),
@@ -7094,4 +7252,4 @@ function Thinking({
7094
7252
  ) });
7095
7253
  }
7096
7254
 
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 };
7255
+ export { ArrowRotateClockwiseIcon, COMPOSER_ID_COPILOT, COMPOSER_ID_MAIN, CSV_PREVIEW_MAX_ROWS, CanvasWidget, ConversationConfirmationCard, CopyButton, Message2 as Message, ModelIcon, PdfViewer, Spinner, Thinking, VolumeFullIcon, WarningSignIcon, brandLabel, csvTextToWorkbookJson, dynamic, isPlainTextLanguage, modeToBrandRow, setPendingFiles, unshownPendingConfirmations, useBackDismiss, useChatStreamStore, useComposerStore, useComputer, useComputerFiles, useContextWindowInfo, useIsCompacting, useLivePreviewUrl, usePersonConfirmations, useQueuedMessages, useUploadComputerFile, useUploadFile };
package/dist/header.js CHANGED
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { ChatHeader, ChatHeaderActions } from './chunk-ZFTMGEV5.js';
2
+ export { ChatHeader, ChatHeaderActions } from './chunk-JYYH3AXV.js';
3
3
  import './chunk-X3QVICX7.js';
4
- import './chunk-QFVBVBUR.js';
4
+ import './chunk-OMOIIMNG.js';
5
5
  import './chunk-CWAOLMFS.js';
6
6
  import './chunk-T5SANYSX.js';
7
- import './chunk-I5NAI7HP.js';
7
+ import './chunk-AVSAEPHS.js';
8
8
  import './chunk-QBV7MAFV.js';
9
9
  import './chunk-PKNEC4LJ.js';
10
10
  import './chunk-UWKO24VT.js';
package/dist/message.js CHANGED
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { Message, Thinking } from './chunk-QABN6WBZ.js';
3
- import './chunk-QFVBVBUR.js';
2
+ export { Message, Thinking } from './chunk-VCPYAMYP.js';
3
+ import './chunk-OMOIIMNG.js';
4
4
  import './chunk-CWAOLMFS.js';
5
5
  import './chunk-T5SANYSX.js';
6
- import './chunk-I5NAI7HP.js';
6
+ import './chunk-AVSAEPHS.js';
7
7
  import './chunk-QBV7MAFV.js';
8
8
  import './chunk-PKNEC4LJ.js';
9
9
  import './chunk-UWKO24VT.js';
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- export { DEFAULT_SHORTCUTS, NewSessionPrompt, buildDefaultShortcuts } from './chunk-I3YAF6PS.js';
2
+ export { DEFAULT_SHORTCUTS, NewSessionPrompt, buildDefaultShortcuts } from './chunk-CYEEHVPE.js';
3
3
  import './chunk-X3QVICX7.js';
4
4
  import './chunk-T5SANYSX.js';
5
- import './chunk-I5NAI7HP.js';
5
+ import './chunk-AVSAEPHS.js';
6
6
  import './chunk-2P4IEVOQ.js';
7
7
  import './chunk-PUMRNN3R.js';
8
8
  import './chunk-LGVMMBL3.js';
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { DeckNotesCard, deckOwnsArrowKeys } from './chunk-4FRTPVJT.js';
3
- import { resolveStageWidth, zoomPercent, DECK_ZOOM_LEVELS, LazyThumb, ArtifactSkeleton } from './chunk-LP5MVCRH.js';
3
+ import { resolveStageWidth, zoomPercent, DECK_ZOOM_LEVELS, LazyThumb, ArtifactSkeleton } from './chunk-GQEBWNCP.js';
4
4
  import { ChevronLeftIcon } from './chunk-CWAOLMFS.js';
5
- import { useTranslation, useIsMobile } from './chunk-I5NAI7HP.js';
5
+ import { useTranslation, useIsMobile } from './chunk-AVSAEPHS.js';
6
6
  import { Button, ChevronDownMediumIcon, ScrollArea } from './chunk-UWKO24VT.js';
7
7
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, ChevronRightIcon } from './chunk-C3HW5S2Z.js';
8
8
  import { cn } from './chunk-LGVMMBL3.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { zoomPercent, DECK_ZOOM_LEVELS, ArtifactSkeleton, LazyThumb } from './chunk-LP5MVCRH.js';
2
+ import { zoomPercent, DECK_ZOOM_LEVELS, ArtifactSkeleton, LazyThumb } from './chunk-GQEBWNCP.js';
3
3
  import { ChevronLeftIcon } from './chunk-CWAOLMFS.js';
4
- import { useTranslation, useIsMobile } from './chunk-I5NAI7HP.js';
4
+ import { useTranslation, useIsMobile } from './chunk-AVSAEPHS.js';
5
5
  import { Button, ChevronDownMediumIcon, ScrollArea } from './chunk-UWKO24VT.js';
6
6
  import { ChevronRightIcon, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem } from './chunk-C3HW5S2Z.js';
7
7
  import { cn } from './chunk-LGVMMBL3.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontera-sdk/chat-ui",
3
- "version": "1.52.19",
3
+ "version": "1.52.20",
4
4
  "description": "Ready-made React components for embedding a Frontera agent conversation — message rendering, tool calls, artifacts and composer.",
5
5
  "keywords": [
6
6
  "frontera",
@@ -89,8 +89,8 @@
89
89
  },
90
90
  "dependencies": {
91
91
  "@elysiajs/eden": "^1.4.9",
92
- "@frontera-sdk/chat": "1.52.19",
93
- "@frontera-sdk/core": "1.52.19",
92
+ "@frontera-sdk/chat": "1.52.20",
93
+ "@frontera-sdk/core": "1.52.20",
94
94
  "@radix-ui/react-alert-dialog": "^1.1.23",
95
95
  "@radix-ui/react-collapsible": "^1.1.12",
96
96
  "@radix-ui/react-compose-refs": "^1.1.5",