//! Pure domain entity for application settings. //! //! Defines `Settings` (top-level user configuration), `SettingsFlags` //! (grouped boolean toggles), and `InternetMode` (network access level). //! Serialised to `settings.json` by the infrastructure layer. //! //! # Architecture //! This is a pure data structure with **no I/O logic**. Load/save //! responsibilities live in `SettingsRepository` (domain::repository). //! //! ## Settings Fields //! - `internet_mode` — network access policy (Off / ReadOnly / Full) //! - `provider` / `model` — default LLM provider and model name //! - `api_keys` — per-provider API key overrides (name → key) //! - `max_tokens` / `temperature` — generation parameter defaults //! - `review_max_lessons_per_run` — max lessons per auto-review pass //! - `verify_command` — optional shell command to run for verification //! - `workflow_max_concurrency` — max parallel hive-mind nodes //! - `hive_mind_node_timeout_ms` — per-node timeout for hive-mind orchestration //! - `flags` — grouped boolean feature toggles //! - `lsp_languages` — list of language IDs for LSP auto-provisioning use std::collections::HashMap; use serde::{Deserialize, Serialize}; /// Controls how much network access the agent is permitted during a session. /// /// ## Variants /// - `Off` — no network access /// - `ReadOnly` — HTTP GET / HEAD only /// - `Full` — any HTTP method permitted #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum InternetMode { /// No network access permitted. #[default] Off, /// HTTP GET / HEAD requests only. ReadOnly, /// Any HTTP method permitted. Full, } /// Grouped boolean feature toggles for the application. /// /// Kept as a separate struct to avoid clippy's /// `default-too-many-fields` threshold on `Settings`. /// /// ## Fields /// - `review_enabled` — enable automatic inline review after edits /// - `session_archive_enabled` — enable periodic session archiving /// - `lsp_auto_provision` — auto-provision LSP language servers on project open #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SettingsFlags { pub review_enabled: bool, pub session_archive_enabled: bool, pub lsp_auto_provision: bool, } impl Default for SettingsFlags { /// Returns the default flags with all features enabled. fn default() -> Self { Self { review_enabled: true, session_archive_enabled: true, lsp_auto_provision: true, } } } /// Returns the default hive-mind node timeout (600 seconds). fn default_hive_mind_node_timeout_ms() -> u64 { 600_000 } /// Top-level application settings model. /// /// Serialised to `settings.json` by the infrastructure persistence layer. /// Holds LLM provider selection, generation parameters, feature flags, /// and workflow configuration. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Settings { pub internet_mode: InternetMode, pub provider: String, pub model: String, pub api_keys: HashMap, pub max_tokens: Option, pub temperature: Option, pub review_max_lessons_per_run: usize, pub adaptive_review_max_skip: u32, pub verify_command: Option, pub verify_timeout_ms: u64, pub workflow_max_concurrency: usize, #[serde(flatten)] pub flags: SettingsFlags, pub lsp_languages: Vec, #[serde(default = "default_hive_mind_node_timeout_ms")] pub hive_mind_node_timeout_ms: u64, } impl Default for Settings { fn default() -> Self { Self { internet_mode: InternetMode::Off, provider: "zen".to_string(), model: "deepseek-v4-flash-free".to_string(), api_keys: HashMap::new(), max_tokens: None, temperature: None, review_max_lessons_per_run: 5, adaptive_review_max_skip: 3, verify_command: None, verify_timeout_ms: 30_000, workflow_max_concurrency: 5, flags: SettingsFlags::default(), lsp_languages: Vec::new(), hive_mind_node_timeout_ms: 600_000, } } }