diff --git a/src/main.rs b/src/main.rs index da00b0a..6e0ce06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -254,13 +254,22 @@ fn load_agent_config() -> gyandoot_core::config::AgentConfig { fn load_and_convert_config(path: &std::path::Path) -> Result> { let content = std::fs::read_to_string(path)?; - // Try parsing as canonical GyandootConfig first - if let Ok(gyandoot_cfg) = toml::from_str::(&content) { + // Detect format: flat `[provider]` (singular, from gyandoot setup) or + // canonical `[providers]` (plural). We check the raw content because + // GyandootConfig has #[serde(default)] on everything — silent deser + // swallows unknown sections and returns defaults instead of erroring. + let is_flat_format = content.contains("[provider]\n") + || content.contains("[provider]") + && !content.contains("[providers]"); + + if !is_flat_format { + // Canonical format — parse directly + let gyandoot_cfg = toml::from_str::(&content)?; tracing::info!("Loaded config from {}", path.display()); return Ok(gyandoot_core::config::AgentConfig::from(gyandoot_cfg)); } - // Fallback: parse flat `[provider]` format and convert to canonical + // Flat `[provider]` format — parse and convert to canonical #[derive(serde::Deserialize)] struct FlatConfig { provider: FlatProvider,