pub mod agents; pub mod ai; pub mod aihost; pub mod apihost; pub mod auth; pub mod chat; pub mod ci; pub mod database; pub mod email; pub mod email_queue; pub mod git; pub mod githost; pub mod health; pub mod im; pub mod import; pub mod internal; pub mod issues; pub mod livekit; pub mod mcp; pub mod oauth; pub mod pow; pub mod push; pub mod quota; pub mod redis; pub mod runner; pub mod s3; pub mod sandbox_rpc; pub mod scoped; pub mod search; pub mod space; pub mod user; pub mod web; pub mod webhook; pub mod error; pub mod loader; pub use error::ConfigError; use crate::agents::AgentsConfig; use crate::ai::AiConfig; use crate::aihost::AiHostServerConfig; use crate::apihost::ApihostConfig; use crate::auth::AuthConfig; use crate::chat::ChatConfig; use crate::ci::CiConfig; use crate::database::DatabaseConfig; use crate::email::EmailConfig; use crate::email_queue::EmailQueueConfig; use crate::git::GitConfig; use crate::githost::GithostConfig; use crate::health::HealthConfig; use crate::im::ImServerConfig; use crate::import::ImportConfig; use crate::internal::InternalConfig; use crate::issues::IssueConfig; use crate::livekit::LiveKitConfig; use crate::mcp::McpConfig; use crate::oauth::OAuthConfig; use crate::pow::PowConfig; use crate::push::PushConfig; use crate::redis::RedisConfig; use crate::runner::RunnerConfig; use crate::s3::S3Config; use crate::sandbox_rpc::SandboxRpcConfig; use crate::search::SearchConfig; use crate::space::SpaceConfig; use crate::user::UserConfig; use crate::web::WebConfig; use crate::webhook::WebhookConfig; use serde::Deserialize; #[derive(Clone, Debug, Default, Deserialize)] #[serde(default)] pub struct AppConfig { pub s3: S3Config, pub redis: RedisConfig, pub chat: ChatConfig, pub database: DatabaseConfig, pub search: SearchConfig, pub import: ImportConfig, pub pow: PowConfig, pub auth: AuthConfig, pub web: WebConfig, pub user: UserConfig, pub quota: quota::QuotaConfig, pub space: SpaceConfig, pub issues: IssueConfig, pub agents: AgentsConfig, pub sandbox_rpc: SandboxRpcConfig, pub livekit: LiveKitConfig, pub mcp: McpConfig, pub oauth: OAuthConfig, pub git: GitConfig, pub email: EmailConfig, pub email_queue: EmailQueueConfig, pub apihost: ApihostConfig, pub githost: GithostConfig, pub im: ImServerConfig, pub health: HealthConfig, pub internal: InternalConfig, pub ci: CiConfig, pub webhook: WebhookConfig, pub runner: RunnerConfig, pub ai: AiConfig, pub aihost: AiHostServerConfig, pub push: PushConfig, } impl AppConfig { pub fn load() -> Result { crate::loader::load_default() } pub fn validate(&self) -> Result<(), ConfigError> { self.redis.validate().map_err(ConfigError::Validation)?; self.database.validate().map_err(ConfigError::Validation)?; self.pow.validate().map_err(ConfigError::Validation)?; self.auth.validate().map_err(ConfigError::Validation)?; self.chat.is_valid().map_err(ConfigError::Validation)?; self.email.is_valid().map_err(ConfigError::Validation)?; self.email_queue .is_valid() .map_err(ConfigError::Validation)?; self.search.validate().map_err(ConfigError::Validation)?; self.import.validate().map_err(ConfigError::Validation)?; self.apihost.is_valid().map_err(ConfigError::Validation)?; self.githost.is_valid().map_err(ConfigError::Validation)?; self.im.is_valid().map_err(ConfigError::Validation)?; self.health.is_valid().map_err(ConfigError::Validation)?; self.internal.is_valid().map_err(ConfigError::Validation)?; self.ci.validate().map_err(ConfigError::Validation)?; self.webhook.is_valid().map_err(ConfigError::Validation)?; self.ai.validate().map_err(ConfigError::Validation)?; self.aihost.is_valid().map_err(ConfigError::Validation)?; self.livekit.is_valid().map_err(ConfigError::Validation)?; self.mcp.is_valid().map_err(ConfigError::Validation)?; self.oauth.is_valid().map_err(ConfigError::Validation)?; self.agents.validate().map_err(ConfigError::Validation)?; self.sandbox_rpc .is_valid() .map_err(ConfigError::Validation)?; self.push.is_valid().map_err(ConfigError::Validation)?; Ok(()) } }