mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-02 07:11:49 +00:00
Removes the global `uppercase` + `font-mondwest` from the App.tsx root
that forced every page to opt-out, replaces stacked-alpha text colors
with semantic tokens for WCAG-AA contrast across all 7 themes, and
applies the new `text-display` utility from @nous-research/ui@0.16.0
on intentional brand chrome (page titles, sidebar headings, segmented
filters) only. Bumps every sub-12px arbitrary text size to text-xs.
Also widens the dashboard plugin routes (/api/dashboard/agent-plugins/
{name:path}/...) so category-namespaced plugins like observability/
langfuse and image_gen/openai can be enable/disabled from the dashboard
— previously the FE encodeURIComponent-ed the slash and the backend
{name} route rejected it. _validate_plugin_name still blocks .. and
backslash, and strips leading/trailing slash.
Touches sessions/env/keys page chrome and adds two new i18n keys
(`overview`, `showMore`/`showLess`) across all 18 locales.
Squashes 19 commits from PR #28832.
Co-authored-by: Hermes <noreply@nousresearch.com>
97 lines
3.3 KiB
TypeScript
97 lines
3.3 KiB
TypeScript
import { AlertTriangle, Radio, Wifi, WifiOff } from "lucide-react";
|
|
import type { PlatformStatus } from "@/lib/api";
|
|
import { isoTimeAgo } from "@/lib/utils";
|
|
import { Badge } from "@nous-research/ui/ui/components/badge";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { useI18n } from "@/i18n";
|
|
|
|
export function PlatformsCard({ platforms }: PlatformsCardProps) {
|
|
const { t } = useI18n();
|
|
const platformStateBadge: Record<
|
|
string,
|
|
{ tone: "success" | "warning" | "destructive"; label: string }
|
|
> = {
|
|
connected: { tone: "success", label: t.status.connected },
|
|
disconnected: { tone: "warning", label: t.status.disconnected },
|
|
fatal: { tone: "destructive", label: t.status.error },
|
|
};
|
|
|
|
return (
|
|
<Card>
|
|
<CardHeader>
|
|
<div className="flex items-center gap-2">
|
|
<Radio className="h-5 w-5 text-muted-foreground" />
|
|
<CardTitle className="text-base">
|
|
{t.status.connectedPlatforms}
|
|
</CardTitle>
|
|
</div>
|
|
</CardHeader>
|
|
|
|
<CardContent className="grid gap-3">
|
|
{platforms.map(([name, info]) => {
|
|
const display = platformStateBadge[info.state] ?? {
|
|
tone: "outline" as const,
|
|
label: info.state,
|
|
};
|
|
const IconComponent =
|
|
info.state === "connected"
|
|
? Wifi
|
|
: info.state === "fatal"
|
|
? AlertTriangle
|
|
: WifiOff;
|
|
|
|
return (
|
|
<div
|
|
key={name}
|
|
className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 border border-border p-3 w-full"
|
|
>
|
|
<div className="flex items-center gap-3 min-w-0 w-full">
|
|
<IconComponent
|
|
className={`h-4 w-4 shrink-0 ${
|
|
info.state === "connected"
|
|
? "text-success"
|
|
: info.state === "fatal"
|
|
? "text-destructive"
|
|
: "text-warning"
|
|
}`}
|
|
/>
|
|
|
|
<div className="flex flex-col gap-0.5 min-w-0">
|
|
<span className="font-mondwest normal-case text-sm font-medium capitalize truncate">
|
|
{name}
|
|
</span>
|
|
|
|
{info.error_message && (
|
|
<span className="font-mondwest normal-case text-xs text-destructive">
|
|
{info.error_message}
|
|
</span>
|
|
)}
|
|
|
|
{info.updated_at && (
|
|
<span className="font-mondwest normal-case text-xs text-muted-foreground">
|
|
{t.status.lastUpdate}: {isoTimeAgo(info.updated_at)}
|
|
</span>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
<Badge
|
|
tone={display.tone}
|
|
className="shrink-0 self-start sm:self-center"
|
|
>
|
|
{display.tone === "success" && (
|
|
<span className="mr-1 inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-current" />
|
|
)}
|
|
{display.label}
|
|
</Badge>
|
|
</div>
|
|
);
|
|
})}
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
interface PlatformsCardProps {
|
|
platforms: [string, PlatformStatus][];
|
|
}
|