diff --git a/cli/src/connection.rs b/cli/src/connection.rs index f4231649d..62fb0bc15 100644 --- a/cli/src/connection.rs +++ b/cli/src/connection.rs @@ -477,9 +477,11 @@ fn connect(session: &str) -> Result { } pub fn send_command(cmd: Value, session: &str) -> Result { - // Retry logic for transient errors (EAGAIN/EWOULDBLOCK/connection issues) - const MAX_RETRIES: u32 = 5; - const RETRY_DELAY_MS: u64 = 200; + // Retry logic for transient errors (EAGAIN/EWOULDBLOCK/connection issues). + // Use generous retries to handle slow or resource-constrained environments + // (e.g. VMs) where the daemon may be slow to start or respond. + const MAX_RETRIES: u32 = 8; + const RETRY_DELAY_MS: u64 = 500; let mut last_error = String::new(); @@ -543,6 +545,9 @@ fn send_command_once(cmd: &Value, session: &str) -> Result { stream .write_all(json_str.as_bytes()) .map_err(|e| format!("Failed to send: {}", e))?; + stream + .flush() + .map_err(|e| format!("Failed to send: {}", e))?; let mut reader = BufReader::new(stream); let mut response_line = String::new(); diff --git a/cli/src/native/daemon.rs b/cli/src/native/daemon.rs index 8b1c8506a..50f3465f2 100644 --- a/cli/src/native/daemon.rs +++ b/cli/src/native/daemon.rs @@ -360,6 +360,7 @@ async fn handle_connection( let mut resp = serde_json::to_string(&err).unwrap_or_default(); resp.push('\n'); let _ = writer.write_all(resp.as_bytes()).await; + let _ = writer.flush().await; continue; } }; @@ -380,6 +381,9 @@ async fn handle_connection( if writer.write_all(resp.as_bytes()).await.is_err() { break; } + if writer.flush().await.is_err() { + break; + } if is_close { if let Some(ref path) = stream_file_cleanup {