From 31b28ade010711c578d4be58c0dc439badebe000 Mon Sep 17 00:00:00 2001 From: Allen Hutchison Date: Fri, 13 Jun 2025 17:44:14 -0700 Subject: Improvements to web-fetch tool (#1030) --- .../messages/ToolConfirmationMessage.test.tsx | 50 ++++++++++++++++++++++ .../messages/ToolConfirmationMessage.tsx | 32 ++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx (limited to 'packages/cli/src') diff --git a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx new file mode 100644 index 00000000..a2d76247 --- /dev/null +++ b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { render } from 'ink-testing-library'; +import { describe, it, expect, vi } from 'vitest'; +import { ToolConfirmationMessage } from './ToolConfirmationMessage.js'; +import { ToolCallConfirmationDetails } from '@gemini-cli/core'; + +describe('ToolConfirmationMessage', () => { + it('should not display urls if prompt and url are the same', () => { + const confirmationDetails: ToolCallConfirmationDetails = { + type: 'info', + title: 'Confirm Web Fetch', + prompt: 'https://example.com', + urls: ['https://example.com'], + onConfirm: vi.fn(), + }; + + const { lastFrame } = render( + , + ); + + expect(lastFrame()).not.toContain('URLs to fetch:'); + }); + + it('should display urls if prompt and url are different', () => { + const confirmationDetails: ToolCallConfirmationDetails = { + type: 'info', + title: 'Confirm Web Fetch', + prompt: + 'fetch https://github.com/google/gemini-react/blob/main/README.md', + urls: [ + 'https://raw.githubusercontent.com/google/gemini-react/main/README.md', + ], + onConfirm: vi.fn(), + }; + + const { lastFrame } = render( + , + ); + + expect(lastFrame()).toContain('URLs to fetch:'); + expect(lastFrame()).toContain( + '- https://raw.githubusercontent.com/google/gemini-react/main/README.md', + ); + }); +}); diff --git a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx index b747cabc..e1e53ff6 100644 --- a/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx @@ -115,6 +115,38 @@ export const ToolConfirmationMessage: React.FC< }, { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, ); + } else if (confirmationDetails.type === 'info') { + const infoProps = confirmationDetails; + const displayUrls = + infoProps.urls && + !(infoProps.urls.length === 1 && infoProps.urls[0] === infoProps.prompt); + + bodyContent = ( + + {infoProps.prompt} + {displayUrls && infoProps.urls && infoProps.urls.length > 0 && ( + + URLs to fetch: + {infoProps.urls.map((url) => ( + - {url} + ))} + + )} + + ); + + question = `Do you want to proceed?`; + options.push( + { + label: 'Yes, allow once', + value: ToolConfirmationOutcome.ProceedOnce, + }, + { + label: 'Yes, allow always', + value: ToolConfirmationOutcome.ProceedAlways, + }, + { label: 'No (esc)', value: ToolConfirmationOutcome.Cancel }, + ); } else { // mcp tool confirmation const mcpProps = confirmationDetails as ToolMcpConfirmationDetails; -- cgit v1.2.3