use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SessionInfo {
pub key: String,
pub language: String,
pub backend: String,
pub workspace_root: Option<String>,
pub request_count: u64,
pub created_at: u64,
pub last_used_at: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DaemonStatus {
pub total_connections: u64,
pub total_requests: u64,
pub uptime_secs: u64,
pub sessions: Vec<SessionInfo>,
}
impl DaemonStatus {
pub fn touch_session(
&mut self,
key: &str,
language: &str,
backend: &str,
workspace_root: Option<String>,
) {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
if let Some(existing) = self.sessions.iter_mut().find(|s| s.key == key) {
existing.request_count += 1;
existing.last_used_at = now;
} else {
self.sessions.push(SessionInfo {
key: key.to_string(),
language: language.to_string(),
backend: backend.to_string(),
workspace_root,
request_count: 1,
created_at: now,
last_used_at: now,
});
}
}
}