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") {
19            continue;
20        }
21        let session_name = name.trim_end_matches(".pid");
22        let status = if session::is_daemon_alive(&entry.path()) {
23            "running"
24        } else {
25            "stale"
26        };
27        println!("{:<20} {}", session_name, status);
28    }
29    0
30}
31
32pub async fn clean() -> i32 {
33    let base = paths::socket_base_dir();
34
35    let entries = match std::fs::read_dir(&base) {
36        Ok(e) => e,
37        Err(_) => return 0,
38    };
39
40    for entry in entries.flatten() {
41        let name = entry.file_name().to_string_lossy().to_string();
42        if !name.ends_with(".pid") {
43            continue;
44        }
45        let session_name = name.trim_end_matches(".pid");
46
47        if !session::is_daemon_alive(&entry.path()) {
48            // Remove socket and PID files
49            let _ = std::fs::remove_file(paths::socket_path(session_name));
50            let _ = std::fs::remove_file(paths::pid_path(session_name));
51            // Remove XDG state directory (logs, state.json)
52            let _ = std::fs::remove_dir_all(paths::state_dir(session_name));
53            println!("cleaned stale session: {}", session_name);
54        }
55    }
56    0
57}