use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Agent {
pub id: String,
pub name: String,
pub org_id: String,
pub framework: String,
#[serde(default)]
pub public_key: String,
pub status: String,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default)]
pub metadata: serde_json::Value,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub private_key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Token {
pub token: String,
pub agent_id: String,
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub audience: Vec<String>,
#[serde(default)]
pub issued_at: Option<String>,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub token_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntrospectionResult {
pub active: bool,
#[serde(default)]
pub agent_id: Option<String>,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub reasoning: Option<String>,
#[serde(default)]
pub guard_tier: Option<String>,
#[serde(default)]
pub confidence: Option<f64>,
#[serde(default)]
pub latency_ms: Option<i64>,
}
#[deprecated(note = "Use IntrospectionResult")]
pub type VerificationResult = IntrospectionResult;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActionCheckResult {
pub allowed: bool,
#[serde(default)]
pub check_id: Option<String>,
#[serde(default)]
pub confidence: Option<f64>,
#[serde(default)]
pub guard_tier: Option<String>,
#[serde(default)]
pub latency_ms: Option<i64>,
#[serde(default)]
pub reason: Option<String>,
#[serde(default)]
pub elevation_required: Option<bool>,
#[serde(default)]
pub approval_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Session {
pub session_id: String,
pub agent_id: String,
pub org_id: String,
#[serde(default)]
pub source: String,
#[serde(default)]
pub server_id: String,
#[serde(default)]
pub mode: String,
#[serde(default)]
pub allowed_actions: Vec<String>,
#[serde(default)]
pub scope_ceiling: Vec<String>,
#[serde(default)]
pub total_calls: u64,
#[serde(default)]
pub read_calls: u64,
#[serde(default)]
pub write_calls: u64,
#[serde(default)]
pub denied_calls: u64,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub last_activity_at: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct InitSessionRequest {
pub agent_id: String,
pub server_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalRequestStatus {
pub id: String,
#[serde(default)]
pub session_id: String,
#[serde(default)]
pub agent_id: String,
#[serde(default)]
pub org_id: String,
#[serde(default)]
pub action_name: String,
#[serde(default)]
pub action_effect: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub decided_by: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TelemetryEvent {
pub event_type: String,
pub tool_name: String,
#[serde(default)]
pub duration_ms: u64,
#[serde(default)]
pub success: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_type: Option<String>,
#[serde(default)]
pub timestamp: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
#[serde(default)]
pub service: Option<String>,
#[serde(default)]
pub version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateAgentRequest {
pub name: String,
#[serde(default = "default_framework")]
pub framework: String,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default = "default_metadata")]
pub metadata: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
}
fn default_framework() -> String {
"custom".to_string()
}
fn default_metadata() -> serde_json::Value {
serde_json::Value::Object(serde_json::Map::new())
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IssueTokenRequest {
pub agent_id: String,
#[serde(rename = "scopes")]
pub scope: Vec<String>,
#[serde(default, skip_serializing)]
pub audience: Vec<String>,
#[serde(default = "default_ttl")]
pub ttl: u64,
}
fn default_ttl() -> u64 {
300
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntrospectTokenRequest {
pub token: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target: Option<String>,
#[serde(default)]
pub required_scopes: Vec<String>,
}
#[deprecated(note = "Use IntrospectTokenRequest")]
pub type VerifyTokenRequest = IntrospectTokenRequest;
#[derive(Debug, Clone, Serialize)]
pub(crate) struct RevokeTokenRequest {
pub token: String,
pub reason: String,
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct RevokeAgentRequest {
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActionCheckRequest {
pub agent_id: String,
#[serde(default = "default_action")]
pub action: String,
pub tool_name: String,
#[serde(default)]
pub tool_input_summary: String,
#[serde(default)]
pub session_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action_effect: Option<String>,
}
fn default_action() -> String {
"tool_call".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TelemetryReportRequest {
pub agent_id: String,
pub session_id: String,
pub events: Vec<TelemetryEvent>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct CreateAgentResponse {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub org_id: Option<String>,
#[serde(default)]
pub framework: Option<String>,
#[serde(default)]
pub public_key: Option<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub capabilities: Option<Vec<String>>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub private_key: Option<String>,
#[serde(default)]
pub agent: Option<AgentData>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct AgentData {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub org_id: String,
#[serde(default)]
pub framework: String,
#[serde(default)]
pub public_key: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default)]
pub metadata: serde_json::Value,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub private_key: Option<String>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct AgentListResponse {
#[serde(default)]
pub agents: Vec<AgentData>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct IssueTokenResponse {
#[serde(default)]
pub token: Option<String>,
#[serde(default)]
pub agent_token: Option<String>,
#[serde(default)]
pub agent_id: String,
#[serde(default)]
pub scopes: Option<Vec<String>>,
#[serde(default)]
pub scope: Option<Vec<String>>,
#[serde(default)]
pub audience: Vec<String>,
#[serde(default)]
pub issued_at: Option<String>,
#[serde(default)]
pub expires_at: Option<String>,
#[serde(default)]
pub token_id: Option<String>,
#[serde(default)]
pub id: Option<String>,
}
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
pub(crate) struct TelemetryReportResponse {
#[serde(default)]
pub accepted: bool,
#[serde(default)]
pub events_processed: usize,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ErrorResponse {
#[serde(default)]
pub message: String,
}
pub const ATI_TRUST_EXTENSION_URI: &str = "https://agenttrust.id/ext/trust/v1";
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentCard {
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub version: String,
#[serde(rename = "supportedInterfaces", default)]
pub supported_interfaces: Vec<AgentInterface>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub provider: Option<Provider>,
#[serde(default)]
pub capabilities: Capabilities,
#[serde(
rename = "securitySchemes",
default,
skip_serializing_if = "Option::is_none"
)]
pub security_schemes: Option<HashMap<String, SecurityScheme>>,
#[serde(rename = "defaultInputModes", default)]
pub default_input_modes: Vec<String>,
#[serde(rename = "defaultOutputModes", default)]
pub default_output_modes: Vec<String>,
#[serde(default)]
pub skills: Vec<AgentCardSkill>,
#[serde(default)]
pub signatures: Vec<AgentCardSignature>,
#[serde(
rename = "documentationUrl",
default,
alias = "documentation_url",
skip_serializing_if = "Option::is_none"
)]
pub documentation_url: Option<String>,
#[serde(
rename = "iconUrl",
default,
alias = "icon_url",
skip_serializing_if = "Option::is_none"
)]
pub icon_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
impl AgentCard {
pub fn primary_url(&self) -> Option<&str> {
self.supported_interfaces
.first()
.map(|i| i.url.as_str())
.or(self.url.as_deref())
}
pub fn trust_score(&self) -> f64 {
self.capabilities
.extensions
.iter()
.find(|e| e.uri == ATI_TRUST_EXTENSION_URI)
.and_then(|e| e.params.as_ref())
.and_then(|p| p.get("ati_trust_score"))
.and_then(|v| v.as_f64())
.unwrap_or(0.0)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentInterface {
#[serde(default)]
pub url: String,
#[serde(rename = "protocolBinding", default, alias = "protocol_binding")]
pub protocol_binding: String,
#[serde(rename = "protocolVersion", default, alias = "protocol_version")]
pub protocol_version: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Provider {
#[serde(default)]
pub organization: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Capabilities {
#[serde(default)]
pub streaming: bool,
#[serde(rename = "pushNotifications", default, alias = "push_notifications")]
pub push_notifications: bool,
#[serde(default)]
pub extensions: Vec<AgentExtension>,
#[serde(
rename = "extendedAgentCard",
default,
alias = "extended_agent_card",
skip_serializing_if = "Option::is_none"
)]
pub extended_agent_card: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentExtension {
#[serde(default)]
pub uri: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SecurityScheme {
#[serde(rename = "type", default)]
pub r#type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scheme: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentCardSkill {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default)]
pub examples: Vec<String>,
#[serde(rename = "inputModes", default, alias = "input_modes")]
pub input_modes: Vec<String>,
#[serde(rename = "outputModes", default, alias = "output_modes")]
pub output_modes: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentCardSignature {
#[serde(default)]
pub protected: String,
#[serde(default)]
pub signature: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub header: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct A2ATask {
#[serde(default)]
pub id: String,
#[serde(default, alias = "sourceAgentId")]
pub source_agent_id: String,
#[serde(default, alias = "targetAgentId")]
pub target_agent_id: String,
#[serde(default)]
pub status: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub artifacts: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(default, alias = "createdAt", skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, alias = "updatedAt", skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SendTaskRequest {
pub source_agent_id: String,
pub target_agent_id: String,
pub message: serde_json::Value,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct V1Task {
#[serde(default)]
pub id: String,
#[serde(rename = "contextId", default, alias = "context_id")]
pub context_id: String,
#[serde(default)]
pub status: V1TaskStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub history: Option<Vec<serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub artifacts: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct V1TaskStatus {
#[serde(default)]
pub state: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MCPServer {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capabilities: Option<Vec<String>>,
#[serde(default, alias = "orgId", skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
#[serde(default, alias = "createdAt", skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterMCPServerRequest {
pub name: String,
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capabilities: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Delegation {
#[serde(default)]
pub id: String,
#[serde(default, alias = "fromAgentId")]
pub from_agent_id: String,
#[serde(default, alias = "toAgentId")]
pub to_agent_id: String,
#[serde(default, alias = "orgId", skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
#[serde(default)]
pub scope: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub restrictions: Option<serde_json::Value>,
#[serde(
default,
alias = "delegationChain",
skip_serializing_if = "Option::is_none"
)]
pub delegation_chain: Option<Vec<String>>,
#[serde(default, alias = "expiresAt")]
pub expires_at: String,
#[serde(default, alias = "revokedAt", skip_serializing_if = "Option::is_none")]
pub revoked_at: Option<String>,
#[serde(default, alias = "createdAt")]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateDelegationRequest {
pub from_agent_id: String,
pub to_agent_id: String,
pub scope: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ttl_seconds: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub restrictions: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_delegation_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FederationProvider {
#[serde(default)]
pub id: String,
#[serde(default, alias = "orgId")]
pub org_id: String,
#[serde(default)]
pub issuer: String,
#[serde(default)]
pub name: String,
#[serde(default, alias = "jwksUri")]
pub jwks_uri: String,
#[serde(
default,
alias = "authorizationEndpoint",
skip_serializing_if = "Option::is_none"
)]
pub authorization_endpoint: Option<String>,
#[serde(
default,
alias = "tokenEndpoint",
skip_serializing_if = "Option::is_none"
)]
pub token_endpoint: Option<String>,
#[serde(default, alias = "trustLevel")]
pub trust_level: String,
#[serde(default)]
pub status: String,
#[serde(default, alias = "createdAt", skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, alias = "updatedAt", skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterFederationProviderRequest {
pub issuer: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trust_level: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifyFederatedTokenRequest {
pub token: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer_hint: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyFederatedTokenResult {
pub valid: bool,
#[serde(default, alias = "agentId", skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer: Option<String>,
#[serde(default, alias = "expiresAt", 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, Default, Serialize, Deserialize)]
pub struct IssueFederatedIDTokenRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub audience: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nonce: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scopes: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ttl: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IssueFederatedIDTokenResult {
#[serde(default, alias = "idToken", alias = "token")]
pub id_token: String,
#[serde(default, alias = "expiresIn")]
pub expires_in: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SIEMDestination {
#[serde(default)]
pub id: String,
#[serde(default, alias = "orgId", skip_serializing_if = "Option::is_none")]
pub org_id: Option<String>,
#[serde(default)]
pub name: String,
#[serde(default, alias = "destinationType")]
pub destination_type: String,
#[serde(default, alias = "endpointUrl")]
pub endpoint_url: String,
#[serde(default, alias = "authToken", skip_serializing_if = "Option::is_none")]
pub auth_token: Option<String>,
#[serde(default, alias = "isActive")]
pub is_active: bool,
#[serde(default, alias = "batchSize")]
pub batch_size: u32,
#[serde(default, alias = "flushIntervalSeconds")]
pub flush_interval_seconds: u32,
#[serde(
default,
alias = "filterEventTypes",
skip_serializing_if = "Option::is_none"
)]
pub filter_event_types: Option<Vec<String>>,
#[serde(default, alias = "createdAt", skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(default, alias = "updatedAt", skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateSIEMDestinationRequest {
pub name: String,
pub destination_type: String,
pub endpoint_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth_token: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub batch_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub flush_interval_seconds: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter_event_types: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UpdateSIEMDestinationRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub endpoint_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth_token: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_active: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub batch_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub flush_interval_seconds: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter_event_types: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SIEMDeliveryRecord {
#[serde(default)]
pub id: String,
#[serde(default, alias = "destinationId")]
pub destination_id: String,
#[serde(default, alias = "batchSize")]
pub batch_size: u32,
#[serde(default)]
pub status: String,
#[serde(default, alias = "statusCode", skip_serializing_if = "Option::is_none")]
pub status_code: Option<u32>,
#[serde(
default,
alias = "errorMessage",
skip_serializing_if = "Option::is_none"
)]
pub error_message: Option<String>,
#[serde(default, alias = "deliveredAt")]
pub delivered_at: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct IssueWIMSETokenRequest {
pub agent_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub environment: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ttl_seconds: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct WIMSETokenResponse {
#[serde(default)]
pub token: String,
#[serde(default)]
pub workload_id: String,
#[serde(default)]
pub trust_domain: String,
#[serde(default)]
pub expires_at: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyWIMSETokenRequest {
pub token: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trust_domain_filter: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VerifyWIMSETokenResponse {
#[serde(default)]
pub valid: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workload_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trust_domain: Option<String>,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
impl CreateAgentResponse {
pub(crate) fn into_agent(self) -> Agent {
if let Some(ad) = self.agent {
Agent {
id: ad.id,
name: ad.name,
org_id: ad.org_id,
framework: if ad.framework.is_empty() {
"custom".to_string()
} else {
ad.framework
},
public_key: ad.public_key,
status: if ad.status.is_empty() {
"active".to_string()
} else {
ad.status
},
capabilities: ad.capabilities,
metadata: ad.metadata,
created_at: ad.created_at,
private_key: ad.private_key,
}
} else {
Agent {
id: self.id.unwrap_or_default(),
name: self.name.unwrap_or_default(),
org_id: self.org_id.unwrap_or_default(),
framework: self.framework.unwrap_or_else(|| "custom".to_string()),
public_key: self.public_key.unwrap_or_default(),
status: self.status.unwrap_or_else(|| "active".to_string()),
capabilities: self.capabilities.unwrap_or_default(),
metadata: self.metadata.unwrap_or_else(default_metadata),
created_at: self.created_at,
private_key: self.private_key,
}
}
}
}
impl AgentData {
pub(crate) fn into_agent(self) -> Agent {
Agent {
id: self.id,
name: self.name,
org_id: self.org_id,
framework: if self.framework.is_empty() {
"custom".to_string()
} else {
self.framework
},
public_key: self.public_key,
status: if self.status.is_empty() {
"active".to_string()
} else {
self.status
},
capabilities: self.capabilities,
metadata: self.metadata,
created_at: self.created_at,
private_key: self.private_key,
}
}
}
impl IssueTokenResponse {
pub(crate) fn into_token(self) -> Token {
let tok = self.token.unwrap_or_default();
let tok = if tok.is_empty() {
self.agent_token.unwrap_or_default()
} else {
tok
};
let scopes = self.scopes.unwrap_or_default();
let scopes = if scopes.is_empty() {
self.scope.unwrap_or_default()
} else {
scopes
};
let token_id = self.token_id.or(self.id);
Token {
token: tok,
agent_id: self.agent_id,
scopes,
audience: self.audience,
issued_at: self.issued_at,
expires_at: self.expires_at,
token_id,
}
}
}