agm_core/agent/session_loader/
codex.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::Codex.sessions_root_path())?;
8 let session_paths = ytil_sys::file::find_matching_recursively_in_dir(
9 &root,
10 |entry| entry.path().extension().is_some_and(|ext| ext == "jsonl"),
11 |_| false,
12 )?;
13
14 let mut sessions = Vec::new();
15 for session_path in session_paths {
16 let content = std::fs::read_to_string(&session_path)
17 .context("failed to read Codex session file")
18 .attach_with(|| format!("path={}", session_path.display()))?;
19 let session_name = session_path
20 .file_stem()
21 .and_then(|name| name.to_str())
22 .unwrap_or_default();
23 let mut session = crate::agent::session_parser::codex::parse(&content, session_name)
24 .attach_with(|| format!("path={}", session_path.display()))?;
25 if session.workspace.is_dir() {
26 session.path = session_path;
27 sessions.push(session);
28 }
29 }
30
31 Ok(sessions)
32}