diff --git a/CHANGELOG.md b/CHANGELOG.md index 41f715e0fb60..9ae345d86212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- **Status signal:** omit the redundant `Plugins: OK` row from compact `/status` output while retaining actionable plugin-health warnings and detailed plugin status. - **Control UI terminal rendering:** adopt the shared `@openclaw/libterminal` browser lifecycle and add Nerd Font fallbacks so icon-enabled shell listings render their glyphs when a compatible local font is installed. - **Control UI chat history:** hide redundant channel-final delivery mirrors when the preceding app-server assistant reply already shows the same text. - **Control UI chat spacing:** keep the first message comfortably clear of the topbar with a responsive minimum transcript inset. diff --git a/src/status/status-plugin-health.test.ts b/src/status/status-plugin-health.test.ts index 300f1abbb097..522f99d799ad 100644 --- a/src/status/status-plugin-health.test.ts +++ b/src/status/status-plugin-health.test.ts @@ -14,8 +14,8 @@ const emptySnapshot: StatusPluginHealthSnapshot = { }; describe("plugin health status formatting", () => { - it("shows a tiny OK line when there are no plugin health problems", () => { - expect(formatCompactPluginHealthLine(emptySnapshot)).toBe("๐Ÿ”Œ Plugins: OK"); + it("omits the compact line when there are no plugin health problems", () => { + expect(formatCompactPluginHealthLine(emptySnapshot)).toBeUndefined(); }); it("summarizes plugin errors and context engine quarantines in the compact line", () => { @@ -119,7 +119,7 @@ describe("plugin health status formatting", () => { }, ], }), - ).toBe("๐Ÿ”Œ Plugins: OK"); + ).toBeUndefined(); }); it("merges runtime health into installed plugin snapshots for detailed status", () => { diff --git a/src/status/status-plugin-health.ts b/src/status/status-plugin-health.ts index 2db9827e70c8..e4193faef263 100644 --- a/src/status/status-plugin-health.ts +++ b/src/status/status-plugin-health.ts @@ -224,7 +224,9 @@ function formatCount(count: number, noun: string): string { return `${count} ${noun}${count === 1 ? "" : "s"}`; } -export function formatCompactPluginHealthLine(snapshot: StatusPluginHealthSnapshot): string { +export function formatCompactPluginHealthLine(snapshot: StatusPluginHealthSnapshot): + | string + | undefined { const loadErrors = snapshot.plugins.filter((plugin) => plugin.status === "error").length; const dependencyIssues = snapshot.plugins.filter(hasDependencyIssue).length; const diagnosticErrors = countProblemDiagnostics(getReportableDiagnostics(snapshot)).errors; @@ -243,7 +245,7 @@ export function formatCompactPluginHealthLine(snapshot: StatusPluginHealthSnapsh diagnosticErrors > 0 ? formatCount(diagnosticErrors, "diagnostic error") : null, ].filter((part): part is string => Boolean(part)); - return parts.length === 0 ? "๐Ÿ”Œ Plugins: OK" : `โš ๏ธ Plugins: ${parts.join(" ยท ")}`; + return parts.length === 0 ? undefined : `โš ๏ธ Plugins: ${parts.join(" ยท ")}`; } function formatPluginList(ids: readonly string[], limit: number): string { @@ -323,7 +325,7 @@ export function formatDetailedPluginHealth(snapshot: StatusPluginHealthSnapshot) byLocale(left.configuredId, right.configuredId) || byLocale(left.source, right.source), ); const lines = [ - formatCompactPluginHealthLine(snapshot), + formatCompactPluginHealthLine(snapshot) ?? "๐Ÿ”Œ Plugins: OK", `Loaded: ${loaded.length}${loaded.length > 0 ? ` (${formatPluginList(loaded, 8)})` : ""}`, `Disabled: ${disabled}`, ]; diff --git a/src/status/status-text.ts b/src/status/status-text.ts index eada6a51a6b6..3e6f8692ee2a 100644 --- a/src/status/status-text.ts +++ b/src/status/status-text.ts @@ -274,7 +274,7 @@ function buildStatusUptimeLine(): string { return `โฑ๏ธ Uptime: gateway ${formatStatusUptimeDuration(gatewayUptimeMs)} ยท system ${formatStatusUptimeDuration(systemUptimeMs)}`; } -async function resolveRuntimePluginHealthLine(): Promise { +async function resolveRuntimePluginHealthLine(): Promise { try { const { collectRuntimePluginHealthSnapshot } = await loadStatusPluginHealthRuntime(); return formatCompactPluginHealthLine(collectRuntimePluginHealthSnapshot());