Skip to main content

agent_procs/cli/
session_cmd.rs

1use crate::paths;
2use crate::session;
3
4pub async fn list() -> i32 {
5    let base = paths::socket_base_dir();
6
7    let entries = match std::fs::read_dir(&base) {
8        Ok(e) => e,
9        Err(_) => {
10            println!("no active sessions");
11            return 0;
12        }
13    };
14
15    println!("{:<20} STATUS", "SESSION");
16    for entry in entries.flatten() {
17        let name = entry.file_name().to_string_lossy().to_string();
18        if !name.ends_with(".pid") { continue; }
19        let session_name = name.trim_end_matches(".pid");
20        let status = if session::is_daemon_alive(&entry.path()) {
21            "running"
22        } else {
23            "stale"
24        };
25        println!("{:<20} {}", session_name, status);
26    }
27    0
28}
29
30pub async fn clean() -> i32 {
31    let base = paths::socket_base_dir();
32
33    let entries = match std::fs::read_dir(&base) {
34        Ok(e) => e,
35        Err(_) => return 0,
36    };
37
38    for entry in entries.flatten() {
39        let name = entry.file_name().to_string_lossy().to_string();
40        if !name.ends_with(".pid") { continue; }
41        let session_name = name.trim_end_matches(".pid");
42
43        if !session::is_daemon_alive(&entry.path()) {
44            // Remove socket and PID files
45            let _ = std::fs::remove_file(paths::socket_path(session_name));
46            let _ = std::fs::remove_file(paths::pid_path(session_name));
47            // Remove XDG state directory (logs, state.json)
48            let _ = std::fs::remove_dir_all(paths::state_dir(session_name));
49            println!("cleaned stale session: {}", session_name);
50        }
51    }
52    0
53}