feat(tui): implement status bar with connection and turn state indicators feat(tui): create workflow panel for agent status and progress visualization feat(web): introduce web frontend interface with static file serving feat(ws): add WebSocket interface for real-time communication and session management
121 lines
4.1 KiB
Rust
121 lines
4.1 KiB
Rust
//! 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<String, String>,
|
|
pub max_tokens: Option<u32>,
|
|
pub temperature: Option<f32>,
|
|
pub review_max_lessons_per_run: usize,
|
|
pub adaptive_review_max_skip: u32,
|
|
pub verify_command: Option<String>,
|
|
pub verify_timeout_ms: u64,
|
|
pub workflow_max_concurrency: usize,
|
|
#[serde(flatten)]
|
|
pub flags: SettingsFlags,
|
|
pub lsp_languages: Vec<String>,
|
|
#[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,
|
|
}
|
|
}
|
|
}
|