use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct ClaudeCliStatus {
#[serde(default, skip_serializing_if = "String::is_empty")]
pub checked_at: String,
pub available: Option<bool>,
pub logged_in: Option<bool>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub error: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MergeError {
pub message: String,
pub at: String,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct MergeStatus {
pub enabled: bool,
pub claude_cli: ClaudeCliStatus,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub last_merge_at: String,
pub last_merge_error: Option<MergeError>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub worker: Option<WorkerStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub queue: Option<QueueStatus>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct WorkerStatus {
pub last_claim_at: Option<String>,
pub agent: String,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct QueueStatus {
pub queued: u64,
pub leased: u64,
pub failed: u64,
pub oldest_queued_at: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Health {
pub status: String,
pub git_commit: String,
pub started_at: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub last_sync_at: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub last_backup_at: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub last_offbox_at: String,
pub merge: MergeStatus,
}