use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExplainedStep {
pub index: usize,
pub tool: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub args: Option<serde_json::Value>,
pub verdict: StepVerdict,
pub rules_evaluated: Vec<RuleEvaluation>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub state_snapshot: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum StepVerdict {
Allowed,
Blocked,
Warning,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RuleEvaluation {
pub rule_id: String,
pub rule_type: String,
pub passed: bool,
pub explanation: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraceExplanation {
pub policy_name: String,
pub policy_version: String,
pub total_steps: usize,
pub allowed_steps: usize,
pub blocked_steps: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_block_index: Option<usize>,
pub steps: Vec<ExplainedStep>,
pub blocking_rules: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ToolCall {
#[serde(alias = "name", alias = "tool_name")]
pub tool: String,
#[serde(default)]
pub args: Option<serde_json::Value>,
}