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}
44
45#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash, Default)]
47pub enum AgentState {
48 #[default]
49 Created,
50 Initializing,
51 Ready,
52 Running,
53 Suspended,
54 Waiting,
55 Completed,
56 Failed,
57 Terminating,
58 Terminated,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct AgentMetadata {
64 pub version: String,
65 pub author: String,
66 pub description: String,
67 pub capabilities: Vec<Capability>,
68 pub dependencies: Vec<Dependency>,
69 pub resource_requirements: ResourceRequirements,
70 pub security_requirements: SecurityRequirements,
71 pub custom_fields: HashMap<String, String>,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct ResourceRequirements {
77 pub min_memory_mb: usize,
78 pub max_memory_mb: usize,
79 pub min_cpu_cores: f32,
80 pub max_cpu_cores: f32,
81 pub disk_space_mb: usize,
82 pub network_bandwidth_mbps: usize,
83}
84
85impl Default for ResourceRequirements {
86 fn default() -> Self {
87 Self {
88 min_memory_mb: 64,
89 max_memory_mb: 512,
90 min_cpu_cores: 0.1,
91 max_cpu_cores: 1.0,
92 disk_space_mb: 100,
93 network_bandwidth_mbps: 10,
94 }
95 }
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct SecurityRequirements {
101 pub min_security_tier: SecurityTier,
102 pub requires_encryption: bool,
103 pub requires_signature: bool,
104 pub network_isolation: bool,
105 pub file_system_isolation: bool,
106}
107
108impl Default for SecurityRequirements {
109 fn default() -> Self {
110 Self {
111 min_security_tier: SecurityTier::Tier1,
112 requires_encryption: true,
113 requires_signature: true,
114 network_isolation: true,
115 file_system_isolation: true,
116 }
117 }
118}
119
120#[derive(Debug, Clone)]
122pub struct AgentInstance {
123 pub id: AgentId,
124 pub config: AgentConfig,
125 pub state: AgentState,
126 pub resource_allocation: Option<ResourceAllocation>,
127 pub sandbox_handle: Option<SandboxHandle>,
128 pub created_at: SystemTime,
129 pub last_activity: SystemTime,
130 pub execution_count: u64,
131 pub last_state_change: SystemTime,
132 pub error_count: u32,
133 pub restart_count: u32,
134 pub last_error: Option<String>,
135}
136
137impl AgentInstance {
138 pub fn new(config: AgentConfig) -> Self {
139 let now = SystemTime::now();
140 Self {
141 id: config.id,
142 config,
143 state: AgentState::Created,
144 resource_allocation: None,
145 sandbox_handle: None,
146 created_at: now,
147 last_activity: now,
148 execution_count: 0,
149 last_state_change: now,
150 error_count: 0,
151 restart_count: 0,
152 last_error: None,
153 }
154 }
155
156 pub fn update_activity(&mut self) {
157 self.last_activity = SystemTime::now();
158 }
159
160 pub fn increment_execution(&mut self) {
161 self.execution_count += 1;
162 self.update_activity();
163 }
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
168pub struct SandboxHandle {
169 pub id: String,
170 pub security_tier: SecurityTier,
171 pub created_at: SystemTime,
172 pub process_id: Option<u32>,
173 pub container_id: Option<String>,
174}
175
176#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
178pub enum TerminationReason {
179 Completed,
180 Failed(String),
181 PolicyViolation(String),
182 ResourceExhaustion,
183 Timeout,
184 ManualTermination,
185 SystemShutdown,
186}
187
188impl std::fmt::Display for TerminationReason {
189 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
190 match self {
191 TerminationReason::Completed => write!(f, "Completed successfully"),
192 TerminationReason::Failed(reason) => write!(f, "Failed: {}", reason),
193 TerminationReason::PolicyViolation(policy) => write!(f, "Policy violation: {}", policy),
194 TerminationReason::ResourceExhaustion => write!(f, "Resource exhaustion"),
195 TerminationReason::Timeout => write!(f, "Execution timeout"),
196 TerminationReason::ManualTermination => write!(f, "Manual termination"),
197 TerminationReason::SystemShutdown => write!(f, "System shutdown"),
198 }
199 }
200}