fix: re render context usage indicator (#5102)
This commit is contained in:
parent
a3351bc985
commit
8e6a565adb
|
@ -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>
|
||||||
|
);
|
||||||
|
};
|
|
@ -7,12 +7,12 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Box, Text } from 'ink';
|
import { Box, Text } from 'ink';
|
||||||
import { Colors } from '../colors.js';
|
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 { ConsoleSummaryDisplay } from './ConsoleSummaryDisplay.js';
|
||||||
import process from 'node:process';
|
import process from 'node:process';
|
||||||
import Gradient from 'ink-gradient';
|
import Gradient from 'ink-gradient';
|
||||||
import { MemoryUsageDisplay } from './MemoryUsageDisplay.js';
|
import { MemoryUsageDisplay } from './MemoryUsageDisplay.js';
|
||||||
|
import { ContextUsageDisplay } from './ContextUsageDisplay.js';
|
||||||
import { DebugProfiler } from './DebugProfiler.js';
|
import { DebugProfiler } from './DebugProfiler.js';
|
||||||
|
|
||||||
interface FooterProps {
|
interface FooterProps {
|
||||||
|
@ -43,85 +43,81 @@ export const Footer: React.FC<FooterProps> = ({
|
||||||
promptTokenCount,
|
promptTokenCount,
|
||||||
nightly,
|
nightly,
|
||||||
vimMode,
|
vimMode,
|
||||||
}) => {
|
}) => (
|
||||||
const limit = tokenLimit(model);
|
<Box justifyContent="space-between" width="100%">
|
||||||
const percentage = promptTokenCount / limit;
|
<Box>
|
||||||
|
{debugMode && <DebugProfiler />}
|
||||||
return (
|
{vimMode && <Text color={Colors.Gray}>[{vimMode}] </Text>}
|
||||||
<Box justifyContent="space-between" width="100%">
|
{nightly ? (
|
||||||
<Box>
|
<Gradient colors={Colors.GradientColors}>
|
||||||
{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}>
|
|
||||||
{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>
|
|
||||||
|
|
||||||
{/* 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>
|
|
||||||
</Text>
|
|
||||||
{corgiMode && (
|
|
||||||
<Text>
|
<Text>
|
||||||
<Text color={Colors.Gray}>| </Text>
|
{shortenPath(tildeifyPath(targetDir), 70)}
|
||||||
<Text color={Colors.AccentRed}>▼</Text>
|
{branchName && <Text> ({branchName}*)</Text>}
|
||||||
<Text color={Colors.Foreground}>(´</Text>
|
|
||||||
<Text color={Colors.AccentRed}>ᴥ</Text>
|
|
||||||
<Text color={Colors.Foreground}>`)</Text>
|
|
||||||
<Text color={Colors.AccentRed}>▼ </Text>
|
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
</Gradient>
|
||||||
{!showErrorDetails && errorCount > 0 && (
|
) : (
|
||||||
<Box>
|
<Text color={Colors.LightBlue}>
|
||||||
<Text color={Colors.Gray}>| </Text>
|
{shortenPath(tildeifyPath(targetDir), 70)}
|
||||||
<ConsoleSummaryDisplay errorCount={errorCount} />
|
{branchName && <Text color={Colors.Gray}> ({branchName}*)</Text>}
|
||||||
</Box>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{showMemoryUsage && <MemoryUsageDisplay />}
|
{debugMode && (
|
||||||
</Box>
|
<Text color={Colors.AccentRed}>
|
||||||
|
{' ' + (debugMessage || '--debug')}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
</Box>
|
</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}{' '}
|
||||||
|
<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>
|
||||||
|
)}
|
||||||
|
{!showErrorDetails && errorCount > 0 && (
|
||||||
|
<Box>
|
||||||
|
<Text color={Colors.Gray}>| </Text>
|
||||||
|
<ConsoleSummaryDisplay errorCount={errorCount} />
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
{showMemoryUsage && <MemoryUsageDisplay />}
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
|
Loading…
Reference in New Issue