use super::action::{ActionEnvelope, ExecutionMode};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionCapability {
pub app_id: String,
pub operation: String,
pub backend: String,
pub supported_modes: Vec<ExecutionMode>,
pub interference: String,
pub confidence: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_at: Option<String>,
pub verification_source: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PolicyDecision {
pub decision: String,
pub policy_digest: String,
pub reasons: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grant_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ActionPreview {
pub envelope: ActionEnvelope,
pub executable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocker: Option<String>,
pub policy: PolicyDecision,
pub capability: ExecutionCapability,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReceiptStatus {
Committed,
Rejected,
Interrupted,
Indeterminate,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecutionReceipt {
pub receipt_id: String,
pub session_id: String,
pub action_id: String,
pub action_digest: String,
pub attempt: u32,
pub status: ReceiptStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<Value>,
}