"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 (
);
}
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}
);
}