// MoNaCo dev viewer — sibling of open-wikitable-smoke-viewer, adapted for the // 100-question monaco_dev subset. Key divergences from the smoke viewer: // // • scoring column is LLM judge_score (not deterministic F1). Every metric // the trajectory / compare cards expose comes from the AML judge output // (parsed.judge_score / precision / recall). // • dataset tab renders the monaco raw schema (question_decomposition + // steps + docs[] — no SQL). // • 3 e2e runs (v0, v2, v3) instead of 2. // • sidebar has NO subset/pill filters — just the 100 qids. // // View modes: // - "dataset" — source monaco raw record per qid // - "unified" — unified eval bundle // - "trajectories" — standalone agentic · structure per q (cell4_agentic_a) // - "trajectories_corpus" — standalone agentic · structure per ds (cell5_agentic_b) // - "trajectories_rawtext" — standalone agentic · DCI (cell6_agentic_c v2) // - "e2e_v0" / "e2e_v2" / "e2e_v3" — e2e_pipeline runs (agent trajectories) // - "e2e_structures_v0/2/3" — per-qid supporting doc + generated structures // - "compare" — side-by-side grid across all 9 configs // // State machine: load index.json → render sidebar → on click/nav fetch // records/.json and render question + tables / trajectory / compare grid. (function () { 'use strict'; const MODES = { dataset: { indexUrl: 'index.json', recordsDir: 'records', topbarSub: 'dev subset · 100 questions', indexShape: 'array', }, unified: { indexUrl: 'unified/index.json', recordsDir: 'unified/records', topbarSub: 'unified eval bundle · dev 100-qid subset', indexShape: 'array', }, trajectories: { indexUrl: 'trajectories/index.json', recordsDir: 'trajectories/records', indexShape: 'wrapped', }, trajectories_corpus: { indexUrl: 'trajectories_corpus/index.json', recordsDir: 'trajectories_corpus/records', indexShape: 'wrapped', }, trajectories_rawtext: { indexUrl: 'trajectories_rawtext/index.json', recordsDir: 'trajectories_rawtext/records', indexShape: 'wrapped', }, e2e_v0: { indexUrl: 'trajectories_e2e_v0/index.json', recordsDir: 'trajectories_e2e_v0/records', indexShape: 'wrapped', }, e2e_v2: { indexUrl: 'trajectories_e2e_v2/index.json', recordsDir: 'trajectories_e2e_v2/records', indexShape: 'wrapped', }, e2e_v3: { indexUrl: 'trajectories_e2e_v3/index.json', recordsDir: 'trajectories_e2e_v3/records', indexShape: 'wrapped', }, e2e_structures_v0: { indexUrl: 'e2e_structures_v0/index.json', recordsDir: 'e2e_structures_v0/records', indexShape: 'wrapped', }, e2e_structures_v2: { indexUrl: 'e2e_structures_v2/index.json', recordsDir: 'e2e_structures_v2/records', indexShape: 'wrapped', }, e2e_structures_v3: { indexUrl: 'e2e_structures_v3/index.json', recordsDir: 'e2e_structures_v3/records', indexShape: 'wrapped', }, compare: { indexUrl: 'compare/index.json', recordsDir: 'compare/records', indexShape: 'wrapped', }, }; const modeState = Object.fromEntries( Object.keys(MODES).map((k) => [k, { index: [], filtered: [], selectedQid: null, cache: new Map(), meta: null }]) ); const state = { viewMode: 'dataset', search: '', stopReasonFilter: 'all', scoreFilter: 'all', compareDisagreeFilter: 'all', activeBucket: 'supporting', }; function curMode() { return modeState[state.viewMode]; } // Trajectory-shape modes share the same index schema // (qid, question, judge_score, correct, has_error, stop_reason, n_turns). const TRAJ_MODES = new Set([ 'trajectories', 'trajectories_corpus', 'trajectories_rawtext', 'e2e_v0', 'e2e_v2', 'e2e_v3', ]); const E2E_STRUCT_MODES = new Set(['e2e_structures_v0', 'e2e_structures_v2', 'e2e_structures_v3']); // ── DOM ──────────────────────────────────────────────────────────── const dom = { list: document.getElementById('qidList'), main: document.getElementById('mainPane'), search: document.getElementById('searchBox'), stopFilter: document.getElementById('stopReasonFilter'), scoreFilter: document.getElementById('scoreFilter'), compareDisagreeFilter: document.getElementById('compareDisagreeFilter'), e2eMeta: document.getElementById('e2eMeta'), viewModeRow: document.getElementById('viewModeRow'), topbarSub: document.getElementById('topbarSub'), prev: document.getElementById('prevBtn'), next: document.getElementById('nextBtn'), counter: document.getElementById('counter'), }; // ── Utils ────────────────────────────────────────────────────────── const escapeHtml = (s) => String(s ?? '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); const debounce = (fn, ms) => { let t; return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); }; }; const num = (x) => (x === null || x === undefined ? '—' : String(x)); const fmtJson = (o) => { if (o === null || o === undefined) return ''; try { return JSON.stringify(o, null, 2); } catch (e) { return String(o); } }; function scoreClass(judgeScore, correct) { if (correct) return 'good'; const j = judgeScore || 0; if (j >= 0.5) return 'mid'; if (j > 0) return 'low'; return 'zero'; } function renderMarkdown(src) { if (typeof window.marked !== 'undefined' && window.marked && window.marked.parse) { try { return `
${window.marked.parse(String(src ?? ''))}
`; } catch (e) { // fall through } } return `
${escapeHtml(src ?? '')}
`; } // ── Filtering ────────────────────────────────────────────────────── function recomputeFiltered() { if (TRAJ_MODES.has(state.viewMode)) return recomputeFilteredE2e(); if (state.viewMode === 'compare') return recomputeFilteredCompare(); const m = curMode(); const q = state.search.trim().toLowerCase(); const filtered = []; for (let i = 0; i < m.index.length; i++) { const e = m.index[i]; if (q) { const hay = (e.qid + ' ' + e.question).toLowerCase(); if (!hay.includes(q)) continue; } filtered.push(i); } m.filtered = filtered; } function recomputeFilteredE2e() { const m = curMode(); const q = state.search.trim().toLowerCase(); const stop = state.stopReasonFilter; const score = state.scoreFilter; const filtered = []; for (let i = 0; i < m.index.length; i++) { const e = m.index[i]; if (stop !== 'all' && e.stop_reason !== stop) continue; const j = e.judge_score || 0; if (score === 'correct' && !e.correct) continue; if (score === 'partial' && !(j > 0 && !e.correct)) continue; if (score === 'zero' && !(j === 0)) continue; if (q) { const hay = (e.qid + ' ' + e.question).toLowerCase(); if (!hay.includes(q)) continue; } filtered.push(i); } m.filtered = filtered; } function recomputeFilteredCompare() { const m = modeState.compare; const q = state.search.trim().toLowerCase(); const dis = state.compareDisagreeFilter; const filtered = []; for (let i = 0; i < m.index.length; i++) { const e = m.index[i]; if (dis !== 'all') { const cells = e.cells || []; const allHigh = cells.length > 0 && cells.every((c) => c.correct === 1); const allZero = cells.length > 0 && cells.every((c) => (c.judge_score || 0) === 0); if (dis === 'agree_high' && !allHigh) continue; if (dis === 'agree_zero' && !allZero) continue; if (dis === 'disagree' && (allHigh || allZero)) continue; } if (q) { const hay = (e.qid + ' ' + e.question).toLowerCase(); if (!hay.includes(q)) continue; } filtered.push(i); } m.filtered = filtered; } // ── Sidebar render ───────────────────────────────────────────────── function renderSidebar() { if (TRAJ_MODES.has(state.viewMode)) return renderSidebarE2e(); if (state.viewMode === 'unified') return renderSidebarUnified(); if (state.viewMode === 'compare') return renderSidebarCompare(); if (E2E_STRUCT_MODES.has(state.viewMode)) return renderSidebarE2eStructures(); return renderSidebarDataset(); } function renderSidebarDataset() { const m = modeState.dataset; const html = []; for (const i of m.filtered) { const e = m.index[i]; const sel = e.qid === m.selectedQid ? ' selected' : ''; html.push( `
  • ` + `${escapeHtml(e.qid)}` + `${escapeHtml(e.question)}` + `` + `docs ${num(e.n_docs)}` + `ans ${num(e.n_answers)}` + `` + `
  • ` ); } dom.list.innerHTML = html.join(''); updateCounter(); } function renderSidebarUnified() { const m = modeState.unified; const html = []; for (const i of m.filtered) { const e = m.index[i]; const sel = e.qid === m.selectedQid ? ' selected' : ''; html.push( `
  • ` + `${escapeHtml(e.qid)}` + `${escapeHtml(e.question)}` + `` + `docs ${num(e.n_docs)}` + `ans ${num(e.n_answers)}` + `` + `
  • ` ); } dom.list.innerHTML = html.join(''); updateCounter(); } // Trajectory sidebar: judge_score pill + correct tick + stop + turns. function renderSidebarE2e() { const m = curMode(); const html = []; for (const i of m.filtered) { const e = m.index[i]; const sel = e.qid === m.selectedQid ? ' selected' : ''; const j = e.judge_score || 0; const cls = scoreClass(j, e.correct); const correctPill = e.correct ? `` : ''; const errPill = e.has_error ? `ERR` : ''; const stop = e.stop_reason || ''; const stopPill = stop ? `${escapeHtml(stop)}` : ''; html.push( `
  • ` + `` + `${(j * 100).toFixed(0)}` + correctPill + errPill + `${escapeHtml(e.qid)}` + `` + `${escapeHtml(e.question)}` + `` + stopPill + (e.n_turns != null ? `turns ${num(e.n_turns)}` : '') + `gold ${num(e.gold_answers_length)}` + `` + `
  • ` ); } dom.list.innerHTML = html.join(''); updateCounter(); } // Compare sidebar: sparkline of judge-score buckets per cell. function renderSidebarCompare() { const m = modeState.compare; const html = []; for (const i of m.filtered) { const e = m.index[i]; const sel = e.qid === m.selectedQid ? ' selected' : ''; const sparks = (e.cells || []).map((c) => { const cls = scoreClass(c.judge_score, c.correct); return ``; }).join(''); html.push( `
  • ` + `${escapeHtml(e.qid)}` + `${escapeHtml(e.question)}` + `` + `${sparks}` + `gold ${num(e.gold_answers_length)}` + `` + `
  • ` ); } dom.list.innerHTML = html.join(''); updateCounter(); } function renderSidebarE2eStructures() { const m = curMode(); const html = []; for (const i of m.filtered) { const e = m.index[i]; const sel = e.qid === m.selectedQid ? ' selected' : ''; html.push( `
  • ` + `${escapeHtml(e.qid)}` + `${escapeHtml(e.question)}` + `` + `docs ${num(e.n_docs)}` + `struct ${num(e.n_structures)}` + `` + `
  • ` ); } dom.list.innerHTML = html.join(''); updateCounter(); } function updateCounter() { const m = curMode(); const total = m.index.length; const shown = m.filtered.length; const sel = m.selectedQid; let pos = 0; if (sel) { const idx = m.filtered.findIndex((i) => m.index[i].qid === sel); pos = idx >= 0 ? idx + 1 : 0; } if (pos) { dom.counter.textContent = `${pos} / ${shown}` + (shown !== total ? ` (of ${total})` : ''); } else { dom.counter.textContent = `${shown}` + (shown !== total ? ` of ${total}` : ''); } dom.prev.disabled = !sel || pos <= 1; dom.next.disabled = !sel || pos >= shown; } function scrollSelectedIntoView() { const node = dom.list.querySelector('li.selected'); if (node && typeof node.scrollIntoView === 'function') { node.scrollIntoView({ block: 'nearest' }); } } // ── Record fetching ─────────────────────────────────────────────── async function loadRecord(qid) { const m = curMode(); if (m.cache.has(qid)) return m.cache.get(qid); const dir = MODES[state.viewMode].recordsDir; const res = await fetch(`${dir}/${encodeURIComponent(qid)}.json`); if (!res.ok) throw new Error(`fetch ${dir}/${qid}.json failed: ${res.status}`); const rec = await res.json(); m.cache.set(qid, rec); return rec; } // ── Main pane render ────────────────────────────────────────────── function renderEmpty() { let msg; switch (state.viewMode) { case 'unified': msg = 'Select a question on the left to inspect its unified-bundle gold answers + supporting docs.'; break; case 'trajectories': msg = 'Select a question on the left to inspect the structure-per-q (Baseline A / cell 4) agent trajectory.'; break; case 'trajectories_corpus': msg = 'Select a question on the left to inspect the structure-per-ds (Baseline B / cell 5) agent trajectory.'; break; case 'trajectories_rawtext': msg = 'Select a question on the left to inspect the DCI (Baseline C / cell 6) agent trajectory.'; break; case 'e2e_v0': msg = 'Select a question on the left to inspect the e2e v0 pipeline trajectory (per-qid LLM judge_score).'; break; case 'e2e_v2': msg = 'Select a question on the left to inspect the e2e v2 pipeline trajectory (per-qid LLM judge_score).'; break; case 'e2e_v3': msg = 'Select a question on the left to inspect the e2e v3 pipeline trajectory (per-qid LLM judge_score).'; break; case 'e2e_structures_v0': msg = 'Select a question on the left to inspect its supporting doc(s) and the e2e v0 pipeline-generated structures.'; break; case 'e2e_structures_v2': msg = 'Select a question on the left to inspect its supporting doc(s) and the e2e v2 pipeline-generated structures.'; break; case 'e2e_structures_v3': msg = 'Select a question on the left to inspect its supporting doc(s) and the e2e v3 pipeline-generated structures.'; break; case 'compare': msg = 'Select a question on the left to see all 9 configs side-by-side (closed-book / with-docs / with-structures / structure per q / structure per ds / DCI / e2e v0 / e2e v2 / e2e v3).'; break; default: msg = 'Select a question on the left to begin.'; } dom.main.innerHTML = `
    ${msg}
    `; } function renderLoading() { dom.main.innerHTML = `
    Loading record…
    `; } function pickInitialBucket(rec) { return 'supporting'; } function renderRecord(rec) { if (TRAJ_MODES.has(state.viewMode)) return renderTrajectoryRecord(rec); if (state.viewMode === 'compare') return renderCompareRecord(rec); if (E2E_STRUCT_MODES.has(state.viewMode)) return renderE2eStructuresRecord(rec); return state.viewMode === 'unified' ? renderUnifiedRecord(rec) : renderDatasetRecord(rec); } // ── Dataset rendering (monaco raw schema) ───────────────────────── function renderDatasetRecord(rec) { state.activeBucket = pickInitialBucket(rec); const answers = Array.isArray(rec.answers) ? rec.answers : (rec.answers ? [rec.answers] : []); const answersHtml = answers.length ? answers.map((a) => `${escapeHtml(String(a))}`).join('') : `(empty)`; const supDocs = rec.docs || []; const docsHtml = supDocs.length ? supDocs.map((d, i) => renderMonacoRawDoc(d, i + 1)).join('') : `
    No supporting doc recorded for this question.
    `; const html = `
    ${rec.dataset ? `${escapeHtml(rec.dataset)}` : ''} ${escapeHtml(rec.qid)} ${rec.ex_num != null ? `ex_num=${rec.ex_num}` : ''}
    ${escapeHtml(rec.question)}
    Gold answer${answers.length > 1 ? 's' : ''} (${answers.length}) ${answersHtml}

    Supporting documents (${supDocs.length} — from monaco raw docs[]; every entry is is_supporting=true)

    ${docsHtml}
    `; dom.main.innerHTML = html; wireCopyBtn(rec.qid); } function renderMonacoRawDoc(d, idx) { const subq = d.sub_question_text ? `
    ↳ ${escapeHtml(d.sub_question_text)}
    ` : ''; return `
    ${escapeHtml(d.title || '(untitled)')} ${d.section ? `${escapeHtml(d.section)}` : ''}
    📄 doc ${escapeHtml(String(d.id))} ${(d.text || '').length} chars
    ${subq}
    ${renderMarkdown(d.text || '')}
    `; } // ── Unified rendering ───────────────────────────────────────────── function renderUnifiedRecord(rec) { const answers = Array.isArray(rec.answers) ? rec.answers : (rec.answers ? [rec.answers] : []); const answersHtml = answers.length ? answers.map((a) => `${escapeHtml(String(a))}`).join('') : `(empty)`; const docs = rec.docs || []; const docsHtml = docs.length ? docs.map((d, i) => `
    [Doc ${i + 1}] id=${escapeHtml(String(d.id ?? ''))}
    ${renderMarkdown(d.contents || '')}
    `).join('') : `
    No gold supporting docs.
    `; const html = `
    ${escapeHtml(rec.qid)} ${rec.dataset ? `${escapeHtml(rec.dataset)}` : ''}
    ${escapeHtml(rec.question)}
    Gold answer${answers.length > 1 ? 's' : ''} (${answers.length}) ${answersHtml}

    Gold Supporting Documents (${docs.length})

    ${docsHtml}
    `; dom.main.innerHTML = html; wireCopyBtn(rec.qid); } function wireCopyBtn(qid) { const copyBtn = document.getElementById('copyQidBtn'); if (!copyBtn) return; copyBtn.addEventListener('click', () => { navigator.clipboard.writeText(qid).then(() => { copyBtn.textContent = '✓ copied'; copyBtn.classList.add('copied'); setTimeout(() => { copyBtn.textContent = '📋 copy qid'; copyBtn.classList.remove('copied'); }, 1200); }); }); } // ── Trajectory rendering (LLM judge scores) ──────────────────────── function pill(label, cls) { return `${label}`; } function renderTrajectoryRecord(rec) { const m = rec.metrics || {}; const j = m.judge_score ?? 0; const correct = m.correct ?? 0; const cls = scoreClass(j, correct); const goldHtml = (rec.gold_answers || []).map( (a) => `${escapeHtml(String(a))}` ).join('') || `(empty)`; const predList = rec.pred_items || []; const predHtml = predList.length ? predList.map((a) => `${escapeHtml(String(a))}`).join('') : `(no extracted final answer)`; const errBlock = rec.error ? `
    Error: ${escapeHtml(rec.error.slice(0, 1200))}${rec.error.length > 1200 ? '…' : ''}
    ` : ''; const tokens = rec.tokens || {}; const metaPills = [ rec.n_turns != null ? pill(`turns ${num(rec.n_turns)}${rec.max_turns ? '/' + rec.max_turns : ''}`, 'meta') : '', rec.stop_reason ? pill(`stop=${escapeHtml(rec.stop_reason)}`, `meta stop-${rec.stop_reason}`) : '', tokens.total_tokens != null ? pill(`tokens ${tokens.total_tokens}`, 'meta') : '', rec.latency_ms != null ? pill(`${(rec.latency_ms / 1000).toFixed(1)}s`, 'meta') : '', rec.model ? pill(escapeHtml(rec.model), 'meta mono') : '', rec.mode ? pill(`mode=${escapeHtml(rec.mode)}`, 'meta mono') : '', ].filter(Boolean).join(''); const extractedRow = m.extracted_final_answer ? `
    Judge-extracted${escapeHtml(String(m.extracted_final_answer))}
    ` : ''; const trajSection = (rec.events && rec.events.length) ? `

    Trajectory (${rec.events.length} events · ${escapeHtml(rec.system_prompt_file || '')})

    ${renderEvents(rec.events)}
    ` : (rec.user_prompt ? `

    Prompt (single-turn — no trajectory)

    system prompt (${(rec.system_prompt || '').length} chars)
    ${escapeHtml(rec.system_prompt || '')}
    user prompt (${(rec.user_prompt || '').length} chars)
    ${escapeHtml((rec.user_prompt || '').slice(0, 8000))}${(rec.user_prompt || '').length > 8000 ? '\n\n… (truncated)' : ''}
    ` : ''); const html = `
    ${escapeHtml(rec.dataset_origin || rec.dataset || 'monaco_dev')} ${escapeHtml(rec.qid)}
    ${escapeHtml(rec.question)}
    J: ${(j * 100).toFixed(1)} correct: ${correct} P: ${((m.precision ?? 0) * 100).toFixed(1)} R: ${((m.recall ?? 0) * 100).toFixed(1)} |P|=${predList.length} · |G|=${(rec.gold_answers || []).length}
    Gold (${(rec.gold_answers || []).length}) ${goldHtml}
    Model answer items (${predList.length}) ${predHtml}
    ${extractedRow}
    ${metaPills}
    ${errBlock}

    Model's full answer (raw text before judge extraction)

    ${escapeHtml(rec.model_answer || '(empty)')}
    ${trajSection} `; dom.main.innerHTML = html; wireCopyBtn(rec.qid); } function renderEvents(events) { if (!events.length) return `
    No events recorded.
    `; const parts = []; for (let i = 0; i < events.length; i++) { const ev = events[i]; if (ev.type === 'tool_call') { const next = events[i + 1]; const paired = next && next.type === 'tool_result' ? next : null; parts.push(renderToolPair(ev, paired, i)); if (paired) i += 1; continue; } if (ev.type === 'tool_result') { parts.push(renderToolPair(null, ev, i)); continue; } if (ev.type === 'text') { parts.push(`
    💬 assistant text
    ${escapeHtml(ev.content || '')}
    `); continue; } if (ev.type === 'error') { parts.push(`
    ⚠ error
    ${escapeHtml(ev.content || '')}
    `); continue; } if (ev.type === 'done') { parts.push(`
    🏁 done · stop=${escapeHtml(ev.content || '?')}
    `); continue; } parts.push(`
    ${escapeHtml(ev.type || '?')}
    ${escapeHtml(ev.content || '')}
    `); } return parts.join(''); } function renderToolPair(call, result, idx) { const name = (call && call.name) || (result && result.name) || '?'; const callBody = call ? `
    ${escapeHtml(fmtJson(call.input))}
    ` : `
    (no matching tool_call)
    `; const trunc = result && result.truncated ? ' truncated' : ''; const resultBody = result ? `
    ${escapeHtml(result.content || '')}
    ` : `
    (no matching tool_result)
    `; return ( `
    ` + `
    🔧 ${escapeHtml(name)}${trunc}
    ` + `
    ` + `
    input
    ${callBody}
    ` + `
    output
    ${resultBody}
    ` + `
    ` + `
    ` ); } function renderE2eMeta(meta) { if (!meta) return ''; if (meta.n_structures_total != null) return renderE2eStructMeta(meta); if (meta.configs && meta.mean_metrics) { const cells = meta.configs.map((c) => { const mm = meta.mean_metrics[c] || {}; const j = ((mm.mean_judge_score || 0) * 100).toFixed(1); const cor = ((mm.mean_correct || 0) * 100).toFixed(0); return `${escapeHtml(c)}: ${j}`; }).join(''); return `
    Compare ${meta.n} qids · ${(meta.configs || []).length} configs
    ${cells}
    `; } const stops = Object.entries(meta.stop_reason_counts || {}) .map(([k, v]) => `${escapeHtml(k)}: ${v}`) .join(''); return `
    Run ${escapeHtml(meta.label || '')}
    n: ${meta.n} J: ${((meta.mean_judge_score || 0) * 100).toFixed(2)} ✓: ${((meta.mean_correct || 0) * 100).toFixed(2)} P: ${((meta.mean_precision || 0) * 100).toFixed(2)} R: ${((meta.mean_recall || 0) * 100).toFixed(2)} err: ${((meta.fraction_error || 0) * 100).toFixed(2)}%
    ${stops}
    `; } function metaSubtitle(meta) { if (!meta) return ''; if (meta.n_structures_total != null) { return `e2e structures · ${meta.n_qids} questions · ${meta.n_docs_unique} unique docs · ${meta.n_structures_total} structure files`; } if (meta.configs && meta.mean_metrics) { const cells = meta.configs.map((c) => { const mm = meta.mean_metrics[c] || {}; return `${c} J ${((mm.mean_judge_score || 0) * 100).toFixed(1)}`; }).join(' · '); return `${meta.n} questions · ${cells}`; } return `${meta.label || 'agentic run'} · ${meta.n} questions · J ${((meta.mean_judge_score || 0) * 100).toFixed(2)} · ✓ ${((meta.mean_correct || 0) * 100).toFixed(2)}`; } // ── Compare record (side-by-side grid of 9 cells) ────────────────── function renderCompareRecord(rec) { const configsOrder = rec.configs_order || Object.keys(rec.configs || {}); const configs = rec.configs || {}; const gold = rec.gold_answers || []; const goldHtml = gold.length ? gold.map((g) => `${escapeHtml(String(g))}`).join('') : `(empty)`; let bestJ = -1; for (const k of configsOrder) { const c = configs[k]; const j = (c && c.metrics && c.metrics.judge_score) || 0; if (j > bestJ) bestJ = j; } const cardHtml = configsOrder.map((label) => { const c = configs[label]; if (!c) { return `
    ${escapeHtml(label)}
    No response
    `; } const m = c.metrics || {}; const j = m.judge_score || 0; const correct = m.correct || 0; const cls = scoreClass(j, correct); const isWinner = bestJ > 0 && j === bestJ; const winnerCls = isWinner ? ' is-winner' : ''; const answer = c.answer || ''; const answerHtml = answer ? `
    ${escapeHtml(answer.length > 1500 ? answer.slice(0, 1500) + '…' : answer)}
    ` : `
    (empty)
    `; const predItems = c.pred_items || []; const predPills = predItems.length ? predItems.map((p) => `${escapeHtml(String(p))}`).join('') : `(no extracted final answer)`; const footerPills = []; if (c.mode === 'agentic') { if (c.stop_reason) footerPills.push(`stop=${escapeHtml(c.stop_reason)}`); if (c.n_turns != null) footerPills.push(`turns ${c.n_turns}/${num(c.max_turns)}`); const tc = c.tool_call_counts || {}; const tcKeys = Object.keys(tc); if (tcKeys.length) { const txt = tcKeys.map((k) => `${k}:${tc[k]}`).join(' · '); footerPills.push(`${escapeHtml(txt)}`); } const tk = c.tokens || {}; if (tk.total_tokens != null) footerPills.push(`${tk.total_tokens} tok`); } else { if (c.finish_reason) footerPills.push(`finish=${escapeHtml(c.finish_reason)}`); const u = c.usage || {}; if (u.total_tokens != null) footerPills.push(`${u.total_tokens} tok`); } if (c.latency_ms != null) footerPills.push(`${(c.latency_ms / 1000).toFixed(1)}s`); if (c.model) footerPills.push(`${escapeHtml(c.model)}`); return `
    ${escapeHtml(label)}${isWinner ? ' 🏆' : ''} J ${(j * 100).toFixed(0)} ✓ ${correct} P ${((m.precision || 0) * 100).toFixed(0)} R ${((m.recall || 0) * 100).toFixed(0)}
    Extracted (${predItems.length}): ${predPills}
    ${answerHtml}
    `; }).join(''); const html = `
    monaco_dev ${escapeHtml(rec.qid)}
    ${escapeHtml(rec.question)}
    Gold (${gold.length}) ${goldHtml}

    All ${configsOrder.length} cells side-by-side · LLM judge_score / correct / P / R (canonical --deterministic-extract judge)

    ${cardHtml}
    `; dom.main.innerHTML = html; wireCopyBtn(rec.qid); } // ── e2e structures record (supporting docs + per-shape structure files) ─ const SHAPE_ICON = { tabular_records: '📊', chronology_and_timeline_indexes: '🕒', claim_and_theme_summaries: '💬', qa_shortcuts_and_templates: '❓', relation_graphs_and_mappings: '🕸', }; function renderE2eStructMeta(meta) { if (!meta) return ''; const shapeRows = (meta.shapes || []).map((s) => { const desc = (meta.shape_descriptions || {})[s] || ''; const icon = SHAPE_ICON[s] || '🧩'; return `
    ${icon} ${escapeHtml(s)} ${escapeHtml(desc.slice(0, 80))}${desc.length > 80 ? '…' : ''}
    `; }).join(''); return `
    E2E Structures ${escapeHtml(meta.label || '')}
    qids: ${meta.n_qids} unique docs: ${meta.n_docs_unique} structures: ${meta.n_structures_total} avg/qid: ${meta.n_structures_avg_per_qid}
    ${shapeRows} `; } function renderE2eStructuresRecord(rec) { const goldHtml = (rec.gold_answers || []).map( (a) => `${escapeHtml(String(a))}` ).join('') || `(empty)`; const docs = rec.docs || []; const docsHtml = docs.length ? docs.map((d) => renderE2eStructDoc(d)).join('') : `
    No supporting docs recorded for this question.
    `; const html = `
    monaco_dev ${escapeHtml(rec.qid)} 📄 ${rec.n_docs} doc · 🏗 ${rec.n_structures} struct
    ${escapeHtml(rec.question)}
    Gold answer${(rec.gold_answers || []).length > 1 ? 's' : ''} (${(rec.gold_answers || []).length}) ${goldHtml}

    📄 Supporting doc${docs.length > 1 ? 's' : ''} + 🏗 E2E-pipeline structures (5 shapes: tabular_records, chronology_and_timeline_indexes, claim_and_theme_summaries, qa_shortcuts_and_templates, relation_graphs_and_mappings)

    ${docsHtml}
    `; dom.main.innerHTML = html; wireCopyBtn(rec.qid); } function renderE2eStructDoc(d) { const supportBadge = d.is_supporting ? `✓ supporting` : `distractor`; const structs = d.structures || []; const structsHtml = structs.length ? structs.map((s) => renderE2eStructItem(s, d.doc_id)).join('') : `
    No e2e structures were extracted from this doc.
    `; return `
    📄 doc ${escapeHtml(String(d.doc_id))} ${supportBadge} 🏗 ${structs.length} structure file${structs.length === 1 ? '' : 's'}
    📖 source document${(d.contents || '').length} chars
    ${renderMarkdown(d.contents || '')}
    ${structsHtml}
    `; } function renderE2eStructItem(s, docId) { const icon = SHAPE_ICON[s.shape_id] || '🧩'; const body = renderStructContent(s.format, s.content || ''); return `
    ${icon} ${escapeHtml(s.shape_id)} ${escapeHtml(s.file)} ${escapeHtml(s.format)} ${s.description ? `
    ${escapeHtml(s.description)}
    ` : ''}
    ${body}
    `; } function renderStructContent(fmt, content) { if (!content) return `
    (empty file)
    `; if (fmt === 'csv') return renderCsvAsTable(content); if (fmt === 'jsonl') return renderJsonl(content); if (fmt === 'json') { try { const parsed = JSON.parse(content); return `
    ${escapeHtml(JSON.stringify(parsed, null, 2))}
    `; } catch (e) { return `
    ${escapeHtml(content)}
    `; } } if (fmt === 'md') return renderMarkdown(content); return `
    ${escapeHtml(content)}
    `; } function parseCsv(text) { const rows = []; let row = []; let cell = ''; let inQuote = false; let i = 0; while (i < text.length) { const c = text[i]; if (inQuote) { if (c === '"') { if (text[i + 1] === '"') { cell += '"'; i += 2; continue; } inQuote = false; i++; continue; } cell += c; i++; continue; } if (c === '"') { inQuote = true; i++; continue; } if (c === ',') { row.push(cell); cell = ''; i++; continue; } if (c === '\n') { row.push(cell); rows.push(row); row = []; cell = ''; i++; continue; } if (c === '\r') { i++; continue; } cell += c; i++; } if (cell.length > 0 || row.length > 0) { row.push(cell); rows.push(row); } return rows; } function renderCsvAsTable(text) { const rows = parseCsv(text); if (!rows.length) return `
    ${escapeHtml(text)}
    `; const head = rows[0]; const body = rows.slice(1); const headHtml = head.map((h) => `${escapeHtml(h)}`).join(''); const bodyHtml = body .filter((r) => r.length && !(r.length === 1 && r[0] === '')) .map((r) => `${r.map((c) => `${escapeHtml(c)}`).join('')}`) .join(''); return `
    ${headHtml}${bodyHtml}
    `; } function renderJsonl(text) { const lines = text.split('\n').map((l) => l.trim()).filter(Boolean); if (!lines.length) return `
    (empty)
    `; const items = lines.map((line) => { let parsed; try { parsed = JSON.parse(line); } catch (e) { parsed = null; } if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { const rows = Object.entries(parsed).map(([k, v]) => { const vstr = (v === null || v === undefined) ? '∅' : (typeof v === 'string') ? v : JSON.stringify(v); return `
    ${escapeHtml(k)}${escapeHtml(vstr)}
    `; }).join(''); return `
    ${rows}
    `; } return `
    ${escapeHtml(line)}
    `; }).join(''); return `
    ${items}
    `; } // ── Selection / nav ─────────────────────────────────────────────── async function selectQid(qid, pushHash = true) { const m = curMode(); m.selectedQid = qid; renderSidebar(); scrollSelectedIntoView(); if (pushHash) { const h = `#${state.viewMode}:${encodeURIComponent(qid)}`; if (window.location.hash !== h) window.history.replaceState(null, '', h); } renderLoading(); try { const rec = await loadRecord(qid); if (m.selectedQid !== qid) return; renderRecord(rec); } catch (e) { dom.main.innerHTML = `
    Failed to load record: ${escapeHtml(e.message)}
    `; } } function step(delta) { const m = curMode(); if (!m.selectedQid) { if (m.filtered.length) selectQid(m.index[m.filtered[0]].qid); return; } const cur = m.filtered.findIndex((i) => m.index[i].qid === m.selectedQid); if (cur < 0) return; const next = cur + delta; if (next < 0 || next >= m.filtered.length) return; selectQid(m.index[m.filtered[next]].qid); } // ── Mode switching ──────────────────────────────────────────────── async function setViewMode(mode) { if (!MODES[mode] || mode === state.viewMode) return; state.viewMode = mode; dom.viewModeRow.querySelectorAll('.view-mode-btn').forEach((b) => { const on = b.getAttribute('data-view-mode') === mode; b.classList.toggle('active', on); b.setAttribute('aria-selected', on ? 'true' : 'false'); }); document.querySelectorAll('[data-show-in]').forEach((el) => { const want = (el.getAttribute('data-show-in') || '').split(/\s+/).filter(Boolean); el.hidden = !want.includes(mode); }); renderEmpty(); await ensureIndexLoaded(mode); dom.topbarSub.textContent = MODES[mode].topbarSub || metaSubtitle(modeState[mode].meta); if ((TRAJ_MODES.has(mode) || mode === 'compare' || E2E_STRUCT_MODES.has(mode)) && modeState[mode].meta && dom.e2eMeta) { dom.e2eMeta.innerHTML = renderE2eMeta(modeState[mode].meta); } recomputeFiltered(); renderSidebar(); const sel = curMode().selectedQid; if (sel) { selectQid(sel, /*pushHash=*/false); } else if (curMode().filtered.length) { renderEmpty(); } else { dom.main.innerHTML = `
    No items in this view.
    `; } } async function ensureIndexLoaded(mode) { const m = modeState[mode]; if (m.index.length) return; const url = MODES[mode].indexUrl; const res = await fetch(url); if (!res.ok) throw new Error(`fetch ${url} failed: ${res.status}`); const payload = await res.json(); if (MODES[mode].indexShape === 'wrapped') { m.meta = payload.meta || null; m.index = payload.rows || []; } else { m.index = Array.isArray(payload) ? payload : (payload.rows || []); } } // ── Wiring ──────────────────────────────────────────────────────── function wire() { dom.list.addEventListener('click', (ev) => { const li = ev.target.closest('li.qid-row'); if (li) selectQid(li.getAttribute('data-qid')); }); dom.search.addEventListener('input', debounce(() => { state.search = dom.search.value; recomputeFiltered(); renderSidebar(); }, 120)); dom.viewModeRow.addEventListener('click', (ev) => { const btn = ev.target.closest('.view-mode-btn'); if (!btn) return; const mode = btn.getAttribute('data-view-mode'); setViewMode(mode).catch((e) => { dom.main.innerHTML = `
    Failed to switch mode: ${escapeHtml(e.message)}
    `; }); }); if (dom.stopFilter) { dom.stopFilter.addEventListener('click', (ev) => { const btn = ev.target.closest('.filter-pill'); if (!btn) return; const v = btn.getAttribute('data-stop'); if (v === state.stopReasonFilter) return; state.stopReasonFilter = v; dom.stopFilter.querySelectorAll('.filter-pill').forEach((b) => b.classList.toggle('active', b === btn)); recomputeFiltered(); renderSidebar(); }); } if (dom.scoreFilter) { dom.scoreFilter.addEventListener('click', (ev) => { const btn = ev.target.closest('.filter-pill'); if (!btn) return; const v = btn.getAttribute('data-score'); if (v === state.scoreFilter) return; state.scoreFilter = v; dom.scoreFilter.querySelectorAll('.filter-pill').forEach((b) => b.classList.toggle('active', b === btn)); recomputeFiltered(); renderSidebar(); }); } if (dom.compareDisagreeFilter) { dom.compareDisagreeFilter.addEventListener('click', (ev) => { const btn = ev.target.closest('.filter-pill'); if (!btn) return; const v = btn.getAttribute('data-disagree'); if (v === state.compareDisagreeFilter) return; state.compareDisagreeFilter = v; dom.compareDisagreeFilter.querySelectorAll('.filter-pill').forEach((b) => b.classList.toggle('active', b === btn)); recomputeFiltered(); renderSidebar(); }); } dom.prev.addEventListener('click', () => step(-1)); dom.next.addEventListener('click', () => step(+1)); document.addEventListener('keydown', (ev) => { if (ev.target && (ev.target.tagName === 'INPUT' || ev.target.tagName === 'TEXTAREA')) { if (ev.key === 'Escape') ev.target.blur(); return; } if (ev.key === 'ArrowLeft') { ev.preventDefault(); step(-1); } else if (ev.key === 'ArrowRight') { ev.preventDefault(); step(+1); } else if (ev.key === '/') { ev.preventDefault(); dom.search.focus(); dom.search.select(); } }); window.addEventListener('hashchange', () => { const parsed = parseHash(window.location.hash); if (!parsed) return; if (parsed.mode !== state.viewMode) { setViewMode(parsed.mode).then(() => { if (parsed.qid && parsed.qid !== curMode().selectedQid) selectQid(parsed.qid, /*pushHash=*/false); }); } else if (parsed.qid && parsed.qid !== curMode().selectedQid) { selectQid(parsed.qid, /*pushHash=*/false); } }); } function parseHash(hash) { const s = (hash || '').replace(/^#/, ''); if (!s) return null; if (s.includes(':')) { const [mode, ...rest] = s.split(':'); if (MODES[mode]) return { mode, qid: decodeURIComponent(rest.join(':')) }; } return { mode: 'dataset', qid: decodeURIComponent(s) }; } // ── Boot ────────────────────────────────────────────────────────── async function boot() { wire(); dom.main.innerHTML = `
    Loading index…
    `; const parsed = parseHash(window.location.hash); const initialMode = (parsed && MODES[parsed.mode]) ? parsed.mode : 'dataset'; try { await ensureIndexLoaded('dataset'); } catch (e) { dom.main.innerHTML = `
    Failed to load index.json: ${escapeHtml(e.message)}
    `; return; } if (initialMode === 'dataset') { recomputeFiltered(); renderSidebar(); } else { try { await setViewMode(initialMode); } catch (e) { dom.main.innerHTML = `
    Failed to load ${escapeHtml(initialMode)} index: ${escapeHtml(e.message)}
    `; return; } } if (parsed && parsed.qid) { const m = curMode(); if (m.index.some((e) => e.qid === parsed.qid)) { selectQid(parsed.qid, /*pushHash=*/false); return; } } renderEmpty(); } boot(); })();