use super::*;
pub async fn sync_has_gotcha_edges(
store: &Store,
gotcha_key: &str,
old_files: &[String],
new_files: &[String],
) -> bool {
let old_set: HashSet<&str> = old_files.iter().map(String::as_str).collect();
let new_set: HashSet<&str> = new_files.iter().map(String::as_str).collect();
let mut failed = false;
let ts = now_secs().to_le_bytes();
for file_path in new_set.difference(&old_set) {
let file_key = format!("file:{file_path}");
let edge_key = Edge::new(&file_key, EdgeKind::HasGotcha, gotcha_key).to_key();
if let Err(e) = store.put_raw(&edge_key, &ts).await {
tracing::warn!("gotcha_edges: add failed for {file_key} → {gotcha_key}: {e}");
failed = true;
crate::store::repair::mark_dirty(store, gotcha_key, &format!("edge add failed: {e}"))
.await;
}
}
for file_path in old_set.difference(&new_set) {
let file_key = format!("file:{file_path}");
let edge_key = Edge::new(&file_key, EdgeKind::HasGotcha, gotcha_key).to_key();
if let Err(e) = store.delete(&edge_key).await {
tracing::warn!("gotcha_edges: remove failed for {file_key} → {gotcha_key}: {e}");
failed = true;
crate::store::repair::mark_dirty(
store,
gotcha_key,
&format!("edge remove failed: {e}"),
)
.await;
}
}
!failed
}
pub async fn invalidate_consultation_receipts(store: &Store, affected_files: &[String]) {
for file_path in affected_files {
let consulted_key = format!("session:consulted:file:{file_path}");
let _ = store.delete(&consulted_key).await;
}
}
pub async fn propagate_confirmation_to_files(store: &Store, affected_files: &[String]) {
for file_path in affected_files {
let file_key = format!("file:{file_path}");
if let Ok(Some(mut file_record)) = store.get(&file_key).await {
file_record.confidence.confirmation_count += 1;
let now = now_secs();
file_record.updated_at = now;
file_record.version.logical_clock += 1;
file_record.version.wall_clock = now;
if let Err(e) = store.put(&file_key, &file_record).await {
tracing::warn!("propagate_confirmation: failed to update {file_key}: {e}");
}
}
}
}