1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5use std::time::{Duration, SystemTime};
6
7use super::{AgentId, Capability, Dependency, PolicyId, Priority};
8use crate::types::resource::{ResourceAllocation, ResourceLimits};
9use crate::types::security::SecurityTier;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct AgentConfig {
14 pub id: AgentId,
15 pub name: String,
16 pub dsl_source: String,
17 pub execution_mode: ExecutionMode,
18 pub security_tier: SecurityTier,
19 pub resource_limits: ResourceLimits,
20 pub capabilities: Vec<Capability>,
21 pub policies: Vec<PolicyId>,
22 pub metadata: HashMap<String, String>,
23 pub priority: Priority,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
28pub enum ExecutionMode {
29 Persistent,
31 #[default]
33 Ephemeral,
34 Scheduled { interval: Duration },
36 CronScheduled {
38 cron_expression: String,
39 timezone: String,
40 },
41 EventDriven,
43 External {
46 endpoint: Option<String>,
48 agentpin_domain: Option<String>,
50 heartbeat_interval_secs: u64,
52 },
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash, Default)]
57pub enum AgentState {
58 #[default]
59 Created,
60 Initializing,
61 Ready,
62 Running,
63 Suspended,
64 Waiting,
65 Completed,
66 Failed,
67 Terminating,
68 Terminated,
69 Unreachable,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct AgentMetadata {
76 pub version: String,
77 pub author: String,
78 pub description: String,
79 pub capabilities: Vec<Capability>,
80 pub dependencies: Vec<Dependency>,
81 pub resource_requirements: ResourceRequirements,
82 pub security_requirements: SecurityRequirements,
83 pub custom_fields: HashMap<String, String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct ResourceRequirements {
89 pub min_memory_mb: usize,
90 pub max_memory_mb: usize,
91 pub min_cpu_cores: f32,
92 pub max_cpu_cores: f32,
93 pub disk_space_mb: usize,
94 pub network_bandwidth_mbps: usize,
95}
96
97impl Default for ResourceRequirements {
98 fn default() -> Self {
99 Self {
100 min_memory_mb: 64,
101 max_memory_mb: 512,
102 min_cpu_cores: 0.1,
103 max_cpu_cores: 1.0,
104 disk_space_mb: 100,
105 network_bandwidth_mbps: 10,
106 }
107 }
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct SecurityRequirements {
113 pub min_security_tier: SecurityTier,
114 pub requires_encryption: bool,
115 pub requires_signature: bool,
116 pub network_isolation: bool,
117 pub file_system_isolation: bool,
118}
119
120impl Default for SecurityRequirements {
121 fn default() -> Self {
122 Self {
123 min_security_tier: SecurityTier::Tier1,
124 requires_encryption: true,
125 requires_signature: true,
126 network_isolation: true,
127 file_system_isolation: true,
128 }
129 }
130}
131
132#[derive(Debug, Clone)]
134pub struct AgentInstance {
135 pub id: AgentId,
136 pub config: AgentConfig,
137 pub state: AgentState,
138 pub resource_allocation: Option<ResourceAllocation>,
139 pub sandbox_handle: Option<SandboxHandle>,
140 pub created_at: SystemTime,
141 pub last_activity: SystemTime,
142 pub execution_count: u64,
143 pub last_state_change: SystemTime,
144 pub error_count: u32,
145 pub restart_count: u32,
146 pub last_error: Option<String>,
147}
148
149impl AgentInstance {
150 pub fn new(config: AgentConfig) -> Self {
151 let now = SystemTime::now();
152 Self {
153 id: config.id,
154 config,
155 state: AgentState::Created,
156 resource_allocation: None,
157 sandbox_handle: None,
158 created_at: now,
159 last_activity: now,
160 execution_count: 0,
161 last_state_change: now,
162 error_count: 0,
163 restart_count: 0,
164 last_error: None,
165 }
166 }
167
168 pub fn update_activity(&mut self) {
169 self.last_activity = SystemTime::now();
170 }
171
172 pub fn increment_execution(&mut self) {
173 self.execution_count += 1;
174 self.update_activity();
175 }
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize)]
180pub struct SandboxHandle {
181 pub id: String,
182 pub security_tier: SecurityTier,
183 pub created_at: SystemTime,
184 pub process_id: Option<u32>,
185 pub container_id: Option<String>,
186}
187
188#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
190pub enum TerminationReason {
191 Completed,
192 Failed(String),
193 PolicyViolation(String),
194 ResourceExhaustion,
195 Timeout,
196 ManualTermination,
197 SystemShutdown,
198}
199
200impl std::fmt::Display for TerminationReason {
201 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
202 match self {
203 TerminationReason::Completed => write!(f, "Completed successfully"),
204 TerminationReason::Failed(reason) => write!(f, "Failed: {}", reason),
205 TerminationReason::PolicyViolation(policy) => write!(f, "Policy violation: {}", policy),
206 TerminationReason::ResourceExhaustion => write!(f, "Resource exhaustion"),
207 TerminationReason::Timeout => write!(f, "Execution timeout"),
208 TerminationReason::ManualTermination => write!(f, "Manual termination"),
209 TerminationReason::SystemShutdown => write!(f, "System shutdown"),
210 }
211 }
212}