1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Workflow {
10 pub id: String,
12 pub name: String,
14 pub description: String,
16 #[serde(default)]
18 pub parameters: Vec<WorkflowParameter>,
19 pub steps: Vec<WorkflowStep>,
21 pub config: WorkflowConfig,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct WorkflowStep {
28 pub id: String,
30 pub name: String,
32 pub step_type: StepType,
34 pub config: StepConfig,
36 pub dependencies: Vec<String>,
38 pub approval_required: bool,
40 pub on_error: ErrorAction,
42 #[serde(default)]
44 pub risk_score: Option<u8>,
45 #[serde(default)]
47 pub risk_factors: RiskFactors,
48}
49
50impl Default for WorkflowStep {
51 fn default() -> Self {
52 Self {
53 id: String::new(),
54 name: String::new(),
55 step_type: StepType::Agent(AgentStep {
56 agent_id: String::new(),
57 task: String::new(),
58 }),
59 config: StepConfig {
60 config: serde_json::json!({}),
61 },
62 dependencies: Vec::new(),
63 approval_required: false,
64 on_error: ErrorAction::Fail,
65 risk_score: None,
66 risk_factors: RiskFactors::default(),
67 }
68 }
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(tag = "type")]
74pub enum StepType {
75 #[serde(rename = "agent")]
77 Agent(AgentStep),
78 #[serde(rename = "command")]
80 Command(CommandStep),
81 #[serde(rename = "condition")]
83 Condition(ConditionStep),
84 #[serde(rename = "parallel")]
86 Parallel(ParallelStep),
87 #[serde(rename = "approval")]
89 Approval(ApprovalStep),
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct AgentStep {
95 pub agent_id: String,
97 pub task: String,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct CommandStep {
104 pub command: String,
106 pub args: Vec<String>,
108 pub timeout: u64,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct ConditionStep {
115 pub condition: String,
117 pub then_steps: Vec<String>,
119 pub else_steps: Vec<String>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct ParallelStep {
126 pub steps: Vec<String>,
128 pub max_concurrency: usize,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
134pub struct ApprovalStep {
135 pub message: String,
137 pub timeout: u64,
139 pub default: ApprovalDefault,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub enum ApprovalDefault {
146 #[serde(rename = "approve")]
148 Approve,
149 #[serde(rename = "reject")]
151 Reject,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct StepConfig {
157 #[serde(flatten)]
159 pub config: serde_json::Value,
160}
161
162#[derive(Debug, Clone, Serialize, Deserialize)]
164#[serde(tag = "action")]
165pub enum ErrorAction {
166 #[serde(rename = "fail")]
168 Fail,
169 #[serde(rename = "retry")]
171 Retry {
172 max_attempts: usize,
174 delay_ms: u64,
176 },
177 #[serde(rename = "skip")]
179 Skip,
180 #[serde(rename = "rollback")]
182 Rollback,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize)]
187pub struct WorkflowConfig {
188 pub timeout_ms: Option<u64>,
190 pub max_parallel: Option<usize>,
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize)]
196pub struct WorkflowState {
197 pub workflow_id: String,
199 pub status: WorkflowStatus,
201 pub current_step: Option<String>,
203 pub completed_steps: Vec<String>,
205 pub step_results: HashMap<String, StepResult>,
207 pub started_at: DateTime<Utc>,
209 pub updated_at: DateTime<Utc>,
211}
212
213#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
215pub enum WorkflowStatus {
216 #[serde(rename = "pending")]
218 Pending,
219 #[serde(rename = "running")]
221 Running,
222 #[serde(rename = "paused")]
224 Paused,
225 #[serde(rename = "waiting_approval")]
227 WaitingApproval,
228 #[serde(rename = "completed")]
230 Completed,
231 #[serde(rename = "failed")]
233 Failed,
234 #[serde(rename = "cancelled")]
236 Cancelled,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
241pub struct StepResult {
242 pub status: StepStatus,
244 pub output: Option<serde_json::Value>,
246 pub error: Option<String>,
248 pub duration_ms: u64,
250}
251
252#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
254pub enum StepStatus {
255 #[serde(rename = "pending")]
257 Pending,
258 #[serde(rename = "running")]
260 Running,
261 #[serde(rename = "completed")]
263 Completed,
264 #[serde(rename = "failed")]
266 Failed,
267 #[serde(rename = "skipped")]
269 Skipped,
270}
271
272#[derive(Debug, Clone, Serialize, Deserialize)]
274pub struct WorkflowParameter {
275 pub name: String,
277 #[serde(rename = "type")]
279 pub param_type: String,
280 pub default: Option<serde_json::Value>,
282 #[serde(default)]
284 pub required: bool,
285 #[serde(default)]
287 pub description: String,
288}
289
290#[derive(Debug, Clone, Serialize, Deserialize)]
292pub struct Parameter {
293 pub name: String,
295 pub value: serde_json::Value,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize, Default)]
301pub struct RiskFactors {
302 #[serde(default)]
304 pub impact: u8,
305 #[serde(default)]
307 pub reversibility: u8,
308 #[serde(default)]
310 pub complexity: u8,
311}
312
313#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct RiskAssessment {
316 pub step_id: String,
318 pub step_name: String,
320 pub risk_score: u8,
322 pub risk_factors: RiskFactors,
324 pub approval_required: bool,
326 pub approval_decision: Option<ApprovalDecisionRecord>,
328}
329
330#[derive(Debug, Clone, Serialize, Deserialize)]
332pub struct ApprovalDecisionRecord {
333 pub approved: bool,
335 pub timestamp: DateTime<Utc>,
337 pub approver: Option<String>,
339 pub comments: Option<String>,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
345pub struct RiskAssessmentReport {
346 pub workflow_id: String,
348 pub workflow_name: String,
350 pub overall_risk_score: u8,
352 pub step_assessments: Vec<RiskAssessment>,
354 pub safety_violations: Vec<SafetyViolation>,
356 pub generated_at: DateTime<Utc>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize)]
362pub struct SafetyViolation {
363 pub step_id: String,
365 pub violation_type: String,
367 pub description: String,
369}