use super::*;
const MTIME_TOLERANCE_SECS: i64 = 120;
pub(crate) fn attach_snapshot_content(events: &mut [FileEvent], session_path: &Path) {
let owner = crate::subagent::parent_session_id_from_path(session_path)
.unwrap_or_else(|| crate::subagent::session_id_from_path(session_path));
let Ok(home) = crate::path::claude_home() else {
return;
};
let store = home.join("file-history").join(owner);
let mut prev_version: Option<u64> = None;
for e in events.iter_mut() {
let EventKind::HistorySnapshotMarker {
version,
backup_file,
backup_time,
content,
} = &mut e.kind
else {
continue;
};
let changed = match (prev_version, *version) {
(Some(p), Some(v)) => v != p,
(None, Some(_)) => true, _ => false,
};
if version.is_some() {
prev_version = *version;
}
if !changed {
continue;
}
let (Some(name), Some(bt)) = (backup_file.as_deref(), backup_time.as_deref()) else {
continue;
};
*content = verified_store_content(&store.join(name), bt);
}
}
pub(crate) fn verified_store_content(path: &Path, backup_time: &str) -> Option<String> {
let recorded: jiff::Timestamp = backup_time.parse().ok()?;
let meta = std::fs::metadata(path).ok()?;
let mtime = meta.modified().ok()?;
let mtime_secs =
i64::try_from(mtime.duration_since(std::time::UNIX_EPOCH).ok()?.as_secs()).ok()?;
if (mtime_secs - recorded.as_second()).abs() > MTIME_TOLERANCE_SECS {
return None; }
String::from_utf8(std::fs::read(path).ok()?).ok()
}