2025-04-25 17:11:08 -07:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2025 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
2025-08-26 00:04:53 +02:00
|
|
|
import type React from 'react';
|
2025-09-25 14:07:17 -04:00
|
|
|
import { useMemo } from 'react';
|
|
|
|
|
import { escapeAnsiCtrlCodes } from '../utils/textUtils.js';
|
2025-05-24 00:44:17 -07:00
|
|
|
import type { HistoryItem } from '../types.js';
|
2025-04-25 17:11:08 -07:00
|
|
|
import { UserMessage } from './messages/UserMessage.js';
|
2025-05-18 01:18:32 -07:00
|
|
|
import { UserShellMessage } from './messages/UserShellMessage.js';
|
2025-04-25 17:11:08 -07:00
|
|
|
import { GeminiMessage } from './messages/GeminiMessage.js';
|
|
|
|
|
import { InfoMessage } from './messages/InfoMessage.js';
|
|
|
|
|
import { ErrorMessage } from './messages/ErrorMessage.js';
|
|
|
|
|
import { ToolGroupMessage } from './messages/ToolGroupMessage.js';
|
|
|
|
|
import { GeminiMessageContent } from './messages/GeminiMessageContent.js';
|
2025-06-13 21:21:40 -07:00
|
|
|
import { CompressionMessage } from './messages/CompressionMessage.js';
|
2025-09-17 14:32:46 -07:00
|
|
|
import { WarningMessage } from './messages/WarningMessage.js';
|
2025-04-25 17:11:08 -07:00
|
|
|
import { Box } from 'ink';
|
2025-05-23 10:34:15 -07:00
|
|
|
import { AboutBox } from './AboutBox.js';
|
2025-06-10 15:59:52 -04:00
|
|
|
import { StatsDisplay } from './StatsDisplay.js';
|
2025-06-29 20:44:33 -04:00
|
|
|
import { ModelStatsDisplay } from './ModelStatsDisplay.js';
|
|
|
|
|
import { ToolStatsDisplay } from './ToolStatsDisplay.js';
|
2025-06-11 16:40:31 -04:00
|
|
|
import { SessionSummaryDisplay } from './SessionSummaryDisplay.js';
|
2025-08-04 09:53:50 -07:00
|
|
|
import { Help } from './Help.js';
|
2025-08-26 00:04:53 +02:00
|
|
|
import type { SlashCommand } from '../commands/types.js';
|
2025-09-12 09:20:04 -07:00
|
|
|
import { ExtensionsList } from './views/ExtensionsList.js';
|
2025-09-29 14:27:06 -07:00
|
|
|
import { getMCPServerStatus } from '@google/gemini-cli-core';
|
|
|
|
|
import { ToolsList } from './views/ToolsList.js';
|
2025-12-30 13:35:52 -08:00
|
|
|
import { SkillsList } from './views/SkillsList.js';
|
2025-09-29 14:27:06 -07:00
|
|
|
import { McpStatus } from './views/McpStatus.js';
|
2025-10-03 00:52:16 +02:00
|
|
|
import { ChatList } from './views/ChatList.js';
|
2025-12-03 10:01:57 -08:00
|
|
|
import { HooksList } from './views/HooksList.js';
|
2025-11-13 19:11:06 -08:00
|
|
|
import { ModelMessage } from './messages/ModelMessage.js';
|
2025-04-25 17:11:08 -07:00
|
|
|
|
|
|
|
|
interface HistoryItemDisplayProps {
|
|
|
|
|
item: HistoryItem;
|
2025-06-19 20:17:23 +00:00
|
|
|
availableTerminalHeight?: number;
|
|
|
|
|
terminalWidth: number;
|
2025-05-15 22:56:03 -07:00
|
|
|
isPending: boolean;
|
2025-06-12 02:21:54 +01:00
|
|
|
isFocused?: boolean;
|
2025-08-04 09:53:50 -07:00
|
|
|
commands?: readonly SlashCommand[];
|
2025-09-11 13:27:27 -07:00
|
|
|
activeShellPtyId?: number | null;
|
2025-09-20 10:59:37 -07:00
|
|
|
embeddedShellFocused?: boolean;
|
2025-09-27 12:40:09 -07:00
|
|
|
availableTerminalHeightGemini?: number;
|
2025-04-25 17:11:08 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
|
|
|
|
|
item,
|
2025-05-15 00:19:41 -07:00
|
|
|
availableTerminalHeight,
|
2025-06-19 20:17:23 +00:00
|
|
|
terminalWidth,
|
2025-05-15 22:56:03 -07:00
|
|
|
isPending,
|
2025-08-04 09:53:50 -07:00
|
|
|
commands,
|
2025-06-12 02:21:54 +01:00
|
|
|
isFocused = true,
|
2025-09-11 13:27:27 -07:00
|
|
|
activeShellPtyId,
|
2025-09-20 10:59:37 -07:00
|
|
|
embeddedShellFocused,
|
2025-09-27 12:40:09 -07:00
|
|
|
availableTerminalHeightGemini,
|
2025-09-25 14:07:17 -04:00
|
|
|
}) => {
|
|
|
|
|
const itemForDisplay = useMemo(() => escapeAnsiCtrlCodes(item), [item]);
|
|
|
|
|
|
|
|
|
|
return (
|
2025-11-11 07:50:11 -08:00
|
|
|
<Box flexDirection="column" key={itemForDisplay.id} width={terminalWidth}>
|
2025-09-25 14:07:17 -04:00
|
|
|
{/* Render standard message types */}
|
|
|
|
|
{itemForDisplay.type === 'user' && (
|
2025-11-11 07:50:11 -08:00
|
|
|
<UserMessage text={itemForDisplay.text} width={terminalWidth} />
|
2025-09-25 14:07:17 -04:00
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'user_shell' && (
|
|
|
|
|
<UserShellMessage text={itemForDisplay.text} />
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'gemini' && (
|
|
|
|
|
<GeminiMessage
|
|
|
|
|
text={itemForDisplay.text}
|
|
|
|
|
isPending={isPending}
|
2025-09-27 12:40:09 -07:00
|
|
|
availableTerminalHeight={
|
|
|
|
|
availableTerminalHeightGemini ?? availableTerminalHeight
|
|
|
|
|
}
|
2025-09-25 14:07:17 -04:00
|
|
|
terminalWidth={terminalWidth}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'gemini_content' && (
|
|
|
|
|
<GeminiMessageContent
|
|
|
|
|
text={itemForDisplay.text}
|
|
|
|
|
isPending={isPending}
|
2025-09-27 12:40:09 -07:00
|
|
|
availableTerminalHeight={
|
|
|
|
|
availableTerminalHeightGemini ?? availableTerminalHeight
|
|
|
|
|
}
|
2025-09-25 14:07:17 -04:00
|
|
|
terminalWidth={terminalWidth}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'info' && (
|
2025-11-07 15:17:23 -08:00
|
|
|
<InfoMessage
|
|
|
|
|
text={itemForDisplay.text}
|
|
|
|
|
icon={itemForDisplay.icon}
|
|
|
|
|
color={itemForDisplay.color}
|
|
|
|
|
/>
|
2025-09-25 14:07:17 -04:00
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'warning' && (
|
|
|
|
|
<WarningMessage text={itemForDisplay.text} />
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'error' && (
|
|
|
|
|
<ErrorMessage text={itemForDisplay.text} />
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'about' && (
|
|
|
|
|
<AboutBox
|
|
|
|
|
cliVersion={itemForDisplay.cliVersion}
|
|
|
|
|
osVersion={itemForDisplay.osVersion}
|
|
|
|
|
sandboxEnv={itemForDisplay.sandboxEnv}
|
|
|
|
|
modelVersion={itemForDisplay.modelVersion}
|
|
|
|
|
selectedAuthType={itemForDisplay.selectedAuthType}
|
|
|
|
|
gcpProject={itemForDisplay.gcpProject}
|
|
|
|
|
ideClient={itemForDisplay.ideClient}
|
2025-11-19 19:46:21 -08:00
|
|
|
userEmail={itemForDisplay.userEmail}
|
2025-09-25 14:07:17 -04:00
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'help' && commands && (
|
|
|
|
|
<Help commands={commands} />
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'stats' && (
|
2025-11-26 20:21:33 -05:00
|
|
|
<StatsDisplay
|
|
|
|
|
duration={itemForDisplay.duration}
|
|
|
|
|
quotas={itemForDisplay.quotas}
|
|
|
|
|
/>
|
2025-09-25 14:07:17 -04:00
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'model_stats' && <ModelStatsDisplay />}
|
|
|
|
|
{itemForDisplay.type === 'tool_stats' && <ToolStatsDisplay />}
|
2025-11-13 19:11:06 -08:00
|
|
|
{itemForDisplay.type === 'model' && (
|
|
|
|
|
<ModelMessage model={itemForDisplay.model} />
|
|
|
|
|
)}
|
2025-09-25 14:07:17 -04:00
|
|
|
{itemForDisplay.type === 'quit' && (
|
|
|
|
|
<SessionSummaryDisplay duration={itemForDisplay.duration} />
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'tool_group' && (
|
|
|
|
|
<ToolGroupMessage
|
|
|
|
|
toolCalls={itemForDisplay.tools}
|
|
|
|
|
groupId={itemForDisplay.id}
|
|
|
|
|
availableTerminalHeight={availableTerminalHeight}
|
|
|
|
|
terminalWidth={terminalWidth}
|
|
|
|
|
isFocused={isFocused}
|
|
|
|
|
activeShellPtyId={activeShellPtyId}
|
|
|
|
|
embeddedShellFocused={embeddedShellFocused}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{itemForDisplay.type === 'compression' && (
|
|
|
|
|
<CompressionMessage compression={itemForDisplay.compression} />
|
|
|
|
|
)}
|
2025-10-23 08:05:43 -05:00
|
|
|
{itemForDisplay.type === 'extensions_list' && (
|
|
|
|
|
<ExtensionsList extensions={itemForDisplay.extensions} />
|
|
|
|
|
)}
|
2025-09-29 14:27:06 -07:00
|
|
|
{itemForDisplay.type === 'tools_list' && (
|
|
|
|
|
<ToolsList
|
|
|
|
|
terminalWidth={terminalWidth}
|
|
|
|
|
tools={itemForDisplay.tools}
|
|
|
|
|
showDescriptions={itemForDisplay.showDescriptions}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2025-12-30 13:35:52 -08:00
|
|
|
{itemForDisplay.type === 'skills_list' && (
|
|
|
|
|
<SkillsList
|
|
|
|
|
skills={itemForDisplay.skills}
|
|
|
|
|
showDescriptions={itemForDisplay.showDescriptions}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2025-09-29 14:27:06 -07:00
|
|
|
{itemForDisplay.type === 'mcp_status' && (
|
|
|
|
|
<McpStatus {...itemForDisplay} serverStatus={getMCPServerStatus} />
|
|
|
|
|
)}
|
2025-10-03 00:52:16 +02:00
|
|
|
{itemForDisplay.type === 'chat_list' && (
|
|
|
|
|
<ChatList chats={itemForDisplay.chats} />
|
|
|
|
|
)}
|
2025-12-03 10:01:57 -08:00
|
|
|
{itemForDisplay.type === 'hooks_list' && (
|
|
|
|
|
<HooksList hooks={itemForDisplay.hooks} />
|
|
|
|
|
)}
|
2025-09-25 14:07:17 -04:00
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
};
|