Skip to main content

rover/tasks/
mod.rs

1//! Long-running task subsystem.
2//!
3//! See `docs/superpowers/specs/2026-05-14-rover-m6-tasks-batching-design.md`.
4
5pub mod batch_fetch;
6pub mod deps;
7pub mod error;
8pub mod retry;
9pub mod revalidate;
10pub mod scheduler;
11pub mod summarize;
12pub mod types;
13
14pub use deps::WorkerDeps;
15pub use error::TasksError;
16pub use scheduler::{NewTaskSender, Scheduler};
17pub use types::{
18    BatchFetchParams, BatchFetchResult, CoreEvent, RetryParams, RevalidateParams, TaskId, TaskKind,
19    TaskStatus,
20};
21
22use std::sync::Arc;
23use tokio::task::JoinSet;
24use tokio_util::sync::CancellationToken;
25
26use crate::storage::Db;
27
28/// Default production dispatch table. Routes by `TaskKind`.
29pub struct DefaultSpawner {
30    pub deps: WorkerDeps,
31}
32
33impl scheduler::WorkerSpawner for DefaultSpawner {
34    fn spawn(
35        &self,
36        join_set: &mut JoinSet<()>,
37        db: Db,
38        task_id: TaskId,
39        kind: TaskKind,
40        cancel: CancellationToken,
41    ) {
42        match kind {
43            TaskKind::Summarize => {
44                join_set.spawn(summarize::run(db, task_id, cancel));
45            }
46            TaskKind::BatchFetch => {
47                join_set.spawn(batch_fetch::run(self.deps.clone(), db, task_id, cancel));
48            }
49            TaskKind::Retry => {
50                join_set.spawn(retry::run(self.deps.clone(), db, task_id, cancel));
51            }
52            TaskKind::Revalidate => {
53                join_set.spawn(revalidate::run(self.deps.clone(), db, task_id, cancel));
54            }
55        }
56    }
57}
58
59pub fn default_spawner(deps: WorkerDeps) -> Arc<dyn scheduler::WorkerSpawner> {
60    Arc::new(DefaultSpawner { deps })
61}