use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PolicyProfile {
Fast,
#[default]
Balanced,
Deep,
Forensics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyThresholds {
pub max_body_bytes: u64,
pub max_job_ms: u64,
pub max_render_jobs: Option<u64>,
pub max_retries: u32,
pub retry_base_ms: u64,
pub host_cooldown_ms: u64,
pub proxy_score_floor: f32,
pub always_capture_artifacts: bool,
}
impl PolicyThresholds {
pub fn for_profile(p: PolicyProfile) -> Self {
match p {
PolicyProfile::Fast => Self {
max_body_bytes: 10 * 1024 * 1024,
max_job_ms: 15_000,
max_render_jobs: Some(0),
max_retries: 2,
retry_base_ms: 500,
host_cooldown_ms: 1_000,
proxy_score_floor: 0.2,
always_capture_artifacts: false,
},
PolicyProfile::Balanced => Self {
max_body_bytes: 20 * 1024 * 1024,
max_job_ms: 30_000,
max_render_jobs: None,
max_retries: 3,
retry_base_ms: 500,
host_cooldown_ms: 5_000,
proxy_score_floor: 0.4,
always_capture_artifacts: false,
},
PolicyProfile::Deep => Self {
max_body_bytes: 50 * 1024 * 1024,
max_job_ms: 60_000,
max_render_jobs: None,
max_retries: 5,
retry_base_ms: 1_000,
host_cooldown_ms: 15_000,
proxy_score_floor: 0.5,
always_capture_artifacts: false,
},
PolicyProfile::Forensics => Self {
max_body_bytes: 100 * 1024 * 1024,
max_job_ms: 120_000,
max_render_jobs: None,
max_retries: 5,
retry_base_ms: 1_000,
host_cooldown_ms: 30_000,
proxy_score_floor: 0.7,
always_capture_artifacts: true,
},
}
}
}
impl Default for PolicyThresholds {
fn default() -> Self {
Self::for_profile(PolicyProfile::Balanced)
}
}