/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { useMemo, useCallback } from 'react'; import { Box, Text } from 'ink'; import { Colors } from '../../colors.js'; import { RadioButtonSelect, type RadioSelectItem, } from '../shared/RadioButtonSelect.js'; const PROVIDER_DISPLAY_NAMES: Record = { gemini: 'Google Gemini', codex: 'OpenAI Codex (ChatGPT Backend)', anthropic: 'Anthropic (Claude)', qwen: 'Qwen', synthetic: 'Synthetic (Testing)', zai: 'Zai', openai: 'OpenAI (GPT-4, etc.)', 'openai-responses': 'OpenAI Responses API', openaivercel: 'OpenAI (Vercel AI SDK)', deepseek: 'DeepSeek', }; // Preferred order for provider display const PROVIDER_ORDER: string[] = [ 'gemini', 'codex', 'anthropic', 'qwen', 'synthetic', 'zai', 'openai', 'openai-responses', 'openaivercel', 'deepseek', ]; interface ProviderSelectStepProps { providers: string[]; onSelect: (providerId: string) => void; onSkip: () => void; isFocused?: boolean; } export const ProviderSelectStep: React.FC = ({ providers, onSelect, onSkip, isFocused = true, }) => { const options: Array> = useMemo(() => { // Sort providers by preferred order const sortedProviders = [...providers].sort((a, b) => { const aIndex = PROVIDER_ORDER.indexOf(a); const bIndex = PROVIDER_ORDER.indexOf(b); // Providers not in the list go to the end const aOrder = aIndex === -1 ? PROVIDER_ORDER.length : aIndex; const bOrder = bIndex === -1 ? PROVIDER_ORDER.length : bIndex; return aOrder - bOrder; }); const providerOptions = sortedProviders.map((provider) => ({ label: PROVIDER_DISPLAY_NAMES[provider] || provider, value: provider, key: provider, })); // Add "configure manually" option providerOptions.push({ label: 'Configure manually later', value: '__skip__', key: '__skip__', }); return providerOptions; }, [providers]); const handleSelect = useCallback( (value: string) => { if (value === '__skip__') { onSkip(); } else { onSelect(value); } }, [onSkip, onSelect], ); return ( Step 1 of 5: Choose Your AI Provider {"Select which AI provider you'd like to use:"} Use ↑↓ to navigate, Enter to select, Esc to skip ); };