use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Config {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_compact: Option<AutoCompactConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AutoCompactConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub threshold: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateConfigRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfigProviders {
#[serde(default)]
pub providers: Vec<ProviderConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProviderConfig {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
pub configured: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfigInfoLite {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub small_model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_agent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub share: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mcp: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_info_lite_deserialize() {
let json = r#"{
"model": "claude-3-opus",
"smallModel": "claude-3-haiku",
"defaultAgent": "code",
"share": "manual",
"otherField": "preserved"
}"#;
let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
assert_eq!(config.model, Some("claude-3-opus".to_string()));
assert_eq!(config.small_model, Some("claude-3-haiku".to_string()));
assert_eq!(config.default_agent, Some("code".to_string()));
assert_eq!(config.share, Some("manual".to_string()));
assert_eq!(config.extra.get("otherField").unwrap(), "preserved");
}
#[test]
fn test_config_info_lite_minimal() {
let json = r#"{}"#;
let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
assert!(config.model.is_none());
assert!(config.small_model.is_none());
}
}