macOS Desktop: Browser/node_repl tools are not provisioned to Remote SSH tasks
Summary
The bundled Browser works from a Local Codex task in the macOS desktop app, but tasks running on Linux hosts through the desktop app's Remote SSH connection are not provisioned with the Browser runtime or the required node_repl/js tool.
The right-side in-app browser can be opened manually and its ambient URL is visible to the remote task, but the remote task cannot navigate, inspect, click, scroll, or read the page.
Environment
- Desktop client: macOS ChatGPT/Codex desktop app
- Browser bundle observed in a working Local task:
openai-bundled/browser/26.715.21425 - Remote Codex CLI:
codex-cli 0.144.6 - Remote OS: Ubuntu Linux 6.8 x86_64
- Reproduced on two separate Linux Remote SSH hosts
- Same desktop app, account, and authenticated built-in Browser profile in all tests
Reproduction
- In the macOS desktop app, enable/install the bundled Browser plugin and sign in to a website in the built-in browser.
- Start a Local Codex task.
- Ask Codex to use the built-in browser.
- The Local task exposes
node_repl/js, importsbrowser-client.mjs, connects withagent.browsers.get("iab"), and can navigate/read the page. - Start a task on a saved Linux Remote SSH host in the same desktop app.
- Open the right-side built-in browser and ask the remote task to inspect or navigate it.
- Tool discovery in the remote task exposes no
node_repl/jsand no Browser control tool. The remote filesystem also has no bundled Browser client. - Starting a fresh Remote SSH task does not change the result.
The Local task can use the authenticated Browser profile successfully. The Remote SSH task can only see ambient UI state such as the current URL and cannot control the page.
Expected behavior
A Remote SSH task opened from the desktop app should receive a bridge to the desktop app's local built-in Browser while its shell and filesystem operations continue to run on the remote host.
If Browser control is intentionally unsupported for Remote SSH tasks, the app and Browser documentation should state that clearly and the task should report a specific unsupported-surface error.
Actual behavior
The Browser pane is visible to the user and ambient browser state is supplied to the remote task, which implies integration, but the execution bridge required to act on that state is absent. The failure is silent: the model simply has no Browser or node_repl tool.
Workaround
Delegate the browser-only step to a separate Local task, then relay extracted data back to the Remote SSH task. This works but is fragile for scheduled workflows, durable state, approvals, and task continuity.
Related issues
This appears to be the macOS Remote SSH equivalent of the tool-provisioning failures reported in:
- #19365
- #21575
Those reports involve Windows/WSL, but the key symptom is the same: Browser is installed/enabled while the active non-local task does not receive node_repl/js or the IAB bridge.
4 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Reviewed the suggested duplicates:
node_replto ordinary new/local tasks. In this report, Local tasks work reliably.I also searched the repository for Remote SSH + Browser/
node_replreports. #26560 is remote-control related, but it has a different failure mode:node_replis attached and launches with the wrong controller-side environment. Here, Remote SSH tasks receive no Browser/node_repltool at all, while a Local task in the same macOS Desktop app works.Keeping this issue open because the Remote SSH boundary is the distinguishing and reproducible trigger.
Reproduced on a newer release with an SSH-backed Linux devcontainer.
Environment:
26.820.609400.149.1codex app-serveris launched inside an existing Docker devcontainer@BrowsersuccessfullyRemote-task results:
@Browseris unavailable.node_repl/jsor Browser-control tool is provisioned.browser@openai-bundledorchrome@openai-bundled.browser_use,in_app_browser,computer_use, and full-CDP feature flags are enabled.codex doctorreports the app-server, configuration, authentication, and WebSocket connection as healthy.Since this also occurs on ordinary Remote SSH hosts, Docker does not appear to be the root cause. The devcontainer setup confirms that redirecting the remote app-server through
docker execdoes not receive a bridge to the Mac session-owned IAB backend.Expected behavior remains either:
@Browseras unsupported and avoid injecting ambient browser state that the task cannot act upon.Additional reproduction on a newer Remote SSH task, with one product/security detail that seems important for the expected fix.
Environment
codex-cli 0.150.0-alpha.8Reproduction
codex_app__open_in_codex. That tool can show/open a URL or target a tab in the Codex UI, but explicitly is not an inspection or interaction interface.node_repl/browser-client tool.This matches the Remote SSH provisioning boundary described in this issue. It reproduces on Windows Desktop + Debian remote as well as the macOS + Linux configurations already reported.
Impact / workaround
For browser-based acceptance testing, the remote task must separately download and run Playwright/Chromium on the remote host. That is slow, consumes remote storage, and creates a different browser profile/session from the authenticated tab the user is watching. It does not satisfy workflows where the user wants to observe and review actions in the existing Codex Browser tab.
Expected security and UX contract
Please provide a controlled, auditable bridge for the current user-authorized tab while shell/filesystem work remains remote. At minimum it should support page read/DOM or accessibility inspection, screenshot, click, type/fill, and navigation on the explicitly authorized tab.
Sensitive values typed into forms should be passed as protected tool arguments, not embedded in URLs, model-visible logs, or diagnostic output. Agent actions and their resulting page state should remain visible to the user in that same Codex Browser tab.
If bridging the Desktop-owned tab into Remote SSH tasks is intentionally unsupported, the app should clearly say so and should not imply controllability merely by supplying ambient tab state plus
open_in_codex.