import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@renderer/components/ui/select'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@renderer/components/ui/tooltip'; import { formatProviderBackendLabel } from '@renderer/utils/providerBackendIdentity'; import type { CliProviderStatus } from '@shared/types'; interface Props { provider: CliProviderStatus; disabled?: boolean; onSelect: (providerId: CliProviderStatus['providerId'], backendId: string) => void; } export function getProviderRuntimeBackendStateLabel( option: NonNullable[number] ): string | null { switch (option.state) { case 'ready': return null; case 'locked': return 'Locked'; case 'disabled': return 'Disabled'; case 'authentication-required': return 'Auth required'; case 'runtime-missing': return 'Runtime missing'; case 'degraded': return 'Degraded'; default: if (!option.available) { return 'Unavailable'; } if (option.selectable === false) { return 'Locked'; } return null; } } export function getProviderRuntimeBackendAudienceLabel( option: NonNullable[number] ): string | null { return option.audience === 'internal' ? 'Internal' : null; } export function getVisibleProviderRuntimeBackendOptions( provider: CliProviderStatus ): NonNullable { return provider.availableBackends ?? []; } export function getOptionDisplayLabel( provider: CliProviderStatus, option: NonNullable[number], resolvedOption: NonNullable[number] | null ): string { if (provider.providerId === 'codex') { const legacyLabel = formatProviderBackendLabel(provider.providerId, option.id); if (legacyLabel) { return legacyLabel; } } if (option.id !== 'auto') { return option.label; } if (resolvedOption?.label) { return `Auto (currently: ${resolvedOption.label})`; } return 'Auto'; } export function getProviderRuntimeBackendSummary(provider: CliProviderStatus): string | null { const options = provider.availableBackends ?? []; if (options.length === 0) { return null; } const selectedBackendId = provider.selectedBackendId ?? options[0]?.id ?? ''; const selectedOption = options.find((option) => option.id === selectedBackendId) ?? options[0]; const resolvedOption = options.find((option) => option.id === provider.resolvedBackendId) ?? null; const parts = [getOptionDisplayLabel(provider, selectedOption, resolvedOption)]; const audienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption); const stateLabel = getProviderRuntimeBackendStateLabel(selectedOption); if (audienceLabel) { parts.push(audienceLabel.toLowerCase()); } if (stateLabel) { parts.push(stateLabel.toLowerCase()); } return parts.join(' - '); } export const ProviderRuntimeBackendSelector = ({ provider, disabled = false, onSelect, }: Props): React.JSX.Element | null => { const options = getVisibleProviderRuntimeBackendOptions(provider); if (options.length === 0) { return null; } if (provider.providerId === 'codex' && options.length === 1) { return null; } const selectedBackendId = provider.selectedBackendId ?? options[0]?.id ?? ''; const selectedOption = options.find((option) => option.id === selectedBackendId) ?? options[0]; const resolvedOption = options.find((option) => option.id === provider.resolvedBackendId) ?? null; const selectedLabel = getOptionDisplayLabel(provider, selectedOption, resolvedOption); const selectedStateLabel = getProviderRuntimeBackendStateLabel(selectedOption); const selectedAudienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption); return (
Runtime backend {provider.resolvedBackendId && provider.resolvedBackendId !== provider.selectedBackendId && ( Resolved: {resolvedOption?.label ?? provider.resolvedBackendId} )}
{selectedOption && (
{selectedLabel} {selectedOption.recommended ? ( Recommended ) : null} {selectedAudienceLabel ? ( {selectedAudienceLabel} ) : null} {!selectedStateLabel && !selectedOption.available ? ( Unavailable {selectedOption.detailMessage ?? selectedOption.statusMessage ?? 'Unavailable'} ) : selectedStateLabel ? ( {selectedStateLabel} {selectedOption.detailMessage ?? selectedOption.statusMessage ?? 'This backend cannot be selected yet.'} ) : null}
{selectedOption.description}
{selectedOption.statusMessage ?
{selectedOption.statusMessage}
: null} {selectedOption.detailMessage && selectedOption.available ? (
{selectedOption.detailMessage}
) : null}
)}
); };