87 lines
3.2 KiB
TypeScript
87 lines
3.2 KiB
TypeScript
import { formatAge } from "../infra/channel-summary.js";
|
|
import { formatTokenCount } from "../utils/usage-format.js";
|
|
import { formatContextUsageLine } from "./tui-formatters.js";
|
|
import type { GatewayStatusSummary } from "./tui-types.js";
|
|
|
|
export function formatStatusSummary(summary: GatewayStatusSummary) {
|
|
const lines: string[] = [];
|
|
lines.push("Gateway status");
|
|
|
|
if (!summary.linkChannel) {
|
|
lines.push("Link channel: unknown");
|
|
} else {
|
|
const linkLabel = summary.linkChannel.label ?? "Link channel";
|
|
const linked = summary.linkChannel.linked === true;
|
|
const authAge =
|
|
linked && typeof summary.linkChannel.authAgeMs === "number"
|
|
? ` (last refreshed ${formatAge(summary.linkChannel.authAgeMs)})`
|
|
: "";
|
|
lines.push(`${linkLabel}: ${linked ? "linked" : "not linked"}${authAge}`);
|
|
}
|
|
|
|
const providerSummary = Array.isArray(summary.providerSummary) ? summary.providerSummary : [];
|
|
if (providerSummary.length > 0) {
|
|
lines.push("");
|
|
lines.push("System:");
|
|
for (const line of providerSummary) {
|
|
lines.push(` ${line}`);
|
|
}
|
|
}
|
|
|
|
const heartbeatAgents = summary.heartbeat?.agents ?? [];
|
|
if (heartbeatAgents.length > 0) {
|
|
const heartbeatParts = heartbeatAgents.map((agent) => {
|
|
const agentId = agent.agentId ?? "unknown";
|
|
if (!agent.enabled || !agent.everyMs) return `disabled (${agentId})`;
|
|
return `${agent.every ?? "unknown"} (${agentId})`;
|
|
});
|
|
lines.push("");
|
|
lines.push(`Heartbeat: ${heartbeatParts.join(", ")}`);
|
|
}
|
|
|
|
const sessionPaths = summary.sessions?.paths ?? [];
|
|
if (sessionPaths.length === 1) {
|
|
lines.push(`Session store: ${sessionPaths[0]}`);
|
|
} else if (sessionPaths.length > 1) {
|
|
lines.push(`Session stores: ${sessionPaths.length}`);
|
|
}
|
|
|
|
const defaults = summary.sessions?.defaults;
|
|
const defaultModel = defaults?.model ?? "unknown";
|
|
const defaultCtx =
|
|
typeof defaults?.contextTokens === "number"
|
|
? ` (${formatTokenCount(defaults.contextTokens)} ctx)`
|
|
: "";
|
|
lines.push(`Default model: ${defaultModel}${defaultCtx}`);
|
|
|
|
const sessionCount = summary.sessions?.count ?? 0;
|
|
lines.push(`Active sessions: ${sessionCount}`);
|
|
|
|
const recent = Array.isArray(summary.sessions?.recent) ? summary.sessions?.recent : [];
|
|
if (recent.length > 0) {
|
|
lines.push("Recent sessions:");
|
|
for (const entry of recent) {
|
|
const ageLabel = typeof entry.age === "number" ? formatAge(entry.age) : "no activity";
|
|
const model = entry.model ?? "unknown";
|
|
const usage = formatContextUsageLine({
|
|
total: entry.totalTokens ?? null,
|
|
context: entry.contextTokens ?? null,
|
|
remaining: entry.remainingTokens ?? null,
|
|
percent: entry.percentUsed ?? null,
|
|
});
|
|
const flags = entry.flags?.length ? ` | flags: ${entry.flags.join(", ")}` : "";
|
|
lines.push(
|
|
`- ${entry.key}${entry.kind ? ` [${entry.kind}]` : ""} | ${ageLabel} | model ${model} | ${usage}${flags}`,
|
|
);
|
|
}
|
|
}
|
|
|
|
const queued = Array.isArray(summary.queuedSystemEvents) ? summary.queuedSystemEvents : [];
|
|
if (queued.length > 0) {
|
|
const preview = queued.slice(0, 3).join(" | ");
|
|
lines.push(`Queued system events (${queued.length}): ${preview}`);
|
|
}
|
|
|
|
return lines;
|
|
}
|