use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ComponentState {
Disabled,
Starting,
Connected,
Disconnected,
Backoff,
Stopping,
Stopped,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ComponentHealth {
pub id: String,
#[serde(default)]
pub channel: String,
pub account: String,
pub bot_id: Option<String>,
pub user_id: Option<String>,
pub enabled: bool,
pub state: ComponentState,
pub last_success_unix_seconds: Option<u64>,
pub error: Option<String>,
pub restarts: u64,
#[serde(default)]
pub remote_tools: RemoteTools,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub senders: Option<Senders>,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RemoteTools {
#[default]
None,
Owner,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Senders {
#[default]
Owner,
Anyone,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DaemonStatus {
pub version: String,
pub pid: u32,
pub components: Vec<ComponentHealth>,
#[serde(default)]
pub delegations: DelegationSummary,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub restart: Option<RestartInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confirm: Option<ConfirmInfo>,
}
pub const DEFAULT_CONFIRM_SECONDS: u64 = 30 * 60;
pub const MAX_CONFIRM_SECONDS: u64 = 4 * 60 * 60;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ConfirmInfo {
pub id: String,
pub state: ConfirmState,
pub chat: String,
pub deadline_unix_seconds: u64,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ConfirmState {
Pending,
Yes,
No,
Expired,
Withdrawn,
Failed,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RestartInfo {
pub to_version: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub waiting_for: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub requester: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub origin: Option<String>,
pub deadline_unix_seconds: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct DelegationSummary {
pub active: u64,
pub reaped: u64,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entries: Vec<DelegationInfo>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub killed: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DelegationInfo {
pub handle: String,
pub agent: String,
pub session: String,
pub depth: u32,
pub pid: u32,
pub owner_pid: u32,
pub processes: u32,
pub cwd: String,
pub started_unix_seconds: u64,
pub orphaned: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conversation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turn: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum DaemonCommand {
Status,
Reload,
ChannelSet {
channel: String,
account: String,
enabled: bool,
workspace: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
remote_tools: Option<RemoteTools>,
#[serde(default, skip_serializing_if = "Option::is_none")]
senders: Option<Senders>,
},
ChannelLogout {
channel: String,
account: String,
},
Delegations {
#[serde(default)]
all: bool,
},
DelegationKill {
#[serde(default, skip_serializing_if = "Option::is_none")]
handle: Option<String>,
#[serde(default)]
orphans: bool,
},
RestartWhenIdle {
#[serde(default, skip_serializing_if = "Option::is_none")]
version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
commit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
parent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
max_wait_seconds: Option<u64>,
},
ConfirmAsk {
question: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
parent: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
timeout_seconds: Option<u64>,
},
ConfirmStatus {
id: String,
},
}