BigPizzaV3/CodexPlusPlus · error

Original browser service is not selected

Error message

Original browser service is not selected

What it means

selected_key requires that the descriptor's NODE_REPL_TRUSTED_SERVICES JSON map selects the original @oai/browser-desktop/service for the browser surface. This guarantee lets Codex++ safely patch and restore the adapter: if a different (already-modified or third-party) browser service is configured, patching it would corrupt an unknown artifact, so discovery rejects the descriptor.

Solutions

  1. Reset NODE_REPL_TRUSTED_SERVICES so browser maps to "@oai/browser-desktop/service"
  2. Reinstall the unified-computer-use plugin to restore the default trusted-services map
  3. Remove stale plugin descriptor directories so only the stock descriptor is discovered

Example fix

// before
"NODE_REPL_TRUSTED_SERVICES": "{\"browser\":\"@vendor/alternate-browser\"}"
// after
"NODE_REPL_TRUSTED_SERVICES": "{\"browser\":\"@oai/browser-desktop/service\"}"
Defensive patterns

Strategy: validation

Validate before calling

let services: Value = serde_json::from_str(env["NODE_REPL_TRUSTED_SERVICES"].as_str().unwrap_or(""))?;
if services["browser"] != "@oai/browser-desktop/service" { eprintln!("non-default browser service selected"); }

Type guard

fn selects_original_browser_service(env: &Value) -> bool {
    env["NODE_REPL_TRUSTED_SERVICES"].as_str()
        .and_then(|s| serde_json::from_str::<Value>(s).ok())
        .map(|v| v["browser"] == "@oai/browser-desktop/service")
        .unwrap_or(false)
}

Prevention

When it happens

Trigger: selected_key reads env.NODE_REPL_TRUSTED_SERVICES from the cua_repl server descriptor and the services["browser"] value is anything other than "@oai/browser-desktop/service" — e.g. the map was edited, the plugin selected an alternate browser backend, or a newer plugin version renamed the service.

Common situations: Manual tweaks to NODE_REPL_TRUSTED_SERVICES to enable non-default backends; plugin upgrades that change service identifiers; experimenting with alternative browser service implementations inside the cua_repl env.

Related errors


AI-assisted analysis of BigPizzaV3/CodexPlusPlus@b1ed92e5e4 (2026-09-19). Data as JSON: /api/errors/225d20bc99233fb3. Report an issue: GitHub.

Appendix: source

Thrown at crates/codex-plus-core/src/native_browser.rs:314

        key_valid(key) && relative == Path::new(key).join("bin/node.exe"),
        "Unexpected native runtime layout"
    );
    let env = &server["env"];
    ensure!(
        env["NODE_REPL_NODE_PATH"].as_str().map(Path::new) == Some(node.as_path()),
        "Conflicting native Node selection"
    );
    let worker = root.join(key).join("bin/node_repl.exe");
    ensure!(
        env["CUA_REPL_NODE_REPL_PATH"].as_str().map(Path::new) == Some(worker.as_path()),
        "Conflicting native worker selection"
    );
    let services: Value = serde_json::from_str(
        env["NODE_REPL_TRUSTED_SERVICES"]
            .as_str()
            .context("Missing native service map")?,
    )?;
    ensure!(
        services["browser"] == "@oai/browser-desktop/service",
        "Original browser service is not selected"
    );
    ensure!(
        env["CUA_REPL_ENABLED_SURFACES"].as_str() == Some("browser"),
        "Unsupported native surface selection"
    );
    let args = server["args"]
        .as_array()
        .context("Missing native entry point")?;
    let entry = root
        .join(key)
        .join("bin/node_modules/@oai/cua-repl/bin/cua-repl.mjs");
    ensure!(
        args.len() == 1 && args[0].as_str().map(Path::new) == Some(entry.as_path()),
        "Unsupported native entry point"
    );
    plain_path(&node)?;

View on GitHub (pinned to b1ed92e5e4)