Skip to main content

agent_procs/cli/
session_cmd.rs

1use crate::paths;
2use crate::session;
3
4/// Iterate PID files in the socket base dir, yielding `(session_name, entry)` pairs.
5fn pid_entries() -> impl Iterator<Item = (String, std::fs::DirEntry)> {
6    let base = paths::socket_base_dir();
7    std::fs::read_dir(base)
8        .into_iter()
9        .flatten()
10        .flatten()
11        .filter_map(|entry| {
12            let name = entry.file_name().to_string_lossy().to_string();
13            let is_pid = std::path::Path::new(&name)
14                .extension()
15                .is_some_and(|ext| ext.eq_ignore_ascii_case("pid"));
16            if is_pid {
17                let session_name = name.trim_end_matches(".pid").to_string();
18                Some((session_name, entry))
19            } else {
20                None
21            }
22        })
23}
24
25pub fn list() -> i32 {
26    let mut found = false;
27    for (session_name, entry) in pid_entries() {
28        if !found {
29            println!("{:<20} STATUS", "SESSION");
30            found = true;
31        }
32        let status = if session::is_daemon_alive(&entry.path()) {
33            "running"
34        } else {
35            "stale"
36        };
37        println!("{:<20} {}", session_name, status);
38    }
39    if !found {
40        println!("no active sessions");
41    }
42    0
43}
44
45pub fn clean() -> i32 {
46    for (session_name, entry) in pid_entries() {
47        if !session::is_daemon_alive(&entry.path()) {
48            let _ = std::fs::remove_file(paths::socket_path(&session_name));
49            let _ = std::fs::remove_file(paths::pid_path(&session_name));
50            let _ = std::fs::remove_dir_all(paths::state_dir(&session_name));
51            println!("cleaned stale session: {}", session_name);
52        }
53    }
54    0
55}