/** * @license * Copyright 2026 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { Box, Text } from 'ink'; import { IdeIntegrationNudge } from '../IdeIntegrationNudge.js'; import { LoopDetectionConfirmation } from './LoopDetectionConfirmation.js'; import { FolderTrustDialog } from './FolderTrustDialog.js'; import { ConsentPrompt } from './ConsentPrompt.js'; import { ThemeDialog } from './ThemeDialog.js'; import { SettingsDialog } from './SettingsDialog.js'; import { AuthInProgress } from '../auth/AuthInProgress.js'; import { AuthDialog } from '../auth/AuthDialog.js'; import { BannedAccountDialog } from '../auth/BannedAccountDialog.js'; import { ApiAuthDialog } from '../auth/ApiAuthDialog.js'; import { EditorSettingsDialog } from './EditorSettingsDialog.js'; import { PrivacyNotice } from '../privacy/PrivacyNotice.js'; import { ProQuotaDialog } from './ProQuotaDialog.js'; import { ValidationDialog } from './ValidationDialog.js'; import { OverageMenuDialog } from './OverageMenuDialog.js'; import { EmptyWalletDialog } from './EmptyWalletDialog.js'; import { runExitCleanup } from '../../utils/cleanup.js'; import { RELAUNCH_EXIT_CODE } from '../../utils/processUtils.js'; import { SessionBrowser } from './SessionBrowser.js'; import { PermissionsModifyTrustDialog } from './PermissionsModifyTrustDialog.js'; import { ModelDialog } from './ModelDialog.js'; import { theme } from '../semantic-colors.js'; import { useUIState } from '../contexts/UIStateContext.js'; import { useUIActions } from '../contexts/UIActionsContext.js'; import { useConfig } from '../contexts/ConfigContext.js'; import { useSettings } from '../contexts/SettingsContext.js'; import process from 'node:process'; import { type UseHistoryManagerReturn } from '../hooks/useHistoryManager.js'; import { AdminSettingsChangedDialog } from './AdminSettingsChangedDialog.js'; import { IdeTrustChangeDialog } from './IdeTrustChangeDialog.js'; import { NewAgentsNotification } from './NewAgentsNotification.js'; import { AgentConfigDialog } from './AgentConfigDialog.js'; import { PolicyUpdateDialog } from './PolicyUpdateDialog.js'; interface DialogManagerProps { addItem: UseHistoryManagerReturn['addItem']; terminalWidth: number; } // Props for DialogManager export const DialogManager = ({ addItem, terminalWidth, }: DialogManagerProps) => { const config = useConfig(); const settings = useSettings(); const uiState = useUIState(); const uiActions = useUIActions(); const { constrainHeight, terminalHeight, staticExtraHeight, terminalWidth: uiTerminalWidth, } = uiState; if (uiState.adminSettingsChanged) { return ; } if (uiState.showIdeRestartPrompt) { return ; } if (uiState.newAgents) { return ( ); } if (uiState.quota.proQuotaRequest) { return ( ); } if (uiState.quota.validationRequest) { return ( ); } if (uiState.quota.overageMenuRequest) { return ( ); } if (uiState.quota.emptyWalletRequest) { return ( ); } if (uiState.shouldShowIdePrompt) { return ( ); } if (uiState.isFolderTrustDialogOpen) { return ( ); } if (uiState.isPolicyUpdateDialogOpen) { return ( uiActions.setIsPolicyUpdateDialogOpen(false)} /> ); } if (uiState.loopDetectionConfirmationRequest) { return ( ); } if (uiState.permissionConfirmationRequest) { const files = uiState.permissionConfirmationRequest.files; const filesList = files.map((f) => `- ${f}`).join('\n'); return ( { uiState.permissionConfirmationRequest?.onComplete({ allowed }); }} terminalWidth={terminalWidth} /> ); } // commandConfirmationRequest and authConsentRequest are kept separate // to avoid focus deadlocks and state race conditions between the // synchronous command loop and the asynchronous auth flow. if (uiState.commandConfirmationRequest) { return ( ); } if (uiState.authConsentRequest) { return ( ); } if (uiState.confirmUpdateExtensionRequests.length > 0) { const request = uiState.confirmUpdateExtensionRequests[0]; return ( ); } if (uiState.isThemeDialogOpen) { return ( {uiState.themeError && ( {uiState.themeError} )} ); } if (uiState.isSettingsDialogOpen) { return ( uiActions.closeSettingsDialog()} onRestartRequest={async () => { await runExitCleanup(); process.exit(RELAUNCH_EXIT_CODE); }} availableTerminalHeight={terminalHeight - staticExtraHeight} /> ); } if (uiState.isModelDialogOpen) { return ; } if ( uiState.isAgentConfigDialogOpen && uiState.selectedAgentName && uiState.selectedAgentDisplayName && uiState.selectedAgentDefinition ) { return ( { // Reload agent registry to pick up changes const agentRegistry = config?.getAgentRegistry(); if (agentRegistry) { await agentRegistry.reload(); } }} /> ); } if (uiState.accountSuspensionInfo) { return ( { process.exit(1); }} onChangeAuth={() => { uiActions.clearAccountSuspension(); }} /> ); } if (uiState.isAuthenticating) { return ( { uiActions.onAuthError('Authentication cancelled.'); }} /> ); } if (uiState.isAwaitingApiKeyInput) { return ( ); } if (uiState.isAuthDialogOpen) { return ( ); } if (uiState.isEditorDialogOpen) { return ( {uiState.editorError && ( {uiState.editorError} )} ); } if (uiState.showPrivacyNotice) { return ( uiActions.exitPrivacyNotice()} config={config} /> ); } if (uiState.isSessionBrowserOpen) { return ( ); } if (uiState.isPermissionsDialogOpen) { return ( ); } return null; };