tracevault_core/
policy.rs1use 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}