From 28e6cc0965350e65a512abc473df4cbaec69ecb4 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 7 Apr 2026 16:00:57 +0900 Subject: [PATCH] feat(runtime): activate per-worktree session isolation (#41) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove #[cfg(test)] gate from session_control module — SessionStore is now available at runtime, not just in tests. Export SessionStore and add workspace_sessions_dir() helper that creates fingerprinted session directories per workspace root. This is the #41 kill shot: parallel opencode serve instances will use separate session namespaces based on workspace fingerprint instead of sharing a global ~/.local/share/opencode/ store. The CLI already uses cwd/.claw/sessions/ (sessions_dir()), and now SessionStore::from_cwd() adds workspace hash isolation on top. --- rust/crates/runtime/src/lib.rs | 4 ++-- rust/crates/runtime/src/session.rs | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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()) +}