diff --git a/crates/gyandoot-agent/src/browser_manager.rs b/crates/gyandoot-agent/src/browser_manager.rs index fa727d1..6e3ef30 100644 --- a/crates/gyandoot-agent/src/browser_manager.rs +++ b/crates/gyandoot-agent/src/browser_manager.rs @@ -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(()) }