use confique::Config;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
pub struct SupervisorConfig {
#[config(nested)]
pub supervisor: SupervisorRootConfig,
#[config(nested)]
pub policy: PolicyConfig,
#[config(nested)]
pub shutdown: ShutdownConfig,
#[config(nested)]
pub observability: ObservabilityConfig,
pub ipc: Option<DashboardIpcConfig>,
}
impl rust_config_tree::ConfigSchema for SupervisorConfig {
fn include_paths(layer: &<Self as Config>::Layer) -> Vec<PathBuf> {
let _ = layer;
Vec::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
pub struct SupervisorRootConfig {
pub strategy: crate::spec::supervisor::SupervisionStrategy,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
pub struct PolicyConfig {
pub child_restart_limit: u32,
pub child_restart_window_ms: u64,
pub supervisor_failure_limit: u32,
pub supervisor_failure_window_ms: u64,
pub initial_backoff_ms: u64,
pub max_backoff_ms: u64,
pub jitter_ratio: f64,
pub heartbeat_interval_ms: u64,
pub stale_after_ms: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
pub struct ShutdownConfig {
pub graceful_timeout_ms: u64,
pub abort_wait_ms: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
pub struct ObservabilityConfig {
pub event_journal_capacity: usize,
pub metrics_enabled: bool,
pub audit_enabled: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Config, JsonSchema)]
pub struct DashboardIpcConfig {
pub enabled: bool,
pub target_id: Option<String>,
pub path: Option<PathBuf>,
pub permissions: Option<String>,
pub bind_mode: Option<DashboardIpcBindMode>,
pub registration: Option<DashboardRegistrationConfig>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DashboardIpcBindMode {
CreateNew,
ReplaceStale,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Config, JsonSchema)]
pub struct DashboardRegistrationConfig {
pub enabled: bool,
pub relay_registration_path: Option<PathBuf>,
pub display_name: Option<String>,
pub lease_seconds: Option<u64>,
pub registration_heartbeat_interval_seconds: Option<u64>,
}