summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/cli/src/ui/components/ContextUsageDisplay.tsx25
-rw-r--r--packages/cli/src/ui/components/Footer.tsx152
2 files changed, 99 insertions, 78 deletions
diff --git a/packages/cli/src/ui/components/ContextUsageDisplay.tsx b/packages/cli/src/ui/components/ContextUsageDisplay.tsx
new file mode 100644
index 00000000..037be333
--- /dev/null
+++ b/packages/cli/src/ui/components/ContextUsageDisplay.tsx
@@ -0,0 +1,25 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { Text } from 'ink';
+import { Colors } from '../colors.js';
+import { tokenLimit } from '@google/gemini-cli-core';
+
+export const ContextUsageDisplay = ({
+ promptTokenCount,
+ model,
+}: {
+ promptTokenCount: number;
+ model: string;
+}) => {
+ const percentage = promptTokenCount / tokenLimit(model);
+
+ return (
+ <Text color={Colors.Gray}>
+ ({((1 - percentage) * 100).toFixed(0)}% context left)
+ </Text>
+ );
+};
diff --git a/packages/cli/src/ui/components/Footer.tsx b/packages/cli/src/ui/components/Footer.tsx
index acc55870..14cda5f3 100644
--- a/packages/cli/src/ui/components/Footer.tsx
+++ b/packages/cli/src/ui/components/Footer.tsx
@@ -7,12 +7,12 @@
import React from 'react';
import { Box, Text } from 'ink';
import { Colors } from '../colors.js';
-import { shortenPath, tildeifyPath, tokenLimit } from '@google/gemini-cli-core';
+import { shortenPath, tildeifyPath } from '@google/gemini-cli-core';
import { ConsoleSummaryDisplay } from './ConsoleSummaryDisplay.js';
import process from 'node:process';
import Gradient from 'ink-gradient';
import { MemoryUsageDisplay } from './MemoryUsageDisplay.js';
-
+import { ContextUsageDisplay } from './ContextUsageDisplay.js';
import { DebugProfiler } from './DebugProfiler.js';
interface FooterProps {
@@ -43,85 +43,81 @@ export const Footer: React.FC<FooterProps> = ({
promptTokenCount,
nightly,
vimMode,
-}) => {
- const limit = tokenLimit(model);
- const percentage = promptTokenCount / limit;
-
- return (
- <Box justifyContent="space-between" width="100%">
- <Box>
- {debugMode && <DebugProfiler />}
- {vimMode && <Text color={Colors.Gray}>[{vimMode}] </Text>}
- {nightly ? (
- <Gradient colors={Colors.GradientColors}>
- <Text>
- {shortenPath(tildeifyPath(targetDir), 70)}
- {branchName && <Text> ({branchName}*)</Text>}
- </Text>
- </Gradient>
- ) : (
- <Text color={Colors.LightBlue}>
+}) => (
+ <Box justifyContent="space-between" width="100%">
+ <Box>
+ {debugMode && <DebugProfiler />}
+ {vimMode && <Text color={Colors.Gray}>[{vimMode}] </Text>}
+ {nightly ? (
+ <Gradient colors={Colors.GradientColors}>
+ <Text>
{shortenPath(tildeifyPath(targetDir), 70)}
- {branchName && <Text color={Colors.Gray}> ({branchName}*)</Text>}
+ {branchName && <Text> ({branchName}*)</Text>}
</Text>
- )}
- {debugMode && (
- <Text color={Colors.AccentRed}>
- {' ' + (debugMessage || '--debug')}
- </Text>
- )}
- </Box>
+ </Gradient>
+ ) : (
+ <Text color={Colors.LightBlue}>
+ {shortenPath(tildeifyPath(targetDir), 70)}
+ {branchName && <Text color={Colors.Gray}> ({branchName}*)</Text>}
+ </Text>
+ )}
+ {debugMode && (
+ <Text color={Colors.AccentRed}>
+ {' ' + (debugMessage || '--debug')}
+ </Text>
+ )}
+ </Box>
- {/* Middle Section: Centered Sandbox Info */}
- <Box
- flexGrow={1}
- alignItems="center"
- justifyContent="center"
- display="flex"
- >
- {process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec' ? (
- <Text color="green">
- {process.env.SANDBOX.replace(/^gemini-(?:cli-)?/, '')}
- </Text>
- ) : process.env.SANDBOX === 'sandbox-exec' ? (
- <Text color={Colors.AccentYellow}>
- macOS Seatbelt{' '}
- <Text color={Colors.Gray}>({process.env.SEATBELT_PROFILE})</Text>
- </Text>
- ) : (
- <Text color={Colors.AccentRed}>
- no sandbox <Text color={Colors.Gray}>(see /docs)</Text>
- </Text>
- )}
- </Box>
+ {/* Middle Section: Centered Sandbox Info */}
+ <Box
+ flexGrow={1}
+ alignItems="center"
+ justifyContent="center"
+ display="flex"
+ >
+ {process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec' ? (
+ <Text color="green">
+ {process.env.SANDBOX.replace(/^gemini-(?:cli-)?/, '')}
+ </Text>
+ ) : process.env.SANDBOX === 'sandbox-exec' ? (
+ <Text color={Colors.AccentYellow}>
+ macOS Seatbelt{' '}
+ <Text color={Colors.Gray}>({process.env.SEATBELT_PROFILE})</Text>
+ </Text>
+ ) : (
+ <Text color={Colors.AccentRed}>
+ no sandbox <Text color={Colors.Gray}>(see /docs)</Text>
+ </Text>
+ )}
+ </Box>
- {/* Right Section: Gemini Label and Console Summary */}
- <Box alignItems="center">
- <Text color={Colors.AccentBlue}>
- {' '}
- {model}{' '}
- <Text color={Colors.Gray}>
- ({((1 - percentage) * 100).toFixed(0)}% context left)
- </Text>
+ {/* Right Section: Gemini Label and Console Summary */}
+ <Box alignItems="center">
+ <Text color={Colors.AccentBlue}>
+ {' '}
+ {model}{' '}
+ <ContextUsageDisplay
+ promptTokenCount={promptTokenCount}
+ model={model}
+ />
+ </Text>
+ {corgiMode && (
+ <Text>
+ <Text color={Colors.Gray}>| </Text>
+ <Text color={Colors.AccentRed}>▼</Text>
+ <Text color={Colors.Foreground}>(´</Text>
+ <Text color={Colors.AccentRed}>ᴥ</Text>
+ <Text color={Colors.Foreground}>`)</Text>
+ <Text color={Colors.AccentRed}>▼ </Text>
</Text>
- {corgiMode && (
- <Text>
- <Text color={Colors.Gray}>| </Text>
- <Text color={Colors.AccentRed}>▼</Text>
- <Text color={Colors.Foreground}>(´</Text>
- <Text color={Colors.AccentRed}>ᴥ</Text>
- <Text color={Colors.Foreground}>`)</Text>
- <Text color={Colors.AccentRed}>▼ </Text>
- </Text>
- )}
- {!showErrorDetails && errorCount > 0 && (
- <Box>
- <Text color={Colors.Gray}>| </Text>
- <ConsoleSummaryDisplay errorCount={errorCount} />
- </Box>
- )}
- {showMemoryUsage && <MemoryUsageDisplay />}
- </Box>
+ )}
+ {!showErrorDetails && errorCount > 0 && (
+ <Box>
+ <Text color={Colors.Gray}>| </Text>
+ <ConsoleSummaryDisplay errorCount={errorCount} />
+ </Box>
+ )}
+ {showMemoryUsage && <MemoryUsageDisplay />}
</Box>
- );
-};
+ </Box>
+);