6235fa0541
DisplayIdle::tick() runs every 50ms. After startMcpScreensaver() sets displayDimmed=true, the next tick saw inactive_ms < 100ms (user navigated Settings) and called stopScreensaver() -> overlay deleted in <1s, text tool flash-then-back. Root cause: idle wake logic (inactive<100ms) + charging guard + duty-restore all operated on any overlay including MCP override. Fix: detect MCP active via (drawArea != nullptr || overrideActive) under state.mutex, guard all auto-stop paths with !isMcpActive. MCP still closable via click handler on overlay (CLICKABLE flag). Test: flash es3c28p 2be0c0 31% free to /dev/cu.usbmodem101 192.168.68.113 dashboard 200, dev 6666 ok, /api/mcp 25 tools. Requires PYTHONPATH cleaned for idf.py build (Hermes venv hijacks pydantic_core).