use crate::policy::scope::PolicyScope;
#[derive(Debug, Clone, PartialEq)]
pub struct NetworkPolicy {
pub allowlist: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ActiveHours {
pub start: String,
pub end: String,
pub timezone: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct SchedulePolicy {
pub active_hours: Option<ActiveHours>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ActionOnExceed {
#[default]
Deny,
Suspend,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BudgetPolicy {
pub daily_limit_usd: Option<f64>,
pub monthly_limit_usd: Option<f64>,
pub org_daily_limit_usd: Option<f64>,
pub org_monthly_limit_usd: Option<f64>,
pub timezone: Option<String>,
pub action_on_exceed: ActionOnExceed,
pub window: Option<std::time::Duration>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CredentialAction {
Block,
#[default]
RedactOnly,
AlertOnly,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DataPolicy {
pub sensitive_patterns: Vec<String>,
pub credential_action: CredentialAction,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ApprovalPolicy {
pub timeout_seconds: Option<u32>,
pub escalation_role: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ToolPolicy {
pub allow: bool,
pub limit_per_hour: Option<u32>,
pub requires_approval_if: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PolicyDocument {
pub name: Option<String>,
pub policy_version: Option<String>,
pub version: Option<String>,
pub scope: PolicyScope,
pub network: Option<NetworkPolicy>,
pub schedule: Option<SchedulePolicy>,
pub budget: Option<BudgetPolicy>,
pub data: Option<DataPolicy>,
pub approval_timeout_secs: u32,
pub approval_policy: Option<ApprovalPolicy>,
pub tools: std::collections::HashMap<String, ToolPolicy>,
pub capabilities: Option<aa_core::CapabilitySet>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn policy_document_default_tools_is_empty_map() {
let doc = PolicyDocument {
name: None,
policy_version: None,
version: None,
scope: PolicyScope::Global,
network: None,
schedule: None,
budget: None,
data: None,
approval_timeout_secs: 300,
approval_policy: None,
tools: std::collections::HashMap::new(),
capabilities: None,
};
assert!(doc.tools.is_empty());
}
#[test]
fn network_policy_stores_allowlist() {
let np = NetworkPolicy {
allowlist: vec!["api.openai.com".to_string()],
};
assert_eq!(np.allowlist.len(), 1);
}
#[test]
fn tool_policy_allow_defaults() {
let tp = ToolPolicy {
allow: true,
limit_per_hour: None,
requires_approval_if: None,
};
assert!(tp.allow);
assert!(tp.limit_per_hour.is_none());
}
#[test]
fn credential_action_default_is_redact_only() {
assert_eq!(CredentialAction::default(), CredentialAction::RedactOnly);
}
}