on_audio was resetting the timer on every chunk including silence, so the timeout never fired. Now passes the raw chunk and checks RMS; only resets if energy is above 0.02 (speech, not ambient silence). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>