Skip to content

codex app-server proxy exits 0 with empty stdout/stderr instead of bridging stdio #23572

@shuv1337

Description

@shuv1337

What version of the Codex CLI are you using?

codex-cli 0.131.0

What platform is your computer?

Arch Linux, x86_64.

What issue are you seeing?

codex app-server proxy is documented by --help as:

Proxy stdio bytes to the running app-server control socket

In practice it silently consumes stdin, exits with status 0, and writes nothing to stdout or stderr. Passing the socket explicitly with --sock ~/.codex/app-server-control/app-server-control.sock behaves the same way.

This makes callers believe the proxy path succeeded even though no JSON-RPC response is ever returned. In Desktop-style launchers this turns into an app-server connection failure / initialize timeout even though the underlying app-server daemon is healthy.

Reproduction

With an app-server daemon listening on the default control socket:

codex --version
# codex-cli 0.131.0

body='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"proxy-repro","version":"0.0.0"}}}'
printf 'Content-Length: %d\r\n\r\n%s' "${#body}" "$body" >/tmp/codex-proxy-repro-in.log

codex app-server proxy \
  </tmp/codex-proxy-repro-in.log \
  >/tmp/codex-proxy-repro-out.log \
  2>/tmp/codex-proxy-repro-err.log

echo $?
wc -c /tmp/codex-proxy-repro-in.log /tmp/codex-proxy-repro-out.log /tmp/codex-proxy-repro-err.log

Actual result:

0
183 /tmp/codex-proxy-repro-in.log
0 /tmp/codex-proxy-repro-out.log
0 /tmp/codex-proxy-repro-err.log

The same result happens when the socket is passed explicitly:

codex app-server proxy --sock ~/.codex/app-server-control/app-server-control.sock \
  </tmp/codex-proxy-repro-in.log \
  >/tmp/codex-proxy-repro-sock-out.log \
  2>/tmp/codex-proxy-repro-sock-err.log
0
183 /tmp/codex-proxy-repro-in.log
0 /tmp/codex-proxy-repro-sock-out.log
0 /tmp/codex-proxy-repro-sock-err.log

Expected behavior

Either:

  1. codex app-server proxy should bridge Content-Length-framed stdio JSON-RPC to the app-server control socket and return the initialize response, or
  2. it should fail non-zero with a diagnostic explaining why it cannot proxy.

Evidence that the daemon/socket is healthy

A direct WebSocket upgrade against ~/.codex/app-server-control/app-server-control.sock, followed by a masked text frame containing the same initialize JSON-RPC payload, succeeds:

HTTP/1.1 101 Switching Protocols
{"id":1,"result":{"userAgent":"t/0.131.0 (Arch Linux Rolling Release; x86_64) ghostty/1.3.1-arch2 (direct-ws-repro; 0.0.0)","codexHome":"/home/shuv/.codex","platformFamily":"unix","platformOs":"linux"}}

So the bug appears isolated to the app-server proxy stdio-to-WebSocket bridge path, not to the daemon or the control socket.

Metadata

Metadata

Assignees

No one assigned

    Labels

    CLIIssues related to the Codex CLIapp-serverIssues involving app server protocol or interfacesbugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions