import React from 'react'; import { Box, Text } from 'ink'; export interface TopBarProps { gatewayUrl: string; version: string; modelName: string | null; thinkingLevel: string; contextWindow: number; agentName: string; connected: boolean; connecting: boolean; } /** Compact the URL — strip protocol */ function compactHost(url: string): string { return url.replace(/^https?:\/\//, ''); } function formatContextWindow(n: number): string { if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(0)}M`; if (n >= 1_000) return `${(n / 1_000).toFixed(0)}k`; return String(n); } /** * Mosaic 3×3 icon — brand tiles with black gaps (windmill cross pattern) * * Layout: * blue ·· purple * ·· pink ·· * amber ·· teal */ // Two-space gap between tiles (extracted to avoid prettier collapse) const GAP = ' '; function MosaicIcon() { return ( ██ {GAP} ██ {GAP} ██ ██ {GAP} ██ ); } export function TopBar({ gatewayUrl, version, modelName, thinkingLevel, contextWindow, agentName, connected, connecting, }: TopBarProps) { const host = compactHost(gatewayUrl); const connectionIndicator = connected ? '●' : '○'; const connectionColor = connected ? 'green' : connecting ? 'yellow' : 'red'; // Build model description line like: "claude-opus-4-6 (1M context) · default" const modelDisplay = modelName ?? 'awaiting model'; const contextStr = contextWindow > 0 ? ` (${formatContextWindow(contextWindow)} context)` : ''; const thinkingStr = thinkingLevel !== 'off' ? ` · ${thinkingLevel}` : ''; return ( Mosaic Stack v{version} {modelDisplay} {contextStr} {thinkingStr} · {agentName} {connectionIndicator} {host} ); }