Skip to main content

StateManager

Struct StateManager 

Source
pub struct StateManager { /* private fields */ }
Expand description

Manages session state storage with per-session directory structure.

State is stored in: ~/.config/autom8/<project>/sessions/<session-id>/ Each session has:

  • state.json - The full run state
  • metadata.json - Quick metadata for session listing

The spec/ and runs/ directories remain at the project level (shared across sessions).

Implementations§

Source§

impl StateManager

Source

pub fn new() -> Result<Self>

Create a StateManager using the config directory for the current project. Auto-detects session ID from the current working directory. Uses ~/.config/autom8/<project-name>/ as the base directory.

Source

pub fn with_session(session_id: String) -> Result<Self>

Create a StateManager for a specific session. Uses ~/.config/autom8/<project-name>/ as the base directory.

Source

pub fn for_project(project_name: &str) -> Result<Self>

Create a StateManager for a specific project name. Auto-detects session ID from the current working directory. Uses ~/.config/autom8/<project-name>/ as the base directory.

Source

pub fn for_project_session( project_name: &str, session_id: String, ) -> Result<Self>

Create a StateManager for a specific project and session. Uses ~/.config/autom8/<project-name>/ as the base directory.

Source

pub fn with_dir(dir: PathBuf) -> Self

Create a StateManager with a custom base directory (for testing).

Source

pub fn with_dir_and_session(dir: PathBuf, session_id: String) -> Self

Create a StateManager with a custom base directory and session ID (for testing).

Source

pub fn session_id(&self) -> &str

Get the session ID for this manager.

Source

pub fn runs_dir(&self) -> PathBuf

Path to the runs directory (archived runs)

Source

pub fn spec_dir(&self) -> PathBuf

Path to the spec directory

Source

pub fn ensure_dirs(&self) -> Result<()>

Source

pub fn ensure_spec_dir(&self) -> Result<PathBuf>

Ensure spec directory exists

Source

pub fn list_specs(&self) -> Result<Vec<PathBuf>>

List all spec JSON files in the config directory’s spec/, sorted by modification time (newest first)

Source

pub fn load_current(&self) -> Result<Option<RunState>>

Source

pub fn load_metadata(&self) -> Result<Option<SessionMetadata>>

Load the metadata for the current session.

Source

pub fn save(&self, state: &RunState) -> Result<()>

Save the run state and update session metadata.

Source

pub fn clear_current(&self) -> Result<()>

Source

pub fn save_live(&self, live_state: &LiveState) -> Result<()>

Save live state atomically (write to temp file, then rename).

Atomic writes prevent the monitor from reading a partial/corrupted file.

Source

pub fn load_live(&self) -> Option<LiveState>

Load live state, returning None if file doesn’t exist or is corrupted.

Gracefully handles missing or malformed files so the monitor can recover without crashing.

Source

pub fn clear_live(&self) -> Result<()>

Remove the live state file.

Source

pub fn archive(&self, state: &RunState) -> Result<PathBuf>

Source

pub fn list_archived(&self) -> Result<Vec<RunState>>

Source

pub fn has_active_run(&self) -> Result<bool>

Source

pub fn list_sessions(&self) -> Result<Vec<SessionMetadata>>

List all sessions for this project with their metadata.

Returns sessions sorted by last_active_at descending (most recent first). Sessions without valid metadata are skipped.

Source

pub fn get_session(&self, session_id: &str) -> Option<StateManager>

Get a specific session by ID.

Returns a new StateManager configured for the specified session. Returns None if the session doesn’t exist.

Source

pub fn list_sessions_with_status(&self) -> Result<Vec<SessionStatus>>

List all sessions with enriched status information.

Returns sessions sorted with current session first, then by last_active_at descending. Includes state details (machine state, current story) and marks stale sessions (deleted worktrees).

Source

pub fn find_session_for_branch( &self, branch: &str, ) -> Result<Option<SessionMetadata>>

Find the most recent session that worked on the specified branch.

Searches all sessions in the project and returns the one with the most recent last_active_at timestamp that matches the branch name. This is used by the improve command to load accumulated knowledge from previous runs on the same branch.

Both worktree sessions and main repo sessions are searched.

§Arguments
  • branch - The branch name to search for
§Returns
  • Ok(Some(metadata)) - Found a session that worked on this branch
  • Ok(None) - No session found for this branch (graceful degradation)
  • Err - Error reading session data
Source

pub fn check_branch_conflict( &self, branch_name: &str, ) -> Result<Option<SessionMetadata>>

Check for branch conflicts with other active sessions.

Returns the conflicting session metadata if another session is already using the specified branch. A session “owns” a branch only while it is actively running (status == Running).

Stale sessions (where the worktree directory no longer exists) are automatically skipped and do not cause conflicts.

§Arguments
  • branch_name - The branch name to check for conflicts
§Returns
  • Ok(Some(metadata)) - Another session is using this branch
  • Ok(None) - No conflict, branch is available
  • Err - Error reading session data

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more