(function () { const $ = (sel) => document.querySelector(sel); function shorten(addr) { if (!addr) return '—'; return addr.length > 14 ? addr.slice(0, 8) + '…' + addr.slice(-6) : addr; } function fmtUptime(seconds) { if (!seconds && seconds !== 0) return '—'; const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); const s = Math.floor(seconds % 60); if (h > 0) return `${h}h ${m}m`; if (m > 0) return `${m}m ${s}s`; return `${s}s`; } function renderPhases(phases) { const root = $('#phases'); root.innerHTML = ''; phases.forEach((p) => { const row = document.createElement('div'); row.className = 'phase'; row.innerHTML = `
${layer.description}
${layer.artifact} ${theoremHtml}`; layerRoot.appendChild(div); }); const verRoot = $('#verificationArtifacts'); verRoot.innerHTML = ''; architecture.verification.forEach((v) => { const div = document.createElement('div'); div.className = 'ver-item'; const statusClass = v.status === 'complete' ? 'ok' : 'muted'; div.innerHTML = `${v.note}
`; verRoot.appendChild(div); }); } function renderAssets(assets, proverState) { const map = new Map(); if (proverState && Array.isArray(proverState.results)) { for (const r of proverState.results) map.set(r.assetId, r); } const tbody = $('#assets'); tbody.innerHTML = ''; if (!assets.length) { tbody.innerHTML = 'Run node prover/fetcher.js to populate.
${JSON.stringify(state, null, 2)}`;
}
async function loadHealth() {
try {
const res = await fetch('/api/health');
const data = await res.json();
const uptimeEl = $('#uptime');
if (uptimeEl) uptimeEl.textContent = fmtUptime(data.uptime);
} catch (_) {}
}
async function load() {
const res = await fetch('/api/status');
const data = await res.json();
$('#network').textContent = data.network || '—';
$('#serverTime').textContent = new Date(data.serverTime).toLocaleTimeString();
$('#cbAddress').textContent = data.circuitBreakerAddress || '— not deployed —';
$('#oracleAddress').textContent = data.oracleAddress || '—';
$('#arAddress').textContent = data.assetRegistryAddress || '— not deployed —';
$('#teeAddress').textContent = data.teeVerifierAddress || '— not deployed —';
$('#enclaveAddress').textContent = data.enclaveAddress || '—';
renderPhases(data.phases);
renderTests(data.tests);
renderArchitecture(data.architecture);
renderAssets(data.assets, data.proverState);
renderSigners(data.signerNodes);
renderProver(data.proverState);
loadHealth();
}
load().catch((err) => {
document.body.innerHTML += `${err.message}`;
});
setInterval(load, 15000);
})();