From e039689eff056c8c3868f12b3f00bce1ed071d6e Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 2 Jul 2026 17:45:45 -0400 Subject: [PATCH] =?UTF-8?q?feat(ia):=20wave=202=20=E2=80=94=20Activity=20b?= =?UTF-8?q?ecomes=20the=20whole-app=20pulse;=20Overview=20gets=20the=20hea?= =?UTF-8?q?lth=20strip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Activity tab only knew Celery — the GPU agent (the majority of processing) and the download pipeline were invisible there. Two new self-polling panels: - GpuActivityPanel: queue depths + triage verdicts (defects / file-ok / unprobed, top reason buckets) with a jump to Maintenance -> Failed processing. The triage detail refetches only when the error count moves. - DownloadsActivityPanel: 24h stat chips + failing-source names with a jump into Subscriptions. Both panels join the Activity tab under Queues+workers AND double as the Overview health strip (side-by-side grid under the Celery summary) — one component set, so Overview answers 'is everything healthy?' across all systems. SystemStatsCards reviewed: content still accurate, left as-is. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM --- .../settings/DownloadsActivityPanel.vue | 77 ++++++++++++ .../components/settings/GpuActivityPanel.vue | 110 ++++++++++++++++++ .../components/settings/SystemActivityTab.vue | 10 ++ frontend/src/views/SettingsView.vue | 20 +++- 4 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/settings/DownloadsActivityPanel.vue create mode 100644 frontend/src/components/settings/GpuActivityPanel.vue diff --git a/frontend/src/components/settings/DownloadsActivityPanel.vue b/frontend/src/components/settings/DownloadsActivityPanel.vue new file mode 100644 index 0000000..a3d379f --- /dev/null +++ b/frontend/src/components/settings/DownloadsActivityPanel.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/frontend/src/components/settings/GpuActivityPanel.vue b/frontend/src/components/settings/GpuActivityPanel.vue new file mode 100644 index 0000000..7378309 --- /dev/null +++ b/frontend/src/components/settings/GpuActivityPanel.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/frontend/src/components/settings/SystemActivityTab.vue b/frontend/src/components/settings/SystemActivityTab.vue index 7342944..8470352 100644 --- a/frontend/src/components/settings/SystemActivityTab.vue +++ b/frontend/src/components/settings/SystemActivityTab.vue @@ -17,6 +17,12 @@ + + + + @@ -167,6 +173,10 @@ import { formatRelative as fmtRelative } from '../../utils/date.js' import ErrorDetailModal from '../common/ErrorDetailModal.vue' import QueuesTable from './QueuesTable.vue' import CardHeading from '../common/CardHeading.vue' +import GpuActivityPanel from './GpuActivityPanel.vue' +import DownloadsActivityPanel from './DownloadsActivityPanel.vue' + +defineEmits(['open-maintenance']) // Click-to-open modal for full error text. Replaces the unusable // :title="..." tooltip (operator-flagged 2026-05-26: SQLAlchemy diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue index acb8a83..68eea8d 100644 --- a/frontend/src/views/SettingsView.vue +++ b/frontend/src/views/SettingsView.vue @@ -28,6 +28,13 @@ class="mt-4" @open-activity="tab = 'activity'" /> + +
+ + +
- + @@ -58,6 +65,8 @@ import { useSystemStore } from '../stores/system.js' import SystemStatsCards from '../components/settings/SystemStatsCards.vue' import SystemActivitySummary from '../components/settings/SystemActivitySummary.vue' import SystemActivityTab from '../components/settings/SystemActivityTab.vue' +import GpuActivityPanel from '../components/settings/GpuActivityPanel.vue' +import DownloadsActivityPanel from '../components/settings/DownloadsActivityPanel.vue' import MaintenancePanel from '../components/settings/MaintenancePanel.vue' import CleanupView from './CleanupView.vue' import { useMLStore } from '../stores/ml.js' @@ -93,4 +102,13 @@ watch(tab, (t) => { .fc-settings { max-width: 1140px; } +/* Overview health strip: the two pulse panels side by side, stacking on + narrow screens. Cancel the panels' own bottom margin — the row owns gaps. */ +.fc-health-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); + gap: 16px; + align-items: start; +} +.fc-health-row :deep(.v-card) { margin-bottom: 0 !important; }