/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { Box, Text, useInput } from 'ink'; import { DiffRenderer } from './DiffRenderer.js'; import { Colors } from '../../colors.js'; import { ToolCallConfirmationDetails, ToolConfirmationOutcome, ToolExecuteConfirmationDetails, ToolMcpConfirmationDetails, } from '@gemini-code/core'; import { RadioButtonSelect, RadioSelectItem, } from '../shared/RadioButtonSelect.js'; export interface ToolConfirmationMessageProps { confirmationDetails: ToolCallConfirmationDetails; } 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 (confirmationDetails.type === 'edit') { // 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 if (confirmationDetails.type === 'exec') { const executionProps = confirmationDetails as ToolExecuteConfirmationDetails; bodyContent = ( {executionProps.command} ); question = `Allow execution?`; options.push( { label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }, { label: `Yes, allow always "${executionProps.rootCommand} ..."`, value: ToolConfirmationOutcome.ProceedAlways, }, { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, ); } else { // mcp tool confirmation const mcpProps = confirmationDetails as ToolMcpConfirmationDetails; bodyContent = ( MCP Server: {mcpProps.serverName} Tool: {mcpProps.toolName} ); question = `Allow execution of MCP tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"?`; options.push( { label: 'Yes, allow once', value: ToolConfirmationOutcome.ProceedOnce, }, { label: `Yes, always allow tool "${mcpProps.toolName}" from server "${mcpProps.serverName}"`, value: ToolConfirmationOutcome.ProceedAlwaysTool, // Cast until types are updated }, { label: `Yes, always allow all tools from server "${mcpProps.serverName}"`, value: ToolConfirmationOutcome.ProceedAlwaysServer, }, { 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 */} ); };