Skip to main content

agm_core/agent/session_loader/
codex.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::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}