fix(browser): surface actual camoufox-bridge error on daemon start failure

trigger_daemon_start now captures stdout/stderr and exit code instead
of silently redirecting to a log file. On failure it prints the actual
error, making it obvious what went wrong (npm install issue, node
version mismatch, etc.).
This commit is contained in:
2026-06-12 16:32:45 +05:30
parent cc0ff65e89
commit 07a14e2d7b

View File

@@ -18,7 +18,6 @@
//! `/home/user/.nvm/versions/node/v22/bin/npx`)
//! 2. `"npx"` on Linux/macOS, `"npx.cmd"` on Windows — PATH lookup
use std::process::Stdio;
use std::time::Duration;
use tokio::process::Command;
@@ -136,24 +135,55 @@ async fn trigger_daemon_start(session: &str, node_path: Option<&str>) -> Result<
.map_err(|e| format!("Cannot create {}: {}", log_dir.display(), e))?;
let log_file = log_dir.join("camoufox-daemon-spawn.log");
let log = std::fs::File::create(&log_file)
.map_err(|e| format!("Cannot create log file: {}", e))?;
let npx = resolve_npx(node_path);
// Run a command — the CLI auto-starts the daemon as a side effect
let _output = Command::new(npx)
let output = Command::new(npx)
.args(&[
"camoufox-browser@latest",
"tab_list",
"--session", session,
])
.stdout(Stdio::from(log.try_clone().map_err(|e| e.to_string())?))
.stderr(Stdio::from(log))
.output()
.await
.map_err(|e| format!("{} failed: {}. Is Node.js installed?", npx, e))?;
.map_err(|e| {
let hint = if node_path.is_none() {
"\n → Set [browser].node_path in your config, e.g.:\n [browser]\n node_path = \"/Users/yourname/.nvm/versions/node/v22/bin/npx\"".to_string()
} else {
format!("\n → npx at '{}' not found or not executable", npx)
};
format!("{} failed: {}. Is Node.js installed?{}", npx, e, hint)
})?;
if !output.status.success() {
// Read the log for details
let stderr = String::from_utf8_lossy(&output.stderr).trim().to_string();
let stdout = String::from_utf8_lossy(&output.stdout).trim().to_string();
let details = if !stderr.is_empty() { stderr.clone() } else { stdout.clone() };
// Also save to log file for reference
let _ = std::fs::write(&log_file, format!(
"exit_code: {}\nstdout:\n{}\nstderr:\n{}\n",
output.status.code().unwrap_or(-1),
stdout, stderr
));
let hint = if node_path.is_none() {
"\n → Try setting [browser].node_path in your config:\n [browser]\n node_path = \"/Users/yourname/.nvm/versions/node/v22/bin/npx\"".to_string()
} else {
String::new()
};
return Err(format!(
"camoufox-browser failed (exit: {}):\n {}\n → Full log saved to {}{}",
output.status.code().unwrap_or(-1),
details,
log_file.display(),
hint,
));
}
// Command succeeded — daemon should be starting
Ok(())
}