/** * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { Box, Text } from 'ink'; import { UserIdentity } from './UserIdentity.js'; import { Tips } from './Tips.js'; import { useSettings } from '../contexts/SettingsContext.js'; import { useConfig } from '../contexts/ConfigContext.js'; import { useUIState } from '../contexts/UIStateContext.js'; import { Banner } from './Banner.js'; import { useBanner } from '../hooks/useBanner.js'; import { useTips } from '../hooks/useTips.js'; import { theme } from '../semantic-colors.js'; import { ThemedGradient } from './ThemedGradient.js'; import { CliSpinner } from './CliSpinner.js'; interface AppHeaderProps { version: string; showDetails?: boolean; } const ICON = `▝▜▄ ▝▜▄ ▗▟▀ ▝▀ `; export const AppHeader = ({ version, showDetails = true }: AppHeaderProps) => { const settings = useSettings(); const config = useConfig(); const { terminalWidth, bannerData, bannerVisible, updateInfo } = useUIState(); const { bannerText } = useBanner(bannerData); const { showTips } = useTips(); const showHeader = !( settings.merged.ui.hideBanner || config.getScreenReader() ); if (!showDetails) { return ( {showHeader && ( {ICON} Gemini CLI v{version} )} ); } return ( {showHeader && ( {ICON} {/* Line 1: Gemini CLI vVersion [Updating] */} Gemini CLI v{version} {updateInfo && ( Updating )} {/* Line 2: Blank */} {/* Lines 3 & 4: User Identity info (Email /auth and Plan /upgrade) */} {settings.merged.ui.showUserIdentity !== false && ( )} )} {bannerVisible && bannerText && ( )} {!(settings.merged.ui.hideTips || config.getScreenReader()) && showTips && } ); };