Files
codex/codex-rs/tcp-tunnel/README.md
T
richardopenai 8d44977aa2 Add opt-in JSON diagnostics for TCP tunnels (#50131)
## What changed

Add `codex tcp-tunnel --diagnostics-json` to emit versioned, newline-delimited JSON diagnostics on stderr. Records classify startup, CONNECT, transport, and control failures without exposing credentials, addresses, headers, or raw error messages. Rejected CONNECT records may include a validated `http_status`.

Distinguish terminal failures from recoverable stream and transport events, flush terminal records before returning a generic error, and preserve stdout readiness and credential acknowledgments. Keep human-readable diagnostics as the default and document the version 1 schema and consumer fallback rules.

## Testing

Add tests for bounded output, error-chain suppression, terminal flushing, control error classification, CONNECT status validation, legacy behavior, and flag parsing. Extend the reconnect test to exercise a rejected CONNECT followed by a successful connection in JSON mode.

GitOrigin-RevId: 350f67fe8e3f313e8a6d3bb0fd891952b77647fd
2026-10-02 00:46:14 +00:00

26 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HTTP/3 TCP tunnel
The ordinary Codex binary includes the hidden `codex tcp-tunnel` command. It forwards a loopback TCP listener to an explicitly selected host and port through a TLS-verified HTTP/3 CONNECT proxy. The proxy URL must be an exact HTTPS origin in the supplied policy file; the target is provided separately as `host:port` or `[IPv6]:port`.
The initial bearer must be provided as a single line on standard input (`--auth-token-stdin`). With `--auth-token-updates-stdin`, later lines replace the bearer for new connections, emit `AUTH_UPDATED`, and closure of the controlling pipe stops the tunnel. With `--connect-headers-stdin`, the first line is instead a JSON list of `["x-name","value"]` pairs; token lines follow. Only non-forwarding `x-` extension headers are accepted. No header values or credentials belong in the command arguments.
The process emits `LISTENING 127.0.0.1:<port>` after connecting to the proxy. A proxy handshake does not authorize the target; each local connection makes its own authenticated CONNECT. The listener survives transport reconnects, but TCP streams are never replayed.
`--diagnostics-json` opts into newline-delimited JSON on stderr. Version 1 contains
`v`, `phase` (`startup`, `connect`, `transport`, or `control`), `code` (`failed`,
`timeout`, `rejected`, `closed`, `draining`, or `invalid_input`), and `terminal`.
A rejected CONNECT may also include a numeric `http_status` (100–599, excluding
2xx). Records contain no credentials, addresses, headers, or raw error messages
and are less than 256 bytes. Stdout readiness and credential acknowledgments are
unchanged. A terminal record is flushed before an unsuccessful return; closing
the controlling pipe normally emits no failure. The CLI may append a generic
error line after the terminal record. Nonterminal events may concern
one TCP stream or a reconnecting shared transport and do not identify the cause
of a later child-process failure. Consumers must ignore records with unknown versions or fields and keep a generic
fallback for helpers without this flag.
Version 1 terminal combinations are `startup/{failed,timeout}`,
`control/{failed,invalid_input}`, and `transport/failed`. Nonterminal combinations
are `connect/{failed,rejected}` and `transport/{failed,timeout,closed,draining}`.
Other combinations are unknown records and must use the generic fallback.