<!doctype html><meta charset=utf8><title>MCP run</title><style> body{font:15px/1.55 ui-sans-serif,system-ui;max-width:760px;margin:0 auto;padding:24px;color:#d7dce5;background:#0b0f17} #banner{font-weight:700;font-size:14px;margin-bottom:14px;color:#8b98a9} #banner.ok{color:#7ee787}#banner.no{color:#ff7b72} .row{opacity:0;transform:translateY(6px);transition:opacity .25s,transform .25s;margin:6px 0} .row.in{opacity:1;transform:none} .u{background:#1f6feb;color:#fff;padding:.55rem .8rem;border-radius:12px;font-weight:600} .a{color:#8b98a9;padding:.3rem .8rem;border-left:2px solid #30363d} .au{background:#1c1606;border:1px solid #5c4813;color:#e3b341;padding:.4rem .7rem;border-radius:10px;font-size:13.5px} .t{background:#0f1620;border:1px solid #21262d;border-radius:10px;padding:.5rem .75rem} .t.run{border-color:#1f6feb}.t .g{color:#6b7785}.t .sp{color:#58a6ff;font-style:italic} .t pre{background:#010409;color:#c9d1d9;padding:.5rem;border-radius:6px;margin:.4rem 0 0;font-size:12.5px;overflow:auto} .x{padding:.2rem .8rem;font-size:13.5px}.x.ok{color:#7ee787}.x.no{color:#ff7b72;font-weight:700} .e{color:#ff7b72;font-weight:700;padding:.4rem .8rem} .cur{display:inline-block;width:7px;height:15px;background:#8b98a9;vertical-align:-2px;animation:b .8s steps(1) infinite} @keyframes b{50%{opacity:0}}</style><div id="banner">● recording</div><div id="chat"></div><script>const RUN = __RUN__;const SPEED = 1;const esc = s => String(s).replace(/[&<>]/g,c=>({'&':'&','<':'<','>':'>'}[c]));const chat = document.getElementById('chat');const add = html => { const d=document.createElement('div'); d.innerHTML=html.trim(); const el=d.firstElementChild; el.classList.add('row'); chat.appendChild(el); requestAnimationFrame(()=>el.classList.add('in')); el.scrollIntoView({behavior:'smooth',block:'end'}); return el; };const sleep = ms => new Promise(r=>setTimeout(r, ms/SPEED));async function type(el, text){ for(let i=0;i<=text.length;i++){ el.innerHTML=esc(text.slice(0,i))+'<span class=cur></span>'; await sleep(16); } el.innerHTML=esc(text); }(async () => { await sleep(300); for (const t of RUN.turns){ if (t.role==='auth') continue; // OAuth is its own phase in the recording if (t.role==='user'){ add('<div class="u">'+esc(t.text)+'</div>'); await sleep(700); } else if (t.role==='assistant'){ const el=add('<div class="a"></div>'); await type(el, t.text); await sleep(250); } else if (t.role==='tool'){ const el=add('<div class="t run">🔧 <b>'+esc(t.call.name)+'</b> <span class="sp">running…</span></div>'); await sleep(750); el.classList.remove('run'); el.innerHTML='🔧 <b>'+esc(t.call.name)+'</b> '+(t.ok?'✓':'✗')+' <span class="g">→ '+esc(String(t.text).slice(0,90))+'</span><pre>'+esc(JSON.stringify({args:t.call.args,result:t.result},null,2))+'</pre>'; el.scrollIntoView({behavior:'smooth',block:'end'}); await sleep(550); } else if (t.role==='assert'){ add('<div class="x '+(t.ok?'ok':'no')+'">'+(t.ok?'✅':'❌')+' expect('+esc(JSON.stringify(t.actual))+').'+t.kind+'('+esc(JSON.stringify(t.expected))+')</div>'); await sleep(450); } else if (t.role==='error'){ add('<div class="e">💥 '+esc(t.text)+'</div>'); await sleep(500); } } await sleep(400); const b=document.getElementById('banner'); b.textContent=(RUN.ok?'✓ PASSED':'✗ FAILED')+' · '+RUN.meta.server; b.className=RUN.ok?'ok':'no'; window.__done=true;})();</script>
<!doctype html><meta charset=utf8><title>MCP run</title><style>
body{font:15px/1.55 ui-sans-serif,system-ui;max-width:760px;margin:0 auto;padding:24px;color:#d7dce5;background:#0b0f17}
#banner{font-weight:700;font-size:14px;margin-bottom:14px;color:#8b98a9}
#banner.ok{color:#7ee787}#banner.no{color:#ff7b72}
.row{opacity:0;transform:translateY(6px);transition:opacity .25s,transform .25s;margin:6px 0}
.row.in{opacity:1;transform:none}
.u{background:#1f6feb;color:#fff;padding:.55rem .8rem;border-radius:12px;font-weight:600}
.a{color:#8b98a9;padding:.3rem .8rem;border-left:2px solid #30363d}
.au{background:#1c1606;border:1px solid #5c4813;color:#e3b341;padding:.4rem .7rem;border-radius:10px;font-size:13.5px}
.t{background:#0f1620;border:1px solid #21262d;border-radius:10px;padding:.5rem .75rem}
.t.run{border-color:#1f6feb}.t .g{color:#6b7785}.t .sp{color:#58a6ff;font-style:italic}
.t pre{background:#010409;color:#c9d1d9;padding:.5rem;border-radius:6px;margin:.4rem 0 0;font-size:12.5px;overflow:auto}
.x{padding:.2rem .8rem;font-size:13.5px}.x.ok{color:#7ee787}.x.no{color:#ff7b72;font-weight:700}
.e{color:#ff7b72;font-weight:700;padding:.4rem .8rem}
.cur{display:inline-block;width:7px;height:15px;background:#8b98a9;vertical-align:-2px;animation:b .8s steps(1) infinite}
@keyframes b{50%{opacity:0}}
</style>
<div id="banner">● recording</div><div id="chat"></div>
<script>
const RUN = __RUN__;
const SPEED = 1;
const esc = s => String(s).replace(/[&<>]/g,c=>({'&':'&','<':'<','>':'>'}[c]));
const chat = document.getElementById('chat');
const add = html => { const d=document.createElement('div'); d.innerHTML=html.trim(); const el=d.firstElementChild; el.classList.add('row'); chat.appendChild(el); requestAnimationFrame(()=>el.classList.add('in')); el.scrollIntoView({behavior:'smooth',block:'end'}); return el; };
const sleep = ms => new Promise(r=>setTimeout(r, ms/SPEED));
async function type(el, text){ for(let i=0;i<=text.length;i++){ el.innerHTML=esc(text.slice(0,i))+'<span class=cur></span>'; await sleep(16); } el.innerHTML=esc(text); }
(async () => {
await sleep(300);
for (const t of RUN.turns){
if (t.role==='auth') continue; // OAuth is its own phase in the recording
if (t.role==='user'){ add('<div class="u">'+esc(t.text)+'</div>'); await sleep(700); }
else if (t.role==='assistant'){ const el=add('<div class="a"></div>'); await type(el, t.text); await sleep(250); }
else if (t.role==='tool'){
const el=add('<div class="t run">🔧 <b>'+esc(t.call.name)+'</b> <span class="sp">running…</span></div>');
await sleep(750);
el.classList.remove('run');
el.innerHTML='🔧 <b>'+esc(t.call.name)+'</b> '+(t.ok?'✓':'✗')+' <span class="g">→ '+esc(String(t.text).slice(0,90))+'</span><pre>'+esc(JSON.stringify({args:t.call.args,result:t.result},null,2))+'</pre>';
el.scrollIntoView({behavior:'smooth',block:'end'}); await sleep(550);
}
else if (t.role==='assert'){ add('<div class="x '+(t.ok?'ok':'no')+'">'+(t.ok?'✅':'❌')+' expect('+esc(JSON.stringify(t.actual))+').'+t.kind+'('+esc(JSON.stringify(t.expected))+')</div>'); await sleep(450); }
else if (t.role==='error'){ add('<div class="e">💥 '+esc(t.text)+'</div>'); await sleep(500); }
}
await sleep(400);
const b=document.getElementById('banner'); b.textContent=(RUN.ok?'✓ PASSED':'✗ FAILED')+' · '+RUN.meta.server; b.className=RUN.ok?'ok':'no';
window.__done=true;
})();
</script>