Skip to main content

SessionStore

Struct SessionStore 

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

Thread-safe persistent session store backed by a JSON file.

Manages active Claude Code sessions, tracking which Slack threads correspond to which agent sessions. Persists to disk atomically to survive restarts.

§Thread Safety

All methods are async and internally use RwLock for concurrent access. Multiple readers can access simultaneously; writes are exclusive.

Implementations§

Source§

impl SessionStore

Source

pub fn new(path: PathBuf) -> Self

Creates a new session store, loading existing sessions from disk if present.

§Arguments
  • path - Path to the JSON file for persisting sessions
§Returns

A new SessionStore instance. If the file doesn’t exist or is invalid, starts with an empty session map (does not error). Creates a new session store using blocking I/O for initial load.

Source

pub async fn insert(&self, session: SessionInfo) -> Result<()>

Inserts a new session and persists to disk atomically.

§Arguments
  • session - Session information to store
§Errors

Returns an error if the write to disk fails (filesystem error, permissions, etc.)

Source

pub async fn get_by_thread(&self, thread_ts: &str) -> Option<SessionInfo>

Retrieves a session by its Slack thread timestamp.

§Arguments
  • thread_ts - Slack thread timestamp (unique identifier for the thread)
§Returns

The session if found, or None if no session exists for this thread

Source

pub async fn update<F>(&self, thread_ts: &str, f: F) -> Result<()>
where F: FnOnce(&mut SessionInfo),

Updates a session in-place and persists to disk atomically.

§Arguments
  • thread_ts - Thread timestamp of the session to update
  • f - Closure that modifies the session
§Errors

Returns SessionNotFound if the thread doesn’t exist, or a write error if persistence fails.

§Example
store.update("1234.5678", |session| {
    session.total_turns += 1;
    session.last_active = Utc::now();
}).await?;
Source

pub async fn active_sessions(&self) -> Vec<SessionInfo>

Source

pub async fn has_session_id(&self, session_id: &str) -> bool

Checks if any session has the given agent session ID.

Used to prevent duplicate sessions and detect races in session sync.

§Arguments
  • session_id - Agent session ID to search for
§Returns

true if a session with this ID exists, false otherwise

Source

pub async fn prune_stale_channels( &self, repo_channels: &HashMap<String, String>, )

Remove sessions whose channel_id doesn’t match the current channel for their repo.

Source

pub async fn prune_expired(&self, ttl_days: i64)

Remove sessions whose last_active is older than the TTL.

Trait Implementations§

Source§

impl Clone for SessionStore

Source§

fn clone(&self) -> SessionStore

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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