use super::types::SessionState;
use crate::core::pathutil::has_project_marker;
pub(crate) fn normalize_loaded_session(mut session: SessionState) -> SessionState {
if matches!(session.project_root.as_deref(), Some(r) if r.trim().is_empty()) {
session.project_root = None;
}
if matches!(session.shell_cwd.as_deref(), Some(c) if c.trim().is_empty()) {
session.shell_cwd = None;
}
if session.canonical_checkpoint.is_none()
&& let (Some(root), Some(cwd)) = (&session.project_root, &session.shell_cwd)
{
let root_p = std::path::Path::new(root);
let cwd_p = std::path::Path::new(cwd);
if is_agent_or_temp_dir(root_p) && !has_project_marker(root_p) && has_project_marker(cwd_p)
{
session.project_root = Some(cwd.clone());
}
}
if session.compression_level.is_empty() {
if session.terse_mode {
session.compression_level = "lite".to_string();
} else if let Some(env_level) = crate::core::config::CompressionLevel::from_env() {
session.compression_level = env_level.label().to_string();
session.terse_mode = env_level.is_active();
} else {
session.compression_level = "off".to_string();
}
} else if !session.terse_mode {
let level =
crate::core::config::CompressionLevel::from_str_label(&session.compression_level)
.unwrap_or_default();
session.terse_mode = level.is_active();
}
session
}
pub(crate) fn session_matches_project_root(
session: &SessionState,
target_root: &std::path::Path,
) -> bool {
let recorded = session
.project_root
.as_deref()
.or(session.shell_cwd.as_deref());
recorded.is_some_and(|path| resolve_for_match(std::path::Path::new(path)) == target_root)
}
fn resolve_for_match(path: &std::path::Path) -> std::path::PathBuf {
if crate::core::pathutil::may_probe_path(path) {
crate::core::pathutil::safe_canonicalize_or_self(path)
} else {
path.to_path_buf()
}
}
fn is_agent_or_temp_dir(dir: &std::path::Path) -> bool {
let s = dir.to_string_lossy();
s.contains("/.claude")
|| s.contains("/.codebuddy")
|| s.contains("/.codex")
|| s.contains("/var/folders/")
|| s.contains("/tmp/")
|| s.contains("\\.claude")
|| s.contains("\\.codebuddy")
|| s.contains("\\.codex")
|| s.contains("\\AppData\\Local\\Temp")
|| s.contains("\\Temp\\")
}