import "./AgentErrorDetailsModal.css"; import { useMemo, useState } from "react"; import { AlertCircle, Check, Copy, ExternalLink } from "lucide-react"; const DEFAULT_ISSUE_URL = "https://github.com/Runfusion/Fusion/issues/new"; export interface AgentErrorIssueContext { surface: string; agentId?: string; agentName?: string; agentState?: string; runId?: string; taskId?: string; timestamp?: string; } interface AgentErrorDetailsModalProps { open: boolean; onClose: () => void; errorText: string; issueContext: AgentErrorIssueContext; } export function buildAgentErrorIssueUrl(errorText: string, context: AgentErrorIssueContext): string { const title = `[Agent Error] ${context.surface}${context.agentName ? ` - ${context.agentName}` : ""}`; const bodyLines = [ "## Agent Error Report", "", `- Surface: ${context.surface}`, `- Agent ID: ${context.agentId ?? "unknown"}`, `- Agent Name: ${context.agentName ?? "unknown"}`, `- Agent State: ${context.agentState ?? "unknown"}`, `- Run ID: ${context.runId ?? "n/a"}`, `- Task ID: ${context.taskId ?? "n/a"}`, `- Timestamp: ${context.timestamp ?? new Date().toISOString()}`, "", "## Error", "```text", errorText, "```", ]; const params = new URLSearchParams({ title, body: bodyLines.join("\n"), }); return `${DEFAULT_ISSUE_URL}?${params.toString()}`; } export function AgentErrorDetailsModal({ open, onClose, errorText, issueContext }: AgentErrorDetailsModalProps) { const [copied, setCopied] = useState(false); const issueUrl = useMemo(() => buildAgentErrorIssueUrl(errorText, issueContext), [errorText, issueContext]); if (!open) { return null; } return (
event.target === event.currentTarget && onClose()} role="dialog" aria-modal="true" aria-label="Agent error details">

Agent Error Details

{errorText}
{ event.preventDefault(); window.open(issueUrl, "_blank", "noopener,noreferrer"); }} > Report on GitHub
); } interface AgentErrorIndicatorProps { errorText: string; issueContext: AgentErrorIssueContext; summaryPrefix?: string; } export function AgentErrorIndicator({ errorText, issueContext, summaryPrefix = "Error" }: AgentErrorIndicatorProps) { const [open, setOpen] = useState(false); return ( <> setOpen(false)} errorText={errorText} issueContext={issueContext} /> ); }