From 5baf231e076ed96bb2aaba245eb53ad0e4501d76 Mon Sep 17 00:00:00 2001 From: Franz Bettag Date: Tue, 28 Apr 2026 19:11:11 +0200 Subject: Add named persistent sessions (#57) * feat: add named persistent sessions * feat: add session management commands * fix: tighten named session stop and override precedence * fix: handle session help and stop test race * test: isolate default session env test --------- Co-authored-by: Ogulcan Celik --- src/server/headless.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/server/headless.rs') diff --git a/src/server/headless.rs b/src/server/headless.rs index 5f9aad2c..62cf3ba1 100644 --- a/src/server/headless.rs +++ b/src/server/headless.rs @@ -152,12 +152,16 @@ fn toast_message_from_state_change( /// Returns the path for the client protocol socket. /// /// Contract-aligned override behavior: -/// 1. If `HERDR_SOCKET_PATH` is set, derive the client socket path from it by +/// 1. If CLI `--session ` is active, use that session's client socket. +/// 2. If `HERDR_SOCKET_PATH` is set, derive the client socket path from it by /// inserting `-client` before `.sock` (e.g. `herdr.sock` -> `herdr-client.sock`). /// This keeps JSON API and client socket overrides consistent. -/// 2. Otherwise, honor `HERDR_CLIENT_SOCKET_PATH` (legacy/testing fallback). -/// 3. Otherwise, use the app config directory. +/// 3. Otherwise, honor `HERDR_CLIENT_SOCKET_PATH` (legacy/testing fallback). +/// 4. Otherwise, use the active session data directory. pub fn client_socket_path() -> PathBuf { + if crate::session::explicit_session_requested() { + return crate::session::client_socket_path_for(crate::session::active_name().as_deref()); + } client_socket_path_from_overrides( std::env::var(api::SOCKET_PATH_ENV_VAR).ok().as_deref(), std::env::var(CLIENT_SOCKET_PATH_ENV_VAR).ok().as_deref(), @@ -176,7 +180,7 @@ fn client_socket_path_from_overrides( return PathBuf::from(client_socket_override); } - config::config_dir().join("herdr-client.sock") + crate::session::client_socket_path_for(crate::session::active_name().as_deref()) } fn derive_client_socket_from_api_socket(api_socket_path: &Path) -> PathBuf { @@ -2178,6 +2182,8 @@ mod tests { #[test] fn client_socket_path_defaults_to_config_dir() { + std::env::remove_var(crate::session::SESSION_ENV_VAR); + crate::session::clear_explicit_session_for_test(); let path = client_socket_path_from_overrides(None, None); assert_eq!(path, config::config_dir().join("herdr-client.sock")); } -- cgit v1.2.3