Skip to main content

agm_core/agent/session_loader/
claude.rs

1use rootcause::prelude::ResultExt as _;
2
3use crate::agent::Agent;
4use crate::agent::session::Session;
5
6pub fn load_sessions() -> rootcause::Result<Vec<Session>> {
7    let root = ytil_sys::dir::build_home_path(Agent::Claude.sessions_root_path())?;
8    let session_paths = ytil_sys::file::find_matching_recursively_in_dir(
9        &root,
10        |entry| {
11            let path = entry.path();
12            path.extension().is_some_and(|ext| ext == "jsonl")
13                && path
14                    .file_name()
15                    .and_then(|name| name.to_str())
16                    .is_some_and(|name| !matches!(name, "sessions-index.json" | "session.json"))
17        },
18        |_| false,
19    )?;
20
21    let mut sessions = Vec::new();
22    for session_path in session_paths {
23        let content = std::fs::read_to_string(&session_path)
24            .context("failed to read Claude session file")
25            .attach_with(|| format!("path={}", session_path.display()))?;
26        let mut session = crate::agent::session_parser::claude::parse(&content)
27            .attach_with(|| format!("path={}", session_path.display()))?;
28        if session.workspace.is_dir() {
29            session.path = session_path;
30            sessions.push(session);
31        }
32    }
33
34    Ok(sessions)
35}