2025-11-11 07:50:11 -08:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2025 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
2026-01-23 20:32:35 -05:00
|
|
|
import { Box, Text } from 'ink';
|
2025-11-11 07:50:11 -08:00
|
|
|
import { useUIState } from '../contexts/UIStateContext.js';
|
|
|
|
|
import { AppHeader } from './AppHeader.js';
|
|
|
|
|
import { HistoryItemDisplay } from './HistoryItemDisplay.js';
|
|
|
|
|
import { QuittingDisplay } from './QuittingDisplay.js';
|
|
|
|
|
import { useAppContext } from '../contexts/AppContext.js';
|
|
|
|
|
import { MAX_GEMINI_MESSAGE_LINES } from '../constants.js';
|
2026-01-23 20:32:35 -05:00
|
|
|
import { useConfirmingTool } from '../hooks/useConfirmingTool.js';
|
|
|
|
|
import { useConfig } from '../contexts/ConfigContext.js';
|
|
|
|
|
import { ToolStatusIndicator, ToolInfo } from './messages/ToolShared.js';
|
|
|
|
|
import { theme } from '../semantic-colors.js';
|
2025-11-11 07:50:11 -08:00
|
|
|
|
|
|
|
|
export const AlternateBufferQuittingDisplay = () => {
|
|
|
|
|
const { version } = useAppContext();
|
|
|
|
|
const uiState = useUIState();
|
2026-01-23 20:32:35 -05:00
|
|
|
const config = useConfig();
|
|
|
|
|
|
|
|
|
|
const confirmingTool = useConfirmingTool();
|
|
|
|
|
const showPromptedTool =
|
|
|
|
|
config.isEventDrivenSchedulerEnabled() && confirmingTool !== null;
|
2025-11-11 07:50:11 -08:00
|
|
|
|
|
|
|
|
// We render the entire chat history and header here to ensure that the
|
|
|
|
|
// conversation history is visible to the user after the app quits and the
|
|
|
|
|
// user exits alternate buffer mode.
|
|
|
|
|
// Our version of Ink is clever and will render a final frame outside of
|
|
|
|
|
// the alternate buffer on app exit.
|
|
|
|
|
return (
|
|
|
|
|
<Box
|
|
|
|
|
flexDirection="column"
|
|
|
|
|
flexShrink={0}
|
|
|
|
|
flexGrow={0}
|
|
|
|
|
width={uiState.terminalWidth}
|
|
|
|
|
>
|
|
|
|
|
<AppHeader key="app-header" version={version} />
|
|
|
|
|
{uiState.history.map((h) => (
|
|
|
|
|
<HistoryItemDisplay
|
|
|
|
|
terminalWidth={uiState.mainAreaWidth}
|
|
|
|
|
availableTerminalHeight={undefined}
|
|
|
|
|
availableTerminalHeightGemini={MAX_GEMINI_MESSAGE_LINES}
|
|
|
|
|
key={h.id}
|
|
|
|
|
item={h}
|
|
|
|
|
isPending={false}
|
|
|
|
|
commands={uiState.slashCommands}
|
|
|
|
|
/>
|
|
|
|
|
))}
|
|
|
|
|
{uiState.pendingHistoryItems.map((item, i) => (
|
|
|
|
|
<HistoryItemDisplay
|
|
|
|
|
key={i}
|
|
|
|
|
availableTerminalHeight={undefined}
|
|
|
|
|
terminalWidth={uiState.mainAreaWidth}
|
|
|
|
|
item={{ ...item, id: 0 }}
|
|
|
|
|
isPending={true}
|
|
|
|
|
isFocused={false}
|
|
|
|
|
activeShellPtyId={uiState.activePtyId}
|
|
|
|
|
embeddedShellFocused={uiState.embeddedShellFocused}
|
|
|
|
|
/>
|
|
|
|
|
))}
|
2026-01-23 20:32:35 -05:00
|
|
|
{showPromptedTool && (
|
|
|
|
|
<Box flexDirection="column" marginTop={1} marginBottom={1}>
|
|
|
|
|
<Text color={theme.status.warning} bold>
|
|
|
|
|
Action Required (was prompted):
|
|
|
|
|
</Text>
|
|
|
|
|
<Box marginTop={1}>
|
|
|
|
|
<ToolStatusIndicator
|
|
|
|
|
status={confirmingTool.tool.status}
|
|
|
|
|
name={confirmingTool.tool.name}
|
|
|
|
|
/>
|
|
|
|
|
<ToolInfo
|
|
|
|
|
name={confirmingTool.tool.name}
|
|
|
|
|
status={confirmingTool.tool.status}
|
|
|
|
|
description={confirmingTool.tool.description}
|
|
|
|
|
emphasis="high"
|
|
|
|
|
/>
|
|
|
|
|
</Box>
|
|
|
|
|
</Box>
|
|
|
|
|
)}
|
2025-11-11 07:50:11 -08:00
|
|
|
<QuittingDisplay />
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
};
|