import type { BaseEvent } from "../types.js"; const TRACE_EVENTS = new Set([ "agent.spawn.proposed", "agent.spawned", "agent.completed", "agent.failed", "agent.cancelled", "handoff.sent", "handoff.received", "blackboard.event", "workflow.started", "workflow.node.started", "workflow.node.completed", "workflow.completed", "verification.completed", "result.completed", ]); function text(event: BaseEvent, key: string): string | undefined { return typeof event[key] === "string" ? event[key] as string : undefined; } function number(event: BaseEvent, key: string): number | undefined { return typeof event[key] === "number" ? event[key] as number : undefined; } export function isTraceEvent(event: BaseEvent): boolean { return TRACE_EVENTS.has(event.eventType); } export function traceLine(event: BaseEvent): string | undefined { if (!isTraceEvent(event)) return undefined; const at = event.timestamp.slice(11, 19); const node = text(event, "nodeId") ?? text(event, "fromNodeId") ?? "root"; const peer = text(event, "toNodeId"); const size = number(event, "payloadChars") ?? number(event, "taskChars"); if (event.eventType === "handoff.sent" || event.eventType === "handoff.received") return `${at} ${event.eventType.replace("handoff.", "handoff ")} ${node}${peer ? ` → ${peer}` : ""}${size === undefined ? "" : ` (${size} chars)`}`; if (event.eventType === "result.completed") return `${at} result ${text(event, "terminalState") ?? "unknown"}`; if (event.eventType === "agent.failed") return `${at} failed ${node}: ${text(event, "errorClass") ?? "unknown"}`; return `${at} ${event.eventType.replaceAll(".", " ")} ${node}`; } export function formatTrace(events: readonly BaseEvent[]): string { const lines = events.map(traceLine).filter((line): line is string => line !== undefined); return lines.length ? lines.join("\n") : "No UltraPi trace events for this run."; }