"use client"; import { cn } from "@/lib/utils"; import { useScrollLock } from "@assistant-ui/react"; import { AlertCircle, ChevronRight } from "lucide-react"; import { useRef, useState, type ReactNode } from "react"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; const TRACE_ANIMATION_DURATION = 200; function ToolJsonBlock({ label, value }: { label: string; value: string }) { return (

{label}

        {value}
      
); } export function ToolTraceCard({ icon, signature, description, args, result, }: { icon: ReactNode; signature: string; description: ReactNode; args?: Record; result: unknown; }) { const rootRef = useRef(null); const [open, setOpen] = useState(false); const lockScroll = useScrollLock(rootRef, TRACE_ANIMATION_DURATION); const hasArgs = !!args && Object.keys(args).length > 0; return ( { lockScroll(); setOpen(next); }} className="group/tool-trace max-w-full" style={ { "--animation-duration": `${TRACE_ANIMATION_DURATION}ms`, } as React.CSSProperties } > {icon} {signature} {description}
); } export function ToolStatusCard({ icon, signature, message, loading = false, }: { icon: ReactNode; signature: string; message: string; loading?: boolean; }) { return (
{icon} {signature} {message}
); } export function ToolErrorCard({ signature, error, args, }: { signature: string; error?: string; args?: Record; }) { const rootRef = useRef(null); const [open, setOpen] = useState(false); const lockScroll = useScrollLock(rootRef, TRACE_ANIMATION_DURATION); const message = error || "Unknown error"; const hasArgs = !!args && Object.keys(args).length > 0; return ( { lockScroll(); setOpen(next); }} className="group/tool-error max-w-full" style={ { "--animation-duration": `${TRACE_ANIMATION_DURATION}ms`, } as React.CSSProperties } > {signature} {message}

{message}

); }