From c00dd4475087d69b41457fb31b83a768b900c953 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Mon, 2 Feb 2026 13:47:15 -0600 Subject: [PATCH] fix: improve daemon startup error handling and diagnostics (#337) * fixes * add debugging --- cli/src/connection.rs | 36 +++++++++++++++++++++++++++++++++++- cli/src/main.rs | 34 +++++++++++++++++++++++++++------- src/browser.ts | 4 ++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/cli/src/connection.rs b/cli/src/connection.rs index 320fc0b..73710f3 100644 --- a/cli/src/connection.rs +++ b/cli/src/connection.rs @@ -239,6 +239,37 @@ pub fn ensure_daemon( .map_err(|e| format!("Failed to create socket directory: {}", e))?; } + // Pre-flight check: Validate socket path length (Unix limit is 104 bytes including null terminator) + #[cfg(unix)] + { + let socket_path = get_socket_path(session); + let path_len = socket_path.as_os_str().len(); + if path_len > 103 { + return Err(format!( + "Session name '{}' is too long. Socket path would be {} bytes (max 103).\n\ + Use a shorter session name or set AGENT_BROWSER_SOCKET_DIR to a shorter path.", + session, path_len + )); + } + } + + // Pre-flight check: Verify socket directory is writable + { + let test_file = socket_dir.join(".write_test"); + match fs::write(&test_file, b"") { + Ok(_) => { + let _ = fs::remove_file(&test_file); + } + Err(e) => { + return Err(format!( + "Socket directory '{}' is not writable: {}", + socket_dir.display(), + e + )); + } + } + } + let exe_path = env::current_exe().map_err(|e| e.to_string())?; // Canonicalize to resolve symlinks (e.g., npm global bin symlink -> actual binary) let exe_path = exe_path.canonicalize().unwrap_or(exe_path); @@ -400,7 +431,10 @@ pub fn ensure_daemon( thread::sleep(Duration::from_millis(100)); } - Err("Daemon failed to start".to_string()) + Err(format!( + "Daemon failed to start (socket: {})", + get_socket_dir().join(format!("{}.sock", session)).display() + )) } fn connect(session: &str) -> Result { diff --git a/cli/src/main.rs b/cli/src/main.rs index dcef175..bd9138e 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -443,13 +443,33 @@ fn main() { launch_cmd["ignoreHTTPSErrors"] = json!(true); } - if let Err(e) = send_command(launch_cmd, &flags.session) { - if !flags.json { - eprintln!( - "{} Could not configure browser: {}", - color::warning_indicator(), - e - ); + match send_command(launch_cmd, &flags.session) { + Ok(resp) if !resp.success => { + // Launch command failed (e.g., invalid state file, profile error) + let error_msg = resp + .error + .unwrap_or_else(|| "Browser launch failed".to_string()); + if flags.json { + println!(r#"{{"success":false,"error":"{}"}}"#, error_msg); + } else { + eprintln!("{} {}", color::error_indicator(), error_msg); + } + exit(1); + } + Err(e) => { + if flags.json { + println!(r#"{{"success":false,"error":"{}"}}"#, e); + } else { + eprintln!( + "{} Could not configure browser: {}", + color::error_indicator(), + e + ); + } + exit(1); + } + Ok(_) => { + // Launch succeeded } } } diff --git a/src/browser.ts b/src/browser.ts index 9ce5756..47ac880 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1107,8 +1107,12 @@ export class BrowserManager { context = await launcher.launchPersistentContext(profilePath, { headless: options.headless ?? true, executablePath: options.executablePath, + args: options.args, viewport, extraHTTPHeaders: options.headers, + userAgent: options.userAgent, + ...(options.proxy && { proxy: options.proxy }), + ignoreHTTPSErrors: options.ignoreHTTPSErrors ?? false, }); this.isPersistentContext = true; } else {