remem/memory/scope_cleanup/
merge.rs1use anyhow::Result;
2use rusqlite::Connection;
3use serde::Serialize;
4
5use super::audit::{load_memory_audit_rows, DuplicateCluster};
6use super::mutate::ObjectMutation;
7use super::plan::{apply_memory_cleanup_plan, build_preference_cleanup_plan};
8use super::preference_cluster::preference_clusters;
9
10#[derive(Debug, Clone)]
11pub struct MergePreferencesRequest<'a> {
12 pub project: &'a str,
13 pub dry_run: bool,
14 pub confirm: bool,
15}
16
17#[derive(Debug, Clone, Serialize)]
18pub struct MergePreferencesResult {
19 pub dry_run: bool,
20 pub project: String,
21 pub clusters: Vec<DuplicateCluster>,
22 pub affected: Vec<ObjectMutation>,
23}
24
25pub fn merge_preferences(
26 conn: &Connection,
27 req: &MergePreferencesRequest<'_>,
28) -> Result<MergePreferencesResult> {
29 let dry_run = req.dry_run || !req.confirm;
30 let memories = load_memory_audit_rows(conn, req.project)?;
31 let clusters = preference_clusters(&memories, req.project);
32 let mut affected = Vec::new();
33 if dry_run || clusters.is_empty() {
34 return Ok(MergePreferencesResult {
35 dry_run,
36 project: req.project.to_string(),
37 clusters,
38 affected,
39 });
40 }
41
42 let plan = build_preference_cleanup_plan(conn, req.project)?;
43 affected = apply_memory_cleanup_plan(conn, &plan)?.affected;
44 Ok(MergePreferencesResult {
45 dry_run,
46 project: req.project.to_string(),
47 clusters,
48 affected,
49 })
50}