- Added `JobType`, `SessionTarget`, `Schedule`, `DeliveryConfig`, `CronJob`, `CronRun`, and `CronJobPatch` types in `src/cron/types.rs` for cron job configuration and management. - Introduced `CronAddTool`, `CronListTool`, `CronRemoveTool`, `CronRunTool`, `CronRunsTool`, and `CronUpdateTool` in `src/tools` for adding, listing, removing, running, and updating cron jobs. - Updated the `run` function in `src/daemon/mod.rs` to conditionally start the scheduler based on the cron configuration. - Modified command-line argument parsing in `src/lib.rs` and `src/main.rs` to support new cron job commands. - Enhanced the onboarding wizard in `src/onboard/wizard.rs` to include cron configuration. - Added tests for cron job tools to ensure functionality and error handling.
140 lines
3.2 KiB
Rust
140 lines
3.2 KiB
Rust
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<String>,
|
|
},
|
|
At {
|
|
at: DateTime<Utc>,
|
|
},
|
|
Every {
|
|
every_ms: u64,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
|
pub struct DeliveryConfig {
|
|
#[serde(default)]
|
|
pub mode: String,
|
|
#[serde(default)]
|
|
pub channel: Option<String>,
|
|
#[serde(default)]
|
|
pub to: Option<String>,
|
|
#[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<String>,
|
|
pub name: Option<String>,
|
|
pub job_type: JobType,
|
|
pub session_target: SessionTarget,
|
|
pub model: Option<String>,
|
|
pub enabled: bool,
|
|
pub delivery: DeliveryConfig,
|
|
pub delete_after_run: bool,
|
|
pub created_at: DateTime<Utc>,
|
|
pub next_run: DateTime<Utc>,
|
|
pub last_run: Option<DateTime<Utc>>,
|
|
pub last_status: Option<String>,
|
|
pub last_output: Option<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct CronRun {
|
|
pub id: i64,
|
|
pub job_id: String,
|
|
pub started_at: DateTime<Utc>,
|
|
pub finished_at: DateTime<Utc>,
|
|
pub status: String,
|
|
pub output: Option<String>,
|
|
pub duration_ms: Option<i64>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
|
pub struct CronJobPatch {
|
|
pub schedule: Option<Schedule>,
|
|
pub command: Option<String>,
|
|
pub prompt: Option<String>,
|
|
pub name: Option<String>,
|
|
pub enabled: Option<bool>,
|
|
pub delivery: Option<DeliveryConfig>,
|
|
pub model: Option<String>,
|
|
pub session_target: Option<SessionTarget>,
|
|
pub delete_after_run: Option<bool>,
|
|
}
|