pub struct WorkspaceManager { /* private fields */ }Expand description
Central registry of all active session workspaces.
Thread-safe via DashMap; every public method is either &self or
returns a scoped reference guard.
The optional cache field holds an Arc-wrapped WorkspaceCache
implementation. In single-pod deployments the default NoOpCache is
used. Multi-pod deployments can supply a ValkeyCache (or any other
implementation) via WorkspaceManager::with_cache.
Implementations§
Source§impl WorkspaceManager
impl WorkspaceManager
Sourcepub fn with_cache(db: PgPool, cache: Arc<dyn WorkspaceCache>) -> Self
pub fn with_cache(db: PgPool, cache: Arc<dyn WorkspaceCache>) -> Self
Create a workspace manager with an explicit cache implementation.
Use this constructor when a ValkeyCache or other L2 cache is
available. Pass Arc::new(NoOpCache) to opt-out of caching.
Sourcepub fn cache(&self) -> &dyn WorkspaceCache
pub fn cache(&self) -> &dyn WorkspaceCache
Return a reference to the underlying cache implementation.
Sourcepub fn next_agent_name(&self, repo_id: &Uuid) -> String
pub fn next_agent_name(&self, repo_id: &Uuid) -> String
Auto-assign the next agent name for a repository.
Returns “agent-1”, “agent-2”, etc. incrementing per repo.
Sourcepub async fn create_workspace(
&self,
session_id: SessionId,
repo_id: RepoId,
agent_id: AgentId,
changeset_id: Uuid,
intent: String,
base_commit: String,
mode: WorkspaceMode,
agent_name: String,
) -> Result<SessionId>
pub async fn create_workspace( &self, session_id: SessionId, repo_id: RepoId, agent_id: AgentId, changeset_id: Uuid, intent: String, base_commit: String, mode: WorkspaceMode, agent_name: String, ) -> Result<SessionId>
Create a new workspace for a session and register it.
Sourcepub fn get_workspace(
&self,
session_id: &SessionId,
) -> Option<Ref<'_, SessionId, SessionWorkspace>>
pub fn get_workspace( &self, session_id: &SessionId, ) -> Option<Ref<'_, SessionId, SessionWorkspace>>
Get an immutable reference to a workspace.
Sourcepub fn get_workspace_mut(
&self,
session_id: &SessionId,
) -> Option<RefMut<'_, SessionId, SessionWorkspace>>
pub fn get_workspace_mut( &self, session_id: &SessionId, ) -> Option<RefMut<'_, SessionId, SessionWorkspace>>
Get a mutable reference to a workspace.
Sourcepub fn destroy_workspace(
&self,
session_id: &SessionId,
) -> Option<SessionWorkspace>
pub fn destroy_workspace( &self, session_id: &SessionId, ) -> Option<SessionWorkspace>
Remove and drop a workspace.
Sourcepub fn active_count(&self, repo_id: RepoId) -> usize
pub fn active_count(&self, repo_id: RepoId) -> usize
Count active workspaces for a specific repository.
Sourcepub fn active_sessions_for_repo(
&self,
repo_id: RepoId,
exclude_session: Option<SessionId>,
) -> Vec<SessionId> ⓘ
pub fn active_sessions_for_repo( &self, repo_id: RepoId, exclude_session: Option<SessionId>, ) -> Vec<SessionId> ⓘ
Return session IDs of all active workspaces for a repo, optionally excluding one session.
Sourcepub fn gc_expired(&self) -> Vec<SessionId> ⓘ
pub fn gc_expired(&self) -> Vec<SessionId> ⓘ
Garbage-collect expired persistent workspaces.
Ephemeral workspaces are not GC’d here — they are destroyed when
the session disconnects. This only handles persistent workspaces
whose expires_at deadline has passed.
Sourcepub fn cleanup_disconnected(&self, active_session_ids: &[Uuid])
pub fn cleanup_disconnected(&self, active_session_ids: &[Uuid])
Destroy workspaces for sessions that no longer exist. Call this when a session disconnects or during periodic cleanup.
Sourcepub fn gc_expired_sessions(
&self,
idle_ttl: Duration,
max_ttl: Duration,
) -> Vec<SessionId> ⓘ
pub fn gc_expired_sessions( &self, idle_ttl: Duration, max_ttl: Duration, ) -> Vec<SessionId> ⓘ
Remove workspaces that are idle beyond idle_ttl or alive beyond max_ttl.
Returns the list of expired session IDs. This complements [gc_expired]
(which handles persistent workspace deadlines) by enforcing activity-based
and hard-maximum lifetime limits on all workspaces.
Sourcepub fn total_active(&self) -> usize
pub fn total_active(&self) -> usize
Total number of active workspaces across all repos.
Sourcepub fn describe_other_modifiers(
&self,
file_path: &str,
repo_id: RepoId,
exclude_session: SessionId,
) -> String
pub fn describe_other_modifiers( &self, file_path: &str, repo_id: RepoId, exclude_session: SessionId, ) -> String
Describe which other sessions have modified a given file.
Returns a formatted string like "fn create_task modified by agent-2"
or "modified by agent-2, agent-3". Returns an empty string if no
other session has touched the file.
Sourcepub fn list_sessions(&self, repo_id: RepoId) -> Vec<SessionInfo>
pub fn list_sessions(&self, repo_id: RepoId) -> Vec<SessionInfo>
List all active sessions for a given repository.
Auto Trait Implementations§
impl Freeze for WorkspaceManager
impl !RefUnwindSafe for WorkspaceManager
impl Send for WorkspaceManager
impl Sync for WorkspaceManager
impl Unpin for WorkspaceManager
impl UnsafeUnpin for WorkspaceManager
impl !UnwindSafe for WorkspaceManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more