36fb71699b
The web silence detector previously ran RMS over getByteFrequencyData bytes (which are already dB-scaled) and re-log'd the result, producing numbers that didn't line up with real dBFS. Combined with a static -40 dB threshold that sat right on top of room ambient, silence detection rarely fired and the user had to click stop manually. - Rewrite useSilenceDetector to use getFloatTimeDomainData for honest linear RMS → dBFS. - Silence threshold is now dynamic: track session peak dBFS and treat "silent" as 15 dB below peak. Auto-calibrates per mic/room. - Grace period (1500 ms) at start so the user can begin speaking before checks arm; static -45 dB fallback until peak clears -25 dB so dead-silent sessions don't spin forever. - Silence duration bumped 1500 → 2000 ms for breathing room. Visual: detached red radial-gradient disc sits behind the mic in a wrapper; the button no longer scales, so the white mic icon stays legible on top while the halo grows from 1x to ~2.6x with live amplitude. Much more obvious "you are live" signal than the prior subtle box-shadow pulse. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>