cdd37035d9
macOS sleep/wake (or a silent network drop) can leave the renderer's WebSocket half-open: no close event fires, so connectionState stays 'open' while every RPC hangs until its per-call timeout. prompt.submit's timeout is 30 minutes, so the user's next message reads as "enter does nothing until I restart the app". - Add a minimal ping RPC (tui_gateway/server.py) answered synchronously on the WS reader thread. - On wake signals, reconnectNow now probes the open-looking socket with a 5s-bounded ping and force-closes it on failure, letting the existing reconnect machinery (backoff, tile rebinding, session refresh) take over. A pre-ping backend answering -32601 is treated as healthy. - Tests: half-open socket force-reconnects; healthy socket untouched; method-not-found backend untouched; backend ping envelope contract.