diff --git a/rust/crates/runtime/src/lib.rs b/rust/crates/runtime/src/lib.rs index 7d23f35..e87dfd7 100644 --- a/rust/crates/runtime/src/lib.rs +++ b/rust/crates/runtime/src/lib.rs @@ -35,8 +35,8 @@ pub mod recovery_recipes; mod remote; pub mod sandbox; mod session; -#[cfg(test)] -mod session_control; +pub mod session_control; +pub use session_control::SessionStore; mod sse; pub mod stale_base; pub mod stale_branch; diff --git a/rust/crates/runtime/src/session.rs b/rust/crates/runtime/src/session.rs index e70ceda..d7f4a54 100644 --- a/rust/crates/runtime/src/session.rs +++ b/rust/crates/runtime/src/session.rs @@ -1434,3 +1434,12 @@ mod tests { .collect() } } + +/// Per-worktree session isolation: returns a session directory namespaced +/// by the workspace fingerprint of the given working directory. +/// This prevents parallel `opencode serve` instances from colliding. +pub fn workspace_sessions_dir(cwd: &std::path::Path) -> Result { + let store = crate::session_control::SessionStore::from_cwd(cwd) + .map_err(|e| SessionError::Io(std::io::Error::new(std::io::ErrorKind::Other, e.to_string())))?; + Ok(store.sessions_dir().to_path_buf()) +}