use crate::AppState;
use anyhow::{Context, Result};
use serde_json::{json, Value};
use trusty_common::memory_core::dream::{consolidate_scoped, detect_fading, kg_compact_pass};
use super::helpers::{open_palace_handle, require_maintenance_lease, resolve_palace};
use trusty_common::memory_core::palace::RoomType;
const DEFAULT_MAX_AGE_DAYS: i64 = 7;
pub(crate) async fn handle_dream_consolidate_room(state: &AppState, args: Value) -> Result<Value> {
let palace = resolve_palace(state, &args, "dream_consolidate_room")?;
require_maintenance_lease(state)?;
let room_arg = args
.get("room")
.and_then(|v| v.as_str())
.filter(|s| !s.is_empty());
let room = room_arg.map(RoomType::parse);
let max_age_days = args
.get("max_age_days")
.and_then(|v| v.as_i64())
.unwrap_or(DEFAULT_MAX_AGE_DAYS);
let handle = open_palace_handle(state, &palace)?;
let cfg = crate::service::load_user_config().unwrap_or_default();
let dream_cfg = crate::service::dream_config_from_user_config(&cfg);
let stats = consolidate_scoped(&handle, &dream_cfg, room, max_age_days, None).await?;
let compact = args
.get("compact")
.and_then(|v| v.as_bool())
.unwrap_or(false);
let compaction = if compact {
let dry_run = args
.get("dry_run")
.and_then(|v| v.as_bool())
.unwrap_or(false);
let report = kg_compact_pass(&handle, &dream_cfg, dry_run).await?;
json!({
"ran": report.ran(),
"dry_run": report.dry_run,
"skipped": report.skipped,
"summary": report.summary(),
"kg_redb_bytes_before": report.bytes_before,
"kg_redb_bytes_after": report.bytes_after,
"kg_redb_bytes_reclaimed": report.bytes_reclaimed(),
"history_rows_pruned": report.history_rows_pruned,
"history_rows_stale": report.stats.triples_history_stale,
"triples_active": report.stats.triples_active,
"triples_history": report.stats.triples_history,
"reclaimable_bytes_estimate": report.stats.reclaimable_bytes,
})
} else {
Value::Null
};
let fading = detect_fading(&handle, &dream_cfg.fading);
let fading = serde_json::to_value(&fading).context("serialize fading list")?;
Ok(json!({
"palace": palace,
"room": room_arg,
"summary_facts_created": stats.summary_facts_created,
"facts_evicted": stats.facts_evicted,
"fading": fading,
"compaction": compaction,
}))
}
pub(crate) async fn handle_palace_dream(state: &AppState, args: Value) -> Result<Value> {
handle_dream_consolidate_room(state, args).await
}