BigPizzaV3/CodexPlusPlus · error

Conflicting adapter

Error message

Conflicting adapter

What it means

After confirming exactly one anchor binding, transform_binding refuses to run when the source already contains the string 'cppNativeIdentificationReader' — i.e. this very adapter (or a competing one) has already been injected. The check is idempotency/conflict protection: double-injection would nest adapters and break the identification callback.

Solutions

  1. Skip transform — the file is already adapted; the current invocation is a no-op re-apply.
  2. Restore the original service file (SHA 3e6fd4a8...) from the pinned bundle, then re-run transform once.
  3. If another tool injected a conflicting adapter, uninstall/disable it before using this feature.
  4. Verify via the tool's status command whether the adaptation is already active before calling apply.

Example fix

// before: unconditional apply loop
apply_native_browser(paths)?; // second call -> Conflicting adapter
// after: idempotent guard
if is_already_adapted(paths)? { return Ok(()); }
apply_native_browser(paths)?;
Defensive patterns

Strategy: validation

Validate before calling

let text = std::fs::read_to_string(&service_path)?;
if text.contains("cppNativeIdentificationReader") {
    return Ok(()); // already adapted; skip transform entirely
}

Type guard

fn is_already_adapted(source: &[u8]) -> bool {
    std::str::from_utf8(source)
        .map(|t| t.contains("cppNativeIdentificationReader"))
        .unwrap_or(false)
}

Try / catch

match transform_binding(source, control) {
    Ok(patched) => install(patched),
    Err(e) if e.to_string().contains("Conflicting adapter") => Ok(()), // idempotent no-op
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Running transform on a service file that was previously adapted by this tool (or a conflicting adapter using the same helper symbol): repeated 'apply' invocations without restoring the original, a transform that succeeded but whose atomic file move later failed leaving adapted content in place, or another patching tool injecting the same reader name.

Common situations: Users toggling the opt-in native-browser identification feature on twice; switching profile/apply flows that each run transform; leftover adapted file after a crash mid-apply; coexisting community patches of the same bundle.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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

Appendix: source

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

    }
    result
}

fn transform(source: &[u8], control: &Path, contract: &RuntimeContract) -> Result<Vec<u8>> {
    ensure!(
        sha(source) == contract.service_sha,
        "Unsupported native browser service hash"
    );
    transform_binding(source, control)
}

fn transform_binding(source: &[u8], control: &Path) -> Result<Vec<u8>> {
    let text = std::str::from_utf8(source)?;
    ensure!(
        text.matches(ANCHOR).count() == 1,
        "Expected one callback binding"
    );
    ensure!(
        !text.contains("cppNativeIdentificationReader"),
        "Conflicting adapter"
    );
    let path = serde_json::to_string(&control.to_str().context("Non-Unicode control path")?)?;
    let replacement = format!(
        "new nf(r,this.clientApi,()=>ze(this.runtime),this.turnEndedTracker,cppNativeIdentificationReader(this.runtime,cD,ze,{path}))"
    );
    Ok(format!("{}\n{HELPER}", text.replacen(ANCHOR, &replacement, 1)).into_bytes())
}

fn selected_key(descriptor: &Value, root: &Path) -> Result<String> {
    let server = &descriptor["mcpServers"]["cua_repl"];
    let node = PathBuf::from(
        server["command"]
            .as_str()
            .context("Missing native Node command")?,
    );
    let relative = node

View on GitHub (pinned to b1ed92e5e4)