Browser and Chrome plugins fail at bootstrap: TypeError Cannot redefine property: process

Open 💬 2 comments Opened Jul 14, 2026 by kkpapa

What version of the Codex App are you using (From “About Codex” dialog)?

ChatGPT/Codex Desktop 26.707.71524 (build 5263)

Bundled plugins:

  • browser@26.707.71524
  • chrome@26.707.71524

What subscription do you have?

Authenticated ChatGPT account in the desktop app. Exact plan omitted.

What platform is your computer?

macOS 26.5.1 (build 25F80), Apple Silicon / arm64.

What issue are you seeing?

Both the Codex in-app Browser and Chrome plugin fail deterministically during browser runtime bootstrap, before browser discovery or navigation begins:

TypeError: Cannot redefine property: process
    at .../scripts/browser-client.mjs:33:22
    at SourceTextModule.evaluate
    at importResolved (.../kernel.js:905:27)

The failing code in the bundled client is:

globalThis.process = processShim;
globalThis.global = globalThis.global ?? globalThis;
globalThis.global.process = processShim;

The trusted JavaScript runtime intentionally installs a locked process facade first:

Object.defineProperty(runtimeContext, "process", {
  value: trustedProcess,
  writable: false,
  configurable: false,
  enumerable: false,
});

Since ESM executes in strict mode, the assignment to globalThis.process throws immediately.

This affects both browser surfaces because their browser-client.mjs files are byte-identical:

SHA-256:
57ee77a283eb230c6c6d47353af13a25cec4c331b511868c8fbf7ccd3dd1b2f6

What steps can reproduce the bug?

  1. Open ChatGPT/Codex Desktop 26.707.71524 on macOS arm64.
  2. Install and enable either the bundled Browser or Chrome plugin.
  3. Start a fresh Codex task.
  4. Ask Codex to use @Browser or @Chrome.
  5. Run the plugin's documented bootstrap:

``js
const { setupBrowserRuntime } = await import(
"/Users/<user>/.codex/plugins/cache/openai-bundled/browser/26.707.71524/scripts/browser-client.mjs"
);
await setupBrowserRuntime({ globals: globalThis });
``

  1. The dynamic import throws Cannot redefine property: process. No browser backend is queried.

Frequency: 100%. Reproduced repeatedly with both bundled plugins.

What is the expected behavior?

The trusted bundled browser client should import successfully without mutating or replacing the locked global process facade, then continue to Browser/Chrome discovery and setup.

Additional information

Differential tests:

  • The exact unmodified browser-client.mjs imports successfully in an ordinary Node child process.
  • It fails only when evaluated in the trusted Codex runtime where process is intentionally non-writable and non-configurable.
  • A proof copy that keeps the process shim module-local imports past this collision. It then correctly fails the later trust check because the copy is not a trusted bundled client.
  • App and plugin versions match, so this is not a stale cross-version plugin cache.
  • Reinstalling the plugins, restarting Chrome and the app, and using a fresh task do not change the result.

This appears distinct from reports where the client imports and later fails with browser-client is not trusted or a native-pipe error: here the original trusted client throws during module evaluation, before the native bridge is inspected.

Suggested fix:

  • Keep the kernel's locked process facade; do not make it writable/configurable.
  • Make the browser client's Node polyfill module-local (and, if needed, use a module-local global proxy) instead of assigning to globalThis.process.
  • Add an integration test that imports the trusted browser client in a runtime where globalThis.process is already non-writable/non-configurable, asserts that the global is unchanged, and verifies setup reaches browser discovery.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗