"use client" import { useMemo, useState } from "react" import { AlertTriangleIcon, CheckCircle2Icon, TimerIcon } from "lucide-react" import { JsonTreeViewer } from "@/components/json-tree-viewer" import { Badge } from "@/components/ui/badge" import { ScrollArea } from "@/components/ui/scroll-area" import type { AIWorkflowNodeRun, AIWorkflowRun } from "@/lib/api/admin" import { cn } from "@/lib/utils" import { OfficialWorkflowEditor } from "../../ai-workflows/_components/official-workflow-editor" export function WorkflowRunAuditGraph({ run }: { run: AIWorkflowRun }) { const nodeRuns = useMemo(() => run.nodes ?? [], [run.nodes]) const firstNodeId = nodeRuns[0]?.nodeId ?? run.definition?.nodes?.[0]?.id ?? "" const [selectedNodeId, setSelectedNodeId] = useState(firstNodeId) const selectedNodeRun = nodeRuns.find((item) => item.nodeId === selectedNodeId) ?? nodeRuns[0] const executedNodeIds = useMemo(() => new Set(nodeRuns.map((item) => item.nodeId)), [nodeRuns]) return (
undefined} readonly />
已执行 {executedNodeIds.size} {run.errorMessage ? ( 异常 ) : null}
) } function NodeRunPreview({ nodeRun }: { nodeRun?: AIWorkflowNodeRun }) { if (!nodeRun) { return
暂无节点执行记录。
} return (
{nodeRun.errorMessage ? (
{nodeRun.errorMessage}
) : null}
) } function PreviewBlock({ title, value }: { title: string; value?: string }) { return (
{title}
{value ? :
}
) } function parsePreview(value: string) { try { return JSON.parse(value) } catch { return value } }