import { CheckCircleIcon, ChevronUp, ClipboardListIcon, Loader2Icon, XCircleIcon, } from "lucide-react"; import { useMemo, useState } from "react"; import { Streamdown } from "streamdown"; import { ChainOfThought, ChainOfThoughtContent, ChainOfThoughtStep, } from "@/components/ai-elements/chain-of-thought"; import { Shimmer } from "@/components/ai-elements/shimmer"; import { Button } from "@/components/ui/button"; import { ShineBorder } from "@/components/ui/shine-border"; import { useI18n } from "@/core/i18n/hooks"; import { hasToolCalls } from "@/core/messages/utils"; import { useRehypeSplitWordsIntoSpans } from "@/core/rehype"; import { streamdownPlugins, streamdownPluginsWithWordAnimation, } from "@/core/streamdown"; import { useSubtask } from "@/core/tasks/context"; import { explainLastToolCall } from "@/core/tools/utils"; import { cn } from "@/lib/utils"; import { FlipDisplay } from "../flip-display"; import { SafeCitationContent } from "./safe-citation-content"; export function SubtaskCard({ className, taskId, isLoading, }: { className?: string; taskId: string; isLoading: boolean; }) { const { t } = useI18n(); const [collapsed, setCollapsed] = useState(true); const rehypePlugins = useRehypeSplitWordsIntoSpans(isLoading); const task = useSubtask(taskId)!; const icon = useMemo(() => { if (task.status === "completed") { return ; } else if (task.status === "failed") { return ; } else if (task.status === "in_progress") { return ; } }, [task.status]); return (
{task.status === "in_progress" && ( <> )}
{task.prompt && ( {task.prompt} } > )} {task.status === "in_progress" && task.latestMessage && hasToolCalls(task.latestMessage) && ( } > {explainLastToolCall(task.latestMessage, t)} )} {task.status === "completed" && ( <> } > ) : null } > )} {task.status === "failed" && ( {task.error}
} icon={} > )}
); }