Repository navigation
Description
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
- 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) - Wait for a newer Codex release (0.163.0), so T3 shows "Update available" for that environment's Codex provider.
- 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:
- The update can't work for this install.
codex updateonly 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. - 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.runCommandAndVerifyshows 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
juliusmarminge commentedon Oct 20, 2026
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 undernode_modulesor a known package manager falls back to runningcodex 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 whichCODEX_HOMEis 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.