Skip to main content

lean_ctx/core/context_kernel/
health_api.rs

1//! Enhanced health dashboard for the Context Kernel.
2
3/// Combined snapshot of kernel health, adaptation, search, evidence, and live state.
4#[derive(Debug, Clone, serde::Serialize)]
5pub struct EnhancedDashboard {
6    /// Aggregated kernel health and activity.
7    pub kernel_health: super::health::HealthReport,
8    /// Current adaptive-compression state.
9    pub adaptive: super::adaptive_bridge::AdaptiveSummary,
10    /// Search activity recorded for the current session.
11    pub search: crate::tools::search_kernel::SearchSummary,
12    /// Evidence totals observed at dispatch boundaries.
13    pub evidence_dispatch: super::evidence_wiring::DispatchSummary,
14    /// Existing live dashboard snapshot.
15    pub live: serde_json::Value,
16}
17
18/// Collects an enhanced dashboard snapshot from all kernel reporting surfaces.
19#[must_use]
20pub fn enhanced_dashboard() -> EnhancedDashboard {
21    let live = serde_json::from_str(&super::live_dashboard::snapshot_json())
22        .unwrap_or_else(|error| serde_json::json!({ "error": error.to_string() }));
23    EnhancedDashboard {
24        kernel_health: super::health::kernel_health(),
25        adaptive: super::adaptive_bridge::adaptive_summary(),
26        search: crate::tools::search_kernel::search_summary(),
27        evidence_dispatch: super::evidence_wiring::dispatch_summary(),
28        live,
29    }
30}
31
32/// Serializes the enhanced dashboard, returning a JSON error object on failure.
33#[must_use]
34pub fn health_json() -> String {
35    serde_json::to_string(&enhanced_dashboard())
36        .unwrap_or_else(|error| serde_json::json!({ "error": error.to_string() }).to_string())
37}
38
39/// Formats the key kernel signals as a compact one-line status.
40#[must_use]
41pub fn one_line_status() -> String {
42    let report = super::health::kernel_health();
43    let health = if super::health::is_healthy() {
44        "OK"
45    } else {
46        "DEGRADED"
47    };
48    let kernel = if report.kernel_enabled { "ON" } else { "OFF" };
49    let adaptive = super::adaptive_bridge::adaptive_summary();
50    let search = crate::tools::search_kernel::search_summary();
51    format!(
52        "Kernel: {kernel} | Health: {health} | Dedup: {:.0}% hit | Adaptive: {:?} | Searches: {}",
53        report.dedup_hit_rate * 100.0,
54        adaptive.advice,
55        search.total_searches,
56    )
57}
58
59#[cfg(test)]
60mod tests {
61    use super::{enhanced_dashboard, health_json, one_line_status};
62    use crate::core::context_kernel::{adaptive_bridge, evidence_wiring, kernel_config};
63    use crate::tools::search_kernel;
64
65    fn isolated() -> std::sync::MutexGuard<'static, ()> {
66        let guard = kernel_config::KERNEL_TEST_LOCK
67            .lock()
68            .unwrap_or_else(std::sync::PoisonError::into_inner);
69        kernel_config::reset_features();
70        adaptive_bridge::reset();
71        search_kernel::reset();
72        evidence_wiring::reset();
73        guard
74    }
75
76    #[test]
77    fn enhanced_includes_all() {
78        let _guard = isolated();
79        adaptive_bridge::update_bounce_signal(0.15);
80        search_kernel::record_search("health dashboard", 2, 8);
81        evidence_wiring::record_from_tool_dispatch("ctx_search", 2, 8, 4);
82
83        let dashboard = enhanced_dashboard();
84
85        assert!(dashboard.kernel_health.subsystem_count > 0);
86        assert!(dashboard.adaptive.signals_received > 0);
87        assert!(dashboard.search.total_searches > 0);
88        assert!(dashboard.evidence_dispatch.tool_dispatches > 0);
89        assert!(dashboard.live.is_object());
90    }
91
92    #[test]
93    fn health_json_valid() {
94        let _guard = isolated();
95        assert!(serde_json::from_str::<serde_json::Value>(&health_json()).is_ok());
96    }
97
98    #[test]
99    fn one_line_contains_kernel() {
100        let _guard = isolated();
101        assert!(one_line_status().contains("Kernel:"));
102    }
103}