${esc(event.output_summary || event.input_summary || "")}
import { parseTrace, compareBranch, parseExchange, toExchange, attachFindings, downloadJson } from "./replay-core.js";
const $ = selector => document.querySelector(selector);
let trace = null; let importedFindings = [];
function esc(value) { return String(value ?? "").replace(/[&<>'"]/g, c => ({"&":"&","<":"<",">":">","'":"'",'"':"""}[c])); }
function renderEvents(events, target) { target.innerHTML = events.map(event => ` ${esc(event.output_summary || event.input_summary || "")}
No events.
"; } function renderTrace() { $("#meta").textContent = `${trace.trace_id} · ${trace.source_type || trace.source?.format || "trace"} · ${(trace.original_trajectory || trace.events).length} events`; if (trace.original_trajectory) { renderEvents(trace.original_trajectory, $("#original-events")); const select = $("#branch"); select.innerHTML = trace.branches.map(branch => ``).join(""); } renderComparison(); } function renderComparison() { if (!trace || !trace.branches?.length) return; const comparison = compareBranch(trace, $("#branch").value); renderEvents(comparison.alternate, $("#alternate-events")); $("#classification").textContent = comparison.classification; $("#outcomes").textContent = `Original: ${JSON.stringify(comparison.originalOutcome)} · Alternate: ${JSON.stringify(comparison.alternateOutcome)}`; $("#findings").innerHTML = importedFindings.map(f => `