use serde::Serialize;
use std::sync::{Arc, Mutex};
#[derive(Debug, Clone, Serialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ConsolidationRunStatus {
pub last_run_started_at: Option<String>,
pub last_run_completed_at: Option<String>,
pub last_run_ok: bool,
pub last_error: Option<String>,
pub review_candidates_seen: u64,
pub memories_written: u64,
pub repeated_failure_patterns: u64,
pub proposals_minted: u64,
pub total_runs: u64,
pub total_memories_written: u64,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ConsolidationRunOutcome {
pub started_at: String,
pub completed_at: String,
pub review_candidates_seen: u64,
pub memories_written: u64,
pub repeated_failure_patterns: u64,
pub proposals_minted: u64,
pub error: Option<String>,
}
#[derive(Clone, Default)]
pub struct ConsolidationStatusState {
inner: Arc<Mutex<ConsolidationRunStatus>>,
}
impl ConsolidationStatusState {
pub fn new() -> Self {
Self::default()
}
pub fn record_run(&self, outcome: ConsolidationRunOutcome) {
if let Ok(mut status) = self.inner.lock() {
status.last_run_started_at = Some(outcome.started_at);
status.last_run_completed_at = Some(outcome.completed_at);
status.last_run_ok = outcome.error.is_none();
status.last_error = outcome.error;
status.review_candidates_seen = outcome.review_candidates_seen;
status.memories_written = outcome.memories_written;
status.repeated_failure_patterns = outcome.repeated_failure_patterns;
status.proposals_minted = outcome.proposals_minted;
status.total_runs = status.total_runs.saturating_add(1);
status.total_memories_written = status
.total_memories_written
.saturating_add(outcome.memories_written);
}
}
pub fn snapshot(&self) -> ConsolidationRunStatus {
self.inner
.lock()
.map(|status| status.clone())
.unwrap_or_default()
}
}