pub struct SessionWorkspace {Show 15 fields
pub id: WorkspaceId,
pub session_id: SessionId,
pub repo_id: RepoId,
pub agent_id: AgentId,
pub agent_name: String,
pub changeset_id: Uuid,
pub intent: String,
pub base_commit: String,
pub overlay: FileOverlay,
pub graph: SessionGraph,
pub mode: WorkspaceMode,
pub state: WorkspaceState,
pub created_at: Instant,
pub last_active: Instant,
pub files_read: Arc<DashMap<String, DateTime<Utc>>>,
}Expand description
An isolated workspace for a single agent session.
Reads resolve overlay-first, then fall through to the Git tree at
base_commit. Writes go exclusively to the overlay.
Fields§
§id: WorkspaceId§session_id: SessionId§repo_id: RepoId§agent_id: AgentId§agent_name: String§changeset_id: Uuid§intent: String§base_commit: String§overlay: FileOverlay§graph: SessionGraph§mode: WorkspaceMode§state: WorkspaceState§created_at: Instant§last_active: Instant§files_read: Arc<DashMap<String, DateTime<Utc>>>Per-path wall-clock timestamp of the most recent dk_file_read in
this session. Consumed by the STALE_OVERLAY pre-write check so a
session whose local view predates a competing submitted changeset is
forced to re-read before writing. Interior-mutable so it can be
updated through &SessionWorkspace (mirrors how overlay manages
its own locking).
Implementations§
Source§impl SessionWorkspace
impl SessionWorkspace
Sourcepub fn rehydrate(
workspace_id: WorkspaceId,
session_id: SessionId,
repo_id: RepoId,
agent_id: AgentId,
changeset_id: Uuid,
intent: String,
base_commit: String,
mode: WorkspaceMode,
agent_name: String,
db: PgPool,
) -> Self
pub fn rehydrate( workspace_id: WorkspaceId, session_id: SessionId, repo_id: RepoId, agent_id: AgentId, changeset_id: Uuid, intent: String, base_commit: String, mode: WorkspaceMode, agent_name: String, db: PgPool, ) -> Self
Rehydrate a workspace from existing database state without inserting a new row.
Used by [WorkspaceManager::resume] to reconstruct an in-memory
SessionWorkspace after the DB row has already been updated (session_id
rotated, stranded_at cleared). Unlike SessionWorkspace::new, this
constructor does not insert a new session_workspaces row — it only
wires up the in-memory structures pointing at the existing workspace_id.
Sourcepub async fn new(
session_id: SessionId,
repo_id: RepoId,
agent_id: AgentId,
changeset_id: Uuid,
intent: String,
base_commit: String,
mode: WorkspaceMode,
agent_name: String,
db: PgPool,
) -> Result<Self>
pub async fn new( session_id: SessionId, repo_id: RepoId, agent_id: AgentId, changeset_id: Uuid, intent: String, base_commit: String, mode: WorkspaceMode, agent_name: String, db: PgPool, ) -> Result<Self>
Create a new workspace and persist metadata to the database.
Sourcepub fn read_file(
&self,
path: &str,
git_repo: &GitRepository,
) -> Result<FileReadResult>
pub fn read_file( &self, path: &str, git_repo: &GitRepository, ) -> Result<FileReadResult>
Read a file through the overlay-first layer.
- If the overlay has a
ModifiedorAddedentry, return that content. - If the overlay has a
Deletedentry, return a “not found” error. - Otherwise, read from the Git tree at
base_commit.
Sourcepub async fn write_file(
&self,
path: &str,
content: Vec<u8>,
git_repo: &GitRepository,
) -> Result<String>
pub async fn write_file( &self, path: &str, content: Vec<u8>, git_repo: &GitRepository, ) -> Result<String>
Write a file through the overlay.
Determines whether the file is new (not in base tree) or modified.
Sourcepub async fn delete_file(&self, path: &str) -> Result<()>
pub async fn delete_file(&self, path: &str) -> Result<()>
Delete a file in the overlay.
Sourcepub fn list_files(
&self,
git_repo: &GitRepository,
only_modified: bool,
prefix: Option<&str>,
) -> Result<Vec<String>>
pub fn list_files( &self, git_repo: &GitRepository, only_modified: bool, prefix: Option<&str>, ) -> Result<Vec<String>>
List files visible in this workspace.
If only_modified is true, return only overlay entries.
Otherwise, return the full base tree merged with overlay changes.
When prefix is Some, only paths starting with the given prefix
are included. The filter is applied early in the pipeline so that
building the HashSet only contains relevant entries rather than
the entire tree (which can be 100k+ files in large repos).
Sourcepub fn mark_read(&self, path: &str)
pub fn mark_read(&self, path: &str)
Record that this session just read path at the current wall-clock
time. Called from handle_file_read to feed the STALE_OVERLAY
pre-write check: a session whose per-path timestamp predates a
competing submitted changeset touching the same path is forced to
re-read before the next dk_file_write is accepted.
Sourcepub fn last_read(&self, path: &str) -> Option<DateTime<Utc>>
pub fn last_read(&self, path: &str) -> Option<DateTime<Utc>>
Return the wall-clock timestamp of the most recent dk_file_read
for path, or None if this session has never read it.
Sourcepub async fn reindex_from_overlay(&mut self) -> Result<()>
pub async fn reindex_from_overlay(&mut self) -> Result<()>
Re-parse overlay file contents and rebuild the semantic graph.
Called by [WorkspaceManager::resume] after the overlay is restored from
the database. Walks every entry in the overlay, parses supported files,
and updates the session graph delta accordingly:
- Deleted entries: all session-owned symbols for that file are
removed from the delta by iterating
added_symbolsandmodified_symbolsand dropping matches. - Added / Modified entries: the content is re-parsed by the
[
ParserRegistry]. The parse result is fed intoSessionGraph::update_from_parsewith an empty base (all symbols in overlay files are session additions — there is no base-symbol set available at this point). Unsupported file extensions are silently skipped.
Auto Trait Implementations§
impl !RefUnwindSafe for SessionWorkspace
impl !UnwindSafe for SessionWorkspace
impl Freeze for SessionWorkspace
impl Send for SessionWorkspace
impl Sync for SessionWorkspace
impl Unpin for SessionWorkspace
impl UnsafeUnpin for SessionWorkspace
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
impl<T> Fruit 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