feat(nvim): implement auto-spawning headless instance and interactive preemption

This commit is contained in:
Riz Ashraf committed 2026-09-23 04:53:09 +01:00
1 parent 7d783d2f37
commit 914cecbaf2
2 files changed
+95 -8

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
use std::sync::Arc;
use std::sync::LazyLock;
pub static ACTIVE_SOCKET: LazyLock<Arc<std::sync::Mutex<Option<String>>>> =
LazyLock::new(|| Arc::new(std::sync::Mutex::new(None)));
pub static HEADLESS_PROC: LazyLock<Arc<std::sync::Mutex<Option<tokio::process::Child>>>> =
LazyLock::new(|| Arc::new(std::sync::Mutex::new(None)));
pub async fn spawn_headless_nvim() -> Result<String, String> {
if std::process::Command::new("nvim").arg("--version").output().is_err() {
return Err("Error: Neovim is not installed or not in PATH. Cannot execute nvim tool. Fallback to basic terminal tools.".to_string());
}
#[cfg(windows)]
let socket_name = format!(r"\\.\pipe\agy-headless-nvim-{}", std::process::id());
#[cfg(unix)]
let socket_name = format!("/tmp/agy-headless-nvim-{}.sock", std::process::id());
let child = tokio::process::Command::new("nvim")
.arg("--headless")
.arg("--listen")
.arg(&socket_name)
.kill_on_drop(true)
.spawn()
.map_err(|e| format!("Failed to spawn headless Neovim: {}", e))?;
tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await;
let mut old_child = {
let mut lock = HEADLESS_PROC.lock().unwrap_or_else(|e| e.into_inner());
let old = lock.take();
*lock = Some(child);
old
};
if let Some(mut old) = old_child {
let _ = old.kill().await;
}
Ok(socket_name)
}