lean_ctx/core/context_kernel/
health_api.rs1#[derive(Debug, Clone, serde::Serialize)]
5pub struct EnhancedDashboard {
6 pub kernel_health: super::health::HealthReport,
8 pub adaptive: super::adaptive_bridge::AdaptiveSummary,
10 pub search: crate::tools::search_kernel::SearchSummary,
12 pub evidence_dispatch: super::evidence_wiring::DispatchSummary,
14 pub live: serde_json::Value,
16}
17
18#[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#[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#[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}