37134b8c18
When a tool container stops, the docker exec PTY reaches EOF. Previously, the event-driven reader silently returned on EOF, leaving websockets attached to a dead session. Input writes then failed silently. Changes: - _on_fd_readable: detect EOF (empty read) and call _handle_eof() - _handle_eof: stop reading, mark process dead, close all websockets with code 4001 to force frontend reconnection - write_input: detect write errors and trigger EOF cleanup Quality gates: pytest (19 passed, 1 skipped)