core/src/session_rollout_init_error.rs
49 lines
use std::io::ErrorKind;use std::path::Path;use crate::rollout::SESSIONS_SUBDIR;use codex_protocol::error::CodexErr;pub(crate) fn map_session_init_error(err: &anyhow::Error, codex_home: &Path) -> CodexErr { if let Some(mapped) = err .chain() .filter_map(|cause| cause.downcast_ref::<std::io::Error>()) .find_map(|io_err| map_rollout_io_error(io_err, codex_home)) { return mapped; } CodexErr::Fatal(format!("Failed to initialize session: {err:#}"))}fn map_rollout_io_error(io_err: &std::io::Error, codex_home: &Path) -> Option<CodexErr> { let sessions_dir = codex_home.join(SESSIONS_SUBDIR); let hint = match io_err.kind() { ErrorKind::PermissionDenied => format!( "Codex cannot access session files at {} (permission denied). If sessions were created using sudo, fix ownership: sudo chown -R $(whoami) {}", sessions_dir.display(), codex_home.display() ), ErrorKind::NotFound => format!( "Session storage missing at {}. Create the directory or choose a different Codex home.", sessions_dir.display() ), ErrorKind::AlreadyExists => format!( "Session storage path {} is blocked by an existing file. Remove or rename it so Codex can create sessions.", sessions_dir.display() ), ErrorKind::InvalidData | ErrorKind::InvalidInput => format!( "Session data under {} looks corrupt or unreadable. Clearing the sessions directory may help (this will remove saved threads).", sessions_dir.display() ), ErrorKind::IsADirectory | ErrorKind::NotADirectory => format!( "Session storage path {} has an unexpected type. Ensure it is a directory Codex can use for session files.", sessions_dir.display() ), _ => return None, }; Some(CodexErr::Fatal(format!( "{hint} (underlying error: {io_err})" )))}