use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct AgentConfig {
pub agent: AgentSection,
pub provider: ProviderSection,
pub session: SessionSection,
pub tools: ToolsSection,
pub skills: SkillsSection,
pub sub_agents: SubAgentsSection,
pub callbacks: CallbacksSection,
pub hooks: HooksSection,
pub compaction: CompactionSection,
pub execution: ExecutionSection,
pub system_prompt_strategy: SystemPromptStrategySection,
pub system_prompt: SystemPromptSection,
pub default_workspace: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct AgentSection {
pub system_prompt: Option<String>,
pub profile: ProfileSection,
pub instances: Vec<AgentInstanceSection>,
pub workspace: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ProfileSection {
pub profile_id: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub system_prompt: Option<String>,
pub thinking_level: Option<String>,
pub temperature: Option<f32>,
pub max_tokens: Option<u32>,
pub config_id: Option<String>,
pub skills: Vec<String>,
pub compaction: Option<String>,
pub instances: Vec<ProfileInstanceSection>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ProfileInstanceSection {
pub id: String,
pub description: Option<String>,
pub name: Option<String>,
pub system_prompt: Option<String>,
pub thinking_level: Option<String>,
pub temperature: Option<f32>,
pub max_tokens: Option<u32>,
pub config_id: Option<String>,
pub skills: Vec<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct AgentInstanceSection {
pub name: Option<String>,
pub agent_profile: Option<String>,
pub profile: Option<ProfileSection>,
pub system_prompt: Option<String>,
pub provider: Option<String>,
pub workspace: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ProviderSection {
pub model: Option<String>,
pub api_key: Option<String>,
pub api: Option<String>,
#[serde(alias = "url")]
pub base_url: Option<String>,
pub provider: Option<String>,
pub name: Option<String>,
pub reasoning: Option<bool>,
pub context_window: Option<u32>,
pub max_tokens: Option<u32>,
pub cost: CostSection,
pub headers: HashMap<String, String>,
pub compat: CompatSection,
pub instances: Vec<ProviderInstance>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CostSection {
pub input_per_million: Option<f64>,
pub output_per_million: Option<f64>,
pub cache_read_per_million: Option<f64>,
pub cache_write_per_million: Option<f64>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CompatSection {
pub auth_style: Option<String>,
pub reasoning_format: Option<String>,
pub max_tokens_field: Option<String>,
pub supports_streaming: Option<bool>,
pub supports_system_message: Option<bool>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ProviderInstance {
pub id: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub model: Option<String>,
pub api_key: Option<String>,
pub api: Option<String>,
#[serde(alias = "url")]
pub base_url: Option<String>,
pub provider: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SessionSection {
pub scope: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ToolsSection {
pub enabled: Vec<String>,
pub tool_strategy: Option<String>,
pub batch_size: Option<usize>,
pub instances: Vec<ToolInstance>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ToolInstance {
pub name: Option<String>,
pub enabled: Option<bool>,
pub config: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SkillsSection {
pub paths: Vec<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SubAgentsSection {
pub instances: Vec<SubAgentInstance>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SubAgentInstance {
pub id: Option<String>,
pub name: Option<String>,
pub description: Option<String>,
pub system_prompt: Option<String>,
pub provider: Option<String>,
pub model: Option<String>,
pub max_turns: Option<usize>,
pub tools: Vec<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CallbacksSection {
pub before_loop: Option<String>,
pub after_loop: Option<String>,
pub before_turn: Option<String>,
pub after_turn: Option<String>,
pub before_tool_execution: Option<String>,
pub after_tool_execution: Option<String>,
pub before_compaction_start: Option<String>,
pub after_compaction_end: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct HooksSection {
pub convert_to_llm: Option<String>,
pub transform_context: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CompactionSection {
pub max_context_tokens: Option<usize>,
pub system_prompt_tokens: Option<usize>,
pub compact_at_pct: Option<f64>,
pub compact_budget_threshold_pct: Option<f64>,
pub keep_first_turns: Option<usize>,
pub keep_recent_turns: Option<usize>,
pub max_summary_tokens: Option<usize>,
pub tool_output_max_lines: Option<usize>,
pub focus_message: Option<String>,
pub instances: Vec<CompactionInstanceSection>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CompactionInstanceSection {
pub id: String,
pub description: Option<String>,
pub max_context_tokens: Option<usize>,
pub system_prompt_tokens: Option<usize>,
pub compact_at_pct: Option<f64>,
pub compact_budget_threshold_pct: Option<f64>,
pub keep_first_turns: Option<usize>,
pub keep_recent_turns: Option<usize>,
pub max_summary_tokens: Option<usize>,
pub tool_output_max_lines: Option<usize>,
pub focus_message: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct ExecutionSection {
pub max_turns: Option<usize>,
pub max_total_tokens: Option<usize>,
pub max_duration_secs: Option<u64>,
pub max_cost: Option<f64>,
pub retry: RetrySection,
pub cache: CacheSection,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct RetrySection {
pub max_retries: Option<usize>,
pub initial_delay_ms: Option<u64>,
pub backoff_multiplier: Option<f64>,
pub max_delay_ms: Option<u64>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct CacheSection {
pub enabled: Option<bool>,
pub strategy: Option<String>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SystemPromptStrategySection {
pub instances: Vec<StrategyInstanceSection>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct StrategyInstanceSection {
pub id: String,
pub description: Option<String>,
pub blocks: Vec<StrategyBlockSection>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct StrategyBlockSection {
pub name: String,
pub order: Option<u32>,
pub max_length: Option<usize>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct SystemPromptSection {
pub instances: Vec<PromptInstanceSection>,
}
#[derive(Debug, Deserialize, Default, Clone)]
#[serde(default)]
pub struct PromptInstanceSection {
pub id: String,
pub description: Option<String>,
#[serde(rename = "type")]
pub strategy_type: Option<String>,
#[serde(flatten)]
pub blocks: HashMap<String, serde_json::Value>,
}