mirror of
https://github.com/openai/codex.git
synced 2026-05-28 15:00:16 +00:00
50 lines
1.9 KiB
Rust
50 lines
1.9 KiB
Rust
use std::io::ErrorKind;
|
|
use std::path::Path;
|
|
|
|
use crate::error::CodexErr;
|
|
use crate::rollout::SESSIONS_SUBDIR;
|
|
|
|
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})"
|
|
)))
|
|
}
|