import { Activity, AlertTriangle, Check, CheckCircle2, ChevronDown, ChevronRight, Circle, FileDiff, Loader2, Search, } from 'lucide-react'; import React, { useEffect, useMemo, useState } from 'react'; import type { AgentActivity, AgentUsage } from '../../domain/agentActivity'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible'; interface AgentActivityGroupProps { activities?: AgentActivity[]; usage?: AgentUsage; isStreaming?: boolean; t: (key: string) => string; } function statusLabel(status: 'running' | 'completed' | 'failed', t: AgentActivityGroupProps['t']): string { return t(`ai.chat.activity.status.${status}`); } function formatTokens(value: number | undefined): string { return new Intl.NumberFormat().format(Math.max(0, value ?? 0)); } const AgentActivityGroup: React.FC = ({ activities = [], usage, isStreaming = false, t, }) => { const [open, setOpen] = useState(isStreaming); useEffect(() => { setOpen(isStreaming); }, [isStreaming]); const visibleActivities = useMemo( () => activities.filter((activity) => activity.type !== 'web_search' || activity.query), [activities], ); return (
{visibleActivities.length > 0 && ( {open ? : } {t('ai.chat.activity.title')} {visibleActivities.length} {visibleActivities.map((activity) => { if (activity.type === 'plan_update') { return (
{activity.status === 'running' ? : } {t('ai.chat.activity.plan')} · {statusLabel(activity.status, t)}
{activity.items.map((item, index) => (
{item.completed ? : } {item.text}
))}
); } if (activity.type === 'web_search') { return (
{activity.status === 'running' ? : }
{t('ai.chat.activity.webSearch')}: {activity.query} · {statusLabel(activity.status, t)}
); } if (activity.type === 'file_change') { return (
{t('ai.chat.activity.fileChanges')} · {statusLabel(activity.status, t)}
{activity.changes.map((change, index) => (
{t(`ai.chat.activity.file.${change.kind}`)} {change.path}
))}
); } return (
{activity.message}
); })}
)} {usage && (
{usage.estimated ? `${t('ai.chat.activity.usage')} ~` : `${t('ai.chat.activity.usage')} `}{formatTokens(usage.totalTokens)} {t('ai.chat.activity.usage.input')} {formatTokens(usage.inputTokens)} {t('ai.chat.activity.usage.output')} {formatTokens(usage.outputTokens)} {!!usage.cachedInputTokens && {t('ai.chat.activity.usage.cached')} {formatTokens(usage.cachedInputTokens)}} {!!usage.reasoningTokens && {t('ai.chat.activity.usage.reasoning')} {formatTokens(usage.reasoningTokens)}}
)}
); }; export default AgentActivityGroup;