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
- Reset NODE_REPL_TRUSTED_SERVICES so browser maps to "@oai/browser-desktop/service"
- Reinstall the unified-computer-use plugin to restore the default trusted-services map
- 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
- Do not customize NODE_REPL_TRUSTED_SERVICES if you rely on Codex++ browser patching
- After plugin upgrades, diff the descriptor env against defaults
- Restore the stock descriptor whenever you experiment with alternate browser backends
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
- Conflicting native worker selection
- Unsupported native entry point
- Unsupported native surface selection
- Ambiguous runtime selection; no cache was modified
- 官方混合 API 不应在 auth.json 中保存 OPENAI_API_KEY。请清理此供应商的…
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)