//! High-level manager that discovers, installs (if needed), and starts //! LSP servers. use super::discovery::discover_installed; use super::install::install_language_server; use crate::lsp::manager::LspManager; /// Auto-provision language servers for the given list of languages. /// /// Flow: discover already-installed servers → for each requested language /// not yet available, attempt auto-install → start each server. pub fn auto_provision(lsp_manager: &mut LspManager, languages: &[String]) -> Vec { let mut started = Vec::new(); let installed = discover_installed(); let mut installed_map: std::collections::HashMap< &str, &crate::lsp::provisioner::config::LspProvisionerConfig, > = std::collections::HashMap::new(); for cfg in &installed { installed_map.insert(cfg.language.as_str(), cfg); } for lang in languages { if let Some(cfg) = installed_map.get(lang.as_str()) { if lsp_manager.start(lang, &cfg.command, &cfg.args).is_ok() { started.push(lang.clone()); } } else { // Not installed — try auto-install if install_language_server(lang).is_ok() { // Re-discover after install let refreshed = discover_installed(); for cfg in refreshed { if cfg.language == *lang { if lsp_manager.start(lang, &cfg.command, &cfg.args).is_ok() { started.push(lang.clone()); } break; } } } } } started }