Publish static trace explorer
Browse files
app.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { parseTrace, compareBranch } from "./replay-core.js";
|
| 2 |
+
|
| 3 |
+
const $ = selector => document.querySelector(selector);
|
| 4 |
+
let trace = null;
|
| 5 |
+
function esc(value) { return String(value ?? "").replace(/[&<>'"]/g, c => ({"&":"&","<":"<",">":">","'":"'",'"':"""}[c])); }
|
| 6 |
+
function renderEvents(events, target) { target.innerHTML = events.map(event => `<article class="event"><span class="seq">${event.sequence ?? "路"}</span><strong>${esc(event.event_type)}</strong><span>${esc(event.actor)}</span><p>${esc(event.output_summary || event.input_summary || "")}</p></article>`).join("") || "<p class=muted>No events.</p>"; }
|
| 7 |
+
function renderTrace() {
|
| 8 |
+
$("#title").textContent = trace.title;
|
| 9 |
+
$("#meta").textContent = `${trace.trace_id} 路 ${trace.source_type} 路 ${trace.original_trajectory.length} events`;
|
| 10 |
+
renderEvents(trace.original_trajectory, $("#original-events"));
|
| 11 |
+
const select = $("#branch"); select.innerHTML = trace.branches.map(branch => `<option value="${esc(branch.branch_id)}">${esc(branch.branch_id)}</option>`).join("");
|
| 12 |
+
renderComparison();
|
| 13 |
+
}
|
| 14 |
+
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)}`; }
|
| 15 |
+
async function loadText(text) { try { trace = parseTrace(text); renderTrace(); $("#error").textContent = ""; } catch (error) { $("#error").textContent = error.message; } }
|
| 16 |
+
$("#file").addEventListener("change", event => event.target.files[0]?.text().then(loadText));
|
| 17 |
+
$("#branch").addEventListener("change", renderComparison);
|
| 18 |
+
fetch("data/traces.jsonl").then(response => response.text()).then(text => loadText(text.split("\n").find(Boolean))).catch(() => { $("#error").textContent = "Load a local trace JSON file to begin."; });
|