use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AuditEventType {
ToolExecution,
ToolInterceptedHitl,
ApprovalGranted,
ApprovalRejected,
ApprovalExpired,
PolicyViolation,
ConfigMutation,
SamplingCall,
ResourceAccess,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AuditEventStatus {
Success,
Failed,
Denied,
Intercepted,
Cancelled,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AuditEvent {
pub id: String,
pub timestamp_ns: u64,
pub event_type: AuditEventType,
pub trace_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub actor_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub work_item_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_ip: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub server_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capability_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resource_uri: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sanitized_args: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sanitized_response: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub execution_latency_us: Option<u64>,
pub status: AuditEventStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub operator_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval_ticket_id: Option<String>,
pub prev_hash: String,
pub hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RawAuditEvent {
pub event_type: AuditEventType,
pub trace_id: String,
pub request_id: Option<String>,
pub actor_id: Option<String>,
pub work_item_id: Option<String>,
pub client_ip: Option<String>,
pub server_id: Option<String>,
pub capability_id: Option<String>,
pub resource_uri: Option<String>,
pub sanitized_args: Option<serde_json::Value>,
pub sanitized_response: Option<serde_json::Value>,
pub execution_latency_us: Option<u64>,
pub status: AuditEventStatus,
pub error_code: Option<String>,
pub error_message: Option<String>,
pub operator_id: Option<String>,
pub approval_ticket_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VerificationReport {
pub is_valid: bool,
pub total_records: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub corrupted_at_index: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub corrupted_record_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}