From b75fe44b98a0d583a5dbf48f91b7ce90303a8dcb Mon Sep 17 00:00:00 2001 From: Tara Menon Date: Thu, 11 Jun 2026 22:13:21 +0530 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20config=20format=20detectio?= =?UTF-8?q?n=20=E2=80=94=20raw=20content=20check=20before=20deser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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,