use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] #[serde(rename_all = "lowercase")] pub enum JobType { #[default] Shell, Agent, } impl JobType { pub(crate) fn as_str(&self) -> &'static str { match self { Self::Shell => "shell", Self::Agent => "agent", } } pub(crate) fn parse(raw: &str) -> Self { if raw.eq_ignore_ascii_case("agent") { Self::Agent } else { Self::Shell } } } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] #[serde(rename_all = "lowercase")] pub enum SessionTarget { #[default] Isolated, Main, } impl SessionTarget { pub(crate) fn as_str(&self) -> &'static str { match self { Self::Isolated => "isolated", Self::Main => "main", } } pub(crate) fn parse(raw: &str) -> Self { if raw.eq_ignore_ascii_case("main") { Self::Main } else { Self::Isolated } } } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(tag = "kind", rename_all = "lowercase")] pub enum Schedule { Cron { expr: String, #[serde(default)] tz: Option, }, At { at: DateTime, }, Every { every_ms: u64, }, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct DeliveryConfig { #[serde(default)] pub mode: String, #[serde(default)] pub channel: Option, #[serde(default)] pub to: Option, #[serde(default = "default_true")] pub best_effort: bool, } impl Default for DeliveryConfig { fn default() -> Self { Self { mode: "none".to_string(), channel: None, to: None, best_effort: true, } } } fn default_true() -> bool { true } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CronJob { pub id: String, pub expression: String, pub schedule: Schedule, pub command: String, pub prompt: Option, pub name: Option, pub job_type: JobType, pub session_target: SessionTarget, pub model: Option, pub enabled: bool, pub delivery: DeliveryConfig, pub delete_after_run: bool, pub created_at: DateTime, pub next_run: DateTime, pub last_run: Option>, pub last_status: Option, pub last_output: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CronRun { pub id: i64, pub job_id: String, pub started_at: DateTime, pub finished_at: DateTime, pub status: String, pub output: Option, pub duration_ms: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct CronJobPatch { pub schedule: Option, pub command: Option, pub prompt: Option, pub name: Option, pub enabled: Option, pub delivery: Option, pub model: Option, pub session_target: Option, pub delete_after_run: Option, }