agent_procs/cli/
session_cmd.rs1use crate::paths;
2use crate::session;
3
4fn 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}