use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum DaemonBackend {
#[default]
Firecracker,
Hyperlight,
Docker,
Apple,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq, Hash)]
#[serde(rename_all = "lowercase")]
pub enum DaemonCompatibilityMode {
#[default]
Native,
Claude,
Codex,
Gemini,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "cmd", rename_all = "snake_case")]
pub enum DaemonRequest {
Acquire {
runtime: String,
#[serde(default)]
backend: DaemonBackend,
#[serde(default)]
compatibility_mode: DaemonCompatibilityMode,
},
Release {
id: String,
},
Exec {
runtime: String,
command: Vec<String>,
#[serde(default)]
backend: DaemonBackend,
#[serde(default)]
compatibility_mode: DaemonCompatibilityMode,
},
Prewarm {
compatibility_mode: DaemonCompatibilityMode,
},
Status,
Shutdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DaemonResponse {
Acquired {
id: String,
#[serde(skip_serializing_if = "Option::is_none")]
cid: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
vsock_path: Option<String>,
backend: DaemonBackend,
},
Released,
Executed {
exit_code: i32,
stdout: String,
stderr: String,
},
Status {
warm: usize,
in_use: usize,
min_warm: usize,
max_warm: usize,
backends: Vec<String>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
agent_stats: HashMap<String, usize>,
},
Prewarmed {
compatibility_mode: DaemonCompatibilityMode,
count: usize,
},
ShuttingDown,
Error {
message: String,
},
}
impl DaemonResponse {
pub fn error(message: impl Into<String>) -> Self {
DaemonResponse::Error {
message: message.into(),
}
}
}