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
- Skip transform — the file is already adapted; the current invocation is a no-op re-apply.
- Restore the original service file (SHA 3e6fd4a8...) from the pinned bundle, then re-run transform once.
- If another tool injected a conflicting adapter, uninstall/disable it before using this feature.
- 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
- Make apply flows idempotent: check for the adapter marker before transforming
- Restore the original file before toggling the feature off/on
- Avoid running multiple tools that patch the same bundled service file
- Track apply state in the tool's state dir instead of inferring from file contents
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
- Expected one callback binding
- archived lookup task failed
- built-in Dream Skin theme cannot be deleted
- built-in Dream Skin theme is read-only
- cannot terminate Windows process id
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 = nodeView on GitHub (pinned to b1ed92e5e4)