use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct ObligationFulfillment {
pub endpoint: String,
#[serde(default)]
pub method: String,
pub phase: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_types: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct Obligation {
pub r#type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub detail: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fulfillment: Option<ObligationFulfillment>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct DecisionCallerIdentity {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gateway_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct DecisionTarget {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DecideRequest {
pub stage: String,
pub query: String,
#[serde(default)]
pub caller_identity: DecisionCallerIdentity,
#[serde(default)]
pub target: DecisionTarget,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_token: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<serde_json::Value>,
}
impl DecideRequest {
pub fn new(stage: impl Into<String>, query: impl Into<String>) -> Self {
Self {
stage: stage.into(),
query: query.into(),
..Default::default()
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DecideResponse {
pub verdict: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decision_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trace_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasons: Option<Vec<String>>,
#[serde(default)]
pub obligations: Vec<Obligation>,
#[serde(default)]
pub evaluated_policies: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stage: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MCPCheckInputRequest {
pub connector_type: String,
pub statement: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub operation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MCPCheckInputResponse {
pub allowed: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub block_reason: Option<String>,
#[serde(default)]
pub policies_evaluated: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decision_id: Option<String>,
#[serde(default)]
pub redacted: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub redacted_statement: Option<String>,
#[serde(default)]
pub redaction_evaluated: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MCPCheckOutputRequest {
pub connector_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MCPCheckOutputResponse {
pub allowed: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub block_reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub redacted_message: Option<String>,
#[serde(default)]
pub policies_evaluated: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decision_id: Option<String>,
#[serde(default)]
pub redaction_evaluated: bool,
}