use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RsclawConfig {
pub meta: Option<MetaConfig>,
pub gateway: Option<GatewayConfig>,
pub agents: Option<AgentsConfig>,
pub models: Option<ModelsConfig>,
pub auth: Option<AuthConfig>,
pub channels: Option<ChannelsConfig>,
pub session: Option<SessionConfig>,
pub bindings: Option<Vec<BindingRule>>,
pub cron: Option<CronConfig>,
pub tools: Option<ToolsConfig>,
pub sandbox: Option<SandboxConfig>,
pub skills: Option<SkillsConfig>,
pub plugins: Option<PluginsConfig>,
pub hooks: Option<HooksConfig>,
pub memory: Option<MemoryConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MetaConfig {
pub name: Option<String>,
pub version: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GatewayConfig {
pub host: Option<String>,
pub port: Option<u16>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AgentsConfig {
pub list: Vec<AgentEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AgentEntry {
pub name: String,
pub model: Option<String>,
pub system_prompt: Option<String>,
pub tools: Option<Vec<String>>,
pub channels: Option<Vec<String>>,
#[serde(default)]
pub default: bool,
pub max_tokens: Option<u32>,
pub memory_limit_mb: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ModelsConfig {
pub providers: Vec<ProviderConfig>,
pub primary_model: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ProviderConfig {
pub name: String,
pub provider_type: String,
pub api_key: Option<String>,
pub base_url: Option<String>,
pub models: Vec<ModelEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ModelEntry {
pub name: String,
pub max_tokens: Option<u32>,
pub supports_functions: Option<bool>,
pub supports_vision: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuthConfig {
pub api_keys: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ChannelsConfig {
pub telegram: Option<ChannelConfig>,
pub discord: Option<ChannelConfig>,
pub slack: Option<ChannelConfig>,
pub whatsapp: Option<ChannelConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ChannelConfig {
pub enabled: Option<bool>,
pub token: Option<String>,
pub webhook_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SessionConfig {
pub timeout_minutes: Option<u32>,
pub max_history: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BindingRule {
pub channel: Option<String>,
pub agent: String,
pub peer_id: Option<String>,
pub group_id: Option<String>,
pub path: Option<String>,
pub priority: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CronConfig {
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ToolsConfig {
pub enabled: Option<Vec<String>>,
pub web_search: Option<WebSearchConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WebSearchConfig {
pub engine: Option<String>,
pub api_key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SandboxConfig {
pub enabled: Option<bool>,
pub timeout_seconds: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SkillsConfig {
pub paths: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct PluginsConfig {
pub paths: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct HooksConfig {
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MemoryConfig {
pub max_agent_memory_mb: Option<u32>,
pub conversation_cache_size: Option<u32>,
pub token_threshold: Option<u32>,
pub max_concurrent_agents: Option<u32>,
}