/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { Box, Text, useInput } from 'ink'; import { PartListUnion } from '@google/genai'; import { DiffRenderer } from './DiffRenderer.js'; import { UI_WIDTH } from '../../constants.js'; import { Colors } from '../../colors.js'; import { ToolCallConfirmationDetails, ToolEditConfirmationDetails, ToolConfirmationOutcome, ToolExecuteConfirmationDetails, } from '@gemini-code/server'; import { RadioButtonSelect, RadioSelectItem, } from '../shared/RadioButtonSelect.js'; export interface ToolConfirmationMessageProps { confirmationDetails: ToolCallConfirmationDetails; onSubmit: (value: PartListUnion) => void; } function isEditDetails( props: ToolCallConfirmationDetails, ): props is ToolEditConfirmationDetails { return (props as ToolEditConfirmationDetails).fileName !== undefined; } export const ToolConfirmationMessage: React.FC< ToolConfirmationMessageProps > = ({ confirmationDetails }) => { const { onConfirm } = confirmationDetails; useInput((_, key) => { if (key.escape) { onConfirm(ToolConfirmationOutcome.Cancel); } }); const handleSelect = (item: ToolConfirmationOutcome) => onConfirm(item); let bodyContent: React.ReactNode | null = null; // Removed contextDisplay here let question: string; const options: Array> = new Array< RadioSelectItem >(); if (isEditDetails(confirmationDetails)) { // Body content is now the DiffRenderer, passing filename to it // The bordered box is removed from here and handled within DiffRenderer bodyContent = ; question = `Apply this change?`; options.push( { label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }, { label: 'Yes, allow always', value: ToolConfirmationOutcome.ProceedAlways, }, { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, ); } else { const executionProps = confirmationDetails as ToolExecuteConfirmationDetails; bodyContent = ( {executionProps.command} ); question = `Allow execution?`; options.push( { label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }, { label: `Yes, allow always for ${executionProps.rootCommand} ...`, value: ToolConfirmationOutcome.ProceedAlways, }, { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, ); } return ( {/* Body Content (Diff Renderer or Command Info) */} {/* No separate context display here anymore for edits */} {bodyContent} {/* Confirmation Question */} {question} {/* Select Input for Options */} ); };