1use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct AgentIdentity {
13 pub agent_name: String,
14 pub ship_id: String,
15 pub public_key: String,
16 pub issuer: String,
17 pub issued_at: String,
18 pub valid_until: String,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub model: Option<String>,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub description: Option<String>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct AgentCapabilities {
28 #[serde(default, skip_serializing_if = "Vec::is_empty")]
30 pub tools: Vec<ToolCapability>,
31 #[serde(default, skip_serializing_if = "Vec::is_empty")]
33 pub api_endpoints: Vec<String>,
34 #[serde(default, skip_serializing_if = "Vec::is_empty")]
36 pub mcp_servers: Vec<String>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct ToolCapability {
42 pub name: String,
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub description: Option<String>,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct AgentDeclaration {
50 #[serde(default, skip_serializing_if = "Vec::is_empty")]
51 pub bounded_actions: Vec<String>,
52 #[serde(default, skip_serializing_if = "Vec::is_empty")]
53 pub forbidden: Vec<String>,
54 #[serde(default, skip_serializing_if = "Vec::is_empty")]
55 pub escalation_required: Vec<String>,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct AgentCertificate {
62 pub r#type: String, pub identity: AgentIdentity,
64 pub capabilities: AgentCapabilities,
65 pub declaration: AgentDeclaration,
66 pub signature: CertificateSignature,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct CertificateSignature {
72 pub algorithm: String, pub key_id: String,
74 pub public_key: String, pub signature: String, pub signed_fields: String, }
78
79pub const CERTIFICATE_TYPE: &str = "treeship/agent-certificate/v1";