diff options
Diffstat (limited to 'packages/cli/src/ui/privacy')
| -rw-r--r-- | packages/cli/src/ui/privacy/CloudFreePrivacyNotice.tsx | 104 | ||||
| -rw-r--r-- | packages/cli/src/ui/privacy/CloudPaidPrivacyNotice.tsx | 55 | ||||
| -rw-r--r-- | packages/cli/src/ui/privacy/GeminiPrivacyNotice.tsx | 58 | ||||
| -rw-r--r-- | packages/cli/src/ui/privacy/PrivacyNotice.tsx | 42 |
4 files changed, 259 insertions, 0 deletions
diff --git a/packages/cli/src/ui/privacy/CloudFreePrivacyNotice.tsx b/packages/cli/src/ui/privacy/CloudFreePrivacyNotice.tsx new file mode 100644 index 00000000..f9341bf9 --- /dev/null +++ b/packages/cli/src/ui/privacy/CloudFreePrivacyNotice.tsx @@ -0,0 +1,104 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Box, Newline, Text } from 'ink'; +import { RadioButtonSelect } from '../components/shared/RadioButtonSelect.js'; +import { usePrivacySettings } from '../hooks/usePrivacySettings.js'; +import { CloudPaidPrivacyNotice } from './CloudPaidPrivacyNotice.js'; +import { Config } from '@google/gemini-cli-core'; +import { Colors } from '../colors.js'; + +interface CloudFreePrivacyNoticeProps { + config: Config; + onExit: () => void; +} + +export const CloudFreePrivacyNotice = ({ + config, + onExit, +}: CloudFreePrivacyNoticeProps) => { + const { privacyState, updateDataCollectionOptIn } = + usePrivacySettings(config); + + if (privacyState.isLoading) { + return <Text color={Colors.Gray}>Loading...</Text>; + } + + if (privacyState.error) { + return ( + <Text color={Colors.AccentRed}> + Error loading Opt-in settings: {privacyState.error} + </Text> + ); + } + + if (privacyState.isFreeTier === false) { + return <CloudPaidPrivacyNotice onExit={onExit} />; + } + + const items = [ + { label: 'Yes', value: true }, + { label: 'No', value: false }, + ]; + + return ( + <Box flexDirection="column" marginY={1}> + <Text bold color={Colors.AccentPurple}> + Gemini Code Assist for Individuals Privacy Notice + </Text> + <Newline /> + <Text> + This notice and our Privacy Policy + <Text color={Colors.AccentBlue}>[1]</Text> describe how Gemini Code + Assist handles your data. Please read them carefully. + </Text> + <Newline /> + <Text> + When you use Gemini Code Assist for individuals with Gemini CLI, Google + collects your prompts, related code, generated output, code edits, + related feature usage information, and your feedback to provide, + improve, and develop Google products and services and machine learning + technologies. + </Text> + <Newline /> + <Text> + To help with quality and improve our products (such as generative + machine-learning models), human reviewers may read, annotate, and + process the data collected above. We take steps to protect your privacy + as part of this process. This includes disconnecting the data from your + Google Account before reviewers see or annotate it, and storing those + disconnected copies for up to 18 months. Please don't submit + confidential information or any data you wouldn't want a reviewer + to see or Google to use to improve our products, services and + machine-learning technologies. + </Text> + <Newline /> + <Box flexDirection="column"> + <Text> + Allow Google to use this data to develop and improve our products? + </Text> + <RadioButtonSelect + items={items} + initialIndex={privacyState.dataCollectionOptIn ? 0 : 1} + onSelect={(value) => { + updateDataCollectionOptIn(value); + // Only exit if there was no error. + if (!privacyState.error) { + onExit(); + } + }} + /> + </Box> + <Newline /> + <Text> + <Text color={Colors.AccentBlue}>[1]</Text>{' '} + https://policies.google.com/privacy + </Text> + <Newline /> + <Text color={Colors.Gray}>Press Enter to choose an option and exit.</Text> + </Box> + ); +}; diff --git a/packages/cli/src/ui/privacy/CloudPaidPrivacyNotice.tsx b/packages/cli/src/ui/privacy/CloudPaidPrivacyNotice.tsx new file mode 100644 index 00000000..e50dcd4b --- /dev/null +++ b/packages/cli/src/ui/privacy/CloudPaidPrivacyNotice.tsx @@ -0,0 +1,55 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Box, Newline, Text, useInput } from 'ink'; +import { Colors } from '../colors.js'; + +interface CloudPaidPrivacyNoticeProps { + onExit: () => void; +} + +export const CloudPaidPrivacyNotice = ({ + onExit, +}: CloudPaidPrivacyNoticeProps) => { + useInput((input, key) => { + if (key.escape) { + onExit(); + } + }); + + return ( + <Box flexDirection="column" marginBottom={1}> + <Text bold color={Colors.AccentPurple}> + Vertex AI Notice + </Text> + <Newline /> + <Text> + Service Specific Terms<Text color={Colors.AccentBlue}>[1]</Text> are + incorporated into the agreement under which Google has agreed to provide + Google Cloud Platform<Text color={Colors.AccentGreen}>[2]</Text> to + Customer (the “Agreement”). If the Agreement authorizes the resale or + supply of Google Cloud Platform under a Google Cloud partner or reseller + program, then except for in the section entitled “Partner-Specific + Terms”, all references to Customer in the Service Specific Terms mean + Partner or Reseller (as applicable), and all references to Customer Data + in the Service Specific Terms mean Partner Data. Capitalized terms used + but not defined in the Service Specific Terms have the meaning given to + them in the Agreement. + </Text> + <Newline /> + <Text> + <Text color={Colors.AccentBlue}>[1]</Text>{' '} + https://cloud.google.com/terms/service-terms + </Text> + <Text> + <Text color={Colors.AccentGreen}>[2]</Text>{' '} + https://cloud.google.com/terms/services + </Text> + <Newline /> + <Text color={Colors.Gray}>Press Esc to exit.</Text> + </Box> + ); +}; diff --git a/packages/cli/src/ui/privacy/GeminiPrivacyNotice.tsx b/packages/cli/src/ui/privacy/GeminiPrivacyNotice.tsx new file mode 100644 index 00000000..57030ac3 --- /dev/null +++ b/packages/cli/src/ui/privacy/GeminiPrivacyNotice.tsx @@ -0,0 +1,58 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Box, Newline, Text, useInput } from 'ink'; +import { Colors } from '../colors.js'; + +interface GeminiPrivacyNoticeProps { + onExit: () => void; +} + +export const GeminiPrivacyNotice = ({ onExit }: GeminiPrivacyNoticeProps) => { + useInput((input, key) => { + if (key.escape) { + onExit(); + } + }); + + return ( + <Box flexDirection="column" marginBottom={1}> + <Text bold color={Colors.AccentPurple}> + Gemini API Key Notice + </Text> + <Newline /> + <Text> + By using the Gemini API<Text color={Colors.AccentBlue}>[1]</Text>, + Google AI Studio + <Text color={Colors.AccentRed}>[2]</Text>, and the other Google + developer services that reference these terms (collectively, the + "APIs" or "Services"), you are agreeing to Google + APIs Terms of Service (the "API Terms") + <Text color={Colors.AccentGreen}>[3]</Text>, and the Gemini API + Additional Terms of Service (the "Additional Terms") + <Text color={Colors.AccentPurple}>[4]</Text>. + </Text> + <Newline /> + <Text> + <Text color={Colors.AccentBlue}>[1]</Text>{' '} + https://ai.google.dev/docs/gemini_api_overview + </Text> + <Text> + <Text color={Colors.AccentRed}>[2]</Text> https://aistudio.google.com/ + </Text> + <Text> + <Text color={Colors.AccentGreen}>[3]</Text>{' '} + https://developers.google.com/terms + </Text> + <Text> + <Text color={Colors.AccentPurple}>[4]</Text>{' '} + https://ai.google.dev/gemini-api/terms + </Text> + <Newline /> + <Text color={Colors.Gray}>Press Esc to exit.</Text> + </Box> + ); +}; diff --git a/packages/cli/src/ui/privacy/PrivacyNotice.tsx b/packages/cli/src/ui/privacy/PrivacyNotice.tsx new file mode 100644 index 00000000..b12b3648 --- /dev/null +++ b/packages/cli/src/ui/privacy/PrivacyNotice.tsx @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Box } from 'ink'; +import { type Config, AuthType } from '@google/gemini-cli-core'; +import { GeminiPrivacyNotice } from './GeminiPrivacyNotice.js'; +import { CloudPaidPrivacyNotice } from './CloudPaidPrivacyNotice.js'; +import { CloudFreePrivacyNotice } from './CloudFreePrivacyNotice.js'; + +interface PrivacyNoticeProps { + onExit: () => void; + config: Config; +} + +const PrivacyNoticeText = ({ + config, + onExit, +}: { + config: Config; + onExit: () => void; +}) => { + const authType = config.getContentGeneratorConfig()?.authType; + + switch (authType) { + case AuthType.USE_GEMINI: + return <GeminiPrivacyNotice onExit={onExit} />; + case AuthType.USE_VERTEX_AI: + return <CloudPaidPrivacyNotice onExit={onExit} />; + case AuthType.LOGIN_WITH_GOOGLE_PERSONAL: + default: + return <CloudFreePrivacyNotice config={config} onExit={onExit} />; + } +}; + +export const PrivacyNotice = ({ onExit, config }: PrivacyNoticeProps) => ( + <Box borderStyle="round" padding={1} flexDirection="column"> + <PrivacyNoticeText config={config} onExit={onExit} /> + </Box> +); |
