Skip to main content

subcog/cli/
gc.rs

1//! Garbage collection CLI command.
2
3#![allow(clippy::print_stdout)]
4
5use crate::Result;
6use crate::services::TombstoneService;
7use crate::storage::get_user_data_dir;
8use crate::storage::persistence::FilesystemBackend;
9use std::sync::Arc;
10use std::time::Duration;
11
12/// Runs garbage collection.
13///
14/// # Errors
15///
16/// Returns an error if persistence access or tombstone operations fail.
17pub fn execute(dry_run: bool, purge: bool, older_than_days: u64) -> Result<()> {
18    // Use user-level persistence directory (project facets live in metadata)
19    let data_dir = get_user_data_dir()?;
20    let persistence = Arc::new(FilesystemBackend::new(data_dir.join("memories")))
21        as Arc<dyn crate::storage::traits::PersistenceBackend>;
22    let tombstone_service = TombstoneService::new(persistence.clone());
23
24    if dry_run {
25        println!("Dry-run mode: showing what would be deleted\n");
26
27        // List tombstoned memories
28        let all_ids = persistence.list_ids()?;
29        let mut tombstoned_count = 0;
30
31        for id in all_ids {
32            let Some(memory) = persistence.get(&id)? else {
33                continue;
34            };
35            if memory.status != crate::models::MemoryStatus::Tombstoned {
36                continue;
37            }
38            tombstoned_count += 1;
39            println!(
40                "Would delete: {} ({})",
41                id.as_str(),
42                memory.namespace.as_str()
43            );
44        }
45
46        println!("\nTotal tombstoned memories: {tombstoned_count}");
47        return Ok(());
48    }
49
50    if purge {
51        let older_than = Duration::from_secs(older_than_days * 24 * 60 * 60);
52        let purged = tombstone_service.purge_tombstoned(older_than)?;
53
54        println!("Purged {purged} tombstoned memories older than {older_than_days} days");
55    } else {
56        println!("Garbage collection complete");
57        println!("Use --purge to permanently delete tombstoned memories");
58        println!("Use --dry-run to preview what would be deleted");
59    }
60
61    Ok(())
62}