1c6dfea5b5
Dashboard → System Health is grouped into AgentHub, Machine and Agent
activity. The machine (GET /api/host, every signed-in user) is drawn by
components/health/HostHealth.tsx: host card beside the CPU/memory history,
then CPU (threads as compact cells + temperatures/GPUs), disks & network,
busiest processes, and per-user tiles. Concurrency bars each show their own
agent type on hover.
The Health Score (client/src/lib/healthScore.ts) is now 100 minus what each
check costs, between an amber and a red threshold: event-loop p99
(server/lib/loop-delay.js, shared with /api/metrics), Linux PSI pressure for
CPU, memory and disk I/O (/api/host `pressure`; load per core without PSI),
RAM, the database's disk, V8 heap, hooks silent while agents work, and agent
errors in the last 24 h. All-time success rate, API errors and the transcript
cache hit rate no longer count. /api/settings/info adds server.event_loop and
activity {last_event_at, working_agents, agents_24h}.
Administration: a user row opens its detail in place (GET
/api/users/:id/details — spend, account pool share, live panes, workspaces,
newest sessions); the server panel is gone, member tmux folded into the table;
the Sessions list shows each row's owner in server mode.
31 lines
1.2 KiB
TypeScript
31 lines
1.2 KiB
TypeScript
/**
|
|
* @file SessionToolBadge — names the AI coding CLI that produced a session
|
|
* when it is not Claude Code (`sessions.tool` = `codex`, `antigravity`, …, by
|
|
* its AI Tools label). Renders nothing for a Claude session, so the session
|
|
* header looks as before for every Claude row.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
import { useTranslation } from "react-i18next";
|
|
import { useAiTools } from "../hooks/useAiTools";
|
|
|
|
/** A chip with the tool's name, or nothing for `claude` / an unset tool. */
|
|
export function SessionToolBadge({ tool }: { tool?: string | null }) {
|
|
if (!tool || tool === "claude") return null;
|
|
return <ToolChip tool={tool} />;
|
|
}
|
|
|
|
// Split out so the catalog hook only mounts for a non-Claude session.
|
|
function ToolChip({ tool }: { tool: string }) {
|
|
const { t } = useTranslation("sessions");
|
|
const { label } = useAiTools();
|
|
return (
|
|
<span
|
|
className="inline-flex items-center text-[10px] font-semibold text-violet-700 dark:text-violet-300 bg-violet-500/10 border border-violet-500/25 px-1.5 py-0.5 rounded-full"
|
|
title={t("toolBadgeTitle", { tool: label(tool) })}
|
|
>
|
|
{label(tool)}
|
|
</span>
|
|
);
|
|
}
|