Add the current auth method and GCP Project config to the about message (#2112)

This commit is contained in:
Preston Holmes 2025-06-27 08:46:27 -07:00 committed by GitHub
parent 3ebf54f367
commit 3aabb940f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 126 additions and 0 deletions

View File

@ -14,6 +14,8 @@ interface AboutBoxProps {
osVersion: string;
sandboxEnv: string;
modelVersion: string;
selectedAuthType: string;
gcpProject: string;
}
export const AboutBox: React.FC<AboutBoxProps> = ({
@ -21,6 +23,8 @@ export const AboutBox: React.FC<AboutBoxProps> = ({
osVersion,
sandboxEnv,
modelVersion,
selectedAuthType,
gcpProject,
}) => (
<Box
borderStyle="round"
@ -87,5 +91,29 @@ export const AboutBox: React.FC<AboutBoxProps> = ({
<Text>{osVersion}</Text>
</Box>
</Box>
<Box flexDirection="row">
<Box width="35%">
<Text bold color={Colors.LightBlue}>
Auth Method
</Text>
</Box>
<Box>
<Text>
{selectedAuthType.startsWith('oauth') ? 'OAuth' : selectedAuthType}
</Text>
</Box>
</Box>
{gcpProject && (
<Box flexDirection="row">
<Box width="35%">
<Text bold color={Colors.LightBlue}>
GCP Project
</Text>
</Box>
<Box>
<Text>{gcpProject}</Text>
</Box>
</Box>
)}
</Box>
);

View File

@ -67,6 +67,8 @@ describe('<HistoryItemDisplay />', () => {
osVersion: 'test-os',
sandboxEnv: 'test-env',
modelVersion: 'test-model',
selectedAuthType: 'test-auth',
gcpProject: 'test-project',
};
const { lastFrame } = render(
<HistoryItemDisplay {...baseItem} item={item} />,

View File

@ -65,6 +65,8 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
osVersion={item.osVersion}
sandboxEnv={item.sandboxEnv}
modelVersion={item.modelVersion}
selectedAuthType={item.selectedAuthType}
gcpProject={item.gcpProject}
/>
)}
{item.type === 'stats' && (

View File

@ -336,6 +336,89 @@ describe('useSlashCommandProcessor', () => {
});
});
describe('/about command', () => {
it('should show the about box with all details including auth and project', async () => {
// Arrange
mockGetCliVersionFn.mockResolvedValue('test-version');
process.env.SANDBOX = 'gemini-sandbox';
process.env.GOOGLE_CLOUD_PROJECT = 'test-gcp-project';
vi.mocked(mockConfig.getModel).mockReturnValue('test-model-from-config');
const settings = {
merged: {
selectedAuthType: 'test-auth-type',
contextFileName: 'GEMINI.md',
},
} as LoadedSettings;
const { result } = renderHook(() =>
useSlashCommandProcessor(
mockConfig,
settings,
[],
mockAddItem,
mockClearItems,
mockLoadHistory,
mockRefreshStatic,
mockSetShowHelp,
mockOnDebugMessage,
mockOpenThemeDialog,
mockOpenAuthDialog,
mockOpenEditorDialog,
mockPerformMemoryRefresh,
mockCorgiMode,
false,
mockSetQuittingMessages,
),
);
// Act
await act(async () => {
await result.current.handleSlashCommand('/about');
});
// Assert
expect(mockAddItem).toHaveBeenCalledTimes(2); // user message + about message
expect(mockAddItem).toHaveBeenNthCalledWith(
2,
expect.objectContaining({
type: 'about',
cliVersion: 'test-version',
osVersion: 'test-platform',
sandboxEnv: 'gemini-sandbox',
modelVersion: 'test-model-from-config',
selectedAuthType: 'test-auth-type',
gcpProject: 'test-gcp-project',
}),
expect.any(Number),
);
});
it('should show sandbox-exec profile when applicable', async () => {
// Arrange
mockGetCliVersionFn.mockResolvedValue('test-version');
process.env.SANDBOX = 'sandbox-exec';
process.env.SEATBELT_PROFILE = 'test-profile';
vi.mocked(mockConfig.getModel).mockReturnValue('test-model-from-config');
const { result } = getProcessorHook();
// Act
await act(async () => {
await result.current.handleSlashCommand('/about');
});
// Assert
expect(mockAddItem).toHaveBeenNthCalledWith(
2,
expect.objectContaining({
sandboxEnv: 'sandbox-exec (test-profile)',
}),
expect.any(Number),
);
});
});
describe('Other commands', () => {
it('/help should open help and return true', async () => {
const { handleSlashCommand } = getProcessor();

View File

@ -103,6 +103,8 @@ export const useSlashCommandProcessor = (
osVersion: message.osVersion,
sandboxEnv: message.sandboxEnv,
modelVersion: message.modelVersion,
selectedAuthType: message.selectedAuthType,
gcpProject: message.gcpProject,
};
} else if (message.type === MessageType.STATS) {
historyItemContent = {
@ -596,6 +598,8 @@ export const useSlashCommandProcessor = (
}
const modelVersion = config?.getModel() || 'Unknown';
const cliVersion = await getCliVersion();
const selectedAuthType = settings.merged.selectedAuthType || '';
const gcpProject = process.env.GOOGLE_CLOUD_PROJECT || '';
addMessage({
type: MessageType.ABOUT,
timestamp: new Date(),
@ -603,6 +607,8 @@ export const useSlashCommandProcessor = (
osVersion,
sandboxEnv,
modelVersion,
selectedAuthType,
gcpProject,
});
},
},
@ -1007,6 +1013,7 @@ export const useSlashCommandProcessor = (
toggleCorgiMode,
savedChatTags,
config,
settings,
showToolDescriptions,
session,
gitService,

View File

@ -94,6 +94,8 @@ export type HistoryItemAbout = HistoryItemBase & {
osVersion: string;
sandboxEnv: string;
modelVersion: string;
selectedAuthType: string;
gcpProject: string;
};
export type HistoryItemStats = HistoryItemBase & {
@ -169,6 +171,8 @@ export type Message =
osVersion: string;
sandboxEnv: string;
modelVersion: string;
selectedAuthType: string;
gcpProject: string;
content?: string; // Optional content, not really used for ABOUT
}
| {