From f14e445e9ca32e009a045ab1f21a062b871d984d Mon Sep 17 00:00:00 2001 From: James Maes Date: Fri, 16 Oct 2026 09:13:32 -0500 Subject: [PATCH] fix(assistant): worded health tile instead of the raw UNKNOWN enum The Assistant health tile showed the HealthStatus name (UP/DEGRADED/DOWN/UNKNOWN). It now shows Healthy / Degraded / Down, and "Not checked yet" when no check has reported, with the check cadence in the context line. The drill to health_check is unchanged. Co-Authored-By: Claude Opus 5.5 --- .../health/AssistantHealthWidget.java | 22 +++++++++++++++++-- .../health/AssistantHealthChecksTest.java | 7 +++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/qbit-assistant/src/main/java/com/kingsrook/qbits/assistant/health/AssistantHealthWidget.java b/qbit-assistant/src/main/java/com/kingsrook/qbits/assistant/health/AssistantHealthWidget.java index 0f513ea..6b8cab3 100644 --- a/qbit-assistant/src/main/java/com/kingsrook/qbits/assistant/health/AssistantHealthWidget.java +++ b/qbit-assistant/src/main/java/com/kingsrook/qbits/assistant/health/AssistantHealthWidget.java @@ -42,6 +42,24 @@ public class AssistantHealthWidget extends AbstractWidgetRenderer { public static final String NAME = "assistantHealth"; + public static final String NOT_CHECKED = "Not checked yet"; + + + + /******************************************************************************* + ** Human words for a health status; unknown means no check has reported yet. + *******************************************************************************/ + static String wording(HealthStatus status) + { + return (switch(status) + { + case UP -> "Healthy"; + case DEGRADED -> "Degraded"; + case DOWN -> "Down"; + case UNKNOWN -> NOT_CHECKED; + }); + } + /******************************************************************************* @@ -72,8 +90,8 @@ public class AssistantHealthWidget extends AbstractWidgetRenderer .map(check -> runner.getLastOutcome(check.getName())) .map(outcome -> outcome == null ? HealthStatus.UNKNOWN : outcome.getStatus()).toArray(HealthStatus[]::new)); } - return (new RenderWidgetOutput(new StatisticsData().withCount(status.name()) - .withCountContext("System Health") + return (new RenderWidgetOutput(new StatisticsData().withCount(wording(status)) + .withCountContext("System Health. Provider checks run every 1 to 5 minutes; model checks every 6 hours") .withCountURL(FilterLinkBuilder.href("health_check", List.of(Map.of("fieldName", "component", "operator", "EQUALS", "values", List.of("assistant"))))))); } } diff --git a/qbit-assistant/src/test/java/com/kingsrook/qbits/assistant/health/AssistantHealthChecksTest.java b/qbit-assistant/src/test/java/com/kingsrook/qbits/assistant/health/AssistantHealthChecksTest.java index 691cc6e..017e8e9 100644 --- a/qbit-assistant/src/test/java/com/kingsrook/qbits/assistant/health/AssistantHealthChecksTest.java +++ b/qbit-assistant/src/test/java/com/kingsrook/qbits/assistant/health/AssistantHealthChecksTest.java @@ -606,7 +606,8 @@ class AssistantHealthChecksTest extends BaseAssistantTest assertThat(qInstance.getWidget(AssistantHealthWidget.NAME).getType()).isEqualTo(WidgetType.STATISTICS.getType()); var renderer = new AssistantHealthWidget(); StatisticsData data = (StatisticsData) renderer.render(new RenderWidgetInput()).getWidgetData(); - assertThat(data.getCount()).isEqualTo("UNKNOWN"); + assertThat(data.getCount()).isEqualTo("Not checked yet"); + assertThat(data.getCountContext()).contains("Provider checks run every 1 to 5 minutes"); assertThat(data.getCountURL()).startsWith("/app/").contains("health_check", "assistant"); try(var central = cached("assistant.provider." + row.getId(), HealthCheckOutcome.up("Reachable"), Instant.now())) { @@ -614,14 +615,14 @@ class AssistantHealthChecksTest extends BaseAssistantTest cache.setAccessible(true); cache.invoke(central, AssistantHealthChecks.CLIENT_ERRORS, HealthCheckOutcome.up("0 client errors reported in the last hour")); data = (StatisticsData) renderer.render(new RenderWidgetInput()).getWidgetData(); - assertThat(data.getCount()).isEqualTo("UP"); + assertThat(data.getCount()).isEqualTo("Healthy"); ////////////////////////////////////////////////////////////////// // many client errors in the last hour show on the card as well // ////////////////////////////////////////////////////////////////// cache.invoke(central, AssistantHealthChecks.CLIENT_ERRORS, HealthCheckOutcome.degraded("25 client errors reported in the last hour")); data = (StatisticsData) renderer.render(new RenderWidgetInput()).getWidgetData(); - assertThat(data.getCount()).isEqualTo("DEGRADED"); + assertThat(data.getCount()).isEqualTo("Degraded"); } } } -- 2.54.0