use basemyai_core::{MaintenanceTask, Result, Store};
use crate::now_unix;
#[derive(Debug, Clone, Copy)]
pub struct AdaptiveForgetting {
pub capacity_per_agent: usize,
pub recency_half_life_secs: i64,
}
#[async_trait::async_trait]
impl MaintenanceTask for AdaptiveForgetting {
fn name(&self) -> &str {
"adaptive-forgetting"
}
async fn run(&self, store: &Store) -> Result<()> {
let conn = store.connect();
let now = now_unix();
let half_life = self.recency_half_life_secs;
let capacity = i64::try_from(self.capacity_per_agent).unwrap_or(i64::MAX);
conn.execute(
"DELETE FROM memory WHERE id IN (\
SELECT id FROM (\
SELECT id, ROW_NUMBER() OVER (\
PARTITION BY agent_id \
ORDER BY importance \
+ CAST(?2 AS REAL) / (\
CAST(?2 AS REAL) \
+ max(0, CAST(?1 AS REAL) - COALESCE(last_access, valid_from))\
) DESC, id\
) AS rn FROM memory\
) WHERE rn > ?3\
)",
basemyai_core::libsql::params![now, half_life, capacity],
)
.await
.map_err(|e| basemyai_core::CoreError::Storage(e.to_string()))?;
Ok(())
}
}