codex_helper_core/
host_local.rs1use 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}