import type { ReadonlyFooterDataProvider, Theme } from "@earendil-works/pi-coding-agent"; import { truncateToWidth, type Component } from "@earendil-works/pi-tui"; import { INPUT_STASH_STATUS_KEY } from "./input-stash.js"; export interface StatusOnlyFooterOptions { theme: Theme; footerData: ReadonlyFooterDataProvider; } function sanitizeStatusText(text: string): string { return text.replace(/[\r\n\t]/g, " ").replace(/ +/g, " ").trim(); } export function renderExtensionStatusLine(statuses: ReadonlyMap, width: number, theme: Theme): string | undefined { if (width <= 0 || statuses.size === 0) return undefined; const stash = sanitizeStatusText(statuses.get(INPUT_STASH_STATUS_KEY) ?? ""); const rest = Array.from(statuses.entries()) .filter(([key]) => key !== INPUT_STASH_STATUS_KEY) .sort(([a], [b]) => a.localeCompare(b)) .map(([, status]) => sanitizeStatusText(status)) .filter(Boolean); const parts = stash ? [theme.fg("warning", stash), ...rest] : rest; const text = parts.join(" "); return text ? truncateToWidth(text, width, theme.fg("dim", "...")) : undefined; } export class StatusOnlyFooter implements Component { constructor(private readonly options: StatusOnlyFooterOptions) {} dispose(): void {} invalidate(): void {} render(width: number): string[] { const extensionStatus = renderExtensionStatusLine( this.options.footerData.getExtensionStatuses(), width, this.options.theme, ); return extensionStatus ? [extensionStatus] : []; } }