`_start_callback_server` hardcodes 127.0.0.1. On a desktop install that is exactly
right — the browser finishing the flow is on the same machine. On a server install
it cannot work: a container publishes its port to the container's external
interface, and a listener on the container's own loopback never sees that traffic.
The redirect lands on a closed port, the flow times out after five minutes, and
ChatGPT sign-in is impossible for every containerized deployment, including the
project's own docker recipe.
The bind address is now read per flow from COWORKER_OAUTH_CALLBACK_HOST, defaulting
to 127.0.0.1, so nothing changes for desktop users. REDIRECT_URI is untouched: it
describes where the browser goes, not where we listen, so the registered redirect
stays valid and needs no re-registration.
An empty value falls back to loopback rather than becoming "listen everywhere" —
the one mistake here that would widen exposure silently.
Tests assert the bind address through the call rather than by binding for real: the
port is fixed at 1455, so a machine running the Codex CLI (its usual holder) or a
container publishing that port would otherwise fail them for unrelated reasons.
Browser sign-in on the registered loopback port; tokens in the SecretStore profile.
Rides the Responses provider for conversion/streaming; refresh-on-expiry and on-401.
REST: signin (background + status poll), status, signout; oauth rows in providers list.