diff --git a/src/cliproxy/antigravity-responsibility.ts b/src/cliproxy/antigravity-responsibility.ts index 1f89b5a2..c16722cd 100644 --- a/src/cliproxy/antigravity-responsibility.ts +++ b/src/cliproxy/antigravity-responsibility.ts @@ -14,7 +14,8 @@ import { getCliproxySafetyConfig } from '../config/unified-config-loader'; export const ANTIGRAVITY_RISK_ISSUE_URL = 'https://github.com/kaitranntt/ccs/issues/509'; export const ANTIGRAVITY_ACK_VERSION = '2026-02-24-antigravity-oauth-v2'; -export const ANTIGRAVITY_ACK_PHRASE = 'I ACCEPT AGY RISK'; +export const RISK_ACK_PHRASE = 'I ACCEPT RISK'; +export const ANTIGRAVITY_ACK_PHRASE = RISK_ACK_PHRASE; export const ANTIGRAVITY_ACCEPT_RISK_FLAGS = ['--accept-agr-risk', '--accept-antigravity-risk']; type AgyRiskContext = 'oauth' | 'run'; diff --git a/tests/unit/cliproxy/antigravity-responsibility.test.ts b/tests/unit/cliproxy/antigravity-responsibility.test.ts index 420c142a..0777a60d 100644 --- a/tests/unit/cliproxy/antigravity-responsibility.test.ts +++ b/tests/unit/cliproxy/antigravity-responsibility.test.ts @@ -57,7 +57,7 @@ describe('antigravity-responsibility', () => { reviewedIssue509: true, understandsBanRisk: true, acceptsFullResponsibility: true, - typedPhrase: ' i accept agy risk ', + typedPhrase: ' i accept risk ', }); expect(result.valid).toBeTrue(); diff --git a/ui/src/components/account/account-safety-warning-card.tsx b/ui/src/components/account/account-safety-warning-card.tsx index 8272caab..ad646ad1 100644 --- a/ui/src/components/account/account-safety-warning-card.tsx +++ b/ui/src/components/account/account-safety-warning-card.tsx @@ -1,14 +1,16 @@ import { AlertTriangle, ExternalLink, Settings2 } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; -import { Checkbox } from '@/components/ui/checkbox'; +import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { cn } from '@/lib/utils'; +import { RISK_ACK_PHRASE } from '@/components/account/antigravity-responsibility-constants'; interface AccountSafetyWarningCardProps { className?: string; showAcknowledgement?: boolean; - acknowledged?: boolean; - onAcknowledgedChange?: (value: boolean) => void; + acknowledgementPhrase?: string; + acknowledgementText?: string; + onAcknowledgementTextChange?: (value: string) => void; disabled?: boolean; showProxySettingsLink?: boolean; } @@ -16,8 +18,9 @@ interface AccountSafetyWarningCardProps { export function AccountSafetyWarningCard({ className, showAcknowledgement = false, - acknowledged = false, - onAcknowledgedChange, + acknowledgementPhrase = RISK_ACK_PHRASE, + acknowledgementText = '', + onAcknowledgementTextChange, disabled = false, showProxySettingsLink = false, }: AccountSafetyWarningCardProps) { @@ -99,20 +102,22 @@ export function AccountSafetyWarningCard({ - {showAcknowledgement && onAcknowledgedChange && ( + {showAcknowledgement && onAcknowledgementTextChange && (
-
- onAcknowledgedChange(Boolean(checked))} - disabled={disabled} - /> - -
+ + onAcknowledgementTextChange(e.target.value)} + placeholder={acknowledgementPhrase} + disabled={disabled} + className="mt-2 font-mono text-xs" + />
)} diff --git a/ui/src/components/account/add-account-dialog.tsx b/ui/src/components/account/add-account-dialog.tsx index a387eb92..094ce6ff 100644 --- a/ui/src/components/account/add-account-dialog.tsx +++ b/ui/src/components/account/add-account-dialog.tsx @@ -34,6 +34,7 @@ import { AntigravityResponsibilityChecklist } from '@/components/account/antigra import { ANTIGRAVITY_ACK_VERSION, DEFAULT_ANTIGRAVITY_RISK_CHECKLIST, + RISK_ACK_PHRASE, isAntigravityRiskChecklistComplete, } from '@/components/account/antigravity-responsibility-constants'; import { @@ -55,6 +56,10 @@ interface AddAccountDialogProps { isFirstAccount?: boolean; } +function normalizeRiskPhrase(value: string): string { + return value.trim().replace(/\s+/g, ' ').toUpperCase(); +} + export function AddAccountDialog({ open, onClose, @@ -66,7 +71,7 @@ export function AddAccountDialog({ const [callbackUrl, setCallbackUrl] = useState(''); const [copied, setCopied] = useState(false); const [localError, setLocalError] = useState(null); - const [acknowledgedRisk, setAcknowledgedRisk] = useState(false); + const [riskAcknowledgementText, setRiskAcknowledgementText] = useState(''); const [agyRiskChecklist, setAgyRiskChecklist] = useState(DEFAULT_ANTIGRAVITY_RISK_CHECKLIST); const [agyAckBypassEnabled, setAgyAckBypassEnabled] = useState(false); const [agyAckBypassLoading, setAgyAckBypassLoading] = useState(false); @@ -80,6 +85,7 @@ export function AddAccountDialog({ const requiresAgyResponsibilityFlow = provider === 'agy' && !agyAckBypassEnabled; const isAgyBypassStatePending = provider === 'agy' && agyAckBypassLoading; const isAgyRiskChecklistComplete = isAntigravityRiskChecklistComplete(agyRiskChecklist); + const isGeminiRiskAcknowledged = normalizeRiskPhrase(riskAcknowledgementText) === RISK_ACK_PHRASE; const defaultDeviceCode = isDeviceCodeProvider(provider); const requiresNickname = isNicknameRequiredProvider(provider); const kiroMethodOption = getKiroAuthMethodOption(kiroAuthMethod); @@ -102,7 +108,7 @@ export function AddAccountDialog({ setCallbackUrl(''); setCopied(false); setLocalError(null); - setAcknowledgedRisk(false); + setRiskAcknowledgementText(''); setAgyRiskChecklist(DEFAULT_ANTIGRAVITY_RISK_CHECKLIST); setAgyAckBypassEnabled(false); setAgyAckBypassLoading(false); @@ -113,7 +119,7 @@ export function AddAccountDialog({ useEffect(() => { if (open) { - setAcknowledgedRisk(false); + setRiskAcknowledgementText(''); setAgyRiskChecklist(DEFAULT_ANTIGRAVITY_RISK_CHECKLIST); setLocalError(null); } @@ -252,9 +258,9 @@ export function AddAccountDialog({ ); return; } - if (requiresSafetyAcknowledgement && !acknowledgedRisk) { + if (requiresSafetyAcknowledgement && !isGeminiRiskAcknowledged) { setLocalError( - 'Please acknowledge the account safety warning before authenticating this provider.' + `Type "${RISK_ACK_PHRASE}" to acknowledge the account safety warning before authenticating this provider.` ); return; } @@ -348,9 +354,10 @@ export function AddAccountDialog({ {requiresSafetyAcknowledgement && !showAuthUI && ( { - setAcknowledgedRisk(value); + acknowledgementPhrase={RISK_ACK_PHRASE} + acknowledgementText={riskAcknowledgementText} + onAcknowledgementTextChange={(value) => { + setRiskAcknowledgementText(value); setLocalError(null); }} disabled={isPending} @@ -549,7 +556,7 @@ export function AddAccountDialog({ isAgyBypassStatePending || (requiresNickname && !nicknameTrimmed) || (requiresAgyResponsibilityFlow && !isAgyRiskChecklistComplete) || - (requiresSafetyAcknowledgement && !acknowledgedRisk) + (requiresSafetyAcknowledgement && !isGeminiRiskAcknowledged) } > diff --git a/ui/src/components/account/antigravity-responsibility-constants.ts b/ui/src/components/account/antigravity-responsibility-constants.ts index dad8544c..621d408d 100644 --- a/ui/src/components/account/antigravity-responsibility-constants.ts +++ b/ui/src/components/account/antigravity-responsibility-constants.ts @@ -1,5 +1,6 @@ export const ANTIGRAVITY_ACK_VERSION = '2026-02-24-antigravity-oauth-v2'; -export const ANTIGRAVITY_ACK_PHRASE = 'I ACCEPT AGY RISK'; +export const RISK_ACK_PHRASE = 'I ACCEPT RISK'; +export const ANTIGRAVITY_ACK_PHRASE = RISK_ACK_PHRASE; export interface AntigravityRiskChecklistValue { reviewedIssue509: boolean;