use orbok_core::{FileId, JobId, JobType, SourceId};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkPriority {
Maintenance = 0,
LowBackground = 1,
NormalBackground = 2,
UserVisible = 3,
UserBlocking = 4,
}
impl Default for WorkPriority {
fn default() -> Self {
WorkPriority::NormalBackground
}
}
impl WorkPriority {
pub fn as_i64(self) -> i64 {
self as i64
}
pub fn from_i64(v: i64) -> Self {
match v {
4 => Self::UserBlocking,
3 => Self::UserVisible,
2 => Self::NormalBackground,
1 => Self::LowBackground,
_ => Self::Maintenance,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum JobState {
Pending,
Running,
Paused,
Completed,
Failed,
Cancelled,
WaitingForDependency,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum JobKind {
ScanSource,
ExtractFile,
ChunkFile,
UpdateKeywordIndex,
GenerateEmbedding,
Cleanup,
Repair,
}
impl JobKind {
pub fn as_job_type(self) -> JobType {
match self {
JobKind::ScanSource => JobType::Scan,
JobKind::ExtractFile => JobType::Extract,
JobKind::ChunkFile => JobType::Chunk,
JobKind::UpdateKeywordIndex => JobType::KeywordIndex,
JobKind::GenerateEmbedding => JobType::Embedding,
JobKind::Cleanup => JobType::DeleteStale,
JobKind::Repair => JobType::Rebuild,
}
}
pub fn default_priority(self) -> WorkPriority {
match self {
JobKind::ScanSource => WorkPriority::NormalBackground,
JobKind::ExtractFile => WorkPriority::NormalBackground,
JobKind::ChunkFile => WorkPriority::NormalBackground,
JobKind::UpdateKeywordIndex => WorkPriority::NormalBackground,
JobKind::GenerateEmbedding => WorkPriority::LowBackground,
JobKind::Cleanup => WorkPriority::Maintenance,
JobKind::Repair => WorkPriority::Maintenance,
}
}
}
#[derive(Debug, Clone)]
pub struct IndexJob {
pub id: JobId,
pub file_id: Option<FileId>,
pub source_id: SourceId,
pub kind: JobKind,
pub priority: WorkPriority,
pub state: JobState,
pub attempt_count: u32,
pub last_error_kind: Option<String>,
}
impl IndexJob {
pub fn new(source_id: SourceId, kind: JobKind) -> Self {
Self {
id: JobId::generate(),
file_id: None,
source_id,
priority: kind.default_priority(),
kind,
state: JobState::Pending,
attempt_count: 0,
last_error_kind: None,
}
}
pub fn with_file(mut self, file_id: FileId) -> Self {
self.file_id = Some(file_id);
self
}
pub fn with_priority(mut self, priority: WorkPriority) -> Self {
self.priority = priority;
self
}
}
#[derive(Debug, Clone)]
pub enum SchedulerEvent {
JobQueued(JobId),
JobStarted(JobId),
JobPaused(JobId),
JobResumed(JobId),
JobCompleted(JobId),
JobFailed {
id: JobId,
error_kind: String,
},
JobCancelled(JobId),
QueueBackpressureApplied(QueueKind),
QueueBackpressureReleased(QueueKind),
UserActivityDetected,
ResourceModeChanged(ResourceMode),
PartialReadinessChanged {
ready_count: u64,
pending_count: u64,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QueueKind {
Scan,
Extract,
Chunk,
Keyword,
Embedding,
Maintenance,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ResourceMode {
#[default]
Normal,
UserActive,
LowImpact,
Paused,
}