diff --git a/dashboard/web/src/components/hermes-ops-panel.tsx b/dashboard/web/src/components/hermes-ops-panel.tsx index 50b84ed..75ae976 100644 --- a/dashboard/web/src/components/hermes-ops-panel.tsx +++ b/dashboard/web/src/components/hermes-ops-panel.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import Link from 'next/link'; -import { AlertTriangle, CheckCircle2, Cloud, DatabaseBackup, ExternalLink, Gauge, HardDrive, RefreshCw, ShieldCheck, Timer, Wifi, Activity, CalendarClock, Link2 } from 'lucide-react'; +import { AlertTriangle, CheckCircle2, Cloud, Copy, DatabaseBackup, ExternalLink, Gauge, HardDrive, RefreshCw, ShieldCheck, Timer, Wifi, Activity, CalendarClock, Link2 } from 'lucide-react'; import { Badge, Button } from '@/components/ui/Primitives'; import { SectionCard } from '@/components/hermes-shell'; import { api, type HermesOpsInstance, type HermesOpsSnapshot } from '@/lib/api'; @@ -94,6 +94,10 @@ function InstanceCard({ instance }: { instance: HermesOpsInstance }) { Open dashboard + ); @@ -123,6 +127,17 @@ export function HermesOpsPanel() { }, []); const allHealthy = useMemo(() => snapshot ? snapshot.warnings.length === 0 : false, [snapshot]); + const healthyInstances = snapshot + ? snapshot.instances.filter((instance) => + instance.gateway.active && + instance.dashboard.active && + instance.backup.timer.active && + instance.backup.repo.clean && + instance.google.workspaceToken + ).length + : 0; + const activeDashboards = snapshot ? snapshot.instances.filter((instance) => instance.dashboard.active).length : 0; + const activeBackupTimers = snapshot ? snapshot.instances.filter((instance) => instance.backup.timer.active).length : 0; return ( +
+
+
+ + Healthy instances +
+

{healthyInstances}/2

+
+
+
+ + Active dashboards +
+

{activeDashboards}/2

+
+
+
+ + Active backup timers +
+

{activeBackupTimers}/2

+
+
+
+ + Open warnings +
+

{snapshot.warnings.length}

+
+
+
diff --git a/docs/hermes-setup-upgrade-roadmap.md b/docs/hermes-setup-upgrade-roadmap.md index a4da21a..4126a6a 100644 --- a/docs/hermes-setup-upgrade-roadmap.md +++ b/docs/hermes-setup-upgrade-roadmap.md @@ -21,6 +21,16 @@ - **Needs manual UX validation:** dashboard feature-by-feature checks, Telegram approval prompt flow, and Telegram media/file delivery. - **Needs future workflow adoption:** practicing `delegate_task`, spawned/tmux sessions, worktrees, and Kanban on real tasks before checking them as completed. +## Next To-Dos + +The remaining work is now mostly hardening rather than feature delivery: + +- finish the GitHub/Gitea least-privilege audit for the root-managed push path +- decide whether `security.redact_secrets` should be enabled by default +- document the gateway-session `privacy.redact_pii` policy +- rotate any credentials that were migrated or exposed during the setup work +- tighten least-privilege token scopes for GitHub/Gitea, web APIs, and provider keys + ## Purpose Turn the Hermes setup ideas from the referenced video into a practical ByteLyst upgrade checklist for this VM-backed, Telegram-driven Hermes installation. diff --git a/docs/hermes_dashboard_roadmap.md b/docs/hermes_dashboard_roadmap.md index 39151dc..41b2875 100644 --- a/docs/hermes_dashboard_roadmap.md +++ b/docs/hermes_dashboard_roadmap.md @@ -665,6 +665,19 @@ Known roadmap assumptions to handle safely during implementation: --- +## Next Dashboard Improvements + +Potential follow-up work for Hermes Mission Control: + +- snapshot diff view that shows what changed since the last refresh +- per-instance action row with copy-link and open-dashboard shortcuts +- warning severity filters for the live ops panel +- compact trend cards for recent alert volume and backup freshness +- task-ledger deep links from the ops panel into the most recent Hermes work +- optional dark/light theme toggle if the broader dashboard shell eventually supports it + +--- + # Git workflow Commit incrementally: