generalbots/src/auto_task/auto_task.rs
Rodrigo Rodriguez (Pragmatismo) 36fb7988cb refactor: Move AutoTask system from basic/keywords to auto_task module
- Move app_generator, intent_classifier, intent_compiler, autotask_api, designer_ai, ask_later, auto_task, safety_layer to src/auto_task/
- Create auto_task/mod.rs with exports and route configuration
- Update imports in moved files
- Update main.rs to use auto_task::configure_autotask_routes
- Keep table_definition in keywords (shared utility)
2025-12-27 22:58:43 -03:00

450 lines
9.7 KiB
Rust

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoTask {
pub id: String,
pub title: String,
pub intent: String,
pub status: AutoTaskStatus,
pub mode: ExecutionMode,
pub priority: TaskPriority,
pub plan_id: Option<String>,
pub basic_program: Option<String>,
pub current_step: i32,
pub total_steps: i32,
pub progress: f64,
pub step_results: Vec<StepExecutionResult>,
pub pending_decisions: Vec<PendingDecision>,
pub pending_approvals: Vec<PendingApproval>,
pub risk_summary: Option<RiskSummary>,
pub resource_usage: ResourceUsage,
pub error: Option<TaskError>,
pub rollback_state: Option<RollbackState>,
pub session_id: String,
pub bot_id: String,
pub created_by: String,
pub assigned_to: String,
pub schedule: Option<TaskSchedule>,
pub tags: Vec<String>,
pub parent_task_id: Option<String>,
pub subtask_ids: Vec<String>,
pub depends_on: Vec<String>,
pub dependents: Vec<String>,
pub mcp_servers: Vec<String>,
pub external_apis: Vec<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub estimated_completion: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum AutoTaskStatus {
Draft,
Compiling,
PendingApproval,
Simulating,
WaitingDecision,
Ready,
Running,
Paused,
Blocked,
Completed,
Failed,
Cancelled,
RollingBack,
RolledBack,
}
impl Default for AutoTaskStatus {
fn default() -> Self {
Self::Draft
}
}
impl std::fmt::Display for AutoTaskStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Draft => write!(f, "Draft"),
Self::Compiling => write!(f, "Compiling"),
Self::PendingApproval => write!(f, "Pending Approval"),
Self::Simulating => write!(f, "Simulating"),
Self::WaitingDecision => write!(f, "Waiting for Decision"),
Self::Ready => write!(f, "Ready"),
Self::Running => write!(f, "Running"),
Self::Paused => write!(f, "Paused"),
Self::Blocked => write!(f, "Blocked"),
Self::Completed => write!(f, "Completed"),
Self::Failed => write!(f, "Failed"),
Self::Cancelled => write!(f, "Cancelled"),
Self::RollingBack => write!(f, "Rolling Back"),
Self::RolledBack => write!(f, "Rolled Back"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ExecutionMode {
FullyAutomatic,
SemiAutomatic,
Supervised,
Manual,
DryRun,
}
impl Default for ExecutionMode {
fn default() -> Self {
Self::SemiAutomatic
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Ord, PartialOrd, Eq)]
pub enum TaskPriority {
Critical = 4,
High = 3,
Medium = 2,
Low = 1,
Background = 0,
}
impl Default for TaskPriority {
fn default() -> Self {
Self::Medium
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepExecutionResult {
pub step_id: String,
pub step_order: i32,
pub step_name: String,
pub status: StepStatus,
pub started_at: DateTime<Utc>,
pub completed_at: Option<DateTime<Utc>>,
pub duration_ms: Option<i64>,
pub output: Option<serde_json::Value>,
pub error: Option<String>,
pub logs: Vec<ExecutionLog>,
pub resources_used: ResourceUsage,
pub can_rollback: bool,
pub rollback_data: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum StepStatus {
Pending,
Running,
Completed,
Failed,
Skipped,
RolledBack,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionLog {
pub timestamp: DateTime<Utc>,
pub level: LogLevel,
pub message: String,
pub details: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LogLevel {
Debug,
Info,
Warning,
Error,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingDecision {
pub id: String,
pub decision_type: DecisionType,
pub title: String,
pub description: String,
pub options: Vec<DecisionOption>,
pub default_option: Option<String>,
pub timeout_seconds: Option<i32>,
pub timeout_action: TimeoutAction,
pub context: serde_json::Value,
pub created_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DecisionType {
ApproachSelection,
RiskConfirmation,
AmbiguityResolution,
InformationRequest,
ErrorRecovery,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionOption {
pub id: String,
pub label: String,
pub description: String,
pub pros: Vec<String>,
pub cons: Vec<String>,
pub estimated_impact: ImpactEstimate,
pub recommended: bool,
pub risk_level: RiskLevel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImpactEstimate {
pub cost_change: f64,
pub time_change_minutes: i32,
pub risk_change: f64,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TimeoutAction {
UseDefault,
Pause,
Cancel,
Escalate,
}
impl Default for TimeoutAction {
fn default() -> Self {
Self::Pause
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PendingApproval {
pub id: String,
pub approval_type: ApprovalType,
pub title: String,
pub description: String,
pub risk_level: RiskLevel,
pub approver: String,
pub step_id: Option<String>,
pub impact_summary: String,
pub simulation_result: Option<SimulationResult>,
pub timeout_seconds: i32,
pub default_action: ApprovalDefault,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ApprovalType {
PlanApproval,
StepApproval,
HighRiskAction,
ExternalApiCall,
DataModification,
CostOverride,
SecurityOverride,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ApprovalDefault {
Approve,
Reject,
Pause,
Escalate,
}
impl Default for ApprovalDefault {
fn default() -> Self {
Self::Pause
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Ord, PartialOrd, Eq)]
pub enum RiskLevel {
None = 0,
Low = 1,
Medium = 2,
High = 3,
Critical = 4,
}
impl Default for RiskLevel {
fn default() -> Self {
Self::Low
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskSummary {
pub overall_risk: RiskLevel,
pub data_risk: RiskLevel,
pub cost_risk: RiskLevel,
pub security_risk: RiskLevel,
pub compliance_risk: RiskLevel,
pub risk_factors: Vec<RiskFactor>,
pub mitigations_applied: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskFactor {
pub id: String,
pub category: RiskCategory,
pub description: String,
pub probability: f64,
pub impact: RiskLevel,
pub mitigation: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RiskCategory {
Data,
Cost,
Security,
Compliance,
Performance,
Availability,
Integration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceUsage {
pub compute_hours: f64,
pub storage_gb: f64,
pub api_calls: i32,
pub llm_tokens: i32,
pub estimated_cost_usd: f64,
pub mcp_servers_used: Vec<String>,
pub external_services: Vec<String>,
}
impl Default for ResourceUsage {
fn default() -> Self {
Self {
compute_hours: 0.0,
storage_gb: 0.0,
api_calls: 0,
llm_tokens: 0,
estimated_cost_usd: 0.0,
mcp_servers_used: Vec::new(),
external_services: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskError {
pub code: String,
pub message: String,
pub step_id: Option<String>,
pub recoverable: bool,
pub details: Option<serde_json::Value>,
pub occurred_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RollbackState {
pub available: bool,
pub steps_rolled_back: Vec<String>,
pub rollback_data: HashMap<String, serde_json::Value>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
}
impl Default for RollbackState {
fn default() -> Self {
Self {
available: false,
steps_rolled_back: Vec::new(),
rollback_data: HashMap::new(),
started_at: None,
completed_at: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskSchedule {
pub schedule_type: ScheduleType,
pub scheduled_at: Option<DateTime<Utc>>,
pub cron_expression: Option<String>,
pub timezone: String,
pub max_retries: i32,
pub retry_delay_seconds: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScheduleType {
Immediate,
Scheduled,
Recurring,
OnDemand,
}
impl Default for TaskSchedule {
fn default() -> Self {
Self {
schedule_type: ScheduleType::Immediate,
scheduled_at: None,
cron_expression: None,
timezone: "UTC".to_string(),
max_retries: 3,
retry_delay_seconds: 60,
}
}
}
use crate::auto_task::safety_layer::SimulationResult;