feat: add --show_memory_usage flag to display memory usage in status bar (#606)

This commit is contained in:
Jacob Richman
2025-05-30 22:18:01 +00:00
committed by GitHub
parent 3291ffbe09
commit 01768d7759
10 changed files with 205 additions and 12 deletions

View File

@@ -442,6 +442,9 @@ export const App = ({
corgiMode={corgiMode}
errorCount={errorCount}
showErrorDetails={showErrorDetails}
showMemoryUsage={
config.getDebugMode() || config.getShowMemoryUsage()
}
/>
</Box>
</Box>

View File

@@ -9,6 +9,8 @@ import { Box, Text } from 'ink';
import { Colors } from '../colors.js';
import { shortenPath, tildeifyPath } from '@gemini-code/server';
import { ConsoleSummaryDisplay } from './ConsoleSummaryDisplay.js';
import process from 'node:process';
import { MemoryUsageDisplay } from './MemoryUsageDisplay.js';
interface FooterProps {
model: string;
@@ -20,6 +22,7 @@ interface FooterProps {
corgiMode: boolean;
errorCount: number;
showErrorDetails: boolean;
showMemoryUsage?: boolean;
}
export const Footer: React.FC<FooterProps> = ({
@@ -31,6 +34,7 @@ export const Footer: React.FC<FooterProps> = ({
corgiMode,
errorCount,
showErrorDetails,
showMemoryUsage,
}) => (
<Box marginTop={1} justifyContent="space-between" width="100%">
<Box>
@@ -86,6 +90,7 @@ export const Footer: React.FC<FooterProps> = ({
<ConsoleSummaryDisplay errorCount={errorCount} />
</Box>
)}
{showMemoryUsage && <MemoryUsageDisplay />}
</Box>
</Box>
);

View File

@@ -0,0 +1,40 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import React, { useEffect, useState } from 'react';
import { Box, Text } from 'ink';
import { Colors } from '../colors.js';
import process from 'node:process';
import { formatMemoryUsage } from '../utils/formatters.js';
export const MemoryUsageDisplay: React.FC = () => {
const [memoryUsage, setMemoryUsage] = useState<string>('');
const [memoryUsageColor, setMemoryUsageColor] = useState<string>(
Colors.SubtleComment,
);
useEffect(() => {
const updateMemory = () => {
const usage = process.memoryUsage().rss;
setMemoryUsage(formatMemoryUsage(usage));
setMemoryUsageColor(
usage >= 2 * 1024 * 1024 * 1024
? Colors.AccentRed
: Colors.SubtleComment,
);
};
const intervalId = setInterval(updateMemory, 2000);
updateMemory(); // Initial update
return () => clearInterval(intervalId);
}, []);
return (
<Box>
<Text color={Colors.SubtleComment}>| </Text>
<Text color={memoryUsageColor}>{memoryUsage}</Text>
</Box>
);
};

View File

@@ -9,9 +9,37 @@ const { mockProcessExit } = vi.hoisted(() => ({
}));
vi.mock('node:process', () => ({
default: {
exit: mockProcessExit,
cwd: vi.fn(() => '/mock/cwd'),
get env() {
return process.env;
}, // Use a getter to ensure current process.env is used
platform: 'test-platform',
version: 'test-node-version',
memoryUsage: vi.fn(() => ({
rss: 12345678,
heapTotal: 23456789,
heapUsed: 10234567,
external: 1234567,
arrayBuffers: 123456,
})),
},
// Provide top-level exports as well for compatibility
exit: mockProcessExit,
cwd: vi.fn(() => '/mock/cwd'),
env: { ...process.env },
get env() {
return process.env;
}, // Use a getter here too
platform: 'test-platform',
version: 'test-node-version',
memoryUsage: vi.fn(() => ({
rss: 12345678,
heapTotal: 23456789,
heapUsed: 10234567,
external: 1234567,
arrayBuffers: 123456,
})),
}));
vi.mock('node:fs/promises', () => ({
@@ -227,7 +255,7 @@ describe('useSlashCommandProcessor', () => {
seatbeltProfileVar?: string,
) => {
const cliVersion = 'test-version';
const osVersion = `${process.platform} ${process.version}`;
const osVersion = 'test-platform test-node-version';
let sandboxEnvStr = 'no sandbox';
if (sandboxEnvVar && sandboxEnvVar !== 'sandbox-exec') {
sandboxEnvStr = sandboxEnvVar.replace(/^gemini-(?:code-)?/, '');
@@ -235,6 +263,8 @@ describe('useSlashCommandProcessor', () => {
sandboxEnvStr = `sandbox-exec (${seatbeltProfileVar || 'unknown'})`;
}
const modelVersion = 'test-model';
// Use the mocked memoryUsage value
const memoryUsage = '11.8 MB';
const diagnosticInfo = `
## Describe the bug
@@ -249,6 +279,7 @@ Add any other context about the problem here.
* **Operating System:** ${osVersion}
* **Sandbox Environment:** ${sandboxEnvStr}
* **Model Version:** ${modelVersion}
* **Memory Usage:** ${memoryUsage}
`;
let url =
'https://github.com/google-gemini/gemini-cli/issues/new?template=bug_report.md';

View File

@@ -7,11 +7,13 @@
import { useCallback, useMemo } from 'react';
import { type PartListUnion } from '@google/genai';
import open from 'open';
import process from 'node:process';
import { UseHistoryManagerReturn } from './useHistoryManager.js';
import { Config } from '@gemini-code/server';
import { Message, MessageType, HistoryItemWithoutId } from '../types.js';
import { createShowMemoryAction } from './useShowMemoryCommand.js';
import { GIT_COMMIT_INFO } from '../../generated/git-commit.js';
import { formatMemoryUsage } from '../utils/formatters.js';
export interface SlashCommandActionReturn {
shouldScheduleTool?: boolean;
@@ -206,6 +208,7 @@ export const useSlashCommandProcessor = (
sandboxEnv = `sandbox-exec (${process.env.SEATBELT_PROFILE || 'unknown'})`;
}
const modelVersion = config?.getModel() || 'Unknown';
const memoryUsage = formatMemoryUsage(process.memoryUsage().rss);
const diagnosticInfo = `
## Describe the bug
@@ -220,6 +223,7 @@ Add any other context about the problem here.
* **Operating System:** ${osVersion}
* **Sandbox Environment:** ${sandboxEnv}
* **Model Version:** ${modelVersion}
* **Memory Usage:** ${memoryUsage}
`;
let bugReportUrl =

View File

@@ -0,0 +1,16 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
export const formatMemoryUsage = (bytes: number): string => {
const gb = bytes / (1024 * 1024 * 1024);
if (bytes < 1024 * 1024) {
return `${(bytes / 1024).toFixed(1)} KB`;
}
if (bytes < 1024 * 1024 * 1024) {
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
}
return `${gb.toFixed(2)} GB`;
};