'use client'; import { AlertCircle, Bot, BrainCircuit, Loader2, ServerCog, Square } from 'lucide-react'; import type { ProcessEvent, ProcessRun } from '@/types'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; function statusLabel(status: string) { if (status === 'done') return '已完成'; if (status === 'error') return '失败'; if (status === 'cancelled') return '已取消'; if (status === 'waiting') return '等待中'; if (status === 'running') return '运行中'; if (status === 'queued') return '排队中'; return status; } function actorTypeLabel(actorType: string) { if (actorType === 'mcp') return 'MCP'; if (actorType === 'system') return '系统'; if (actorType === 'agent') return '智能体'; return actorType; } function eventKindLabel(kind: string) { if (kind === 'run_started') return '已启动'; if (kind === 'run_progress') return '进行中'; if (kind === 'run_status') return '状态更新'; if (kind === 'run_artifact') return '产物'; if (kind === 'run_finished') return '已结束'; if (kind === 'run_cancelled') return '已取消'; return kind; } function statusTone(status: string) { if (status === 'done') return 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20'; if (status === 'error') return 'bg-rose-500/10 text-rose-300 border-rose-500/20'; if (status === 'cancelled') return 'bg-zinc-500/10 text-zinc-300 border-zinc-500/20'; if (status === 'waiting') return 'bg-amber-500/10 text-amber-300 border-amber-500/20'; return 'bg-sky-500/10 text-sky-300 border-sky-500/20'; } function actorIcon(run: ProcessRun) { if (run.actor_type === 'mcp') return ; if (run.actor_type === 'system') return ; return ; } export function ProcessLane({ runs, events, selectedRunId, onSelectRun, onCancelRun, }: { runs: ProcessRun[]; events: ProcessEvent[]; selectedRunId: string | null; onSelectRun: (runId: string) => void; onCancelRun: (runId: string) => void; }) { const sortedRuns = [...runs].sort((a, b) => { const at = new Date(a.started_at).getTime(); const bt = new Date(b.started_at).getTime(); return bt - at; }); if (sortedRuns.length === 0) { return null; } return (

执行过程

智能体、A2A、MCP 的实时过程

{sortedRuns.length} 个任务
{sortedRuns.map((run) => { const runEvents = events .filter((event) => event.run_id === run.run_id) .slice(-5) .reverse(); const isSelected = run.run_id === selectedRunId; const canCancel = !run.parent_run_id && run.actor_type !== 'mcp' && (run.status === 'running' || run.status === 'waiting'); return ( onSelectRun(run.run_id)} >
{actorIcon(run)}
{run.actor_name}

{run.title}

{statusLabel(run.status)} {canCancel && ( )}
{actorTypeLabel(run.actor_type)} {run.source && {run.source}} {run.parent_run_id && 子任务}
{run.summary && (
{run.summary}
)}
{runEvents.length === 0 && run.status === 'running' && (
等待首个事件...
)} {runEvents.map((event) => (
{eventKindLabel(event.kind)} {event.status && {statusLabel(event.status)}}
{event.text || '结构化更新'}
))} {run.status === 'error' && (
此任务执行失败。
)}
); })}
); }