refactor: update dependencies and streamline assistant-ui package usages

This commit is contained in:
Anish Sarkar 2026-03-24 02:22:51 +05:30
parent fed3a3b436
commit b8f3f41326
40 changed files with 886 additions and 1110 deletions

View file

@ -37,55 +37,11 @@ import { Thread } from "@/components/assistant-ui/thread";
import { MobileEditorPanel } from "@/components/editor-panel/editor-panel"; import { MobileEditorPanel } from "@/components/editor-panel/editor-panel";
import { MobileHitlEditPanel } from "@/components/hitl-edit-panel/hitl-edit-panel"; import { MobileHitlEditPanel } from "@/components/hitl-edit-panel/hitl-edit-panel";
import { MobileReportPanel } from "@/components/report-panel/report-panel"; import { MobileReportPanel } from "@/components/report-panel/report-panel";
import {
CreateConfluencePageToolUI,
DeleteConfluencePageToolUI,
UpdateConfluencePageToolUI,
} from "@/components/tool-ui/confluence";
import type { ThinkingStep } from "@/components/tool-ui/deepagent-thinking"; import type { ThinkingStep } from "@/components/tool-ui/deepagent-thinking";
import { DisplayImageToolUI } from "@/components/tool-ui/display-image";
import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast";
import { GenerateReportToolUI } from "@/components/tool-ui/generate-report";
import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation";
import {
CreateGmailDraftToolUI,
SendGmailEmailToolUI,
TrashGmailEmailToolUI,
UpdateGmailDraftToolUI,
} from "@/components/tool-ui/gmail";
import {
CreateCalendarEventToolUI,
DeleteCalendarEventToolUI,
UpdateCalendarEventToolUI,
} from "@/components/tool-ui/google-calendar";
import {
CreateGoogleDriveFileToolUI,
DeleteGoogleDriveFileToolUI,
} from "@/components/tool-ui/google-drive";
import {
CreateJiraIssueToolUI,
DeleteJiraIssueToolUI,
UpdateJiraIssueToolUI,
} from "@/components/tool-ui/jira";
import {
CreateLinearIssueToolUI,
DeleteLinearIssueToolUI,
UpdateLinearIssueToolUI,
} from "@/components/tool-ui/linear";
import { LinkPreviewToolUI } from "@/components/tool-ui/link-preview";
import {
CreateNotionPageToolUI,
DeleteNotionPageToolUI,
UpdateNotionPageToolUI,
} from "@/components/tool-ui/notion";
import { SandboxExecuteToolUI } from "@/components/tool-ui/sandbox-execute";
import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage";
import { RecallMemoryToolUI, SaveMemoryToolUI } from "@/components/tool-ui/user-memory";
import { Skeleton } from "@/components/ui/skeleton"; import { Skeleton } from "@/components/ui/skeleton";
import { useChatSessionStateSync } from "@/hooks/use-chat-session-state"; import { useChatSessionStateSync } from "@/hooks/use-chat-session-state";
import { useMessagesElectric } from "@/hooks/use-messages-electric"; import { useMessagesElectric } from "@/hooks/use-messages-electric";
import { documentsApiService } from "@/lib/apis/documents-api.service"; import { documentsApiService } from "@/lib/apis/documents-api.service";
// import { WriteTodosToolUI } from "@/components/tool-ui/write-todos";
import { getBearerToken } from "@/lib/auth-utils"; import { getBearerToken } from "@/lib/auth-utils";
import { convertToThreadMessage } from "@/lib/chat/message-utils"; import { convertToThreadMessage } from "@/lib/chat/message-utils";
import { import {
@ -1719,37 +1675,6 @@ export default function NewChatPage() {
return ( return (
<AssistantRuntimeProvider runtime={runtime}> <AssistantRuntimeProvider runtime={runtime}>
<GeneratePodcastToolUI />
<GenerateReportToolUI />
<GenerateVideoPresentationToolUI />
<LinkPreviewToolUI />
<DisplayImageToolUI />
<ScrapeWebpageToolUI />
<SaveMemoryToolUI />
<RecallMemoryToolUI />
<CreateNotionPageToolUI />
<UpdateNotionPageToolUI />
<DeleteNotionPageToolUI />
<CreateLinearIssueToolUI />
<UpdateLinearIssueToolUI />
<DeleteLinearIssueToolUI />
<CreateGoogleDriveFileToolUI />
<DeleteGoogleDriveFileToolUI />
<CreateCalendarEventToolUI />
<UpdateCalendarEventToolUI />
<DeleteCalendarEventToolUI />
<CreateGmailDraftToolUI />
<UpdateGmailDraftToolUI />
<SendGmailEmailToolUI />
<TrashGmailEmailToolUI />
<CreateJiraIssueToolUI />
<UpdateJiraIssueToolUI />
<DeleteJiraIssueToolUI />
<CreateConfluencePageToolUI />
<UpdateConfluencePageToolUI />
<DeleteConfluencePageToolUI />
<SandboxExecuteToolUI />
{/* <WriteTodosToolUI /> Disabled for now */}
<div key={searchSpaceId} className="flex h-[calc(100dvh-64px)] overflow-hidden"> <div key={searchSpaceId} className="flex h-[calc(100dvh-64px)] overflow-hidden">
<div className="flex-1 flex flex-col min-w-0 overflow-hidden"> <div className="flex-1 flex flex-col min-w-0 overflow-hidden">
<Thread messageThinkingSteps={messageThinkingSteps} /> <Thread messageThinkingSteps={messageThinkingSteps} />

View file

@ -1,10 +1,9 @@
import { import {
ActionBarPrimitive, ActionBarPrimitive,
AssistantIf, AuiIf,
ErrorPrimitive, ErrorPrimitive,
MessagePrimitive, MessagePrimitive,
useAssistantState, useAuiState,
useMessage,
} from "@assistant-ui/react"; } from "@assistant-ui/react";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import { CheckIcon, CopyIcon, DownloadIcon, MessageSquare, RefreshCwIcon } from "lucide-react"; import { CheckIcon, CopyIcon, DownloadIcon, MessageSquare, RefreshCwIcon } from "lucide-react";
@ -21,6 +20,22 @@ import { ToolFallback } from "@/components/assistant-ui/tool-fallback";
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
import { CommentPanelContainer } from "@/components/chat-comments/comment-panel-container/comment-panel-container"; import { CommentPanelContainer } from "@/components/chat-comments/comment-panel-container/comment-panel-container";
import { CommentSheet } from "@/components/chat-comments/comment-sheet/comment-sheet"; import { CommentSheet } from "@/components/chat-comments/comment-sheet/comment-sheet";
import { CreateConfluencePageToolUI, DeleteConfluencePageToolUI, UpdateConfluencePageToolUI } from "@/components/tool-ui/confluence";
import { DeepAgentThinkingToolUI } from "@/components/tool-ui/deepagent-thinking";
import { DisplayImageToolUI } from "@/components/tool-ui/display-image";
import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast";
import { GenerateReportToolUI } from "@/components/tool-ui/generate-report";
import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation";
import { CreateGmailDraftToolUI, SendGmailEmailToolUI, TrashGmailEmailToolUI, UpdateGmailDraftToolUI } from "@/components/tool-ui/gmail";
import { CreateCalendarEventToolUI, DeleteCalendarEventToolUI, UpdateCalendarEventToolUI } from "@/components/tool-ui/google-calendar";
import { CreateGoogleDriveFileToolUI, DeleteGoogleDriveFileToolUI } from "@/components/tool-ui/google-drive";
import { CreateJiraIssueToolUI, DeleteJiraIssueToolUI, UpdateJiraIssueToolUI } from "@/components/tool-ui/jira";
import { CreateLinearIssueToolUI, DeleteLinearIssueToolUI, UpdateLinearIssueToolUI } from "@/components/tool-ui/linear";
import { LinkPreviewToolUI, MultiLinkPreviewToolUI } from "@/components/tool-ui/link-preview";
import { CreateNotionPageToolUI, DeleteNotionPageToolUI, UpdateNotionPageToolUI } from "@/components/tool-ui/notion";
import { SandboxExecuteToolUI } from "@/components/tool-ui/sandbox-execute";
import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage";
import { RecallMemoryToolUI, SaveMemoryToolUI } from "@/components/tool-ui/user-memory";
import { useComments } from "@/hooks/use-comments"; import { useComments } from "@/hooks/use-comments";
import { useMediaQuery } from "@/hooks/use-media-query"; import { useMediaQuery } from "@/hooks/use-media-query";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
@ -42,13 +57,13 @@ const ThinkingStepsPart: FC = () => {
const thinkingStepsMap = useContext(ThinkingStepsContext); const thinkingStepsMap = useContext(ThinkingStepsContext);
// Get the current message ID to look up thinking steps // Get the current message ID to look up thinking steps
const messageId = useAssistantState(({ message }) => message?.id); const messageId = useAuiState(({ message }) => message?.id);
const thinkingSteps = thinkingStepsMap.get(messageId) || []; const thinkingSteps = thinkingStepsMap.get(messageId) || [];
// Check if this specific message is currently streaming // Check if this specific message is currently streaming
// A message is streaming if: thread is running AND this is the last assistant message // A message is streaming if: thread is running AND this is the last assistant message
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
const isLastMessage = useAssistantState(({ message }) => message?.isLast ?? false); const isLastMessage = useAuiState(({ message }) => message?.isLast ?? false);
const isMessageStreaming = isThreadRunning && isLastMessage; const isMessageStreaming = isThreadRunning && isLastMessage;
if (thinkingSteps.length === 0) return null; if (thinkingSteps.length === 0) return null;
@ -70,7 +85,43 @@ const AssistantMessageInner: FC = () => {
<MessagePrimitive.Parts <MessagePrimitive.Parts
components={{ components={{
Text: MarkdownText, Text: MarkdownText,
tools: { Fallback: ToolFallback }, tools: {
by_name: {
deepagent_thinking: DeepAgentThinkingToolUI,
generate_report: GenerateReportToolUI,
generate_podcast: GeneratePodcastToolUI,
generate_video_presentation: GenerateVideoPresentationToolUI,
link_preview: LinkPreviewToolUI,
multi_link_preview: MultiLinkPreviewToolUI,
display_image: DisplayImageToolUI,
scrape_webpage: ScrapeWebpageToolUI,
save_memory: SaveMemoryToolUI,
recall_memory: RecallMemoryToolUI,
execute: SandboxExecuteToolUI,
create_notion_page: CreateNotionPageToolUI,
update_notion_page: UpdateNotionPageToolUI,
delete_notion_page: DeleteNotionPageToolUI,
create_linear_issue: CreateLinearIssueToolUI,
update_linear_issue: UpdateLinearIssueToolUI,
delete_linear_issue: DeleteLinearIssueToolUI,
create_google_drive_file: CreateGoogleDriveFileToolUI,
delete_google_drive_file: DeleteGoogleDriveFileToolUI,
create_calendar_event: CreateCalendarEventToolUI,
update_calendar_event: UpdateCalendarEventToolUI,
delete_calendar_event: DeleteCalendarEventToolUI,
create_gmail_draft: CreateGmailDraftToolUI,
update_gmail_draft: UpdateGmailDraftToolUI,
send_gmail_email: SendGmailEmailToolUI,
trash_gmail_email: TrashGmailEmailToolUI,
create_jira_issue: CreateJiraIssueToolUI,
update_jira_issue: UpdateJiraIssueToolUI,
delete_jira_issue: DeleteJiraIssueToolUI,
create_confluence_page: CreateConfluencePageToolUI,
update_confluence_page: UpdateConfluencePageToolUI,
delete_confluence_page: DeleteConfluencePageToolUI,
},
Fallback: ToolFallback,
},
}} }}
/> />
<MessageError /> <MessageError />
@ -95,7 +146,7 @@ export const AssistantMessage: FC = () => {
const messageRef = useRef<HTMLDivElement>(null); const messageRef = useRef<HTMLDivElement>(null);
const commentPanelRef = useRef<HTMLDivElement>(null); const commentPanelRef = useRef<HTMLDivElement>(null);
const commentTriggerRef = useRef<HTMLButtonElement>(null); const commentTriggerRef = useRef<HTMLButtonElement>(null);
const messageId = useAssistantState(({ message }) => message?.id); const messageId = useAuiState(({ message }) => message?.id);
const searchSpaceId = useAtomValue(activeSearchSpaceIdAtom); const searchSpaceId = useAtomValue(activeSearchSpaceIdAtom);
const dbMessageId = parseMessageId(messageId); const dbMessageId = parseMessageId(messageId);
const commentsEnabled = useAtomValue(commentsEnabledAtom); const commentsEnabled = useAtomValue(commentsEnabledAtom);
@ -104,8 +155,8 @@ export const AssistantMessage: FC = () => {
const isMediumScreen = useMediaQuery("(min-width: 768px) and (max-width: 1023px)"); const isMediumScreen = useMediaQuery("(min-width: 768px) and (max-width: 1023px)");
const isDesktop = useMediaQuery("(min-width: 1024px)"); const isDesktop = useMediaQuery("(min-width: 1024px)");
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
const isLastMessage = useAssistantState(({ message }) => message?.isLast ?? false); const isLastMessage = useAuiState(({ message }) => message?.isLast ?? false);
const isMessageStreaming = isThreadRunning && isLastMessage; const isMessageStreaming = isThreadRunning && isLastMessage;
const { data: commentsData, isSuccess: commentsLoaded } = useComments({ const { data: commentsData, isSuccess: commentsLoaded } = useComments({
@ -227,7 +278,7 @@ export const AssistantMessage: FC = () => {
}; };
const AssistantActionBar: FC = () => { const AssistantActionBar: FC = () => {
const { isLast } = useMessage(); const isLast = useAuiState((s) => s.message.isLast);
return ( return (
<ActionBarPrimitive.Root <ActionBarPrimitive.Root
@ -238,12 +289,12 @@ const AssistantActionBar: FC = () => {
> >
<ActionBarPrimitive.Copy asChild> <ActionBarPrimitive.Copy asChild>
<TooltipIconButton tooltip="Copy"> <TooltipIconButton tooltip="Copy">
<AssistantIf condition={({ message }) => message.isCopied}> <AuiIf condition={({ message }) => message.isCopied}>
<CheckIcon /> <CheckIcon />
</AssistantIf> </AuiIf>
<AssistantIf condition={({ message }) => !message.isCopied}> <AuiIf condition={({ message }) => !message.isCopied}>
<CopyIcon /> <CopyIcon />
</AssistantIf> </AuiIf>
</TooltipIconButton> </TooltipIconButton>
</ActionBarPrimitive.Copy> </ActionBarPrimitive.Copy>
<ActionBarPrimitive.ExportMarkdown asChild> <ActionBarPrimitive.ExportMarkdown asChild>

View file

@ -1,7 +1,6 @@
import { useAssistantState, useThreadViewport } from "@assistant-ui/react";
import { ChevronRightIcon } from "lucide-react"; import { ChevronRightIcon } from "lucide-react";
import type { FC } from "react"; import type { FC } from "react";
import { createContext, useCallback, useContext, useEffect, useRef, useState } from "react"; import { createContext, useCallback, useEffect, useState } from "react";
import { ChainOfThoughtItem } from "@/components/prompt-kit/chain-of-thought"; import { ChainOfThoughtItem } from "@/components/prompt-kit/chain-of-thought";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
import type { ThinkingStep } from "@/components/tool-ui/deepagent-thinking"; import type { ThinkingStep } from "@/components/tool-ui/deepagent-thinking";
@ -154,52 +153,3 @@ export const ThinkingStepsDisplay: FC<{ steps: ThinkingStep[]; isThreadRunning?:
); );
}; };
/**
* Component that handles auto-scroll when thinking steps update.
* Uses useThreadViewport to scroll to bottom when thinking steps change,
* ensuring the user always sees the latest content during streaming.
*/
export const ThinkingStepsScrollHandler: FC = () => {
const thinkingStepsMap = useContext(ThinkingStepsContext);
const viewport = useThreadViewport();
const isRunning = useAssistantState(({ thread }) => thread.isRunning);
// Track the serialized state to detect any changes
const prevStateRef = useRef<string>("");
useEffect(() => {
// Only act during streaming
if (!isRunning) {
prevStateRef.current = "";
return;
}
// Serialize the thinking steps state to detect any changes
// This catches new steps, status changes, and item additions
let stateString = "";
thinkingStepsMap.forEach((steps, msgId) => {
steps.forEach((step) => {
stateString += `${msgId}:${step.id}:${step.status}:${step.items?.length || 0};`;
});
});
// If state changed at all during streaming, scroll
if (stateString !== prevStateRef.current && stateString !== "") {
prevStateRef.current = stateString;
// Multiple attempts to ensure scroll happens after DOM updates
const scrollAttempt = () => {
try {
viewport.scrollToBottom();
} catch {
// Ignore errors - viewport might not be ready
}
};
// Delayed attempts to handle async DOM updates
requestAnimationFrame(scrollAttempt);
setTimeout(scrollAttempt, 100);
}
}, [thinkingStepsMap, viewport, isRunning]);
return null; // This component doesn't render anything
};

View file

@ -1,13 +1,13 @@
import { import {
ActionBarPrimitive, ActionBarPrimitive,
AssistantIf, AuiIf,
BranchPickerPrimitive, BranchPickerPrimitive,
ComposerPrimitive, ComposerPrimitive,
ErrorPrimitive, ErrorPrimitive,
MessagePrimitive, MessagePrimitive,
ThreadPrimitive, ThreadPrimitive,
useAssistantState, useAui,
useComposerRuntime, useAuiState,
} from "@assistant-ui/react"; } from "@assistant-ui/react";
import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { useAtom, useAtomValue, useSetAtom } from "jotai";
import { import {
@ -135,9 +135,9 @@ const ThreadContent: FC = () => {
turnAnchor="top" turnAnchor="top"
className="aui-thread-viewport relative flex flex-1 min-h-0 flex-col overflow-y-auto px-4 pt-4" className="aui-thread-viewport relative flex flex-1 min-h-0 flex-col overflow-y-auto px-4 pt-4"
> >
<AssistantIf condition={({ thread }) => thread.isEmpty}> <AuiIf condition={({ thread }) => thread.isEmpty}>
<ThreadWelcome /> <ThreadWelcome />
</AssistantIf> </AuiIf>
<ThreadPrimitive.Messages <ThreadPrimitive.Messages
components={{ components={{
@ -152,11 +152,11 @@ const ThreadContent: FC = () => {
style={{ paddingBottom: "max(1rem, env(safe-area-inset-bottom))" }} style={{ paddingBottom: "max(1rem, env(safe-area-inset-bottom))" }}
> >
<ThreadScrollToBottom /> <ThreadScrollToBottom />
<AssistantIf condition={({ thread }) => !thread.isEmpty}> <AuiIf condition={({ thread }) => !thread.isEmpty}>
<div className="fade-in slide-in-from-bottom-4 animate-in duration-500 ease-out fill-mode-both"> <div className="fade-in slide-in-from-bottom-4 animate-in duration-500 ease-out fill-mode-both">
<Composer /> <Composer />
</div> </div>
</AssistantIf> </AuiIf>
</ThreadPrimitive.ViewportFooter> </ThreadPrimitive.ViewportFooter>
</ThreadPrimitive.Viewport> </ThreadPrimitive.Viewport>
</ThreadPrimitive.Root> </ThreadPrimitive.Root>
@ -327,11 +327,11 @@ const Composer: FC = () => {
const editorContainerRef = useRef<HTMLDivElement>(null); const editorContainerRef = useRef<HTMLDivElement>(null);
const documentPickerRef = useRef<DocumentMentionPickerRef>(null); const documentPickerRef = useRef<DocumentMentionPickerRef>(null);
const { search_space_id, chat_id } = useParams(); const { search_space_id, chat_id } = useParams();
const composerRuntime = useComposerRuntime(); const aui = useAui();
const hasAutoFocusedRef = useRef(false); const hasAutoFocusedRef = useRef(false);
const isThreadEmpty = useAssistantState(({ thread }) => thread.isEmpty); const isThreadEmpty = useAuiState(({ thread }) => thread.isEmpty);
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
// Cycling placeholder state - only cycles in new chats // Cycling placeholder state - only cycles in new chats
const [placeholderIndex, setPlaceholderIndex] = useState(0); const [placeholderIndex, setPlaceholderIndex] = useState(0);
@ -378,7 +378,7 @@ const Composer: FC = () => {
// hooks never fire their own network requests (eliminates N+1 API calls). // hooks never fire their own network requests (eliminates N+1 API calls).
// Return a primitive string from the selector so useSyncExternalStore can // Return a primitive string from the selector so useSyncExternalStore can
// compare snapshots by value and avoid infinite re-render loops. // compare snapshots by value and avoid infinite re-render loops.
const assistantIdsKey = useAssistantState(({ thread }) => const assistantIdsKey = useAuiState(({ thread }) =>
thread.messages thread.messages
.filter((m) => m.role === "assistant" && m.id?.startsWith("msg-")) .filter((m) => m.role === "assistant" && m.id?.startsWith("msg-"))
.map((m) => m.id?.replace("msg-", "")) .map((m) => m.id?.replace("msg-", ""))
@ -414,9 +414,9 @@ const Composer: FC = () => {
// Sync editor text with assistant-ui composer runtime // Sync editor text with assistant-ui composer runtime
const handleEditorChange = useCallback( const handleEditorChange = useCallback(
(text: string) => { (text: string) => {
composerRuntime.setText(text); aui.composer().setText(text);
}, },
[composerRuntime] [aui]
); );
// Open document picker when @ mention is triggered // Open document picker when @ mention is triggered
@ -469,7 +469,7 @@ const Composer: FC = () => {
return; return;
} }
if (!showDocumentPopover) { if (!showDocumentPopover) {
composerRuntime.send(); aui.composer().send();
editorRef.current?.clear(); editorRef.current?.clear();
setMentionedDocuments([]); setMentionedDocuments([]);
setSidebarDocs([]); setSidebarDocs([]);
@ -478,7 +478,7 @@ const Composer: FC = () => {
showDocumentPopover, showDocumentPopover,
isThreadRunning, isThreadRunning,
isBlockedByOtherUser, isBlockedByOtherUser,
composerRuntime, aui,
setMentionedDocuments, setMentionedDocuments,
setSidebarDocs, setSidebarDocs,
]); ]);
@ -591,7 +591,7 @@ const ComposerAction: FC<ComposerActionProps> = ({ isBlockedByOtherUser = false
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 2; const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 2;
setToolsScrollPos(atTop ? "top" : atBottom ? "bottom" : "middle"); setToolsScrollPos(atTop ? "top" : atBottom ? "bottom" : "middle");
}, []); }, []);
const isComposerTextEmpty = useAssistantState(({ composer }) => { const isComposerTextEmpty = useAuiState(({ composer }) => {
const text = composer.text?.trim() || ""; const text = composer.text?.trim() || "";
return text.length === 0; return text.length === 0;
}); });
@ -1007,16 +1007,14 @@ const ComposerAction: FC<ComposerActionProps> = ({ isBlockedByOtherUser = false
</button> </button>
)} )}
</div> </div>
{!hasModelConfigured && ( {!hasModelConfigured && (
<div className="flex items-center gap-1.5 text-amber-600 dark:text-amber-400 text-xs"> <div className="flex items-center gap-1.5 text-amber-600 dark:text-amber-400 text-xs">
<AlertCircle className="size-3" /> <AlertCircle className="size-3" />
<span>Select a model</span> <span>Select a model</span>
</div> </div>
)} )}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<AssistantIf condition={({ thread }) => !thread.isRunning}> <AuiIf condition={({ thread }) => !thread.isRunning}>
<ComposerPrimitive.Send asChild disabled={isSendDisabled}> <ComposerPrimitive.Send asChild disabled={isSendDisabled}>
<TooltipIconButton <TooltipIconButton
tooltip={ tooltip={
@ -1042,9 +1040,9 @@ const ComposerAction: FC<ComposerActionProps> = ({ isBlockedByOtherUser = false
<ArrowUpIcon className="aui-composer-send-icon size-4" /> <ArrowUpIcon className="aui-composer-send-icon size-4" />
</TooltipIconButton> </TooltipIconButton>
</ComposerPrimitive.Send> </ComposerPrimitive.Send>
</AssistantIf> </AuiIf>
<AssistantIf condition={({ thread }) => thread.isRunning}> <AuiIf condition={({ thread }) => thread.isRunning}>
<ComposerPrimitive.Cancel asChild> <ComposerPrimitive.Cancel asChild>
<Button <Button
type="button" type="button"
@ -1056,7 +1054,7 @@ const ComposerAction: FC<ComposerActionProps> = ({ isBlockedByOtherUser = false
<SquareIcon className="aui-composer-cancel-icon size-3 fill-current" /> <SquareIcon className="aui-composer-cancel-icon size-3 fill-current" />
</Button> </Button>
</ComposerPrimitive.Cancel> </ComposerPrimitive.Cancel>
</AssistantIf> </AuiIf>
</div> </div>
</div> </div>
); );
@ -1151,13 +1149,13 @@ const ThinkingStepsPart: FC = () => {
const thinkingStepsMap = useContext(ThinkingStepsContext); const thinkingStepsMap = useContext(ThinkingStepsContext);
// Get the current message ID to look up thinking steps // Get the current message ID to look up thinking steps
const messageId = useAssistantState(({ message }) => message?.id); const messageId = useAuiState(({ message }) => message?.id);
const thinkingSteps = thinkingStepsMap.get(messageId) || []; const thinkingSteps = thinkingStepsMap.get(messageId) || [];
// Check if this specific message is currently streaming // Check if this specific message is currently streaming
// A message is streaming if: thread is running AND this is the last assistant message // A message is streaming if: thread is running AND this is the last assistant message
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
const isLastMessage = useAssistantState(({ message }) => message?.isLast ?? false); const isLastMessage = useAuiState(({ message }) => message?.isLast ?? false);
const isMessageStreaming = isThreadRunning && isLastMessage; const isMessageStreaming = isThreadRunning && isLastMessage;
if (thinkingSteps.length === 0) return null; if (thinkingSteps.length === 0) return null;
@ -1203,12 +1201,12 @@ const AssistantActionBar: FC = () => {
> >
<ActionBarPrimitive.Copy asChild> <ActionBarPrimitive.Copy asChild>
<TooltipIconButton tooltip="Copy"> <TooltipIconButton tooltip="Copy">
<AssistantIf condition={({ message }) => message.isCopied}> <AuiIf condition={({ message }) => message.isCopied}>
<CheckIcon /> <CheckIcon />
</AssistantIf> </AuiIf>
<AssistantIf condition={({ message }) => !message.isCopied}> <AuiIf condition={({ message }) => !message.isCopied}>
<CopyIcon /> <CopyIcon />
</AssistantIf> </AuiIf>
</TooltipIconButton> </TooltipIconButton>
</ActionBarPrimitive.Copy> </ActionBarPrimitive.Copy>
<ActionBarPrimitive.ExportMarkdown asChild> <ActionBarPrimitive.ExportMarkdown asChild>

View file

@ -1,4 +1,4 @@
import { ActionBarPrimitive, MessagePrimitive, useAssistantState } from "@assistant-ui/react"; import { ActionBarPrimitive, MessagePrimitive, useAuiState } from "@assistant-ui/react";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import { FileText, Pen } from "lucide-react"; import { FileText, Pen } from "lucide-react";
import { type FC, useState } from "react"; import { type FC, useState } from "react";
@ -42,10 +42,10 @@ const UserAvatar: FC<AuthorMetadata> = ({ displayName, avatarUrl }) => {
}; };
export const UserMessage: FC = () => { export const UserMessage: FC = () => {
const messageId = useAssistantState(({ message }) => message?.id); const messageId = useAuiState(({ message }) => message?.id);
const messageDocumentsMap = useAtomValue(messageDocumentsMapAtom); const messageDocumentsMap = useAtomValue(messageDocumentsMapAtom);
const mentionedDocs = messageId ? messageDocumentsMap[messageId] : undefined; const mentionedDocs = messageId ? messageDocumentsMap[messageId] : undefined;
const metadata = useAssistantState(({ message }) => message?.metadata); const metadata = useAuiState(({ message }) => message?.metadata);
const author = metadata?.custom?.author as AuthorMetadata | undefined; const author = metadata?.custom?.author as AuthorMetadata | undefined;
return ( return (
@ -93,13 +93,13 @@ export const UserMessage: FC = () => {
}; };
const UserActionBar: FC = () => { const UserActionBar: FC = () => {
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
// Get current message ID // Get current message ID
const currentMessageId = useAssistantState(({ message }) => message?.id); const currentMessageId = useAuiState(({ message }) => message?.id);
// Find the last user message ID in the thread (computed once, memoized by selector) // Find the last user message ID in the thread (computed once, memoized by selector)
const lastUserMessageId = useAssistantState(({ thread }) => { const lastUserMessageId = useAuiState(({ thread }) => {
const messages = thread.messages; const messages = thread.messages;
for (let i = messages.length - 1; i >= 0; i--) { for (let i = messages.length - 1; i >= 0; i--) {
if (messages[i].role === "user") { if (messages[i].role === "user") {

View file

@ -3,12 +3,6 @@
import { AssistantRuntimeProvider } from "@assistant-ui/react"; import { AssistantRuntimeProvider } from "@assistant-ui/react";
import { Navbar } from "@/components/homepage/navbar"; import { Navbar } from "@/components/homepage/navbar";
import { ReportPanel } from "@/components/report-panel/report-panel"; import { ReportPanel } from "@/components/report-panel/report-panel";
import { DisplayImageToolUI } from "@/components/tool-ui/display-image";
import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast";
import { GenerateReportToolUI } from "@/components/tool-ui/generate-report";
import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation";
import { LinkPreviewToolUI } from "@/components/tool-ui/link-preview";
import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage";
import { Spinner } from "@/components/ui/spinner"; import { Spinner } from "@/components/ui/spinner";
import { usePublicChat } from "@/hooks/use-public-chat"; import { usePublicChat } from "@/hooks/use-public-chat";
import { usePublicChatRuntime } from "@/hooks/use-public-chat-runtime"; import { usePublicChatRuntime } from "@/hooks/use-public-chat-runtime";
@ -45,14 +39,6 @@ export function PublicChatView({ shareToken }: PublicChatViewProps) {
<main className="min-h-screen bg-main-panel text-foreground overflow-x-hidden"> <main className="min-h-screen bg-main-panel text-foreground overflow-x-hidden">
<Navbar scrolledBgClassName={navbarScrolledBg} /> <Navbar scrolledBgClassName={navbarScrolledBg} />
<AssistantRuntimeProvider runtime={runtime}> <AssistantRuntimeProvider runtime={runtime}>
{/* Tool UIs for rendering tool results */}
<GeneratePodcastToolUI />
<GenerateReportToolUI />
<GenerateVideoPresentationToolUI />
<LinkPreviewToolUI />
<DisplayImageToolUI />
<ScrapeWebpageToolUI />
<div className="flex h-screen pt-16 overflow-hidden"> <div className="flex h-screen pt-16 overflow-hidden">
<div className="flex-1 flex flex-col min-w-0 overflow-hidden"> <div className="flex-1 flex flex-col min-w-0 overflow-hidden">
<PublicThread footer={<PublicChatFooter shareToken={shareToken} />} /> <PublicThread footer={<PublicChatFooter shareToken={shareToken} />} />

View file

@ -2,16 +2,22 @@
import { import {
ActionBarPrimitive, ActionBarPrimitive,
AssistantIf, AuiIf,
MessagePrimitive, MessagePrimitive,
ThreadPrimitive, ThreadPrimitive,
useAssistantState, useAuiState,
} from "@assistant-ui/react"; } from "@assistant-ui/react";
import { CheckIcon, CopyIcon } from "lucide-react"; import { CheckIcon, CopyIcon } from "lucide-react";
import { type FC, type ReactNode, useState } from "react"; import { type FC, type ReactNode, useState } from "react";
import { MarkdownText } from "@/components/assistant-ui/markdown-text"; import { MarkdownText } from "@/components/assistant-ui/markdown-text";
import { ToolFallback } from "@/components/assistant-ui/tool-fallback"; import { ToolFallback } from "@/components/assistant-ui/tool-fallback";
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
import { DisplayImageToolUI } from "@/components/tool-ui/display-image";
import { GeneratePodcastToolUI } from "@/components/tool-ui/generate-podcast";
import { GenerateReportToolUI } from "@/components/tool-ui/generate-report";
import { GenerateVideoPresentationToolUI } from "@/components/tool-ui/video-presentation";
import { LinkPreviewToolUI } from "@/components/tool-ui/link-preview";
import { ScrapeWebpageToolUI } from "@/components/tool-ui/scrape-webpage";
interface PublicThreadProps { interface PublicThreadProps {
footer?: ReactNode; footer?: ReactNode;
@ -93,7 +99,7 @@ const UserAvatar: FC<AuthorMetadata & { hasError: boolean; onError: () => void }
}; };
const PublicUserMessage: FC = () => { const PublicUserMessage: FC = () => {
const metadata = useAssistantState(({ message }) => message?.metadata); const metadata = useAuiState(({ message }) => message?.metadata);
const author = metadata?.custom?.author as AuthorMetadata | undefined; const author = metadata?.custom?.author as AuthorMetadata | undefined;
return ( return (
@ -139,7 +145,17 @@ const PublicAssistantMessage: FC = () => {
<MessagePrimitive.Parts <MessagePrimitive.Parts
components={{ components={{
Text: MarkdownText, Text: MarkdownText,
tools: { Fallback: ToolFallback }, tools: {
by_name: {
generate_podcast: GeneratePodcastToolUI,
generate_report: GenerateReportToolUI,
generate_video_presentation: GenerateVideoPresentationToolUI,
link_preview: LinkPreviewToolUI,
display_image: DisplayImageToolUI,
scrape_webpage: ScrapeWebpageToolUI,
},
Fallback: ToolFallback,
},
}} }}
/> />
</div> </div>
@ -160,12 +176,12 @@ const PublicAssistantActionBar: FC = () => {
> >
<ActionBarPrimitive.Copy asChild> <ActionBarPrimitive.Copy asChild>
<TooltipIconButton tooltip="Copy"> <TooltipIconButton tooltip="Copy">
<AssistantIf condition={({ message }) => message.isCopied}> <AuiIf condition={({ message }) => message.isCopied}>
<CheckIcon /> <CheckIcon />
</AssistantIf> </AuiIf>
<AssistantIf condition={({ message }) => !message.isCopied}> <AuiIf condition={({ message }) => !message.isCopied}>
<CopyIcon /> <CopyIcon />
</AssistantIf> </AuiIf>
</TooltipIconButton> </TooltipIconButton>
</ActionBarPrimitive.Copy> </ActionBarPrimitive.Copy>
</ActionBarPrimitive.Root> </ActionBarPrimitive.Root>

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -457,12 +457,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateConfluencePageToolUI = makeAssistantToolUI< export const CreateConfluencePageToolUI = ({ args, result }: ToolCallMessagePartProps<
{ title: string; content?: string; space_id?: string }, { title: string; content?: string; space_id?: string },
CreateConfluencePageResult CreateConfluencePageResult
>({ >) => {
toolName: "create_confluence_page",
render: function CreateConfluencePageUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -494,5 +492,4 @@ export const CreateConfluencePageToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CornerDownLeftIcon } from "lucide-react"; import { CornerDownLeftIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -396,12 +396,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteConfluencePageToolUI = makeAssistantToolUI< export const DeleteConfluencePageToolUI = ({ result }: ToolCallMessagePartProps<
{ page_title_or_id: string; delete_from_kb?: boolean }, { page_title_or_id: string; delete_from_kb?: boolean },
DeleteConfluencePageResult DeleteConfluencePageResult
>({ >) => {
toolName: "delete_confluence_page",
render: function DeleteConfluencePageUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -435,5 +433,4 @@ export const DeleteConfluencePageToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -493,16 +493,14 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateConfluencePageToolUI = makeAssistantToolUI< export const UpdateConfluencePageToolUI = ({ args, result }: ToolCallMessagePartProps<
{ {
page_title_or_id: string; page_title_or_id: string;
new_title?: string; new_title?: string;
new_content?: string; new_content?: string;
}, },
UpdateConfluencePageResult UpdateConfluencePageResult
>({ >) => {
toolName: "update_confluence_page",
render: function UpdateConfluencePageUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -535,5 +533,4 @@ export const UpdateConfluencePageToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { Brain, CheckCircle2, Loader2, Search, Sparkles } from "lucide-react"; import { Brain, CheckCircle2, Loader2, Search, Sparkles } from "lucide-react";
import type { FC, ReactNode } from "react"; import type { FC, ReactNode } from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@ -317,12 +317,7 @@ const SmartChainOfThought: FC<SmartChainOfThoughtProps> = ({ steps }) => {
* when the deepagent is processing a query. It shows thinking steps * when the deepagent is processing a query. It shows thinking steps
* in a collapsible, hierarchical format. * in a collapsible, hierarchical format.
*/ */
export const DeepAgentThinkingToolUI = makeAssistantToolUI< export const DeepAgentThinkingToolUI = ({ result, status }: ToolCallMessagePartProps<DeepAgentThinkingArgs, DeepAgentThinkingResult>) => {
DeepAgentThinkingArgs,
DeepAgentThinkingResult
>({
toolName: "deepagent_thinking",
render: function DeepAgentThinkingUI({ result, status }) {
// Loading state - tool is still running // Loading state - tool is still running
if (status.type === "running" || status.type === "requires-action") { if (status.type === "running" || status.type === "requires-action") {
return <ThinkingLoadingState status={result?.status ?? undefined} />; return <ThinkingLoadingState status={result?.status ?? undefined} />;
@ -349,8 +344,7 @@ export const DeepAgentThinkingToolUI = makeAssistantToolUI<
<SmartChainOfThought steps={result.steps} /> <SmartChainOfThought steps={result.steps} />
</div> </div>
); );
}, };
});
// ============================================================================ // ============================================================================
// Public Components // Public Components

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { AlertCircleIcon, ImageIcon } from "lucide-react"; import { AlertCircleIcon, ImageIcon } from "lucide-react";
import { z } from "zod"; import { z } from "zod";
import { import {
@ -103,9 +103,7 @@ function ParsedImage({ result }: { result: unknown }) {
* - Hover overlay effects * - Hover overlay effects
* - Click to open full size * - Click to open full size
*/ */
export const DisplayImageToolUI = makeAssistantToolUI<DisplayImageArgs, DisplayImageResult>({ export const DisplayImageToolUI = ({ args, result, status }: ToolCallMessagePartProps<DisplayImageArgs, DisplayImageResult>) => {
toolName: "display_image",
render: function DisplayImageUI({ args, result, status }) {
const src = args.src || "Unknown"; const src = args.src || "Unknown";
// Loading state - tool is still running // Loading state - tool is still running
@ -154,8 +152,7 @@ export const DisplayImageToolUI = makeAssistantToolUI<DisplayImageArgs, DisplayI
</ImageErrorBoundary> </ImageErrorBoundary>
</div> </div>
); );
}, };
});
export { export {
DisplayImageArgsSchema, DisplayImageArgsSchema,

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useParams, usePathname } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
import { useCallback, useEffect, useRef, useState } from "react"; import { useCallback, useEffect, useRef, useState } from "react";
import { z } from "zod"; import { z } from "zod";
@ -372,12 +372,7 @@ function PodcastStatusPoller({ podcastId, title }: { podcastId: number; title: s
* *
* It polls for task completion and auto-updates when the podcast is ready. * It polls for task completion and auto-updates when the podcast is ready.
*/ */
export const GeneratePodcastToolUI = makeAssistantToolUI< export const GeneratePodcastToolUI = ({ args, result, status }: ToolCallMessagePartProps<GeneratePodcastArgs, GeneratePodcastResult>) => {
GeneratePodcastArgs,
GeneratePodcastResult
>({
toolName: "generate_podcast",
render: function GeneratePodcastUI({ args, result, status }) {
const title = args.podcast_title || "SurfSense Podcast"; const title = args.podcast_title || "SurfSense Podcast";
// Loading state - tool is still running (agent processing) // Loading state - tool is still running (agent processing)
@ -462,5 +457,4 @@ export const GeneratePodcastToolUI = makeAssistantToolUI<
// Fallback - missing required data // Fallback - missing required data
return <PodcastErrorState title={title} error="Missing podcast ID" />; return <PodcastErrorState title={title} error="Missing podcast ID" />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useAtomValue, useSetAtom } from "jotai"; import { useAtomValue, useSetAtom } from "jotai";
import { Dot } from "lucide-react"; import { Dot } from "lucide-react";
import { useParams, usePathname } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
@ -273,9 +273,7 @@ function ReportCard({
* Generate Report Tool UI renders custom UI inline in chat * Generate Report Tool UI renders custom UI inline in chat
* when the generate_report tool is called by the agent. * when the generate_report tool is called by the agent.
*/ */
export const GenerateReportToolUI = makeAssistantToolUI<GenerateReportArgs, GenerateReportResult>({ export const GenerateReportToolUI = ({ args, result, status }: ToolCallMessagePartProps<GenerateReportArgs, GenerateReportResult>) => {
toolName: "generate_report",
render: function GenerateReportUI({ args, result, status }) {
const params = useParams(); const params = useParams();
const pathname = usePathname(); const pathname = usePathname();
const isPublicRoute = pathname?.startsWith("/public/"); const isPublicRoute = pathname?.startsWith("/public/");
@ -332,5 +330,4 @@ export const GenerateReportToolUI = makeAssistantToolUI<GenerateReportArgs, Gene
} }
return <ReportErrorState title={topic} error="Missing report ID" />; return <ReportErrorState title={topic} error="Missing report ID" />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen, UserIcon, UsersIcon } from "lucide-react"; import { CornerDownLeftIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -466,12 +466,13 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateGmailDraftToolUI = makeAssistantToolUI< export const CreateGmailDraftToolUI = ({
args,
result,
}: ToolCallMessagePartProps<
{ to: string; subject: string; body: string; cc?: string; bcc?: string }, { to: string; subject: string; body: string; cc?: string; bcc?: string },
CreateGmailDraftResult CreateGmailDraftResult
>({ >) => {
toolName: "create_gmail_draft",
render: function CreateGmailDraftUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -503,5 +504,4 @@ export const CreateGmailDraftToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react"; import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -464,12 +464,13 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const SendGmailEmailToolUI = makeAssistantToolUI< export const SendGmailEmailToolUI = ({
args,
result,
}: ToolCallMessagePartProps<
{ to: string; subject: string; body: string; cc?: string; bcc?: string }, { to: string; subject: string; body: string; cc?: string; bcc?: string },
SendGmailEmailResult SendGmailEmailResult
>({ >) => {
toolName: "send_gmail_email",
render: function SendGmailEmailUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -501,5 +502,4 @@ export const SendGmailEmailToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CalendarIcon, CornerDownLeftIcon, MailIcon, UserIcon } from "lucide-react"; import { CalendarIcon, CornerDownLeftIcon, MailIcon, UserIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -379,12 +379,12 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const TrashGmailEmailToolUI = makeAssistantToolUI< export const TrashGmailEmailToolUI = ({
result,
}: ToolCallMessagePartProps<
{ email_subject_or_id: string; delete_from_kb?: boolean }, { email_subject_or_id: string; delete_from_kb?: boolean },
TrashGmailEmailResult TrashGmailEmailResult
>({ >) => {
toolName: "trash_gmail_email",
render: function TrashGmailEmailUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -417,5 +417,4 @@ export const TrashGmailEmailToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react"; import { CornerDownLeftIcon, MailIcon, Pen, UserIcon, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -508,7 +508,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateGmailDraftToolUI = makeAssistantToolUI< export const UpdateGmailDraftToolUI = ({
args,
result,
}: ToolCallMessagePartProps<
{ {
draft_subject_or_id: string; draft_subject_or_id: string;
body: string; body: string;
@ -518,9 +521,7 @@ export const UpdateGmailDraftToolUI = makeAssistantToolUI<
bcc?: string; bcc?: string;
}, },
UpdateGmailDraftResult UpdateGmailDraftResult
>({ >) => {
toolName: "update_gmail_draft",
render: function UpdateGmailDraftUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -555,5 +556,4 @@ export const UpdateGmailDraftToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { ClockIcon, CornerDownLeftIcon, GlobeIcon, MapPinIcon, Pen, UsersIcon } from "lucide-react"; import { ClockIcon, CornerDownLeftIcon, GlobeIcon, MapPinIcon, Pen, UsersIcon } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -606,7 +606,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateCalendarEventToolUI = makeAssistantToolUI< export const CreateCalendarEventToolUI = ({
args,
result,
}: ToolCallMessagePartProps<
{ {
summary: string; summary: string;
start_datetime: string; start_datetime: string;
@ -616,9 +619,7 @@ export const CreateCalendarEventToolUI = makeAssistantToolUI<
attendees?: string[]; attendees?: string[];
}, },
CreateCalendarEventResult CreateCalendarEventResult
>({ >) => {
toolName: "create_calendar_event",
render: function CreateCalendarEventUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -650,5 +651,4 @@ export const CreateCalendarEventToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CalendarIcon, ClockIcon, CornerDownLeftIcon, MapPinIcon } from "lucide-react"; import { CalendarIcon, ClockIcon, CornerDownLeftIcon, MapPinIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -431,12 +431,12 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteCalendarEventToolUI = makeAssistantToolUI< export const DeleteCalendarEventToolUI = ({
result,
}: ToolCallMessagePartProps<
{ event_title_or_id: string; delete_from_kb?: boolean }, { event_title_or_id: string; delete_from_kb?: boolean },
DeleteCalendarEventResult DeleteCalendarEventResult
>({ >) => {
toolName: "delete_calendar_event",
render: function DeleteCalendarEventUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -470,5 +470,4 @@ export const DeleteCalendarEventToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { import {
ArrowRightIcon, ArrowRightIcon,
@ -653,7 +653,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateCalendarEventToolUI = makeAssistantToolUI< export const UpdateCalendarEventToolUI = ({
args,
result,
}: ToolCallMessagePartProps<
{ {
event_ref: string; event_ref: string;
new_summary?: string; new_summary?: string;
@ -664,9 +667,7 @@ export const UpdateCalendarEventToolUI = makeAssistantToolUI<
new_attendees?: string[]; new_attendees?: string[];
}, },
UpdateCalendarEventResult UpdateCalendarEventResult
>({ >) => {
toolName: "update_calendar_event",
render: function UpdateCalendarEventUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -699,5 +700,4 @@ export const UpdateCalendarEventToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, FileIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, FileIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -492,12 +492,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateGoogleDriveFileToolUI = makeAssistantToolUI< export const CreateGoogleDriveFileToolUI = ({ args, result }: ToolCallMessagePartProps<{ name: string; file_type: string; content?: string }, CreateGoogleDriveFileResult>) => {
{ name: string; file_type: string; content?: string },
CreateGoogleDriveFileResult
>({
toolName: "create_google_drive_file",
render: function CreateGoogleDriveFileUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -531,5 +526,4 @@ export const CreateGoogleDriveFileToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CornerDownLeftIcon, InfoIcon } from "lucide-react"; import { CornerDownLeftIcon, InfoIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -410,12 +410,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteGoogleDriveFileToolUI = makeAssistantToolUI< export const DeleteGoogleDriveFileToolUI = ({ result }: ToolCallMessagePartProps<{ file_name: string; delete_from_kb?: boolean }, DeleteGoogleDriveFileResult>) => {
{ file_name: string; delete_from_kb?: boolean },
DeleteGoogleDriveFileResult
>({
toolName: "delete_google_drive_file",
render: function DeleteGoogleDriveFileUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -451,5 +446,4 @@ export const DeleteGoogleDriveFileToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -536,7 +536,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateJiraIssueToolUI = makeAssistantToolUI< export const CreateJiraIssueToolUI = ({ args, result }: ToolCallMessagePartProps<
{ {
project_key: string; project_key: string;
summary: string; summary: string;
@ -545,9 +545,7 @@ export const CreateJiraIssueToolUI = makeAssistantToolUI<
priority?: string; priority?: string;
}, },
CreateJiraIssueResult CreateJiraIssueResult
>({ >) => {
toolName: "create_jira_issue",
render: function CreateJiraIssueUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -579,5 +577,4 @@ export const CreateJiraIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CornerDownLeftIcon } from "lucide-react"; import { CornerDownLeftIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -393,12 +393,10 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteJiraIssueToolUI = makeAssistantToolUI< export const DeleteJiraIssueToolUI = ({ result }: ToolCallMessagePartProps<
{ issue_title_or_key: string; delete_from_kb?: boolean }, { issue_title_or_key: string; delete_from_kb?: boolean },
DeleteJiraIssueResult DeleteJiraIssueResult
>({ >) => {
toolName: "delete_jira_issue",
render: function DeleteJiraIssueUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -432,5 +430,4 @@ export const DeleteJiraIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -553,7 +553,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateJiraIssueToolUI = makeAssistantToolUI< export const UpdateJiraIssueToolUI = ({ args, result }: ToolCallMessagePartProps<
{ {
issue_title_or_key: string; issue_title_or_key: string;
new_summary?: string; new_summary?: string;
@ -561,9 +561,7 @@ export const UpdateJiraIssueToolUI = makeAssistantToolUI<
new_priority?: string; new_priority?: string;
}, },
UpdateJiraIssueResult UpdateJiraIssueResult
>({ >) => {
toolName: "update_jira_issue",
render: function UpdateJiraIssueUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -596,5 +594,4 @@ export const UpdateJiraIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -605,12 +605,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateLinearIssueToolUI = makeAssistantToolUI< export const CreateLinearIssueToolUI = ({ args, result }: ToolCallMessagePartProps<{ title: string; description?: string }, CreateLinearIssueResult>) => {
{ title: string; description?: string },
CreateLinearIssueResult
>({
toolName: "create_linear_issue",
render: function CreateLinearIssueUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -640,5 +635,4 @@ export const CreateLinearIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CornerDownLeftIcon } from "lucide-react"; import { CornerDownLeftIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -360,12 +360,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteLinearIssueToolUI = makeAssistantToolUI< export const DeleteLinearIssueToolUI = ({ result }: ToolCallMessagePartProps<{ issue_ref: string; delete_from_kb?: boolean }, DeleteLinearIssueResult>) => {
{ issue_ref: string; delete_from_kb?: boolean },
DeleteLinearIssueResult
>({
toolName: "delete_linear_issue",
render: function DeleteLinearIssueUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -397,5 +392,4 @@ export const DeleteLinearIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -739,8 +739,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateLinearIssueToolUI = makeAssistantToolUI< export const UpdateLinearIssueToolUI = ({ args, result }: ToolCallMessagePartProps<{
{
issue_ref: string; issue_ref: string;
new_title?: string; new_title?: string;
new_description?: string; new_description?: string;
@ -748,11 +747,7 @@ export const UpdateLinearIssueToolUI = makeAssistantToolUI<
new_assignee_email?: string; new_assignee_email?: string;
new_priority?: number; new_priority?: number;
new_label_names?: string[]; new_label_names?: string[];
}, }, UpdateLinearIssueResult>) => {
UpdateLinearIssueResult
>({
toolName: "update_linear_issue",
render: function UpdateLinearIssueUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -783,5 +778,4 @@ export const UpdateLinearIssueToolUI = makeAssistantToolUI<
if (isErrorResult(result)) return <ErrorCard result={result} />; if (isErrorResult(result)) return <ErrorCard result={result} />;
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { AlertCircleIcon, ExternalLinkIcon, LinkIcon } from "lucide-react"; import { AlertCircleIcon, ExternalLinkIcon, LinkIcon } from "lucide-react";
import { z } from "zod"; import { z } from "zod";
import { import {
@ -111,9 +111,7 @@ function ParsedMediaCard({ result }: { result: unknown }) {
* - Domain name * - Domain name
* - Clickable link to open in new tab * - Clickable link to open in new tab
*/ */
export const LinkPreviewToolUI = makeAssistantToolUI<LinkPreviewArgs, LinkPreviewResult>({ export const LinkPreviewToolUI = ({ args, result, status }: ToolCallMessagePartProps<LinkPreviewArgs, LinkPreviewResult>) => {
toolName: "link_preview",
render: function LinkPreviewUI({ args, result, status }) {
const url = args.url || "Unknown URL"; const url = args.url || "Unknown URL";
// Loading state - tool is still running // Loading state - tool is still running
@ -162,8 +160,7 @@ export const LinkPreviewToolUI = makeAssistantToolUI<LinkPreviewArgs, LinkPrevie
</MediaCardErrorBoundary> </MediaCardErrorBoundary>
</div> </div>
); );
}, };
});
// ============================================================================ // ============================================================================
// Multi Link Preview Schemas // Multi Link Preview Schemas
@ -195,12 +192,7 @@ const MultiLinkPreviewResultSchema = z.object({
type MultiLinkPreviewArgs = z.infer<typeof MultiLinkPreviewArgsSchema>; type MultiLinkPreviewArgs = z.infer<typeof MultiLinkPreviewArgsSchema>;
type MultiLinkPreviewResult = z.infer<typeof MultiLinkPreviewResultSchema>; type MultiLinkPreviewResult = z.infer<typeof MultiLinkPreviewResultSchema>;
export const MultiLinkPreviewToolUI = makeAssistantToolUI< export const MultiLinkPreviewToolUI = ({ args, result, status }: ToolCallMessagePartProps<MultiLinkPreviewArgs, MultiLinkPreviewResult>) => {
MultiLinkPreviewArgs,
MultiLinkPreviewResult
>({
toolName: "multi_link_preview",
render: function MultiLinkPreviewUI({ args, result, status }) {
const urls = args.urls || []; const urls = args.urls || [];
// Loading state // Loading state
@ -244,8 +236,7 @@ export const MultiLinkPreviewToolUI = makeAssistantToolUI<
))} ))}
</div> </div>
); );
}, };
});
export { export {
LinkPreviewArgsSchema, LinkPreviewArgsSchema,

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -445,12 +445,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const CreateNotionPageToolUI = makeAssistantToolUI< export const CreateNotionPageToolUI = ({ args, result }: ToolCallMessagePartProps<{ title: string; content: string }, CreateNotionPageResult>) => {
{ title: string; content: string },
CreateNotionPageResult
>({
toolName: "create_notion_page",
render: function CreateNotionPageUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -486,5 +481,4 @@ export const CreateNotionPageToolUI = makeAssistantToolUI<
} }
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { CornerDownLeftIcon } from "lucide-react"; import { CornerDownLeftIcon } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { TextShimmerLoader } from "@/components/prompt-kit/loader"; import { TextShimmerLoader } from "@/components/prompt-kit/loader";
@ -372,12 +372,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const DeleteNotionPageToolUI = makeAssistantToolUI< export const DeleteNotionPageToolUI = ({ result }: ToolCallMessagePartProps<{ page_title: string; delete_from_kb?: boolean }, DeleteNotionPageResult>) => {
{ page_title: string; delete_from_kb?: boolean },
DeleteNotionPageResult
>({
toolName: "delete_notion_page",
render: function DeleteNotionPageUI({ result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -420,5 +415,4 @@ export const DeleteNotionPageToolUI = makeAssistantToolUI<
} }
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { useSetAtom } from "jotai"; import { useSetAtom } from "jotai";
import { CornerDownLeftIcon, Pen } from "lucide-react"; import { CornerDownLeftIcon, Pen } from "lucide-react";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
@ -395,12 +395,7 @@ function SuccessCard({ result }: { result: SuccessResult }) {
); );
} }
export const UpdateNotionPageToolUI = makeAssistantToolUI< export const UpdateNotionPageToolUI = ({ args, result }: ToolCallMessagePartProps<{ page_title: string; content: string }, UpdateNotionPageResult>) => {
{ page_title: string; content: string },
UpdateNotionPageResult
>({
toolName: "update_notion_page",
render: function UpdateNotionPageUI({ args, result }) {
if (!result) return null; if (!result) return null;
if (isInterruptResult(result)) { if (isInterruptResult(result)) {
@ -440,5 +435,4 @@ export const UpdateNotionPageToolUI = makeAssistantToolUI<
} }
return <SuccessCard result={result as SuccessResult} />; return <SuccessCard result={result as SuccessResult} />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { import {
AlertCircleIcon, AlertCircleIcon,
CheckCircle2Icon, CheckCircle2Icon,
@ -380,9 +380,7 @@ function ExecuteCompleted({
// Tool UI // Tool UI
// ============================================================================ // ============================================================================
export const SandboxExecuteToolUI = makeAssistantToolUI<ExecuteArgs, ExecuteResult>({ export const SandboxExecuteToolUI = ({ args, result, status }: ToolCallMessagePartProps<ExecuteArgs, ExecuteResult>) => {
toolName: "execute",
render: function SandboxExecuteUI({ args, result, status }) {
const command = args.command || "…"; const command = args.command || "…";
if (status.type === "running" || status.type === "requires-action") { if (status.type === "running" || status.type === "requires-action") {
@ -414,7 +412,6 @@ export const SandboxExecuteToolUI = makeAssistantToolUI<ExecuteArgs, ExecuteResu
const parsed = parseExecuteResult(result); const parsed = parseExecuteResult(result);
const threadId = result.thread_id || null; const threadId = result.thread_id || null;
return <ExecuteCompleted command={command} parsed={parsed} threadId={threadId} />; return <ExecuteCompleted command={command} parsed={parsed} threadId={threadId} />;
}, };
});
export { ExecuteArgsSchema, ExecuteResultSchema, type ExecuteArgs, type ExecuteResult }; export { ExecuteArgsSchema, ExecuteResultSchema, type ExecuteArgs, type ExecuteResult };

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { AlertCircleIcon, FileTextIcon } from "lucide-react"; import { AlertCircleIcon, FileTextIcon } from "lucide-react";
import { z } from "zod"; import { z } from "zod";
import { import {
@ -104,9 +104,7 @@ function ParsedArticle({ result }: { result: unknown }) {
* - Word count * - Word count
* - Link to original source * - Link to original source
*/ */
export const ScrapeWebpageToolUI = makeAssistantToolUI<ScrapeWebpageArgs, ScrapeWebpageResult>({ export const ScrapeWebpageToolUI = ({ args, result, status }: ToolCallMessagePartProps<ScrapeWebpageArgs, ScrapeWebpageResult>) => {
toolName: "scrape_webpage",
render: function ScrapeWebpageUI({ args, result, status }) {
const url = args.url || "Unknown URL"; const url = args.url || "Unknown URL";
// Loading state - tool is still running // Loading state - tool is still running
@ -155,8 +153,7 @@ export const ScrapeWebpageToolUI = makeAssistantToolUI<ScrapeWebpageArgs, Scrape
</ArticleErrorBoundary> </ArticleErrorBoundary>
</div> </div>
); );
}, };
});
export { export {
ScrapeWebpageArgsSchema, ScrapeWebpageArgsSchema,

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { BrainIcon, CheckIcon, Loader2Icon, SearchIcon, XIcon } from "lucide-react"; import { BrainIcon, CheckIcon, Loader2Icon, SearchIcon, XIcon } from "lucide-react";
import { z } from "zod"; import { z } from "zod";
@ -80,9 +80,7 @@ function CategoryBadge({ category }: { category: string }) {
// Save Memory Tool UI // Save Memory Tool UI
// ============================================================================ // ============================================================================
export const SaveMemoryToolUI = makeAssistantToolUI<SaveMemoryArgs, SaveMemoryResult>({ export const SaveMemoryToolUI = ({ args, result, status }: ToolCallMessagePartProps<SaveMemoryArgs, SaveMemoryResult>) => {
toolName: "save_memory",
render: function SaveMemoryUI({ args, result, status }) {
const isRunning = status.type === "running" || status.type === "requires-action"; const isRunning = status.type === "running" || status.type === "requires-action";
const isComplete = status.type === "complete"; const isComplete = status.type === "complete";
const isError = result?.status === "error"; const isError = result?.status === "error";
@ -159,16 +157,13 @@ export const SaveMemoryToolUI = makeAssistantToolUI<SaveMemoryArgs, SaveMemoryRe
} }
return null; return null;
}, };
});
// ============================================================================ // ============================================================================
// Recall Memory Tool UI // Recall Memory Tool UI
// ============================================================================ // ============================================================================
export const RecallMemoryToolUI = makeAssistantToolUI<RecallMemoryArgs, RecallMemoryResult>({ export const RecallMemoryToolUI = ({ args, result, status }: ToolCallMessagePartProps<RecallMemoryArgs, RecallMemoryResult>) => {
toolName: "recall_memory",
render: function RecallMemoryUI({ args, result, status }) {
const isRunning = status.type === "running" || status.type === "requires-action"; const isRunning = status.type === "running" || status.type === "requires-action";
const isComplete = status.type === "complete"; const isComplete = status.type === "complete";
const isError = result?.status === "error"; const isError = result?.status === "error";
@ -263,8 +258,7 @@ export const RecallMemoryToolUI = makeAssistantToolUI<RecallMemoryArgs, RecallMe
} }
return null; return null;
}, };
});
// ============================================================================ // ============================================================================
// Exports // Exports

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { makeAssistantToolUI } from "@assistant-ui/react"; import type { ToolCallMessagePartProps } from "@assistant-ui/react";
import { import {
AlertCircleIcon, AlertCircleIcon,
Download, Download,
@ -617,12 +617,10 @@ function StatusPoller({
return <ErrorState title={title} error="Unexpected state" />; return <ErrorState title={title} error="Unexpected state" />;
} }
export const GenerateVideoPresentationToolUI = makeAssistantToolUI< export const GenerateVideoPresentationToolUI = ({ args, result, status }: ToolCallMessagePartProps<
GenerateVideoPresentationArgs, GenerateVideoPresentationArgs,
GenerateVideoPresentationResult GenerateVideoPresentationResult
>({ >) => {
toolName: "generate_video_presentation",
render: function GenerateVideoPresentationUI({ args, result, status }) {
const params = useParams(); const params = useParams();
const pathname = usePathname(); const pathname = usePathname();
const isPublicRoute = pathname?.startsWith("/public/"); const isPublicRoute = pathname?.startsWith("/public/");
@ -705,5 +703,4 @@ export const GenerateVideoPresentationToolUI = makeAssistantToolUI<
} }
return <ErrorState title={title} error="Missing presentation ID" />; return <ErrorState title={title} error="Missing presentation ID" />;
}, };
});

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { makeAssistantToolUI, useAssistantState } from "@assistant-ui/react"; import { type ToolCallMessagePartProps, useAuiState } from "@assistant-ui/react";
import { useAtomValue, useSetAtom } from "jotai"; import { useAtomValue, useSetAtom } from "jotai";
import { useEffect, useMemo } from "react"; import { useEffect, useMemo } from "react";
import { z } from "zod"; import { z } from "zod";
@ -63,14 +63,17 @@ function WriteTodosLoading() {
* only the FIRST component renders. Subsequent updates just update the * only the FIRST component renders. Subsequent updates just update the
* shared state, and the first component reads from it. * shared state, and the first component reads from it.
*/ */
export const WriteTodosToolUI = makeAssistantToolUI<WriteTodosData, WriteTodosData>({ export const WriteTodosToolUI = ({
toolName: "write_todos", args,
render: function WriteTodosUI({ args, result, status, toolCallId }) { result,
status,
toolCallId,
}: ToolCallMessagePartProps<WriteTodosData, WriteTodosData>) => {
const updatePlanState = useSetAtom(updatePlanStateAtom); const updatePlanState = useSetAtom(updatePlanStateAtom);
const planStates = useAtomValue(planStatesAtom); const planStates = useAtomValue(planStatesAtom);
// Check if the THREAD is running // Check if the THREAD is running
const isThreadRunning = useAssistantState(({ thread }) => thread.isRunning); const isThreadRunning = useAuiState(({ thread }) => thread.isRunning);
// Use result if available, otherwise args (for streaming) // Use result if available, otherwise args (for streaming)
const data = result || args; const data = result || args;
@ -152,7 +155,6 @@ export const WriteTodosToolUI = makeAssistantToolUI<WriteTodosData, WriteTodosDa
</PlanErrorBoundary> </PlanErrorBoundary>
</div> </div>
); );
}, };
});
export { WriteTodosSchema, type WriteTodosData }; export { WriteTodosSchema, type WriteTodosData };

View file

@ -23,9 +23,8 @@
"dependencies": { "dependencies": {
"@ai-sdk/react": "^1.2.12", "@ai-sdk/react": "^1.2.12",
"@ariakit/react": "^0.4.21", "@ariakit/react": "^0.4.21",
"@assistant-ui/react": "^0.11.53", "@assistant-ui/react": "^0.12.19",
"@assistant-ui/react-ai-sdk": "^1.1.20", "@assistant-ui/react-markdown": "^0.12.6",
"@assistant-ui/react-markdown": "^0.11.9",
"@babel/standalone": "^7.29.2", "@babel/standalone": "^7.29.2",
"@electric-sql/client": "^1.4.0", "@electric-sql/client": "^1.4.0",
"@electric-sql/pglite": "^0.3.14", "@electric-sql/pglite": "^0.3.14",

View file

@ -15,14 +15,11 @@ importers:
specifier: ^0.4.21 specifier: ^0.4.21
version: 0.4.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 0.4.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@assistant-ui/react': '@assistant-ui/react':
specifier: ^0.11.53 specifier: ^0.12.19
version: 0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) version: 0.12.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
'@assistant-ui/react-ai-sdk':
specifier: ^1.1.20
version: 1.3.8(@assistant-ui/react@0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(assistant-cloud@0.1.18)(react@19.2.4)
'@assistant-ui/react-markdown': '@assistant-ui/react-markdown':
specifier: ^0.11.9 specifier: ^0.12.6
version: 0.11.10(@assistant-ui/react@0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 0.12.6(@assistant-ui/react@0.12.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@babel/standalone': '@babel/standalone':
specifier: ^7.29.2 specifier: ^7.29.2
version: 7.29.2 version: 7.29.2
@ -441,32 +438,16 @@ importers:
packages: packages:
'@ai-sdk/gateway@3.0.53':
resolution: {integrity: sha512-QT3FEoNARMRlk8JJVR7L98exiK9C8AGfrEJVbRxBT1yIXKs/N19o/+PsjTRVsARgDJNcy9JbJp1FspKucEat0Q==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
'@ai-sdk/provider-utils@2.2.8': '@ai-sdk/provider-utils@2.2.8':
resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
zod: ^3.23.8 zod: ^3.23.8
'@ai-sdk/provider-utils@4.0.15':
resolution: {integrity: sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
'@ai-sdk/provider@1.1.3': '@ai-sdk/provider@1.1.3':
resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==}
engines: {node: '>=18'} engines: {node: '>=18'}
'@ai-sdk/provider@3.0.8':
resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==}
engines: {node: '>=18'}
'@ai-sdk/react@1.2.12': '@ai-sdk/react@1.2.12':
resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==}
engines: {node: '>=18'} engines: {node: '>=18'}
@ -477,12 +458,6 @@ packages:
zod: zod:
optional: true optional: true
'@ai-sdk/react@3.0.99':
resolution: {integrity: sha512-xMsp5br4Dpr/3BYq/jrE8q4YLgViU1KHVq8VB0+dzdLJFU3jKA83uoxpbWqzV/edQOBPgGBSb2CgmV5v77rvzA==}
engines: {node: '>=18'}
peerDependencies:
react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1
'@ai-sdk/ui-utils@1.2.11': '@ai-sdk/ui-utils@1.2.11':
resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==}
engines: {node: '>=18'} engines: {node: '>=18'}
@ -508,31 +483,37 @@ packages:
react: ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
'@assistant-ui/react-ai-sdk@1.3.8': '@assistant-ui/core@0.1.7':
resolution: {integrity: sha512-LJ2k2r4SYDfH2gmd5xIsu7XBNGucN7ipLgzHmZ4nd8MX8/S/lBmfiNIUko7MPbwbauq6G4KPmRVsiJ5QrqIx6A==} resolution: {integrity: sha512-219T42ihVOicbJXZLWgD2CW5Bylg9Nk7geC331X4RfJxTDYlm2zIjViGlGaqfj6URXBp6kMulO2BTUrHGmAvdw==}
peerDependencies: peerDependencies:
'@assistant-ui/react': ^0.12.11 '@assistant-ui/store': ^0.2.3
'@assistant-ui/tap': ^0.5.3
'@types/react': '*' '@types/react': '*'
assistant-cloud: '*' assistant-cloud: ^0.1.22
react: ^18 || ^19 react: ^18 || ^19
zustand: ^5.0.11
peerDependenciesMeta: peerDependenciesMeta:
'@types/react': '@types/react':
optional: true optional: true
assistant-cloud: assistant-cloud:
optional: true optional: true
react:
optional: true
zustand:
optional: true
'@assistant-ui/react-markdown@0.11.10': '@assistant-ui/react-markdown@0.12.6':
resolution: {integrity: sha512-7JFd9/s/ZzOtUAHfrxvij4Ti+4V42FVyjF9veWRUsGKKcw7bBZvBxyb2cBMr93sUf0R1eQHsIV39hZjil8J7lw==} resolution: {integrity: sha512-utJqsdDXB3UVZfOa3ErLpaTHraeXkDshR0D34shWdTHrmLyx9e/HypTu4+BgiSsxS+ME6t9WO9M3VeGDprfUcQ==}
peerDependencies: peerDependencies:
'@assistant-ui/react': ^0.11.58 '@assistant-ui/react': ^0.12.19
'@types/react': '*' '@types/react': '*'
react: ^18 || ^19 react: ^18 || ^19
peerDependenciesMeta: peerDependenciesMeta:
'@types/react': '@types/react':
optional: true optional: true
'@assistant-ui/react@0.11.58': '@assistant-ui/react@0.12.19':
resolution: {integrity: sha512-5VbparS71X36Q7g+mHwXZvo4eaJohKkQzMP8jBZD9V/Bl26I8s/s3q9WjRqYWMRWaiyYaoEgnQhESM9yyBtW2g==} resolution: {integrity: sha512-scAf0o8cwjuHT9Y44EFGXcE2y6BSmpeMvt0NxOn8+Y/HBlNttQMLNvrM0p2AjacXCUufagiafAnWybzBV3nKEQ==}
peerDependencies: peerDependencies:
'@types/react': '*' '@types/react': '*'
'@types/react-dom': '*' '@types/react-dom': '*'
@ -544,8 +525,18 @@ packages:
'@types/react-dom': '@types/react-dom':
optional: true optional: true
'@assistant-ui/tap@0.3.6': '@assistant-ui/store@0.2.3':
resolution: {integrity: sha512-4IAN32J9820qbwdc7DeR5HxJVTj+cRPVSMwa9Fv2oP2eMFPAV1eZ8+/co6mgtuM9jSc38vYtZntPsGSHwL7rTg==} resolution: {integrity: sha512-daStbgSQiX7+csqK6Cvo7A8p8UZkTCSMxBHxbhJvwrlVbp7BRJWTxq3U3rpTkSGIar23SXIyVRRfXU8VW7pswA==}
peerDependencies:
'@assistant-ui/tap': ^0.5.3
'@types/react': '*'
react: ^18 || ^19
peerDependenciesMeta:
'@types/react':
optional: true
'@assistant-ui/tap@0.5.3':
resolution: {integrity: sha512-wy06ksqF2LfFxe4JXy31Ns89N/be1Dy3c+mG363cFHFp3CbLkRu8CrCN2SQSgCkXt628E+D8QyzqdBcl9kD4NQ==}
peerDependencies: peerDependencies:
'@types/react': '*' '@types/react': '*'
react: ^18 || ^19 react: ^18 || ^19
@ -1098,6 +1089,10 @@ packages:
resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@babel/runtime@7.29.2':
resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
engines: {node: '>=6.9.0'}
'@babel/standalone@7.29.2': '@babel/standalone@7.29.2':
resolution: {integrity: sha512-VSuvywmVRS8efooKrvJzs6BlVSxRvAdLeGrAKUrWoBx1fFBSeE/oBpUZCQ5BcprLyXy04W8skzz7JT8GqlNRJg==} resolution: {integrity: sha512-VSuvywmVRS8efooKrvJzs6BlVSxRvAdLeGrAKUrWoBx1fFBSeE/oBpUZCQ5BcprLyXy04W8skzz7JT8GqlNRJg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@ -4143,10 +4138,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@vercel/oidc@3.1.0':
resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==}
engines: {node: '>= 20'}
'@xmldom/xmldom@0.8.11': '@xmldom/xmldom@0.8.11':
resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
@ -4171,12 +4162,6 @@ packages:
react: react:
optional: true optional: true
ai@6.0.97:
resolution: {integrity: sha512-eZIAcBymwGhBwncRH/v9pillZNMeRCDkc4BwcvwXerXd7sxjVxRis3ZNCNCpP02pVH4NLs81ljm4cElC4vbNcQ==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
ajv@6.14.0: ajv@6.14.0:
resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==}
@ -4227,14 +4212,11 @@ packages:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
assistant-cloud@0.1.18: assistant-cloud@0.1.22:
resolution: {integrity: sha512-6tq2jPGIBjkjsLQ/Fd4r6PGj4hf05oM2jBl4hBs7YIkaJ3qBVUWiHary2+faNpsPOoY71brsVukl/qz5B1rQkA==} resolution: {integrity: sha512-AEE9shV+oFrGDv/MRTRERctNKpIYS0n34UpAQXXICiOkSWD6QZnS1ljLqruFko7fJoT5CIWq8dNeJWdzQLTBLg==}
assistant-stream@0.2.47: assistant-stream@0.3.6:
resolution: {integrity: sha512-0f+yVwoh7GVwYqaWh6vT+P/zflvEyqysJJzGhjqOPxUYjbNOjcifBw+fVwQPtxysyzye2TZCQtmOWjP0ggvnqw==} resolution: {integrity: sha512-NdtSRrQfWCDA/aqQ1xhobf/xnhuMZkhFAw9xzAt5iAoL3ouxVXOowSRN87OL4MYBQEvqtcjw9/CE6YcsXoBtuw==}
assistant-stream@0.3.3:
resolution: {integrity: sha512-Ne/uTseMIiZx740dTbr/SWxONM8nYj4Z5BRmUfqQN+TNgtOCgWOlC/oTUQ+A7LIUHtmGbcoyZwDf8yd2RASnDA==}
ast-types-flow@0.0.8: ast-types-flow@0.0.8:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
@ -4959,10 +4941,6 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
eventsource-parser@3.0.6:
resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
engines: {node: '>=18.0.0'}
extend@3.0.2: extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@ -6057,6 +6035,11 @@ packages:
engines: {node: ^18 || >=20} engines: {node: ^18 || >=20}
hasBin: true hasBin: true
nanoid@5.1.7:
resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==}
engines: {node: ^18 || >=20}
hasBin: true
napi-postinstall@0.3.4: napi-postinstall@0.3.4:
resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
@ -7149,6 +7132,11 @@ packages:
peerDependencies: peerDependencies:
react: '>=16.8.0' react: '>=16.8.0'
use-effect-event@2.0.3:
resolution: {integrity: sha512-fz1en+z3fYXCXx3nMB8hXDMuygBltifNKZq29zDx+xNJ+1vEs6oJlYd9sK31vxJ0YI534VUsHEBY0k2BATsmBQ==}
peerDependencies:
react: ^18.3 || ^19.0.0-0
use-intl@4.8.3: use-intl@4.8.3:
resolution: {integrity: sha512-nLxlC/RH+le6g3amA508Itnn/00mE+J22ui21QhOWo5V9hCEC43+WtnRAITbJW0ztVZphev5X9gvOf2/Dk9PLA==} resolution: {integrity: sha512-nLxlC/RH+le6g3amA508Itnn/00mE+J22ui21QhOWo5V9hCEC43+WtnRAITbJW0ztVZphev5X9gvOf2/Dk9PLA==}
peerDependencies: peerDependencies:
@ -7331,13 +7319,6 @@ packages:
snapshots: snapshots:
'@ai-sdk/gateway@3.0.53(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
'@vercel/oidc': 3.1.0
zod: 4.3.6
'@ai-sdk/provider-utils@2.2.8(zod@4.3.6)': '@ai-sdk/provider-utils@2.2.8(zod@4.3.6)':
dependencies: dependencies:
'@ai-sdk/provider': 1.1.3 '@ai-sdk/provider': 1.1.3
@ -7345,21 +7326,10 @@ snapshots:
secure-json-parse: 2.7.0 secure-json-parse: 2.7.0
zod: 4.3.6 zod: 4.3.6
'@ai-sdk/provider-utils@4.0.15(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@standard-schema/spec': 1.1.0
eventsource-parser: 3.0.6
zod: 4.3.6
'@ai-sdk/provider@1.1.3': '@ai-sdk/provider@1.1.3':
dependencies: dependencies:
json-schema: 0.4.0 json-schema: 0.4.0
'@ai-sdk/provider@3.0.8':
dependencies:
json-schema: 0.4.0
'@ai-sdk/react@1.2.12(react@19.2.4)(zod@4.3.6)': '@ai-sdk/react@1.2.12(react@19.2.4)(zod@4.3.6)':
dependencies: dependencies:
'@ai-sdk/provider-utils': 2.2.8(zod@4.3.6) '@ai-sdk/provider-utils': 2.2.8(zod@4.3.6)
@ -7370,16 +7340,6 @@ snapshots:
optionalDependencies: optionalDependencies:
zod: 4.3.6 zod: 4.3.6
'@ai-sdk/react@3.0.99(react@19.2.4)(zod@4.3.6)':
dependencies:
'@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
ai: 6.0.97(zod@4.3.6)
react: 19.2.4
swr: 2.4.0(react@19.2.4)
throttleit: 2.1.0
transitivePeerDependencies:
- zod
'@ai-sdk/ui-utils@1.2.11(zod@4.3.6)': '@ai-sdk/ui-utils@1.2.11(zod@4.3.6)':
dependencies: dependencies:
'@ai-sdk/provider': 1.1.3 '@ai-sdk/provider': 1.1.3
@ -7405,20 +7365,21 @@ snapshots:
react: 19.2.4 react: 19.2.4
react-dom: 19.2.4(react@19.2.4) react-dom: 19.2.4(react@19.2.4)
'@assistant-ui/react-ai-sdk@1.3.8(@assistant-ui/react@0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(assistant-cloud@0.1.18)(react@19.2.4)': '@assistant-ui/core@0.1.7(@assistant-ui/store@0.2.3(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(assistant-cloud@0.1.22)(react@19.2.4)(zustand@5.0.11(@types/react@19.2.14)(immer@10.2.0)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))':
dependencies: dependencies:
'@ai-sdk/react': 3.0.99(react@19.2.4)(zod@4.3.6) '@assistant-ui/store': 0.2.3(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
'@assistant-ui/react': 0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) '@assistant-ui/tap': 0.5.3(@types/react@19.2.14)(react@19.2.4)
ai: 6.0.97(zod@4.3.6) assistant-stream: 0.3.6
react: 19.2.4 nanoid: 5.1.7
zod: 4.3.6
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
assistant-cloud: 0.1.18 assistant-cloud: 0.1.22
react: 19.2.4
zustand: 5.0.11(@types/react@19.2.14)(immer@10.2.0)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
'@assistant-ui/react-markdown@0.11.10(@assistant-ui/react@0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': '@assistant-ui/react-markdown@0.12.6(@assistant-ui/react@0.12.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies: dependencies:
'@assistant-ui/react': 0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) '@assistant-ui/react': 0.12.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))
'@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
classnames: 2.5.1 classnames: 2.5.1
@ -7431,21 +7392,21 @@ snapshots:
- react-dom - react-dom
- supports-color - supports-color
'@assistant-ui/react@0.11.58(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': '@assistant-ui/react@0.12.19(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(immer@10.2.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))':
dependencies: dependencies:
'@assistant-ui/tap': 0.3.6(@types/react@19.2.14)(react@19.2.4) '@assistant-ui/core': 0.1.7(@assistant-ui/store@0.2.3(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4))(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(assistant-cloud@0.1.22)(react@19.2.4)(zustand@5.0.11(@types/react@19.2.14)(immer@10.2.0)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))
'@assistant-ui/store': 0.2.3(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)
'@assistant-ui/tap': 0.5.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/primitive': 1.1.3 '@radix-ui/primitive': 1.1.3
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-context': 1.1.3(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-context': 1.1.3(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4)
'@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4)
assistant-cloud: 0.1.18 assistant-cloud: 0.1.22
assistant-stream: 0.2.47 assistant-stream: 0.3.6
nanoid: 5.1.6 nanoid: 5.1.7
radix-ui: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react: 19.2.4 react: 19.2.4
react-dom: 19.2.4(react@19.2.4) react-dom: 19.2.4(react@19.2.4)
react-textarea-autosize: 8.5.9(@types/react@19.2.14)(react@19.2.4) react-textarea-autosize: 8.5.9(@types/react@19.2.14)(react@19.2.4)
@ -7458,7 +7419,15 @@ snapshots:
- immer - immer
- use-sync-external-store - use-sync-external-store
'@assistant-ui/tap@0.3.6(@types/react@19.2.14)(react@19.2.4)': '@assistant-ui/store@0.2.3(@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4))(@types/react@19.2.14)(react@19.2.4)':
dependencies:
'@assistant-ui/tap': 0.5.3(@types/react@19.2.14)(react@19.2.4)
react: 19.2.4
use-effect-event: 2.0.3(react@19.2.4)
optionalDependencies:
'@types/react': 19.2.14
'@assistant-ui/tap@0.5.3(@types/react@19.2.14)(react@19.2.4)':
optionalDependencies: optionalDependencies:
'@types/react': 19.2.14 '@types/react': 19.2.14
react: 19.2.4 react: 19.2.4
@ -8172,6 +8141,8 @@ snapshots:
'@babel/runtime@7.28.6': {} '@babel/runtime@7.28.6': {}
'@babel/runtime@7.29.2': {}
'@babel/standalone@7.29.2': {} '@babel/standalone@7.29.2': {}
'@babel/template@7.28.6': '@babel/template@7.28.6':
@ -11052,8 +11023,6 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.11.1': '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
optional: true optional: true
'@vercel/oidc@3.1.0': {}
'@xmldom/xmldom@0.8.11': {} '@xmldom/xmldom@0.8.11': {}
acorn-jsx@5.3.2(acorn@8.16.0): acorn-jsx@5.3.2(acorn@8.16.0):
@ -11074,14 +11043,6 @@ snapshots:
optionalDependencies: optionalDependencies:
react: 19.2.4 react: 19.2.4
ai@6.0.97(zod@4.3.6):
dependencies:
'@ai-sdk/gateway': 3.0.53(zod@4.3.6)
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.15(zod@4.3.6)
'@opentelemetry/api': 1.9.0
zod: 4.3.6
ajv@6.14.0: ajv@6.14.0:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@ -11168,20 +11129,14 @@ snapshots:
get-intrinsic: 1.3.0 get-intrinsic: 1.3.0
is-array-buffer: 3.0.5 is-array-buffer: 3.0.5
assistant-cloud@0.1.18: assistant-cloud@0.1.22:
dependencies: dependencies:
assistant-stream: 0.3.3 assistant-stream: 0.3.6
assistant-stream@0.2.47: assistant-stream@0.3.6:
dependencies: dependencies:
'@standard-schema/spec': 1.1.0 '@standard-schema/spec': 1.1.0
nanoid: 5.1.6 nanoid: 5.1.7
secure-json-parse: 4.1.0
assistant-stream@0.3.3:
dependencies:
'@standard-schema/spec': 1.1.0
nanoid: 5.1.6
secure-json-parse: 4.1.0 secure-json-parse: 4.1.0
ast-types-flow@0.0.8: {} ast-types-flow@0.0.8: {}
@ -12054,8 +12009,6 @@ snapshots:
esutils@2.0.3: {} esutils@2.0.3: {}
eventsource-parser@3.0.6: {}
extend@3.0.2: {} extend@3.0.2: {}
fast-deep-equal@3.1.3: {} fast-deep-equal@3.1.3: {}
@ -13437,6 +13390,8 @@ snapshots:
nanoid@5.1.6: {} nanoid@5.1.6: {}
nanoid@5.1.7: {}
napi-postinstall@0.3.4: {} napi-postinstall@0.3.4: {}
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
@ -14027,7 +13982,7 @@ snapshots:
react-textarea-autosize@8.5.9(@types/react@19.2.14)(react@19.2.4): react-textarea-autosize@8.5.9(@types/react@19.2.14)(react@19.2.4):
dependencies: dependencies:
'@babel/runtime': 7.28.6 '@babel/runtime': 7.29.2
react: 19.2.4 react: 19.2.4
use-composed-ref: 1.4.0(@types/react@19.2.14)(react@19.2.4) use-composed-ref: 1.4.0(@types/react@19.2.14)(react@19.2.4)
use-latest: 1.3.0(@types/react@19.2.14)(react@19.2.4) use-latest: 1.3.0(@types/react@19.2.14)(react@19.2.4)
@ -14884,6 +14839,10 @@ snapshots:
dequal: 2.0.3 dequal: 2.0.3
react: 19.2.4 react: 19.2.4
use-effect-event@2.0.3(react@19.2.4):
dependencies:
react: 19.2.4
use-intl@4.8.3(react@19.2.4): use-intl@4.8.3(react@19.2.4):
dependencies: dependencies:
'@formatjs/fast-memoize': 3.1.0 '@formatjs/fast-memoize': 3.1.0