Skip to main content

systemprompt_cli/session/
store.rs

1//! On-disk store for CLI session records, keyed by profile.
2//!
3//! Every function takes the [`ResolvedPaths`] it reads and writes under, so
4//! the caller decides which project's `.systemprompt` directory is touched.
5//!
6//! Copyright (c) systemprompt.io — Business Source License 1.1.
7//! See <https://systemprompt.io> for licensing details.
8
9use anyhow::Result;
10use systemprompt_cloud::{CliSession, SessionKey, SessionStore};
11use systemprompt_config::ProfileBootstrap;
12
13use crate::paths::ResolvedPaths;
14
15pub fn clear_session(paths: &ResolvedPaths) -> Result<()> {
16    let profile = ProfileBootstrap::get()?;
17    let tenant_id = profile.cloud.as_ref().and_then(|c| c.tenant_id.as_ref());
18    let session_key = SessionKey::from_tenant_id(tenant_id);
19
20    let sessions_dir = paths.sessions_dir();
21
22    let mut store = SessionStore::load_or_create(&sessions_dir)?;
23    store.remove_session(&session_key);
24    store.save(&sessions_dir)?;
25
26    Ok(())
27}
28
29pub fn clear_all_sessions(paths: &ResolvedPaths) -> Result<()> {
30    let sessions_dir = paths.sessions_dir();
31
32    let store = SessionStore::new();
33    store.save(&sessions_dir)?;
34
35    Ok(())
36}
37
38pub fn get_session_for_key(
39    paths: &ResolvedPaths,
40    session_key: &SessionKey,
41    issuer: &str,
42) -> Result<Option<CliSession>> {
43    let sessions_dir = paths.sessions_dir();
44
45    let store = SessionStore::load_or_create(&sessions_dir)?;
46    Ok(store.get_valid_session(session_key, issuer).cloned())
47}
48
49pub fn load_session_store(paths: &ResolvedPaths) -> Result<SessionStore> {
50    let sessions_dir = paths.sessions_dir();
51    SessionStore::load_or_create(&sessions_dir).map_err(Into::into)
52}