Skip to main content

codex_helper_core/
host_local.rs

1use std::path::Path;
2
3#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
4pub enum HostLocalSessionHistoryMode {
5    #[default]
6    Auto,
7    Disabled,
8    Enabled,
9}
10
11pub fn host_local_session_history_available() -> bool {
12    host_local_session_history_available_for_mode(HostLocalSessionHistoryMode::Auto)
13}
14
15pub fn host_local_session_history_available_for_mode(mode: HostLocalSessionHistoryMode) -> bool {
16    host_local_session_history_available_in_dir(
17        configured_mode(mode),
18        &crate::config::codex_sessions_dir(),
19    )
20}
21
22pub fn host_local_session_history_available_in_dir(
23    mode: HostLocalSessionHistoryMode,
24    sessions_dir: &Path,
25) -> bool {
26    match mode {
27        HostLocalSessionHistoryMode::Disabled => false,
28        HostLocalSessionHistoryMode::Auto | HostLocalSessionHistoryMode::Enabled => {
29            std::fs::metadata(sessions_dir)
30                .map(|metadata| metadata.is_dir())
31                .unwrap_or(false)
32        }
33    }
34}
35
36fn configured_mode(mode: HostLocalSessionHistoryMode) -> HostLocalSessionHistoryMode {
37    match mode {
38        HostLocalSessionHistoryMode::Auto => {
39            mode_from_env().unwrap_or(HostLocalSessionHistoryMode::Auto)
40        }
41        mode => mode,
42    }
43}
44
45fn mode_from_env() -> Option<HostLocalSessionHistoryMode> {
46    let value = std::env::var("CODEX_HELPER_HOST_LOCAL_SESSION_HISTORY").ok()?;
47    let normalized = value.trim().to_ascii_lowercase();
48    match normalized.as_str() {
49        "0" | "false" | "off" | "disabled" | "disable" => {
50            Some(HostLocalSessionHistoryMode::Disabled)
51        }
52        "1" | "true" | "on" | "enabled" | "enable" => Some(HostLocalSessionHistoryMode::Enabled),
53        "" | "auto" => Some(HostLocalSessionHistoryMode::Auto),
54        _ => None,
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn host_local_history_disabled_even_when_dir_exists() {
64        let dir = std::env::temp_dir().join(format!(
65            "codex-helper-host-local-disabled-{}",
66            std::process::id()
67        ));
68        std::fs::create_dir_all(&dir).expect("create temp sessions dir");
69
70        assert!(!host_local_session_history_available_in_dir(
71            HostLocalSessionHistoryMode::Disabled,
72            &dir
73        ));
74
75        let _ = std::fs::remove_dir_all(&dir);
76    }
77
78    #[test]
79    fn host_local_history_auto_requires_existing_dir() {
80        let dir = std::env::temp_dir().join(format!(
81            "codex-helper-host-local-auto-missing-{}",
82            std::process::id()
83        ));
84        let _ = std::fs::remove_dir_all(&dir);
85
86        assert!(!host_local_session_history_available_in_dir(
87            HostLocalSessionHistoryMode::Auto,
88            &dir
89        ));
90
91        std::fs::create_dir_all(&dir).expect("create temp sessions dir");
92        assert!(host_local_session_history_available_in_dir(
93            HostLocalSessionHistoryMode::Auto,
94            &dir
95        ));
96
97        let _ = std::fs::remove_dir_all(&dir);
98    }
99}