codex-helper-core 0.18.0

Core library for codex-helper.
Documentation
use std::path::Path;

#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum HostLocalSessionHistoryMode {
    #[default]
    Auto,
    Disabled,
    Enabled,
}

pub fn host_local_session_history_available() -> bool {
    host_local_session_history_available_for_mode(HostLocalSessionHistoryMode::Auto)
}

pub fn host_local_session_history_available_for_mode(mode: HostLocalSessionHistoryMode) -> bool {
    host_local_session_history_available_in_dir(
        configured_mode(mode),
        &crate::config::codex_sessions_dir(),
    )
}

pub fn host_local_session_history_available_in_dir(
    mode: HostLocalSessionHistoryMode,
    sessions_dir: &Path,
) -> bool {
    match mode {
        HostLocalSessionHistoryMode::Disabled => false,
        HostLocalSessionHistoryMode::Auto | HostLocalSessionHistoryMode::Enabled => {
            std::fs::metadata(sessions_dir)
                .map(|metadata| metadata.is_dir())
                .unwrap_or(false)
        }
    }
}

fn configured_mode(mode: HostLocalSessionHistoryMode) -> HostLocalSessionHistoryMode {
    match mode {
        HostLocalSessionHistoryMode::Auto => {
            mode_from_env().unwrap_or(HostLocalSessionHistoryMode::Auto)
        }
        mode => mode,
    }
}

fn mode_from_env() -> Option<HostLocalSessionHistoryMode> {
    let value = std::env::var("CODEX_HELPER_HOST_LOCAL_SESSION_HISTORY").ok()?;
    let normalized = value.trim().to_ascii_lowercase();
    match normalized.as_str() {
        "0" | "false" | "off" | "disabled" | "disable" => {
            Some(HostLocalSessionHistoryMode::Disabled)
        }
        "1" | "true" | "on" | "enabled" | "enable" => Some(HostLocalSessionHistoryMode::Enabled),
        "" | "auto" => Some(HostLocalSessionHistoryMode::Auto),
        _ => None,
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn host_local_history_disabled_even_when_dir_exists() {
        let dir = std::env::temp_dir().join(format!(
            "codex-helper-host-local-disabled-{}",
            std::process::id()
        ));
        std::fs::create_dir_all(&dir).expect("create temp sessions dir");

        assert!(!host_local_session_history_available_in_dir(
            HostLocalSessionHistoryMode::Disabled,
            &dir
        ));

        let _ = std::fs::remove_dir_all(&dir);
    }

    #[test]
    fn host_local_history_auto_requires_existing_dir() {
        let dir = std::env::temp_dir().join(format!(
            "codex-helper-host-local-auto-missing-{}",
            std::process::id()
        ));
        let _ = std::fs::remove_dir_all(&dir);

        assert!(!host_local_session_history_available_in_dir(
            HostLocalSessionHistoryMode::Auto,
            &dir
        ));

        std::fs::create_dir_all(&dir).expect("create temp sessions dir");
        assert!(host_local_session_history_available_in_dir(
            HostLocalSessionHistoryMode::Auto,
            &dir
        ));

        let _ = std::fs::remove_dir_all(&dir);
    }
}