SIGN IN SIGN UP

fix(antigravity): scrape the sign-in link from stderr as well as stdout

"Get sign-in link" spun for ninety seconds and then reported that the agent
had produced no link. It had produced one 2.6 seconds in: the `print` at the
end of `_run_redirect_server` moved from stdout to stderr between 1.0.0 and
1.1.1, and only stdout was scanned, so nothing ever reached the URL channel
and the start path waited out `URL_WAIT` in full. A user who closed the panel
during that wait saw nothing at all, since a reply outliving its mount is
discarded rather than reported.

Both streams now feed one `AuthUrlSink` and the first match wins, so either
pin works — 1.0.0 still prints to stdout, where the line shares a file
descriptor with the JSON-RPC frames and can carry both. `PYTHONUNBUFFERED=1`
stays for that case, because CPython block-buffers a piped stdout; stderr is
unbuffered either way. The offer happens on the raw line and ahead of
`StderrTail::push`, which redacts and truncates to 512 bytes and would slice a
~510-character consent URL off mid-query.

A closed URL channel now means both streams hit EOF rather than one, which is
the same "the process is gone" it always stood for. The stderr excerpt
attached to a failure drops the prompt line: the tail holds that line
truncated, so a message reporting no link appeared would have trailed off into
two thirds of a consent URL and read as corruption.

Both pumps take a generic reader so the test drives the real ones. A sink
exercised on its own passes with either stream unwired, which is precisely the
shape of the defect.
X
xintaofei committed
6f88b29acec6ef8e877c35c7ae4d1036112f776d
Parent: 1055edc