ricecoder_workflows/
models.rs

1//! Core data models for workflows
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7/// A workflow definition
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Workflow {
10    /// Unique workflow identifier
11    pub id: String,
12    /// Workflow name
13    pub name: String,
14    /// Workflow description
15    pub description: String,
16    /// Workflow parameters
17    #[serde(default)]
18    pub parameters: Vec<WorkflowParameter>,
19    /// Workflow steps
20    pub steps: Vec<WorkflowStep>,
21    /// Workflow configuration
22    pub config: WorkflowConfig,
23}
24
25/// A single step in a workflow
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct WorkflowStep {
28    /// Unique step identifier
29    pub id: String,
30    /// Step name
31    pub name: String,
32    /// Step type
33    pub step_type: StepType,
34    /// Step configuration
35    pub config: StepConfig,
36    /// Dependencies on other steps
37    pub dependencies: Vec<String>,
38    /// Whether approval is required
39    pub approval_required: bool,
40    /// Error action to take on failure
41    pub on_error: ErrorAction,
42    /// Risk score for this step (0-100)
43    #[serde(default)]
44    pub risk_score: Option<u8>,
45    /// Risk factors for this step
46    #[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/// Type of workflow step
72#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(tag = "type")]
74pub enum StepType {
75    /// Agent execution step
76    #[serde(rename = "agent")]
77    Agent(AgentStep),
78    /// Command execution step
79    #[serde(rename = "command")]
80    Command(CommandStep),
81    /// Conditional branching step
82    #[serde(rename = "condition")]
83    Condition(ConditionStep),
84    /// Parallel execution step
85    #[serde(rename = "parallel")]
86    Parallel(ParallelStep),
87    /// Approval gate step
88    #[serde(rename = "approval")]
89    Approval(ApprovalStep),
90}
91
92/// Agent execution step
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct AgentStep {
95    /// Agent identifier
96    pub agent_id: String,
97    /// Task to execute
98    pub task: String,
99}
100
101/// Command execution step
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct CommandStep {
104    /// Command to execute
105    pub command: String,
106    /// Command arguments
107    pub args: Vec<String>,
108    /// Execution timeout
109    pub timeout: u64,
110}
111
112/// Conditional branching step
113#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct ConditionStep {
115    /// Condition expression
116    pub condition: String,
117    /// Steps to execute if condition is true
118    pub then_steps: Vec<String>,
119    /// Steps to execute if condition is false
120    pub else_steps: Vec<String>,
121}
122
123/// Parallel execution step
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct ParallelStep {
126    /// Steps to execute in parallel
127    pub steps: Vec<String>,
128    /// Maximum concurrent executions
129    pub max_concurrency: usize,
130}
131
132/// Approval gate step
133#[derive(Debug, Clone, Serialize, Deserialize)]
134pub struct ApprovalStep {
135    /// Approval message
136    pub message: String,
137    /// Approval timeout
138    pub timeout: u64,
139    /// Default approval decision
140    pub default: ApprovalDefault,
141}
142
143/// Default approval decision
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub enum ApprovalDefault {
146    /// Approve by default
147    #[serde(rename = "approve")]
148    Approve,
149    /// Reject by default
150    #[serde(rename = "reject")]
151    Reject,
152}
153
154/// Step configuration
155#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct StepConfig {
157    /// Configuration as JSON value
158    #[serde(flatten)]
159    pub config: serde_json::Value,
160}
161
162/// Error action on step failure
163#[derive(Debug, Clone, Serialize, Deserialize)]
164#[serde(tag = "action")]
165pub enum ErrorAction {
166    /// Fail the workflow
167    #[serde(rename = "fail")]
168    Fail,
169    /// Retry the step
170    #[serde(rename = "retry")]
171    Retry {
172        /// Maximum retry attempts
173        max_attempts: usize,
174        /// Delay between retries in milliseconds
175        delay_ms: u64,
176    },
177    /// Skip the step
178    #[serde(rename = "skip")]
179    Skip,
180    /// Rollback the workflow
181    #[serde(rename = "rollback")]
182    Rollback,
183}
184
185/// Workflow configuration
186#[derive(Debug, Clone, Serialize, Deserialize)]
187pub struct WorkflowConfig {
188    /// Workflow timeout in milliseconds
189    pub timeout_ms: Option<u64>,
190    /// Maximum parallel steps
191    pub max_parallel: Option<usize>,
192}
193
194/// Workflow execution state
195#[derive(Debug, Clone, Serialize, Deserialize)]
196pub struct WorkflowState {
197    /// Workflow identifier
198    pub workflow_id: String,
199    /// Current execution status
200    pub status: WorkflowStatus,
201    /// Current step being executed
202    pub current_step: Option<String>,
203    /// Completed steps
204    pub completed_steps: Vec<String>,
205    /// Results for each step
206    pub step_results: HashMap<String, StepResult>,
207    /// Workflow start time
208    pub started_at: DateTime<Utc>,
209    /// Last update time
210    pub updated_at: DateTime<Utc>,
211}
212
213/// Workflow execution status
214#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
215pub enum WorkflowStatus {
216    /// Workflow is pending
217    #[serde(rename = "pending")]
218    Pending,
219    /// Workflow is running
220    #[serde(rename = "running")]
221    Running,
222    /// Workflow is paused
223    #[serde(rename = "paused")]
224    Paused,
225    /// Workflow is waiting for approval
226    #[serde(rename = "waiting_approval")]
227    WaitingApproval,
228    /// Workflow completed successfully
229    #[serde(rename = "completed")]
230    Completed,
231    /// Workflow failed
232    #[serde(rename = "failed")]
233    Failed,
234    /// Workflow was cancelled
235    #[serde(rename = "cancelled")]
236    Cancelled,
237}
238
239/// Result of a step execution
240#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
241pub struct StepResult {
242    /// Step execution status
243    pub status: StepStatus,
244    /// Step output
245    pub output: Option<serde_json::Value>,
246    /// Error message if failed
247    pub error: Option<String>,
248    /// Execution duration in milliseconds
249    pub duration_ms: u64,
250}
251
252/// Step execution status
253#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
254pub enum StepStatus {
255    /// Step is pending
256    #[serde(rename = "pending")]
257    Pending,
258    /// Step is running
259    #[serde(rename = "running")]
260    Running,
261    /// Step completed successfully
262    #[serde(rename = "completed")]
263    Completed,
264    /// Step failed
265    #[serde(rename = "failed")]
266    Failed,
267    /// Step was skipped
268    #[serde(rename = "skipped")]
269    Skipped,
270}
271
272/// Workflow parameter definition
273#[derive(Debug, Clone, Serialize, Deserialize)]
274pub struct WorkflowParameter {
275    /// Parameter name
276    pub name: String,
277    /// Parameter type (string, number, boolean, object, array)
278    #[serde(rename = "type")]
279    pub param_type: String,
280    /// Default value if not provided
281    pub default: Option<serde_json::Value>,
282    /// Whether the parameter is required
283    #[serde(default)]
284    pub required: bool,
285    /// Parameter description
286    #[serde(default)]
287    pub description: String,
288}
289
290/// Workflow parameters (legacy, for compatibility)
291#[derive(Debug, Clone, Serialize, Deserialize)]
292pub struct Parameter {
293    /// Parameter name
294    pub name: String,
295    /// Parameter value
296    pub value: serde_json::Value,
297}
298
299/// Risk factors for a workflow step
300#[derive(Debug, Clone, Serialize, Deserialize, Default)]
301pub struct RiskFactors {
302    /// Impact score (0-100): potential for data loss or system damage
303    #[serde(default)]
304    pub impact: u8,
305    /// Reversibility score (0-100): ability to undo the operation
306    #[serde(default)]
307    pub reversibility: u8,
308    /// Complexity score (0-100): number of dependencies and interactions
309    #[serde(default)]
310    pub complexity: u8,
311}
312
313/// Risk assessment for a workflow step
314#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct RiskAssessment {
316    /// Step identifier
317    pub step_id: String,
318    /// Step name
319    pub step_name: String,
320    /// Calculated risk score (0-100)
321    pub risk_score: u8,
322    /// Risk factors used in calculation
323    pub risk_factors: RiskFactors,
324    /// Whether approval was required
325    pub approval_required: bool,
326    /// Approval decision if required
327    pub approval_decision: Option<ApprovalDecisionRecord>,
328}
329
330/// Record of an approval decision
331#[derive(Debug, Clone, Serialize, Deserialize)]
332pub struct ApprovalDecisionRecord {
333    /// Whether the step was approved
334    pub approved: bool,
335    /// Timestamp of the decision
336    pub timestamp: DateTime<Utc>,
337    /// Approver identifier (if available)
338    pub approver: Option<String>,
339    /// Approval comments
340    pub comments: Option<String>,
341}
342
343/// Risk assessment report for a completed workflow
344#[derive(Debug, Clone, Serialize, Deserialize)]
345pub struct RiskAssessmentReport {
346    /// Workflow identifier
347    pub workflow_id: String,
348    /// Workflow name
349    pub workflow_name: String,
350    /// Overall risk score (average of all steps)
351    pub overall_risk_score: u8,
352    /// Risk assessments for each step
353    pub step_assessments: Vec<RiskAssessment>,
354    /// Safety constraint violations (if any)
355    pub safety_violations: Vec<SafetyViolation>,
356    /// Report generation timestamp
357    pub generated_at: DateTime<Utc>,
358}
359
360/// Record of a safety constraint violation
361#[derive(Debug, Clone, Serialize, Deserialize)]
362pub struct SafetyViolation {
363    /// Step identifier
364    pub step_id: String,
365    /// Type of violation
366    pub violation_type: String,
367    /// Description of the violation
368    pub description: String,
369}