"use client"; import { Badge, Spinner } from "@/components/ui/primitives"; import { cn, timeAgo } from "@/lib/utils"; import { ms, usd } from "@/components/ai/models/format"; import { STATUS_TONE, isLive } from "./ExecutionDrawer"; export interface ExecSummary { id: string; agent: string; task: string; model: string | null; status: string; scopes: string[]; outcome: string | null; error: string | null; costUsd: number | null; createdAt: string; startedAt: string | null; finishedAt: string | null; proposals: number; pendingProposals: number; toolCalls: number } export function ExecutionList({ items, agents, onOpen }: { items: ExecSummary[]; agents: Record; onOpen: (id: string) => void }) { if (!items.length) return
No executions yet. Pick an agent, describe a task and run it.
; return (
{["Status", "Agent", "Task", "Model", "Tools", "Proposals", "Cost", "Duration", "When"].map((h) => )}{items.map((e) => { const a = agents[e.agent]; const dur = e.startedAt ? ((e.finishedAt ? new Date(e.finishedAt) : new Date()).getTime() - new Date(e.startedAt).getTime()) : null; return ( onOpen(e.id)} className="cursor-pointer border-t border-line hover:bg-bg-sunk/60"> ); })}
{h}
{isLive(e.status) && }{e.status.replace("_", " ")} {a?.icon} {a?.name ?? e.agent} {e.task} {e.model ?? "—"} {e.toolCalls} {e.proposals}{e.pendingProposals > 0 && {e.pendingProposals} pending} {usd(e.costUsd)}{dur != null ? ms(dur) : "—"}{timeAgo(e.createdAt)}
); }