#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SessionSummary {
pub id: String,
pub status: String,
pub workdir: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct DecisionCounts {
pub allow: u64,
pub block: u64,
pub flag: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TmuxSessionSummary {
pub name: String,
pub managed: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DiscoveredProjectSummary {
pub path: String,
pub session_count: usize,
pub last_session: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RecommendationSummary {
pub id: String,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct HealthReport {
pub reachable: bool,
pub url: String,
pub status: String,
pub catalog_stale: bool,
pub catalog_unknown: bool,
pub managed_total: usize,
pub managed_pending_decisions: usize,
}
#[derive(Debug, Clone)]
pub enum CommandResult {
Sessions(Vec<SessionSummary>),
SessionDetail {
id: String,
status: String,
events: Vec<String>,
},
OverseerStatus {
enabled: bool,
handler: String,
decisions: DecisionCounts,
},
TmuxSessions(Vec<TmuxSessionSummary>),
DiscoveredProjects(Vec<DiscoveredProjectSummary>),
Adopted {
session: String,
},
Discovered {
count: usize,
},
ProjectRegistered {
path: String,
},
ConfigAnalysis {
project: String,
recommendations: Vec<RecommendationSummary>,
},
Snapshot {
session: String,
output: String,
},
Killed {
session_id: String,
},
CommandSent {
session: String,
output: String,
},
ChatReply {
reply: String,
},
Approved {
session_id: String,
},
Denied {
session_id: String,
},
PairCode {
code: String,
expires_in_seconds: u64,
},
PairSuccess {
chat_info: String,
},
PairState {
paired: bool,
},
AlertSubscriptions(Vec<String>),
Doctor(crate::core::doctor::DoctorReport),
SessionStarted {
session: String,
workdir: String,
deployed: bool,
},
Help(String),
Health(HealthReport),
ManagedSpawned {
id: String,
name: String,
state: String,
runtime: String,
attach_cmd: String,
},
ManagedSessions(Vec<ManagedSessionView>),
ManagedFleet(Vec<ProjectFleetView>),
ManagedSession(ManagedSessionView),
ManagedSent {
id: String,
tmux_name: String,
},
ManagedAnswered {
id: String,
answer: String,
tmux_name: String,
},
ManagedActivity {
id: String,
state: String,
summary: String,
raw_pane: String,
runtime_active: bool,
pending_decision: Option<String>,
},
ManagedAttachCmd {
id: String,
attach_cmd: String,
},
ManagedAdopted {
id: String,
name: String,
state: String,
cwd: String,
runtime: String,
attach_cmd: String,
},
ManagedLifecycle {
id: String,
name: String,
state: String,
action: String,
},
Error(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProjectFleetView {
pub project_name: String,
pub repo_url: String,
pub sessions: Vec<ManagedSessionView>,
}
pub(crate) fn fleet_state_glyph(state: &str) -> &'static str {
match state.to_ascii_lowercase().as_str() {
"active" => "🟢",
"provisioning" => "🟡",
_ => "🔴",
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ManagedSessionView {
pub id: String,
pub name: String,
pub state: String,
pub workspace_path: Option<String>,
pub repo_url: Option<String>,
pub branch: Option<String>,
pub pending_decision: Option<String>,
pub proposed_default: Option<String>,
}
impl From<crate::client::ManagedSessionSummary> for ManagedSessionView {
fn from(s: crate::client::ManagedSessionSummary) -> Self {
Self {
id: s.id,
name: s.name,
state: s.state,
workspace_path: s.workspace_path,
repo_url: s.repo_url,
branch: s.branch,
pending_decision: s.pending_decision,
proposed_default: s.proposed_default,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fleet_state_glyph_covers_all_tiers() {
assert_eq!(fleet_state_glyph("active"), "🟢");
assert_eq!(fleet_state_glyph("Active"), "🟢"); assert_eq!(fleet_state_glyph("provisioning"), "🟡");
assert_eq!(fleet_state_glyph("PROVISIONING"), "🟡");
assert_eq!(fleet_state_glyph("stopped"), "🔴");
assert_eq!(fleet_state_glyph("errored"), "🔴");
assert_eq!(fleet_state_glyph("decommissioned"), "🔴");
assert_eq!(fleet_state_glyph(""), "🔴"); }
}