'use client'; import { Badge } from '@/components/ui/badge'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { cn } from '@/lib/utils'; import type { ToolUIPart } from 'ai'; import { CheckCircleIcon, ChevronDownIcon, CircleIcon, ClockIcon, WrenchIcon, XCircleIcon, } from 'lucide-react'; import type { ComponentProps, ReactNode } from 'react'; import { isValidElement } from 'react'; import { CodeBlock } from './code-block'; export type ToolProps = ComponentProps; export const Tool = ({ className, ...props }: ToolProps) => ( ); export type ToolHeaderProps = { title?: string; type: ToolUIPart['type']; state: ToolUIPart['state']; className?: string; }; const getStatusBadge = (status: ToolUIPart['state']) => { const labels: Record = { 'input-streaming': 'Pending', 'input-available': 'Running', 'approval-requested': 'Awaiting Approval', 'approval-responded': 'Responded', 'output-available': 'Completed', 'output-error': 'Error', 'output-denied': 'Denied', }; const icons: Record = { 'input-streaming': , 'input-available': , 'approval-requested': , 'approval-responded': , 'output-available': , 'output-error': , 'output-denied': , }; return ( {icons[status]} {labels[status]} ); }; export const ToolHeader = ({ className, title, type, state, ...props }: ToolHeaderProps) => (
{title ?? type.split('-').slice(1).join('-')} {getStatusBadge(state)}
); export type ToolContentProps = ComponentProps; export const ToolContent = ({ className, ...props }: ToolContentProps) => ( ); export type ToolInputProps = ComponentProps<'div'> & { input: ToolUIPart['input']; }; export const ToolInput = ({ className, input, ...props }: ToolInputProps) => (

Parameters

); export type ToolOutputProps = ComponentProps<'div'> & { output: ToolUIPart['output']; errorText: ToolUIPart['errorText']; }; export const ToolOutput = ({ className, output, errorText, ...props }: ToolOutputProps) => { if (!(output || errorText)) { return null; } let Output =
{output as ReactNode}
; if (typeof output === 'object' && !isValidElement(output)) { Output = ; } else if (typeof output === 'string') { Output = ; } return (

{errorText ? 'Error' : 'Result'}

{errorText &&
{errorText}
} {Output}
); };