use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::acg::profile::SessionArchetype;
use crate::acg::types::{AgentIdentity, ModelClass, RetentionTier, SharingScope};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PolicyEnvelope<T> {
pub agent_identity: AgentIdentity,
pub policy_version: String,
pub created_at: DateTime<Utc>,
pub policy: T,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TransformationClass {
Canonicalization,
VariableExtraction,
SectionReordering,
StableContextPromotion,
ContextPlacement,
Compression,
ToolScopeReduction,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CachePolicy {
pub min_stability_score: f64,
pub min_evidence_count: u32,
pub default_sharing_scope: SharingScope,
pub warm_first_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub max_fanout_for_warm_first: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RewritePolicy {
pub allowed_transformations: Vec<TransformationClass>,
pub require_validation: bool,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub max_auto_risk_tier: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScopeRetentionOverride {
pub scope: SharingScope,
pub tier: RetentionTier,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RetentionPolicy {
pub default_tier: RetentionTier,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub scope_overrides: Option<Vec<ScopeRetentionOverride>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArchetypeRoutingOverride {
pub archetype: SessionArchetype,
pub model_class: ModelClass,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RoutingPolicy {
pub default_model_class: ModelClass,
pub fallback_allowed: bool,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub archetype_overrides: Option<Vec<ArchetypeRoutingOverride>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub session_cost_cap: Option<f64>,
}