agm_core/agent/session_loader/
claude.rs1use 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}