Skip to main content

tracevault_core/
policy.rs

1use serde::{Deserialize, Serialize};
2use uuid::Uuid;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct PolicyRule {
6    pub id: Uuid,
7    pub org_id: Option<String>,
8    pub name: String,
9    pub description: String,
10    pub condition: PolicyCondition,
11    pub action: PolicyAction,
12    pub severity: PolicySeverity,
13    pub enabled: bool,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(tag = "type")]
18pub enum PolicyCondition {
19    TraceCompleteness,
20    AiPercentageThreshold {
21        threshold: f32,
22    },
23    ModelAllowlist {
24        allowed_models: Vec<String>,
25    },
26    SensitivePathPattern {
27        patterns: Vec<String>,
28    },
29    RequiredToolCall {
30        tool_names: Vec<String>,
31    },
32    TokenBudget {
33        max_tokens: Option<u64>,
34        max_cost_usd: Option<f64>,
35    },
36    ConditionalToolCall {
37        tool_name: String,
38        min_count: Option<u32>,
39        when_files_match: Option<Vec<String>>,
40    },
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "snake_case")]
45pub enum PolicyAction {
46    BlockPush,
47    Warn,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51#[serde(rename_all = "lowercase")]
52pub enum PolicySeverity {
53    Critical,
54    High,
55    Medium,
56    Low,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct PolicyEvaluation {
61    pub policy: PolicyRule,
62    pub result: EvalResult,
63    pub details: String,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
67#[serde(rename_all = "lowercase")]
68pub enum EvalResult {
69    Pass,
70    Fail,
71    Warn,
72}