solsticestudioai commited on
Commit
07d8f3f
verified
1 Parent(s): ca34740

Publish static trace explorer

Browse files
Files changed (1) hide show
  1. app.js +18 -0
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 => ({"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"}[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."; });