mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-20 08:47:44 +00:00
Add /about command
This commit is contained in:
committed by
N. Taylor Mullen
parent
4a6833ef49
commit
221370acc5
70
packages/cli/src/ui/components/AboutBox.tsx
Normal file
70
packages/cli/src/ui/components/AboutBox.tsx
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2025 Google LLC
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import { Box, Text } from 'ink';
|
||||||
|
import { Colors } from '../colors.js';
|
||||||
|
|
||||||
|
interface AboutBoxProps {
|
||||||
|
cliVersion: string;
|
||||||
|
osVersion: string;
|
||||||
|
sandboxEnv: string;
|
||||||
|
modelVersion: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const AboutBox: React.FC<AboutBoxProps> = ({
|
||||||
|
cliVersion,
|
||||||
|
osVersion,
|
||||||
|
sandboxEnv,
|
||||||
|
modelVersion,
|
||||||
|
}) => (
|
||||||
|
<Box
|
||||||
|
borderStyle="round"
|
||||||
|
borderColor={Colors.SubtleComment}
|
||||||
|
flexDirection="column"
|
||||||
|
padding={1}
|
||||||
|
marginY={1}
|
||||||
|
width="100%"
|
||||||
|
>
|
||||||
|
<Box marginBottom={1}>
|
||||||
|
<Text bold color={Colors.AccentPurple}>
|
||||||
|
About Gemini CLI
|
||||||
|
</Text>
|
||||||
|
</Box>
|
||||||
|
<Box flexDirection="row">
|
||||||
|
<Box width="35%">
|
||||||
|
<Text bold color={Colors.LightBlue}>CLI Version</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text>{cliVersion}</Text>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
<Box flexDirection="row">
|
||||||
|
<Box width="35%">
|
||||||
|
<Text bold color={Colors.LightBlue}>Model</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text>{modelVersion}</Text>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
<Box flexDirection="row">
|
||||||
|
<Box width="35%">
|
||||||
|
<Text bold color={Colors.LightBlue}>Sandbox</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text>{sandboxEnv}</Text>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
<Box flexDirection="row">
|
||||||
|
<Box width="35%">
|
||||||
|
<Text bold color={Colors.LightBlue}>OS</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text>{osVersion}</Text>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
@@ -64,7 +64,6 @@ export const Footer: React.FC<FooterProps> = ({
|
|||||||
{/* Right Section: Gemini Label and Console Summary */}
|
{/* Right Section: Gemini Label and Console Summary */}
|
||||||
<Box alignItems="center">
|
<Box alignItems="center">
|
||||||
<Text color={Colors.AccentBlue}> {config.getModel()} </Text>
|
<Text color={Colors.AccentBlue}> {config.getModel()} </Text>
|
||||||
<Text color={Colors.SubtleComment}>| CLI {cliVersion} </Text>
|
|
||||||
{corgiMode && (
|
{corgiMode && (
|
||||||
<Text>
|
<Text>
|
||||||
<Text color={Colors.SubtleComment}>| </Text>
|
<Text color={Colors.SubtleComment}>| </Text>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { ErrorMessage } from './messages/ErrorMessage.js';
|
|||||||
import { ToolGroupMessage } from './messages/ToolGroupMessage.js';
|
import { ToolGroupMessage } from './messages/ToolGroupMessage.js';
|
||||||
import { GeminiMessageContent } from './messages/GeminiMessageContent.js';
|
import { GeminiMessageContent } from './messages/GeminiMessageContent.js';
|
||||||
import { Box } from 'ink';
|
import { Box } from 'ink';
|
||||||
|
import { AboutBox } from './AboutBox.js';
|
||||||
|
|
||||||
interface HistoryItemDisplayProps {
|
interface HistoryItemDisplayProps {
|
||||||
item: HistoryItem;
|
item: HistoryItem;
|
||||||
@@ -48,6 +49,14 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
|
|||||||
)}
|
)}
|
||||||
{item.type === 'info' && <InfoMessage text={item.text} />}
|
{item.type === 'info' && <InfoMessage text={item.text} />}
|
||||||
{item.type === 'error' && <ErrorMessage text={item.text} />}
|
{item.type === 'error' && <ErrorMessage text={item.text} />}
|
||||||
|
{item.type === 'about' && (
|
||||||
|
<AboutBox
|
||||||
|
cliVersion={item.cliVersion}
|
||||||
|
osVersion={item.osVersion}
|
||||||
|
sandboxEnv={item.sandboxEnv}
|
||||||
|
modelVersion={item.modelVersion}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{item.type === 'tool_group' && (
|
{item.type === 'tool_group' && (
|
||||||
<ToolGroupMessage
|
<ToolGroupMessage
|
||||||
toolCalls={item.tools}
|
toolCalls={item.tools}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { type PartListUnion } from '@google/genai';
|
|||||||
import open from 'open';
|
import open from 'open';
|
||||||
import { UseHistoryManagerReturn } from './useHistoryManager.js';
|
import { UseHistoryManagerReturn } from './useHistoryManager.js';
|
||||||
import { Config } from '@gemini-code/server';
|
import { Config } from '@gemini-code/server';
|
||||||
import { Message, MessageType, HistoryItemWithoutId } from '../types.js';
|
import { Message, MessageType, HistoryItemWithoutId } from '../types.js'; // Removed HistoryItem
|
||||||
import { createShowMemoryAction } from './useShowMemoryCommand.js';
|
import { createShowMemoryAction } from './useShowMemoryCommand.js';
|
||||||
|
|
||||||
export interface SlashCommandActionReturn {
|
export interface SlashCommandActionReturn {
|
||||||
@@ -47,10 +47,25 @@ export const useSlashCommandProcessor = (
|
|||||||
) => {
|
) => {
|
||||||
const addMessage = useCallback(
|
const addMessage = useCallback(
|
||||||
(message: Message) => {
|
(message: Message) => {
|
||||||
const historyItemContent: HistoryItemWithoutId = {
|
// Convert Message to HistoryItemWithoutId
|
||||||
type: message.type,
|
let historyItemContent: HistoryItemWithoutId;
|
||||||
text: message.content,
|
if (message.type === MessageType.ABOUT) {
|
||||||
};
|
historyItemContent = {
|
||||||
|
type: 'about',
|
||||||
|
cliVersion: message.cliVersion,
|
||||||
|
osVersion: message.osVersion,
|
||||||
|
sandboxEnv: message.sandboxEnv,
|
||||||
|
modelVersion: message.modelVersion,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
historyItemContent = {
|
||||||
|
type: message.type as
|
||||||
|
| MessageType.INFO
|
||||||
|
| MessageType.ERROR
|
||||||
|
| MessageType.USER,
|
||||||
|
text: message.content,
|
||||||
|
};
|
||||||
|
}
|
||||||
addItem(historyItemContent, message.timestamp.getTime());
|
addItem(historyItemContent, message.timestamp.getTime());
|
||||||
},
|
},
|
||||||
[addItem],
|
[addItem],
|
||||||
@@ -149,6 +164,29 @@ export const useSlashCommandProcessor = (
|
|||||||
toggleCorgiMode();
|
toggleCorgiMode();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'about',
|
||||||
|
description: 'Show version info',
|
||||||
|
action: (_mainCommand, _subCommand, _args) => {
|
||||||
|
const osVersion = `${process.platform} ${process.version}`;
|
||||||
|
let sandboxEnv = 'no sandbox';
|
||||||
|
if (process.env.SANDBOX && process.env.SANDBOX !== 'sandbox-exec') {
|
||||||
|
sandboxEnv = process.env.SANDBOX.replace(/^gemini-(?:code-)?/, '');
|
||||||
|
} else if (process.env.SANDBOX === 'sandbox-exec') {
|
||||||
|
sandboxEnv = `sandbox-exec (${process.env.SEATBELT_PROFILE || 'unknown'})`;
|
||||||
|
}
|
||||||
|
const modelVersion = config?.getModel() || 'Unknown';
|
||||||
|
|
||||||
|
addMessage({
|
||||||
|
type: MessageType.ABOUT,
|
||||||
|
timestamp: new Date(),
|
||||||
|
cliVersion,
|
||||||
|
osVersion,
|
||||||
|
sandboxEnv,
|
||||||
|
modelVersion,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'bug',
|
name: 'bug',
|
||||||
description: 'Submit a bug report.',
|
description: 'Submit a bug report.',
|
||||||
|
|||||||
@@ -80,6 +80,14 @@ export type HistoryItemError = HistoryItemBase & {
|
|||||||
text: string;
|
text: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type HistoryItemAbout = HistoryItemBase & {
|
||||||
|
type: 'about';
|
||||||
|
cliVersion: string;
|
||||||
|
osVersion: string;
|
||||||
|
sandboxEnv: string;
|
||||||
|
modelVersion: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type HistoryItemToolGroup = HistoryItemBase & {
|
export type HistoryItemToolGroup = HistoryItemBase & {
|
||||||
type: 'tool_group';
|
type: 'tool_group';
|
||||||
tools: IndividualToolCallDisplay[];
|
tools: IndividualToolCallDisplay[];
|
||||||
@@ -101,6 +109,7 @@ export type HistoryItemWithoutId =
|
|||||||
| HistoryItemGeminiContent
|
| HistoryItemGeminiContent
|
||||||
| HistoryItemInfo
|
| HistoryItemInfo
|
||||||
| HistoryItemError
|
| HistoryItemError
|
||||||
|
| HistoryItemAbout
|
||||||
| HistoryItemToolGroup;
|
| HistoryItemToolGroup;
|
||||||
|
|
||||||
export type HistoryItem = HistoryItemWithoutId & { id: number };
|
export type HistoryItem = HistoryItemWithoutId & { id: number };
|
||||||
@@ -110,15 +119,26 @@ export enum MessageType {
|
|||||||
INFO = 'info',
|
INFO = 'info',
|
||||||
ERROR = 'error',
|
ERROR = 'error',
|
||||||
USER = 'user',
|
USER = 'user',
|
||||||
|
ABOUT = 'about', // Added ABOUT type
|
||||||
// Add GEMINI if needed by other commands
|
// Add GEMINI if needed by other commands
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simplified message structure for internal feedback
|
// Simplified message structure for internal feedback
|
||||||
export interface Message {
|
export type Message =
|
||||||
type: MessageType;
|
| {
|
||||||
content: string; // Renamed from text for clarity in this context
|
type: MessageType.INFO | MessageType.ERROR | MessageType.USER;
|
||||||
timestamp: Date; // For consistency, though addItem might use its own timestamping
|
content: string; // Renamed from text for clarity in this context
|
||||||
}
|
timestamp: Date;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: MessageType.ABOUT;
|
||||||
|
timestamp: Date;
|
||||||
|
cliVersion: string;
|
||||||
|
osVersion: string;
|
||||||
|
sandboxEnv: string;
|
||||||
|
modelVersion: string;
|
||||||
|
content?: string; // Optional content, not really used for ABOUT
|
||||||
|
};
|
||||||
|
|
||||||
export interface ConsoleMessageItem {
|
export interface ConsoleMessageItem {
|
||||||
type: 'log' | 'warn' | 'error' | 'debug';
|
type: 'log' | 'warn' | 'error' | 'debug';
|
||||||
|
|||||||
Reference in New Issue
Block a user