From 4e5f412c2dd81179c13d96410e23dd6c4d3acca7 Mon Sep 17 00:00:00 2001 From: xiaoski Date: Tue, 5 May 2026 00:08:00 +0800 Subject: [PATCH] feat: add scheduler data types (Schedule, ScheduledJob, JobRun) --- src/lib.rs | 1 + src/scheduler/mod.rs | 5 +++++ src/scheduler/store.rs | 1 + src/scheduler/tools.rs | 1 + src/scheduler/types.rs | 50 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 src/scheduler/mod.rs create mode 100644 src/scheduler/store.rs create mode 100644 src/scheduler/tools.rs create mode 100644 src/scheduler/types.rs diff --git a/src/lib.rs b/src/lib.rs index 9856550..218460a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ pub mod protocol; pub mod channels; pub mod logging; pub mod observability; +pub mod scheduler; pub mod skills; pub mod storage; pub mod tools; diff --git a/src/scheduler/mod.rs b/src/scheduler/mod.rs new file mode 100644 index 0000000..c3c5ba3 --- /dev/null +++ b/src/scheduler/mod.rs @@ -0,0 +1,5 @@ +pub mod types; +pub mod store; +pub mod tools; + +pub use types::{JobRun, Schedule, ScheduledJob}; diff --git a/src/scheduler/store.rs b/src/scheduler/store.rs new file mode 100644 index 0000000..27cd0ca --- /dev/null +++ b/src/scheduler/store.rs @@ -0,0 +1 @@ +// Stub — will be filled in Task 5 diff --git a/src/scheduler/tools.rs b/src/scheduler/tools.rs new file mode 100644 index 0000000..33ee302 --- /dev/null +++ b/src/scheduler/tools.rs @@ -0,0 +1 @@ +// Stub — will be filled in Task 9 diff --git a/src/scheduler/types.rs b/src/scheduler/types.rs new file mode 100644 index 0000000..865af41 --- /dev/null +++ b/src/scheduler/types.rs @@ -0,0 +1,50 @@ +use serde::{Deserialize, Serialize}; + +/// How a job is scheduled. Serialized as JSON in the database `schedule` column. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum Schedule { + /// One-shot: fires once at a specific Unix millisecond timestamp, then disables. + #[serde(rename = "at")] + At { at: i64 }, + /// Recurring: fires every `every_ms` milliseconds. + #[serde(rename = "every")] + Every { every_ms: u64 }, + /// Recurring: fires on a cron schedule with optional timezone. + #[serde(rename = "cron")] + Cron { expr: String, tz: Option }, +} + +/// A scheduled job stored in the database. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ScheduledJob { + pub id: String, + pub name: String, + /// JSON-serialized `Schedule` stored as TEXT in SQLite. + pub schedule: Schedule, + pub prompt: String, + pub channel: String, + pub chat_id: String, + pub model: Option, + pub enabled: bool, + pub delete_after_run: bool, + pub next_run_at: i64, + pub last_run_at: Option, + pub last_status: Option, + pub last_error: Option, + pub created_at: i64, + pub updated_at: i64, +} + +/// A single execution record for a job. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JobRun { + pub id: i64, + pub job_id: String, + pub started_at: i64, + pub finished_at: i64, + pub status: String, + pub output: Option, + pub error: Option, + pub duration_ms: i64, +}