Skip to main content

agent_procs/
paths.rs

1use std::env;
2use std::path::PathBuf;
3
4/// macOS limits Unix socket paths to 103 bytes; Linux allows 107.
5const MAX_SOCKET_PATH_LEN: usize = 103;
6
7/// Base directory for sockets and PID files: /tmp/agent-procs-<uid>/
8/// Short fixed path to avoid macOS 103-byte socket path limit.
9pub fn socket_base_dir() -> PathBuf {
10    let uid = nix::unistd::getuid();
11    PathBuf::from(format!("/tmp/agent-procs-{}", uid))
12}
13
14pub fn socket_path(session: &str) -> PathBuf {
15    let path = socket_base_dir().join(format!("{}.sock", session));
16    if path.as_os_str().len() > MAX_SOCKET_PATH_LEN {
17        eprintln!(
18            "warning: socket path exceeds {} bytes ({} bytes): {:?}. \
19             Use a shorter session name.",
20            MAX_SOCKET_PATH_LEN,
21            path.as_os_str().len(),
22            path
23        );
24    }
25    path
26}
27
28pub fn pid_path(session: &str) -> PathBuf {
29    socket_base_dir().join(format!("{}.pid", session))
30}
31
32/// State directory for persistent data (logs, state.json).
33/// Uses $XDG_STATE_HOME, defaults to ~/.local/state/.
34pub fn state_dir(session: &str) -> PathBuf {
35    let base = match env::var("XDG_STATE_HOME") {
36        Ok(dir) => PathBuf::from(dir),
37        Err(_) => {
38            let home = env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
39            PathBuf::from(home).join(".local/state")
40        }
41    };
42    base.join("agent-procs/sessions").join(session)
43}
44
45pub fn log_dir(session: &str) -> PathBuf {
46    state_dir(session).join("logs")
47}
48pub fn state_file(session: &str) -> PathBuf {
49    state_dir(session).join("state.json")
50}