import { ArrowRight, CheckCircle2, FileCheck2 } from "lucide-react"; import { Handle, Position, type NodeProps } from "@xyflow/react"; import type { CanvasNodeData } from "@/lib/layout"; import { runResultFallback } from "@/lib/status-copy"; import { SourceNoticeBadge, StatusBadge } from "@/components/ui/Badges"; import { SourceComparisonButton } from "@/components/flow/SourceComparisonButton"; export function RunResultCard({ data }: NodeProps) { const { item, onOpen } = data as unknown as CanvasNodeData; if (!item || item.itemType !== "final-result") return null; const result = item.result; const artifact = result.artifact; const summary = result.summary || result.errorMessage || runResultFallback(result.status, result.terminal); const summaryPreview = resultSummaryPreview(summary); const adoptedCount = result.branchCounts.merged ?? 0; return
{ if (event.target === event.currentTarget && (event.key === "Enter" || event.key === " ")) { event.preventDefault(); onOpen(item, "business"); } }}>
最终结果
{result.title !== "最终结果" ?

{result.title}

: null}
{result.terminal ? "当前主脚本已经形成" : "脚本构建仍在推进"}

{result.roundCount} 轮构建 · {result.branchCounts.total} 个候选方案

{summaryPreview ?
构建摘要

{summaryPreview}

: null}
{artifact.paragraphCount ?? 0}段落{artifact.elementCount ?? 0}元素{artifact.linkCount ?? 0}关联
{adoptedCount} 个方案已采用{result.branchCounts.discarded ?? 0} 个未采用
; } function resultSummaryPreview(value: string) { const lines = value .replace(/\\n/g, "\n") .split(/\n+/) .map((line) => line.replace(/^\s*(?:#{1,6}\s*|[-*+]\s+|\d+[.、)]\s*)/, "").replace(/[`*_]/g, "").trim()) .filter(Boolean); const text = lines.find((line) => line.length >= 18) || lines[0] || ""; if (text.length <= 150) return text; const candidate = text.slice(0, 151); const punctuation = Math.max(...["。", "!", "?", ";"].map((mark) => candidate.lastIndexOf(mark))); return punctuation >= 72 ? candidate.slice(0, punctuation + 1) : `${text.slice(0, 149).trim()}…`; }