1use confique::Config;
7use schemars::JsonSchema;
8use serde::{Deserialize, Serialize};
9use std::path::PathBuf;
10
11use crate::{
12 config::{
13 audit::AuditConfig,
14 ipc_security::IpcSecurityConfig,
15 policy::{
16 ChildStrategyOverrideConfig, DynamicSupervisorConfig, FailureWindowConfig, GroupConfig,
17 GroupDependencyConfig, GroupStrategyConfig, MeltdownConfig, RestartBudgetConfig,
18 SeverityDefaultConfig, SupervisionPipelineConfig,
19 },
20 },
21 spec::{
22 child_declaration::ChildDeclaration,
23 supervisor::{BackpressureConfig, EscalationPolicy, SupervisionStrategy},
24 },
25};
26
27#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
29pub struct SupervisorConfig {
30 #[config(default = [])]
32 #[serde(default)]
33 pub include: Vec<PathBuf>,
34
35 #[config(nested)]
37 pub supervisor: SupervisorRootConfig,
38 #[config(nested)]
40 pub policy: PolicyConfig,
41 #[config(nested)]
43 pub shutdown: ShutdownConfig,
44 #[config(nested)]
46 pub observability: ObservabilityConfig,
47 #[config(nested)]
49 #[serde(default)]
50 pub audit: AuditConfig,
51 #[config(nested)]
53 #[serde(default)]
54 pub backpressure: BackpressureConfig,
55 #[config(default = [])]
57 #[serde(default)]
58 pub groups: Vec<GroupConfig>,
59 #[config(default = [])]
61 #[serde(default)]
62 pub group_strategies: Vec<GroupStrategyConfig>,
63 #[config(default = [])]
65 #[serde(default)]
66 pub group_dependencies: Vec<GroupDependencyConfig>,
67 #[config(default = [])]
69 #[serde(default)]
70 pub child_strategy_overrides: Vec<ChildStrategyOverrideConfig>,
71 #[config(default = [])]
73 #[serde(default)]
74 pub severity_defaults: Vec<SeverityDefaultConfig>,
75 pub dashboard: Option<DashboardIpcConfig>,
77 #[config(default = [])]
79 #[serde(default)]
80 pub children: Vec<ChildDeclaration>,
81}
82
83impl rust_config_tree::ConfigSchema for SupervisorConfig {
84 fn include_paths(layer: &<Self as Config>::Layer) -> Vec<PathBuf> {
94 layer.include.clone().unwrap_or_default()
95 }
96}
97
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
100pub struct SupervisorRootConfig {
101 pub strategy: SupervisionStrategy,
103 #[serde(default)]
105 pub escalation_policy: Option<EscalationPolicy>,
106 #[config(nested)]
108 #[serde(default)]
109 pub dynamic_supervisor: DynamicSupervisorConfig,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
114pub struct PolicyConfig {
115 pub child_restart_limit: u32,
117 pub child_restart_window_ms: u64,
119 pub supervisor_failure_limit: u32,
121 pub supervisor_failure_window_ms: u64,
123 pub initial_backoff_ms: u64,
125 pub max_backoff_ms: u64,
127 pub jitter_ratio: f64,
129 pub heartbeat_interval_ms: u64,
131 pub stale_after_ms: u64,
133 #[config(nested)]
135 #[serde(default)]
136 pub restart_budget: RestartBudgetConfig,
137 #[config(nested)]
139 #[serde(default)]
140 pub failure_window: FailureWindowConfig,
141 #[config(nested)]
143 #[serde(default)]
144 pub meltdown: MeltdownConfig,
145 #[config(nested)]
147 #[serde(default)]
148 pub supervision_pipeline: SupervisionPipelineConfig,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
153pub struct ShutdownConfig {
154 pub graceful_timeout_ms: u64,
156 pub abort_wait_ms: u64,
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
162pub struct ObservabilityConfig {
163 pub event_journal_capacity: usize,
165 pub metrics_enabled: bool,
167 pub audit_enabled: bool,
169}
170
171#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
173pub struct DashboardIpcConfig {
174 pub enabled: bool,
176 pub target_id: Option<String>,
178 pub path: Option<PathBuf>,
180 pub permissions: Option<String>,
182 pub bind_mode: Option<DashboardIpcBindMode>,
184 pub registration: Option<DashboardRegistrationConfig>,
186 #[serde(default)]
188 pub security_config: Option<IpcSecurityConfig>,
189}
190
191#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
193#[serde(rename_all = "snake_case")]
194pub enum DashboardIpcBindMode {
195 CreateNew,
197 ReplaceStale,
199}
200
201#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Config, JsonSchema)]
203pub struct DashboardRegistrationConfig {
204 pub enabled: bool,
206 pub relay_registration_path: Option<PathBuf>,
208 pub display_name: Option<String>,
210 pub lease_seconds: Option<u64>,
212 pub registration_heartbeat_interval_seconds: Option<u64>,
214}