Skip to main content

symbi_runtime/types/
agent.rs

1//! Agent-related types and data structures
2
3use 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/// Agent configuration for initialization
12#[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/// Agent execution modes
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
28pub enum ExecutionMode {
29    /// Long-lived agent that persists across tasks
30    Persistent,
31    /// Task-based execution that terminates after completion
32    #[default]
33    Ephemeral,
34    /// Interval-based scheduling with periodic execution
35    Scheduled { interval: Duration },
36    /// Cron-expression–based scheduling with timezone support
37    CronScheduled {
38        cron_expression: String,
39        timezone: String,
40    },
41    /// Reactive to events and messages
42    EventDriven,
43}
44
45/// Agent state in the lifecycle
46#[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/// Agent metadata structure
62#[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/// Resource requirements for an agent
75#[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/// Security requirements for an agent
99#[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/// Runtime instance of an agent
121#[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/// Handle to a sandbox environment
167#[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/// Reasons for agent termination
177#[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}