import * as React from 'react' import { clearTrustedDeviceTokenCache } from '../../bridge/trustedDevice.js' import { Text } from '../../ink.js' import { refreshGrowthBookAfterAuthChange } from '../../services/analytics/growthbook.js' import { getGroveNoticeConfig, getGroveSettings, } from '../../services/api/grove.js' import { clearPolicyLimitsCache } from '../../services/policyLimits/index.js' // flushTelemetry is loaded lazily to avoid pulling in ~1.1MB of OpenTelemetry at startup import { clearRemoteManagedSettingsCache } from '../../services/remoteManagedSettings/index.js' import { getClaudeAIOAuthTokens, removeApiKey } from '../../utils/auth.js' import { clearBetasCaches } from '../../utils/betas.js' import { saveGlobalConfig } from '../../utils/config.js' import { gracefulShutdownSync } from '../../utils/gracefulShutdown.js' import { getSecureStorage } from '../../utils/secureStorage/index.js' import { clearToolSchemaCache } from '../../utils/toolSchemaCache.js' import { resetUserCache } from '../../utils/user.js' export async function performLogout({ clearOnboarding = false, }): Promise { // Flush telemetry BEFORE clearing credentials to prevent org data leakage const { flushTelemetry } = await import( '../../utils/telemetry/instrumentation.js' ) await flushTelemetry() await removeApiKey() // Wipe all secure storage data on logout const secureStorage = getSecureStorage() secureStorage.delete() await clearAuthRelatedCaches() saveGlobalConfig(current => { const updated = { ...current } if (clearOnboarding) { updated.hasCompletedOnboarding = false updated.subscriptionNoticeCount = 0 updated.hasAvailableSubscription = false if (updated.customApiKeyResponses?.approved) { updated.customApiKeyResponses = { ...updated.customApiKeyResponses, approved: [], } } } updated.oauthAccount = undefined return updated }) } // clearing anything memoized that must be invalidated when user/session/auth changes export async function clearAuthRelatedCaches(): Promise { // Clear the OAuth token cache getClaudeAIOAuthTokens.cache?.clear?.() clearTrustedDeviceTokenCache() clearBetasCaches() clearToolSchemaCache() // Clear user data cache BEFORE GrowthBook refresh so it picks up fresh credentials resetUserCache() refreshGrowthBookAfterAuthChange() // Clear Grove config cache getGroveNoticeConfig.cache?.clear?.() getGroveSettings.cache?.clear?.() // Clear remotely managed settings cache await clearRemoteManagedSettingsCache() // Clear policy limits cache await clearPolicyLimitsCache() } export async function call(): Promise { await performLogout({ clearOnboarding: true }) const message = ( Successfully logged out from your Anthropic account. ) setTimeout(() => { gracefulShutdownSync(0, 'logout') }, 200) return message }