From 9efca40dae2e75477af1a20df4e3e65bf8dfe93d Mon Sep 17 00:00:00 2001 From: Leo <45218470+ngleo@users.noreply.github.com> Date: Sun, 8 Jun 2025 18:56:58 +0100 Subject: feat: Add flow to allow modifying edits during edit tool call (#808) --- .../messages/ToolConfirmationMessage.tsx | 45 +++++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx') diff --git a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx index 01372290..c46d36f7 100644 --- a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx @@ -13,6 +13,8 @@ import { ToolConfirmationOutcome, ToolExecuteConfirmationDetails, ToolMcpConfirmationDetails, + checkHasEditor, + Config, } from '@gemini-cli/core'; import { RadioButtonSelect, @@ -21,11 +23,12 @@ import { export interface ToolConfirmationMessageProps { confirmationDetails: ToolCallConfirmationDetails; + config?: Config; } export const ToolConfirmationMessage: React.FC< ToolConfirmationMessageProps -> = ({ confirmationDetails }) => { +> = ({ confirmationDetails, config }) => { const { onConfirm } = confirmationDetails; useInput((_, key) => { @@ -44,6 +47,24 @@ export const ToolConfirmationMessage: React.FC< >(); if (confirmationDetails.type === 'edit') { + if (confirmationDetails.isModifying) { + return ( + + Modify in progress: + + Save and close external editor to continue + + + ); + } + // Body content is now the DiffRenderer, passing filename to it // The bordered box is removed from here and handled within DiffRenderer bodyContent = ( @@ -63,8 +84,28 @@ export const ToolConfirmationMessage: React.FC< label: 'Yes, allow always', value: ToolConfirmationOutcome.ProceedAlways, }, - { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, ); + + // Conditionally add editor options if editors are installed + const notUsingSandbox = !process.env.SANDBOX; + const externalEditorsEnabled = + config?.getEnableModifyWithExternalEditors() ?? false; + + if (checkHasEditor('vscode') && notUsingSandbox && externalEditorsEnabled) { + options.push({ + label: 'Modify with VS Code', + value: ToolConfirmationOutcome.ModifyVSCode, + }); + } + + if (checkHasEditor('vim') && externalEditorsEnabled) { + options.push({ + label: 'Modify with vim', + value: ToolConfirmationOutcome.ModifyVim, + }); + } + + options.push({ label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }); } else if (confirmationDetails.type === 'exec') { const executionProps = confirmationDetails as ToolExecuteConfirmationDetails; -- cgit v1.2.3