summaryrefslogtreecommitdiff
path: root/packages/cli/src
diff options
context:
space:
mode:
authorAllen Hutchison <[email protected]>2025-06-13 17:44:14 -0700
committerGitHub <[email protected]>2025-06-13 17:44:14 -0700
commit31b28ade010711c578d4be58c0dc439badebe000 (patch)
treecdddcfb73285697dc9d1a79363f52f07ccaa63e1 /packages/cli/src
parent8eb505fbba664d32c4f5ed94485cc219f2db3e20 (diff)
Improvements to web-fetch tool (#1030)
Diffstat (limited to 'packages/cli/src')
-rw-r--r--packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx50
-rw-r--r--packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx32
2 files changed, 82 insertions, 0 deletions
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(
+ <ToolConfirmationMessage confirmationDetails={confirmationDetails} />,
+ );
+
+ 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(
+ <ToolConfirmationMessage confirmationDetails={confirmationDetails} />,
+ );
+
+ 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 = (
+ <Box flexDirection="column" paddingX={1} marginLeft={1}>
+ <Text color={Colors.AccentCyan}>{infoProps.prompt}</Text>
+ {displayUrls && infoProps.urls && infoProps.urls.length > 0 && (
+ <Box flexDirection="column" marginTop={1}>
+ <Text>URLs to fetch:</Text>
+ {infoProps.urls.map((url) => (
+ <Text key={url}> - {url}</Text>
+ ))}
+ </Box>
+ )}
+ </Box>
+ );
+
+ 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;