Skip to main content

csd/commands/
ps.rs

1//! `csd ps` — list tracked sessions with liveness + live state, mirroring `tmx agents --json`.
2
3use serde::Serialize;
4
5use crate::detect::{self, State};
6use crate::error::Result;
7use crate::session::Session;
8use crate::tmux;
9
10#[derive(Debug, Serialize)]
11pub struct PsResult {
12    pub sessions: Vec<PsEntry>,
13}
14
15#[derive(Debug, Serialize)]
16pub struct PsEntry {
17    #[serde(flatten)]
18    pub session: Session,
19    pub alive: bool,
20    pub state: State,
21}
22
23pub fn run() -> Result<PsResult> {
24    let mut entries = Vec::new();
25    for session in Session::list()? {
26        let alive = tmux::has_session(&session.name)?;
27        let state = if alive { detect::detect(&session)? } else { State::Dead };
28        entries.push(PsEntry { session, alive, state });
29    }
30    Ok(PsResult { sessions: entries })
31}