Skip to content

[Bug]: Codex update always fails on a remote host with a root-owned system-wide Codex install, and the toast hides the reason #22487

Closed

Description

@codybotdev

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

  1. Connect T3 desktop to a remote SSH environment (Ubuntu 24.04 VM) where Codex was installed system-wide by root, with no npm on the box:
    /usr/local/bin/codex -> /usr/local/lib/codex/releases/rust-v0.162.1-x86_64-unknown-linux-musl-<hash>/bin/codex (owned by root:root)
  2. Wait for a newer Codex release (0.163.0), so T3 shows "Update available" for that environment's Codex provider.
  3. Click Update.

Expected behavior

Either Codex updates, or T3 says up front that it can't update this install, explains why, and links the manual steps. If the update command fails, the toast should show what the command printed.

Actual behavior

The toast says only: <env> · Codex: Update command exited with code 1. It fails the same way every time, in about 0.5 s.

Running the same command over SSH as the environment user shows the real error:

$ codex update
Error: Could not detect the Codex installation method. Please update manually: https://developers.openai.com/codex/cli/
$ echo $?
1

There are two separate problems:

  1. The update can't work for this install. codex update only recognizes npm, Homebrew, or standalone installs under $CODEX_HOME/packages/standalone/releases/. This install is under /usr/local/lib/codex/releases/. It's also owned by root, so even if Codex recognized it, the unprivileged user couldn't write the update. T3 still shows the one-click Update button for it.
  2. The toast hides the reason. Codex printed a clear explanation, but the toast shows only the exit code. Nothing in the server trace logs records the command's output either: ProviderMaintenanceRunner.runCommandAndVerify shows up as a successful span with no events. I only found the cause by SSHing in and running the command by hand.

This is related to #19252 (standalone install with a CODEX_HOME mismatch) and #19556 (T3-managed binary), but it's a different install shape. The CODEX_HOME workaround from #19252 doesn't apply here, because the install isn't under any CODEX_HOME, and it isn't writable anyway.

Impact

Minor bug or occasional failure

Version or commit

0.1.0

Environment

T3 Code (Beta) desktop 0.1.0 on macOS 26 (Darwin 25.5.0) → remote SSH environment running T3 server 0.1.0 on Ubuntu 24.04.5 x86_64; remote Codex CLI 0.162.1 (root-owned standalone install, no npm); local Codex 0.163.0

Logs or stack traces

# remote server trace: the span succeeds and records no command output
{"name":"ProviderMaintenanceRunner.runCommandAndVerify", ... "durationMs":31.9, "events":[], "exit":{"_tag":"Success"}}
# desktop trace: server.updateProvider RPC fails (status code 1)
{"name":"server.updateProvider", ... "durationMs":500.6, "status":{"code":"1"}}

Workaround

Reinstall Codex by hand on the remote with sudo, or switch the remote to a user-owned npm install (npm i -g @openai/codex with a user prefix) so codex update can detect it and write the update.

Suggested fixes: (a) include the command's stderr/stdout tail in the failure toast and the server trace; (b) before offering Update, check whether the install is a kind codex update recognizes and whether the user can write to it. If not, show a "manual update required" state rather than a button that can never succeed.

Activity

  1. juliusmarminge commented on Oct 20, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Thanks for running the command by hand, that pins it down.

    Codex refusing to update an install it can't identify is Codex's own behavior. The part on our side is that T3 offers the one-click update at all. The Codex updater recognizes a standalone install only when its path contains /packages/standalone/ (apps/server/src/provider/Drivers/CodexDriver.ts:62-64). Any other path that isn't under node_modules or a known package manager falls back to running codex update (packages/provider-core/src/server/maintenanceResolver.ts:466-478). So a root-owned system install under /usr/local/lib/codex/releases/ gets an Update button that can never succeed, instead of manual-only handling. #19253 changes which CODEX_HOME is used for standalone installs, so it doesn't cover this shape.

    The command's output is captured. The server stores stderr and stdout on the failed update (apps/server/src/provider/providerMaintenanceRunner.ts:237-243, 474-485), but the message is only the exit code (lines 245-253), which matches the toast you saw.

    Accepting this as a bug for both parts: treating unrecognized install paths as manual-only, and showing the updater's output when it fails.

  2. added
    bugSomething is broken or behaving incorrectly.
    acceptedfeature request accepted
    via-triageFiled through npx t3 triage
    on Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    acceptedfeature request acceptedbugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions