Skip to main content

opencode_sdk/types/
config.rs

1//! Config types for opencode_rs.
2
3use serde::{Deserialize, Serialize};
4
5/// OpenCode configuration.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct Config {
9    /// Default provider (can be string or object).
10    #[serde(default, skip_serializing_if = "Option::is_none")]
11    pub provider: Option<serde_json::Value>,
12    /// Default model (can be string or object).
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub model: Option<serde_json::Value>,
15    /// Default agent.
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub agent: Option<serde_json::Value>,
18    /// Auto-compaction settings.
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub auto_compact: Option<AutoCompactConfig>,
21    /// MCP servers.
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub mcp: Option<serde_json::Value>,
24    /// Additional configuration.
25    #[serde(flatten)]
26    pub extra: serde_json::Value,
27}
28
29/// Auto-compaction configuration.
30#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct AutoCompactConfig {
33    /// Whether auto-compaction is enabled.
34    #[serde(default)]
35    pub enabled: bool,
36    /// Token threshold for triggering compaction.
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub threshold: Option<u64>,
39}
40
41/// Request to update configuration.
42#[derive(Debug, Clone, Default, Serialize, Deserialize)]
43#[serde(rename_all = "camelCase")]
44pub struct UpdateConfigRequest {
45    /// New default provider.
46    #[serde(default, skip_serializing_if = "Option::is_none")]
47    pub provider: Option<String>,
48    /// New default model.
49    #[serde(default, skip_serializing_if = "Option::is_none")]
50    pub model: Option<String>,
51    /// New default agent.
52    #[serde(default, skip_serializing_if = "Option::is_none")]
53    pub agent: Option<String>,
54    /// Additional configuration updates.
55    #[serde(flatten)]
56    pub extra: serde_json::Value,
57}
58
59/// Provider configuration info.
60#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct ConfigProviders {
63    /// List of available providers.
64    #[serde(default)]
65    pub providers: Vec<ProviderConfig>,
66}
67
68/// Provider configuration.
69#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct ProviderConfig {
72    /// Provider identifier.
73    pub id: String,
74    /// Provider display name.
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub name: Option<String>,
77    /// Whether the provider is configured.
78    #[serde(default)]
79    pub configured: bool,
80    /// Auth method type.
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub auth_type: Option<String>,
83}
84
85/// Lightweight config info with commonly-used typed fields.
86///
87/// This provides typed access to frequently-used config fields while
88/// preserving unknown fields via flatten. Use this when you need quick
89/// access to common config values without full Config.Info typing.
90#[derive(Debug, Clone, Serialize, Deserialize)]
91#[serde(rename_all = "camelCase")]
92pub struct ConfigInfoLite {
93    /// Default model.
94    #[serde(default, skip_serializing_if = "Option::is_none")]
95    pub model: Option<String>,
96    /// Small model for lightweight tasks.
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub small_model: Option<String>,
99    /// Default agent.
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub default_agent: Option<String>,
102    /// Share setting ("manual" | "auto" | "disabled").
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub share: Option<String>,
105    /// MCP configuration (complex type, kept as Value).
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub mcp: Option<serde_json::Value>,
108    /// Additional config fields.
109    #[serde(flatten)]
110    pub extra: serde_json::Value,
111}
112
113#[cfg(test)]
114mod tests {
115    use super::*;
116
117    #[test]
118    fn test_config_info_lite_deserialize() {
119        let json = r#"{
120            "model": "claude-3-opus",
121            "smallModel": "claude-3-haiku",
122            "defaultAgent": "code",
123            "share": "manual",
124            "otherField": "preserved"
125        }"#;
126        let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
127        assert_eq!(config.model, Some("claude-3-opus".to_string()));
128        assert_eq!(config.small_model, Some("claude-3-haiku".to_string()));
129        assert_eq!(config.default_agent, Some("code".to_string()));
130        assert_eq!(config.share, Some("manual".to_string()));
131        assert_eq!(config.extra.get("otherField").unwrap(), "preserved");
132    }
133
134    #[test]
135    fn test_config_info_lite_minimal() {
136        let json = r#"{}"#;
137        let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
138        assert!(config.model.is_none());
139        assert!(config.small_model.is_none());
140    }
141}