// Live elapsed-time counter, mounted while the agent works. // // THE RESET BUG: this element re-mounts on every `answer.update()` — and a turn // updates the message many times (status line, Meshy progress, streamed tokens). // A React `useState(0)` starts over on each remount, so the timer kept snapping // back to 00:00 and never showed the real elapsed time. // // Fix: keep the START TIME on `window`, keyed by turn id, and derive elapsed from // it. Remounts then resume from the true start instead of restarting the clock. // The component becomes stateless with respect to time; only the tick is state. import { useEffect, useState } from "react"; export default function TurnTimer() { const id = props.id; const [, tick] = useState(0); useEffect(() => { window.__fossilTimer = window.__fossilTimer || {}; if (!window.__fossilTimer[id]) window.__fossilTimer[id] = Date.now(); const t = setInterval(() => { if (window.__fossilTimerStopped?.[id]) { clearInterval(t); return; } tick((v) => v + 1); }, 1000); return () => clearInterval(t); }, [id]); const start = window.__fossilTimer?.[id] || Date.now(); const s = Math.floor((Date.now() - start) / 1000); const mm = String(Math.floor(s / 60)).padStart(2, "0"); const ss = String(s % 60).padStart(2, "0"); return (