diff --git a/src/backend.rs b/src/backend.rs index 7d13b84..9e7283f 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -343,14 +343,29 @@ impl Backend { // ─── Discovery helpers ─────────────────────────────────────────────────────── fn discover() -> Result { + // Try to find the real LS binary first (when MITM wrapper is installed, + // the wrapper is a shell script named language_server_linux_x64, while + // the real binary is language_server_linux_x64.real) let pid_output = Command::new("sh") - .args(["-c", "pgrep -f language_server_linux | head -1"]) + .args(["-c", "pgrep -f 'language_server_linux_x64\\.real' | head -1"]) .output() .map_err(|e| format!("pgrep failed: {e}"))?; - let pid = String::from_utf8_lossy(&pid_output.stdout) + let mut pid = String::from_utf8_lossy(&pid_output.stdout) .trim() .to_string(); + + // Fallback: find any language_server_linux process + if pid.is_empty() { + let pid_output = Command::new("sh") + .args(["-c", "pgrep -f language_server_linux | head -1"]) + .output() + .map_err(|e| format!("pgrep failed: {e}"))?; + pid = String::from_utf8_lossy(&pid_output.stdout) + .trim() + .to_string(); + } + if pid.is_empty() { return Err("Language server not running".to_string()); } @@ -408,6 +423,31 @@ fn discover() -> Result { } } + if https_port.is_empty() { + // Fallback: find the LS HTTPS port via `ss` (when log file hasn't caught up) + if let Ok(output) = std::process::Command::new("ss") + .args(["-tlnp"]) + .output() + { + let ss_out = String::from_utf8_lossy(&output.stdout); + // Find listening ports for this PID — typically the first is HTTPS + for line in ss_out.lines() { + if line.contains(&format!("pid={pid},")) { + // Extract port from "127.0.0.1:PORT" + if let Some(addr) = line.split_whitespace().nth(3) { + if let Some(port_str) = addr.rsplit(':').next() { + if let Ok(p) = port_str.parse::() { + info!(port = p, "Discovered LS HTTPS port via ss"); + https_port = p.to_string(); + break; + } + } + } + } + } + } + } + if https_port.is_empty() { warn!("Could not find HTTPS port in logs, defaulting to 3100"); https_port = "3100".to_string();