"use client"; import { ClipboardCheck, Crosshair, MapPinned, Radio, Route } from "lucide-react"; import type { ReactNode } from "react"; import { cn } from "@/lib/utils"; import type { AgentChatMessage } from "../types"; export function AgentOperationalBrief({ messages, statusLabel, streaming, onSubmitCommand }: { messages: AgentChatMessage[]; statusLabel: string; streaming: boolean; onSubmitCommand: (prompt: string) => void; }) { const brief = createOperationalBrief(messages, statusLabel, streaming); return (

{brief.stateLabel}

{brief.task}

); } function AgentBriefMetric({ icon, label, value }: { icon: ReactNode; label: string; value: string }) { return (
{icon} {label}
{value}
); } function createOperationalBrief(messages: AgentChatMessage[], statusLabel: string, streaming: boolean) { const lastUserMessage = [...messages].reverse().find((message) => message.role === "user" && message.content.trim()); const progressItems = messages.flatMap((message) => message.progress ?? []); const todoItems = messages.flatMap((message) => message.todos?.todos ?? []); const permissionItems = messages.flatMap((message) => message.permissions ?? []); const questionItems = messages.flatMap((message) => message.questions ?? []); const latestProgress = progressItems.at(-1); const activeTodo = [...todoItems].reverse().find((todo) => todo.status === "in_progress") ?? [...todoItems].reverse().find((todo) => todo.status === "pending"); const pendingConfirmations = permissionItems.filter((permission) => permission.status === "pending" || permission.status === "error").length + questionItems.filter((question) => question.status === "pending" || question.status === "error").length; const completedSteps = progressItems.filter((item) => item.status === "completed").length; const task = lastUserMessage?.content.trim() || "等待调度指令"; const evidence = latestProgress?.detail || latestProgress?.title || statusLabel; const plan = activeTodo?.content || (completedSteps > 0 ? `${completedSteps} 项已完成` : "待生成"); const confirmation = pendingConfirmations > 0 ? `${pendingConfirmations} 项待确认` : "无需确认"; const stateLabel = pendingConfirmations > 0 ? "等待人工确认" : streaming ? "Agent 分析中" : "分析完成"; const statusDotClassName = pendingConfirmations > 0 ? "bg-orange-500" : streaming ? "bg-blue-500" : "bg-emerald-500"; const promptContext = lastUserMessage?.content.trim() || "当前排水管网运行态势"; return { task, evidence, plan, confirmation, stateLabel, statusDotClassName, primaryCommand: `请基于“${promptContext}”预览空间影响范围,并列出需要确认的操作。`, secondaryCommand: `请检查“${promptContext}”的证据链,按数据来源、风险和不确定性汇总。` }; }