1use std::env;
2use std::path::PathBuf;
3
4const MAX_SOCKET_PATH_LEN: usize = 103;
6
7pub 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
32pub 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}