import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useAppTranslation } from '@features/localization/renderer'; import { ProviderActivityStatusStrip } from '@renderer/components/common/ProviderActivityStatusStrip'; import { ProviderBrandLogo } from '@renderer/components/common/ProviderBrandLogo'; import { isOpenCodeCatalogHydrating } from '@renderer/components/runtime/providerConnectionUi'; import { Checkbox } from '@renderer/components/ui/checkbox'; import { HoverTooltip } from '@renderer/components/ui/hover-tooltip'; import { Input } from '@renderer/components/ui/input'; import { Label } from '@renderer/components/ui/label'; import { Popover, PopoverContent, PopoverTrigger } from '@renderer/components/ui/popover'; import { Tabs, TabsList, TabsTrigger } from '@renderer/components/ui/tabs'; import { useEffectiveCliProviderStatus } from '@renderer/hooks/useEffectiveCliProviderStatus'; import { cn } from '@renderer/lib/utils'; import { useStore } from '@renderer/store'; import { GEMINI_UI_DISABLED_BADGE_LABEL, GEMINI_UI_DISABLED_REASON, isGeminiUiFrozen, } from '@renderer/utils/geminiUiFreeze'; import { canUseCustomAnthropicCompatibleModel, getAvailableTeamProviderModelOptions, getOpenCodeOpenAiRouteAuthUnavailableReason, getTeamModelUiDisabledReason, isAnthropicCompatibleRuntime, isTeamProviderModelVerificationPending, normalizeTeamModelForUi, TEAM_MODEL_UI_DISABLED_BADGE_LABEL, type TeamRuntimeModelOption, } from '@renderer/utils/teamModelAvailability'; import { doesTeamModelCarryProviderBrand, getProviderScopedTeamModelLabel, getRuntimeAwareProviderScopedTeamModelLabel, getTeamModelLabel as getCatalogTeamModelLabel, getTeamModelSourceBadgeLabel, getTeamProviderLabel as getCatalogTeamProviderLabel, } from '@renderer/utils/teamModelCatalog'; import { compareTeamModelRecommendations, getTeamModelRecommendation, } from '@renderer/utils/teamModelRecommendations'; import { resolveAnthropicLaunchModel } from '@shared/utils/anthropicLaunchModel'; import { getAnthropicDefaultTeamModel } from '@shared/utils/anthropicModelDefaults'; import { parseOpenCodeQualifiedModelRef } from '@shared/utils/opencodeModelRef'; import { isTeamProviderId } from '@shared/utils/teamProvider'; import { useVirtualizer } from '@tanstack/react-virtual'; import { Command as CommandPrimitive } from 'cmdk'; import { AlertTriangle, Check, CheckCircle2, ChevronDown, Filter, Info, Search, Star, } from 'lucide-react'; import type { CliProviderStatus, TeamProviderId } from '@shared/types'; export { getProviderScopedTeamModelLabel } from '@renderer/utils/teamModelCatalog'; // --- Provider definitions --- interface ProviderDef { id: TeamProviderId; label: string; comingSoon: boolean; } interface OpenCodeSourceOption { id: string; label: string; count: number; } interface OpenCodeSourceInfo { id: string; label: string; } interface OpenCodeRouteGroupInfo { id: string; label: string; rank: number; } interface OpenCodeModelGroup { groupId: string; groupLabel: string; rank: number; sortLabel: string; firstIndex: number; options: TeamRuntimeModelOption[]; } interface OpenCodeModelOptionMetadata { option: TeamRuntimeModelOption; index: number; sourceInfo: OpenCodeSourceInfo | null; routeGroup: OpenCodeRouteGroupInfo; routeMetadata: NonNullable['opencode'] | null; recommendation: ReturnType; pricingInfo: OpenCodeModelPricingInfo | null; searchText: string; isRecommended: boolean; isFree: boolean; } interface OpenCodeVirtualHeadingRow { kind: 'heading'; key: string; sourceLabel: string; count: number; } interface OpenCodeVirtualModelRow { kind: 'models'; key: string; options: TeamRuntimeModelOption[]; isLastInGroup: boolean; } type OpenCodeVirtualRow = OpenCodeVirtualHeadingRow | OpenCodeVirtualModelRow; type RenderModelOption = (option: TeamRuntimeModelOption) => React.JSX.Element; type ProviderModelCatalogItem = NonNullable['models'][number]; interface OpenCodeModelCostRates { input: number | null; output: number | null; cacheRead: number | null; cacheWrite: number | null; } interface OpenCodeModelPricingInfo { free: boolean; summary: string | null; title: string | undefined; } type TeamTranslator = ReturnType['t']; const MODEL_GRID_MIN_CARD_WIDTH_PX = 140; const MODEL_GRID_GAP_PX = 6; const OPENCODE_MODEL_GRID_MAX_HEIGHT_PX = 400; const OPENCODE_MODEL_VIRTUALIZATION_THRESHOLD = 80; const OPENCODE_MODEL_GROUP_HEADING_ESTIMATE_PX = 28; const OPENCODE_MODEL_ROW_ESTIMATE_PX = 92; const ANTHROPIC_OPUS_48_NEW_BADGE_EXPIRES_AT_MS = Date.UTC(2026, 5, 12); const PROVIDERS: ProviderDef[] = [ { id: 'anthropic', label: 'Anthropic', comingSoon: false }, { id: 'codex', label: 'Codex', comingSoon: false }, { id: 'opencode', label: 'OpenCode', comingSoon: false }, { id: 'gemini', label: 'Gemini', comingSoon: false }, ]; function getOpenCodeSourceInfo(model: string): OpenCodeSourceInfo | null { const parsed = parseOpenCodeQualifiedModelRef(model); if (!parsed) { return null; } return { id: parsed.sourceId, label: getTeamModelSourceBadgeLabel('opencode', model) ?? parsed.sourceId, }; } function getOpenCodeRouteGroup( catalogModel: ProviderModelCatalogItem | null | undefined, t: TeamTranslator ): OpenCodeRouteGroupInfo { const routeKind = catalogModel?.metadata?.opencode?.routeKind; if (routeKind === 'configured_local') { return { id: 'opencode-config', label: t('modelSelector.routeGroups.openCodeConfig'), rank: 0 }; } if (routeKind === 'builtin_free') { return { id: 'builtin-free', label: t('modelSelector.routeGroups.builtinFree'), rank: 1 }; } if (routeKind === 'connected_provider') { return { id: 'connected-providers', label: t('modelSelector.routeGroups.connectedProviders'), rank: 2, }; } return { id: 'catalog-provider', label: t('modelSelector.routeGroups.otherCatalog'), rank: 3 }; } function isRecommendedTeamModelRecommendation( recommendation: ReturnType ): boolean { return ( recommendation?.level === 'recommended' || recommendation?.level === 'recommended-with-limits' ); } function buildOpenCodeModelSearchText({ option, sourceInfo, routeGroup, routeMetadata, recommendation, pricingInfo, }: { option: TeamRuntimeModelOption; sourceInfo: OpenCodeSourceInfo | null; routeGroup: OpenCodeRouteGroupInfo; routeMetadata: NonNullable['opencode'] | null; recommendation: ReturnType; pricingInfo: OpenCodeModelPricingInfo | null; }): string { return [ option.value, option.label, option.badgeLabel ?? '', sourceInfo?.label ?? '', routeGroup.label, routeMetadata?.proofState ?? '', routeMetadata?.accessKind ?? '', recommendation?.label ?? '', recommendation?.reason ?? '', pricingInfo?.free ? 'free' : '', pricingInfo?.summary ?? '', ] .join(' ') .toLowerCase(); } function isFreeOpenCodeModelOption({ option, routeMetadata, pricingInfo, }: { option: TeamRuntimeModelOption; routeMetadata: NonNullable['opencode'] | null; pricingInfo: OpenCodeModelPricingInfo | null; }): boolean { const badgeLabel = option.badgeLabel?.trim().toLowerCase(); return ( pricingInfo?.free === true || routeMetadata?.routeKind === 'builtin_free' || badgeLabel === 'free' || isFreeOpenCodeModelRoute(option.value) ); } function getOpenCodeModelGridColumnCount(width: number): number { const safeWidth = Number.isFinite(width) ? Math.max(0, width) : 0; if (safeWidth <= 0) { return 1; } return Math.max( 1, Math.floor((safeWidth + MODEL_GRID_GAP_PX) / (MODEL_GRID_MIN_CARD_WIDTH_PX + MODEL_GRID_GAP_PX)) ); } function buildOpenCodeVirtualRows({ defaultOptions, groups, columnCount, }: { defaultOptions: TeamRuntimeModelOption[]; groups: OpenCodeModelGroup[]; columnCount: number; }): OpenCodeVirtualRow[] { const rows: OpenCodeVirtualRow[] = []; if (defaultOptions.length > 0) { rows.push({ kind: 'models', key: 'default', options: defaultOptions, isLastInGroup: true, }); } for (const group of groups) { rows.push({ kind: 'heading', key: `heading:${group.groupId}`, sourceLabel: group.groupLabel, count: group.options.length, }); for (let start = 0; start < group.options.length; start += columnCount) { rows.push({ kind: 'models', key: `models:${group.groupId}:${start}`, options: group.options.slice(start, start + columnCount), isLastInGroup: start + columnCount >= group.options.length, }); } } return rows; } function getRecordValue(record: Record, keys: string[]): unknown { for (const key of keys) { if (key in record) { return record[key]; } } return undefined; } function getFiniteCostNumber(record: Record, keys: string[]): number | null { const value = getRecordValue(record, keys); return typeof value === 'number' && Number.isFinite(value) ? value : null; } function extractOpenCodeCostRates(cost: unknown): OpenCodeModelCostRates | null { if (!cost || typeof cost !== 'object' || Array.isArray(cost)) { return null; } const record = cost as Record; const rates: OpenCodeModelCostRates = { input: getFiniteCostNumber(record, ['input']), output: getFiniteCostNumber(record, ['output']), cacheRead: getFiniteCostNumber(record, ['cache_read', 'cacheRead', 'cached_read']), cacheWrite: getFiniteCostNumber(record, ['cache_write', 'cacheWrite', 'cached_write']), }; return Object.values(rates).some((rate) => rate !== null) ? rates : null; } function formatOpenCodeCostRate(rate: number, t: TeamTranslator): string { if (rate === 0) { return t('modelSelector.pricing.free'); } const formatted = rate.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: rate >= 1 ? 2 : 4, }); return `$${formatted}`; } function formatOpenCodeCostSummary( rates: OpenCodeModelCostRates, t: TeamTranslator ): string | null { const summaryParts: string[] = []; if (rates.input !== null) { summaryParts.push( t('modelSelector.pricing.inputShort', { rate: formatOpenCodeCostRate(rates.input, t) }) ); } if (rates.output !== null) { summaryParts.push( t('modelSelector.pricing.outputShort', { rate: formatOpenCodeCostRate(rates.output, t) }) ); } if (summaryParts.length === 0) { return null; } return t('modelSelector.pricing.perMillionSummary', { summary: summaryParts.join(' · ') }); } function formatOpenCodeCostTitle(rates: OpenCodeModelCostRates, t: TeamTranslator): string { const titleParts: string[] = []; if (rates.input !== null) { titleParts.push( t('modelSelector.pricing.inputTitle', { rate: formatOpenCodeCostRate(rates.input, t) }) ); } if (rates.output !== null) { titleParts.push( t('modelSelector.pricing.outputTitle', { rate: formatOpenCodeCostRate(rates.output, t) }) ); } if (rates.cacheRead !== null) { titleParts.push( t('modelSelector.pricing.cacheReadTitle', { rate: formatOpenCodeCostRate(rates.cacheRead, t), }) ); } if (rates.cacheWrite !== null) { titleParts.push( t('modelSelector.pricing.cacheWriteTitle', { rate: formatOpenCodeCostRate(rates.cacheWrite, t), }) ); } return titleParts.join('\n'); } function getOpenCodeModelPricingInfo( catalogModel: ProviderModelCatalogItem | null | undefined, t: TeamTranslator ): OpenCodeModelPricingInfo | null { const metadata = catalogModel?.metadata; if (!metadata) { return null; } const rates = extractOpenCodeCostRates(metadata.cost); return { free: metadata.free === true, summary: rates ? formatOpenCodeCostSummary(rates, t) : null, title: rates ? formatOpenCodeCostTitle(rates, t) : undefined, }; } function isFreeOpenCodeModelRoute(model: string): boolean { const normalized = model.trim().toLowerCase(); return ( normalized === 'opencode/big-pickle' || normalized.includes(':free') || normalized.endsWith('-free') || normalized.endsWith('/free') ); } function isAnthropicOpus48NewBadgeVisible( providerId: TeamProviderId, model: string, nowMs = Date.now() ): boolean { if (providerId !== 'anthropic' || nowMs >= ANTHROPIC_OPUS_48_NEW_BADGE_EXPIRES_AT_MS) { return false; } const normalized = model.trim().toLowerCase(); return ( normalized === 'opus' || normalized === 'opus[1m]' || normalized === 'claude-opus-4-8' || normalized === 'claude-opus-4-8[1m]' ); } function hasFreeOpenCodeModelRoute(providerStatus: CliProviderStatus | null | undefined): boolean { if (providerStatus?.providerId !== 'opencode') { return false; } if (providerStatus.models.some(isFreeOpenCodeModelRoute)) { return true; } return ( providerStatus.modelCatalog?.models.some((model) => { const badgeLabel = model.badgeLabel?.trim().toLowerCase(); return ( model.metadata?.free === true || badgeLabel === 'free' || isFreeOpenCodeModelRoute(model.launchModel) || isFreeOpenCodeModelRoute(model.id) ); }) ?? false ); } const OPENCODE_UI_DISABLED_REASON = 'OpenCode team launch is not ready.'; export const OPENCODE_ONE_SHOT_DISABLED_REASON = 'OpenCode team launch is available for normal teams, but scheduled one-shot prompts still run through claude -p. Choose Anthropic or Codex for one-shot schedules.'; export const OPENCODE_ONE_SHOT_DISABLED_BADGE_LABEL = 'team only'; function getOpenCodeReadinessBadgeLabel( providerStatus: CliProviderStatus | null | undefined, t: TeamTranslator ): string { if (!providerStatus) { return t('modelSelector.openCodeStatus.badges.check'); } if (!providerStatus.supported) { return t('modelSelector.openCodeStatus.badges.install'); } if (!providerStatus.authenticated) { return t('modelSelector.openCodeStatus.badges.free'); } return t('modelSelector.openCodeStatus.badges.setup'); } function getOpenCodeReadinessSummary( providerStatus: CliProviderStatus | null | undefined, t: TeamTranslator ): string { if (!providerStatus) { return t('modelSelector.openCodeStatus.summary.checking'); } const runtimeReady = providerStatus.supported; const hasFreeModelRoute = hasFreeOpenCodeModelRoute(providerStatus); let readinessSummary = t('modelSelector.openCodeStatus.summaryParts.teamLaunchBlocked'); if (runtimeReady) { if (!providerStatus.authenticated) { readinessSummary = hasFreeModelRoute ? t('modelSelector.openCodeStatus.summaryParts.providerOptional') : t('modelSelector.openCodeStatus.summaryParts.providerModelsNeedSetup'); } else if (providerStatus.capabilities.teamLaunch) { readinessSummary = t('modelSelector.openCodeStatus.summaryParts.teamLaunchReady'); } } const parts = [ runtimeReady ? t('modelSelector.openCodeStatus.summaryParts.runtimeDetected') : t('modelSelector.openCodeStatus.summaryParts.runtimeMissing'), runtimeReady && !providerStatus.authenticated && hasFreeModelRoute ? t('modelSelector.openCodeStatus.summaryParts.freeWithoutAuth') : providerStatus.authenticated ? t('modelSelector.openCodeStatus.summaryParts.providerConnected') : t('modelSelector.openCodeStatus.summaryParts.providerNotConnected'), readinessSummary, ]; return t('modelSelector.openCodeStatus.summary.status', { parts: parts.join(' · ') }); } function getOpenCodeReadinessMessage( providerStatus: CliProviderStatus | null | undefined, t: TeamTranslator ): string { if (!providerStatus) { return t('modelSelector.openCodeStatus.messages.checking'); } if (!providerStatus.supported) { return t('modelSelector.openCodeStatus.messages.unsupported'); } if (!providerStatus.authenticated) { if (hasFreeOpenCodeModelRoute(providerStatus)) { return t('modelSelector.openCodeStatus.messages.freeAvailable'); } return t('modelSelector.openCodeStatus.messages.noFreeListed'); } if (!providerStatus.capabilities.teamLaunch) { return t('modelSelector.openCodeStatus.messages.launchBlocked'); } return t('modelSelector.openCodeStatus.messages.ready'); } export function getTeamModelLabel(model: string): string { return getCatalogTeamModelLabel(model) ?? model; } export function getTeamProviderLabel(providerId: TeamProviderId): string { return getCatalogTeamProviderLabel(providerId) ?? 'Anthropic'; } export function getTeamEffortLabel(effort: string): string { const trimmed = effort.trim(); if (!trimmed) return 'Default'; if (trimmed === 'xhigh') return 'XHigh'; return trimmed.charAt(0).toUpperCase() + trimmed.slice(1); } export function formatTeamModelSummary( providerId: TeamProviderId, model: string, effort?: string ): string { const providerLabel = getTeamProviderLabel(providerId); const routeLabel = providerId === 'opencode' ? (getTeamModelSourceBadgeLabel(providerId, model.trim()) ?? providerLabel) : providerLabel; const rawModelLabel = model.trim() ? getTeamModelLabel(model.trim()) : 'Default'; const modelLabel = model.trim() ? getProviderScopedTeamModelLabel(providerId, model.trim()) : 'Default'; const effortLabel = effort?.trim() ? getTeamEffortLabel(effort) : ''; const modelAlreadyCarriesProviderBrand = doesTeamModelCarryProviderBrand(providerId, rawModelLabel) || (providerId === 'codex' && model.trim().toLowerCase().startsWith('gpt-')); const providerActsAsBackendOnly = providerId !== 'anthropic' && modelLabel !== 'Default' && !modelAlreadyCarriesProviderBrand; const parts = modelAlreadyCarriesProviderBrand ? [modelLabel, effortLabel] : providerActsAsBackendOnly ? [modelLabel, `via ${routeLabel}`, effortLabel] : [providerLabel, modelLabel, effortLabel]; return parts.filter(Boolean).join(' · '); } /** * Computes the effective model string for team provisioning. * By default adds [1m] suffix for Opus 1M context. * When limitContext=true, returns base model without [1m] (200K context). * Standard Sonnet and Haiku selections stay standard context. Explicit Sonnet 1M selections keep * their [1m] suffix unless the 200K limit is enabled. */ export function computeEffectiveTeamModel( selectedModel: string, limitContext: boolean, providerId: TeamProviderId = 'anthropic', providerStatus?: Pick | null ): string | undefined { if (providerId !== 'anthropic') { return selectedModel.trim() || undefined; } const catalog = providerStatus?.providerId === 'anthropic' ? (providerStatus.modelCatalog ?? null) : null; return ( resolveAnthropicLaunchModel({ selectedModel, limitContext, availableLaunchModels: catalog?.models.map((model) => model.launchModel), defaultLaunchModel: catalog?.defaultLaunchModel ?? null, }) ?? getAnthropicDefaultTeamModel(limitContext) ); } const OpenCodeVirtualizedModelGrid = ({ defaultOptions, groups, renderModelOption, }: Readonly<{ defaultOptions: TeamRuntimeModelOption[]; groups: OpenCodeModelGroup[]; renderModelOption: RenderModelOption; }>): React.JSX.Element => { const scrollParentRef = useRef(null); const [gridWidth, setGridWidth] = useState(0); useEffect(() => { const element = scrollParentRef.current; if (!element) { return undefined; } const updateGridWidth = (): void => { const nextWidth = element.clientWidth; setGridWidth((previousWidth) => (previousWidth === nextWidth ? previousWidth : nextWidth)); }; updateGridWidth(); if (typeof ResizeObserver !== 'undefined') { const resizeObserver = new ResizeObserver(updateGridWidth); resizeObserver.observe(element); return () => resizeObserver.disconnect(); } window.addEventListener('resize', updateGridWidth); return () => window.removeEventListener('resize', updateGridWidth); }, []); const columnCount = useMemo(() => getOpenCodeModelGridColumnCount(gridWidth), [gridWidth]); const rows = useMemo( () => buildOpenCodeVirtualRows({ defaultOptions, groups, columnCount }), [columnCount, defaultOptions, groups] ); // eslint-disable-next-line react-hooks/incompatible-library -- TanStack Virtual API limitation, not fixable in user code const rowVirtualizer = useVirtualizer({ count: rows.length, getScrollElement: () => scrollParentRef.current, estimateSize: (index) => rows[index]?.kind === 'heading' ? OPENCODE_MODEL_GROUP_HEADING_ESTIMATE_PX : OPENCODE_MODEL_ROW_ESTIMATE_PX, overscan: 6, }); return (
{rowVirtualizer.getVirtualItems().map((virtualRow) => { const row = rows[virtualRow.index]; if (!row) { return null; } return (
{row.kind === 'heading' ? (

{row.sourceLabel}

{row.count}
) : (
{row.options.map(renderModelOption)}
)}
); })}
); }; const OpenCodeModelCatalogLoadingSkeleton = (): React.JSX.Element => { const { t } = useAppTranslation('team'); return (
{t('modelSelector.openCode.loadingModels')}
{[0, 1, 2].map((index) => (
))}
); }; export interface TeamModelSelectorProps { providerId: TeamProviderId; onProviderChange: (providerId: TeamProviderId) => void; value: string; onValueChange: (value: string) => void; id?: string; disableGeminiOption?: boolean; providerNoticeById?: Partial>; providerDisabledReasonById?: Partial>; providerDisabledBadgeLabelById?: Partial>; modelAdvisoryReasonByValue?: Partial>; modelIssueReasonByValue?: Partial>; modelUnavailableReasonByValue?: Partial>; } export const TeamModelSelector: React.FC = ({ providerId, onProviderChange, value, onValueChange, id, disableGeminiOption = false, providerNoticeById, providerDisabledReasonById, providerDisabledBadgeLabelById, modelAdvisoryReasonByValue, modelIssueReasonByValue, modelUnavailableReasonByValue, }) => { const { t } = useAppTranslation('team'); const multimodelEnabled = useStore((s) => s.appConfig?.general?.multimodelEnabled ?? true); const [recommendedOnly, setRecommendedOnly] = useState(false); const [freeOnly, setFreeOnly] = useState(false); const [modelQuery, setModelQuery] = useState(''); const [openCodeSourceFilterOpen, setOpenCodeSourceFilterOpen] = useState(false); const [openCodeSourceQuery, setOpenCodeSourceQuery] = useState(''); const [selectedOpenCodeSourceIds, setSelectedOpenCodeSourceIds] = useState>( () => new Set() ); const selectedProviderId = disableGeminiOption && isGeminiUiFrozen() && providerId === 'gemini' ? 'anthropic' : providerId; const [inspectedProviderId, setInspectedProviderId] = useState(null); const previousEffectiveProviderIdRef = useRef(selectedProviderId); const previousSelectedProviderIdRef = useRef(selectedProviderId); const effectiveProviderId = inspectedProviderId ?? selectedProviderId; const isInspectingInactiveProvider = inspectedProviderId !== null; const { cliStatus: effectiveCliStatus, sourceCliStatus, providerStatus: runtimeProviderStatus, codexSnapshotPending, } = useEffectiveCliProviderStatus(effectiveProviderId); const cliStatusLoading = useStore((s) => s.cliStatusLoading); const cliProviderStatusLoading = useStore((s) => s.cliProviderStatusLoading ?? {}); const multimodelAvailable = multimodelEnabled || effectiveCliStatus?.flavor === 'agent_teams_orchestrator'; const runtimeProviderStatusById = useMemo( () => new Map( (effectiveCliStatus?.providers ?? []).map((provider) => [provider.providerId, provider]) ), [effectiveCliStatus?.providers] ); const defaultModelTooltip = useMemo(() => { if (effectiveProviderId === 'anthropic') { if (isAnthropicCompatibleRuntime(runtimeProviderStatus)) { const defaultCompatibleModel = runtimeProviderStatus?.modelCatalog?.defaultLaunchModel?.trim() || runtimeProviderStatus?.modelCatalog?.defaultModelId?.trim() || null; return defaultCompatibleModel ? t('modelSelector.defaultTooltip.anthropicCompatibleWithResolved', { model: defaultCompatibleModel, }) : t('modelSelector.defaultTooltip.anthropicCompatible'); } const defaultLongContextModel = getRuntimeAwareProviderScopedTeamModelLabel( 'anthropic', getAnthropicDefaultTeamModel(false), runtimeProviderStatus ) ?? 'Opus 4.8 (1M)'; const defaultLimitedContextModel = getRuntimeAwareProviderScopedTeamModelLabel( 'anthropic', getAnthropicDefaultTeamModel(true), runtimeProviderStatus ) ?? 'Opus 4.8'; return t('modelSelector.defaultTooltip.anthropic', { longContextModel: defaultLongContextModel, limitedContextModel: defaultLimitedContextModel, }); } if (effectiveProviderId === 'opencode') { const defaultOpenCodeModel = runtimeProviderStatus?.modelCatalog?.defaultLaunchModel ?? runtimeProviderStatus?.modelCatalog?.defaultModelId ?? null; return defaultOpenCodeModel ? t('modelSelector.defaultTooltip.openCodeWithResolved', { model: defaultOpenCodeModel }) : t('modelSelector.defaultTooltip.openCode'); } return t('modelSelector.defaultTooltip.runtime'); }, [effectiveProviderId, runtimeProviderStatus, t]); const getProviderOverrideDisabledReason = (candidateProviderId: string): string | null => { if (!isTeamProviderId(candidateProviderId)) { return null; } return providerDisabledReasonById?.[candidateProviderId]?.trim() || null; }; const getProviderDisabledReason = (candidateProviderId: string): string | null => { const overrideReason = getProviderOverrideDisabledReason(candidateProviderId); if (overrideReason) { return overrideReason; } if (candidateProviderId === 'opencode') { const providerStatus = runtimeProviderStatusById.get('opencode') ?? null; if (!providerStatus) { return t('modelSelector.openCodeStatus.loadingRuntime'); } if (!providerStatus.supported) { return ( providerStatus.detailMessage ?? providerStatus.statusMessage ?? 'OpenCode runtime is not installed.' ); } if (providerStatus.authenticated && !providerStatus.capabilities.teamLaunch) { return ( providerStatus.detailMessage ?? providerStatus.statusMessage ?? OPENCODE_UI_DISABLED_REASON ); } return null; } if (disableGeminiOption && isGeminiUiFrozen() && candidateProviderId === 'gemini') { return GEMINI_UI_DISABLED_REASON; } return null; }; const isProviderTemporarilyDisabled = (candidateProviderId: string): boolean => getProviderDisabledReason(candidateProviderId) !== null; const isProviderSelectable = (candidateProviderId: string): boolean => !isProviderTemporarilyDisabled(candidateProviderId) && (multimodelAvailable || candidateProviderId === 'anthropic'); const isProviderInspectable = (candidateProviderId: string): boolean => candidateProviderId === 'opencode' && getProviderOverrideDisabledReason(candidateProviderId) === null && getProviderDisabledReason(candidateProviderId) !== null && multimodelAvailable; const activeProviderSelectable = isProviderSelectable(effectiveProviderId); const getProviderStatusBadge = (candidateProviderId: string): string | null => { if (isTeamProviderId(candidateProviderId)) { const overrideReason = providerDisabledReasonById?.[candidateProviderId]?.trim(); const overrideBadge = providerDisabledBadgeLabelById?.[candidateProviderId]?.trim(); if (overrideReason && overrideBadge) { return overrideBadge; } } if (candidateProviderId === 'opencode') { return getProviderDisabledReason(candidateProviderId) ? getOpenCodeReadinessBadgeLabel(runtimeProviderStatusById.get('opencode'), t) : null; } const providerDisabledReason = getProviderDisabledReason(candidateProviderId); if (providerDisabledReason) { return GEMINI_UI_DISABLED_BADGE_LABEL; } if (!isProviderSelectable(candidateProviderId)) { return t('modelSelector.multimodelOff'); } return null; }; const getProviderStatusBadgeLabel = (statusBadge: string | null): string | null => { if (statusBadge === t('modelSelector.multimodelOff')) { return t('modelSelector.fastMode.off'); } return statusBadge; }; const shouldAwaitRuntimeModelList = effectiveProviderId !== 'anthropic' && (runtimeProviderStatus == null || isTeamProviderModelVerificationPending(effectiveProviderId, runtimeProviderStatus)); const normalizedValue = normalizeTeamModelForUi( effectiveProviderId, value, runtimeProviderStatus ); useEffect(() => { if (isInspectingInactiveProvider) { return; } if (normalizedValue !== value) { onValueChange(normalizedValue); } }, [isInspectingInactiveProvider, normalizedValue, onValueChange, value]); const modelOptions = useMemo(() => { if (shouldAwaitRuntimeModelList) { return [ { value: '', label: t('modelSelector.defaultModel'), badgeLabel: t('modelSelector.defaultModel'), }, ]; } return getAvailableTeamProviderModelOptions(effectiveProviderId, runtimeProviderStatus); }, [effectiveProviderId, runtimeProviderStatus, shouldAwaitRuntimeModelList, t]); const showAnthropicCompatibleCustomModelInput = effectiveProviderId === 'anthropic' && canUseCustomAnthropicCompatibleModel(runtimeProviderStatus); const selectedModelMatchesOption = modelOptions.some( (option) => option.value === normalizedValue ); const anthropicCompatibleCustomModelValue = showAnthropicCompatibleCustomModelInput && normalizedValue && !selectedModelMatchesOption ? normalizedValue : ''; const anthropicCompatibleCatalogWarning = showAnthropicCompatibleCustomModelInput && runtimeProviderStatus?.modelCatalog?.providerId === 'anthropic' ? (runtimeProviderStatus.modelCatalog.diagnostics.message ?? runtimeProviderStatus.modelCatalog.diagnostics.code ?? null) : null; const openCodeCatalogModelById = useMemo(() => { const catalog = runtimeProviderStatus?.modelCatalog; const modelById = new Map(); if (effectiveProviderId !== 'opencode' || catalog?.providerId !== 'opencode') { return modelById; } for (const model of catalog.models) { const launchModel = model.launchModel.trim(); const catalogModelId = model.id.trim(); if (launchModel) { modelById.set(launchModel, model); } if (catalogModelId) { modelById.set(catalogModelId, model); } } return modelById; }, [effectiveProviderId, runtimeProviderStatus?.modelCatalog]); const openCodeModelMetadata = useMemo(() => { if (effectiveProviderId !== 'opencode') { return []; } return modelOptions.map((option, index) => { const sourceInfo = getOpenCodeSourceInfo(option.value); const recommendation = getTeamModelRecommendation(effectiveProviderId, option.value); const catalogModel = openCodeCatalogModelById.get(option.value); const pricingInfo = getOpenCodeModelPricingInfo(catalogModel, t); const routeGroup = getOpenCodeRouteGroup(catalogModel, t); const routeMetadata = catalogModel?.metadata?.opencode ?? null; return { option, index, sourceInfo, routeGroup, routeMetadata, recommendation, pricingInfo, searchText: buildOpenCodeModelSearchText({ option, sourceInfo, routeGroup, routeMetadata, recommendation, pricingInfo, }), isRecommended: isRecommendedTeamModelRecommendation(recommendation), isFree: isFreeOpenCodeModelOption({ option, routeMetadata, pricingInfo }), }; }); }, [effectiveProviderId, modelOptions, openCodeCatalogModelById, t]); const openCodeModelMetadataByValue = useMemo( () => new Map(openCodeModelMetadata.map((metadata) => [metadata.option.value, metadata])), [openCodeModelMetadata] ); const hasRecommendedOpenCodeModels = useMemo( () => openCodeModelMetadata.some((metadata) => metadata.isRecommended), [openCodeModelMetadata] ); const hasFreeOpenCodeModels = useMemo( () => openCodeModelMetadata.some((metadata) => metadata.isFree), [openCodeModelMetadata] ); useEffect(() => { if (previousSelectedProviderIdRef.current === selectedProviderId) { return; } previousSelectedProviderIdRef.current = selectedProviderId; setInspectedProviderId(null); }, [selectedProviderId]); useEffect(() => { if (recommendedOnly && (effectiveProviderId !== 'opencode' || !hasRecommendedOpenCodeModels)) { setRecommendedOnly(false); } }, [effectiveProviderId, hasRecommendedOpenCodeModels, recommendedOnly]); useEffect(() => { if (freeOnly && (effectiveProviderId !== 'opencode' || !hasFreeOpenCodeModels)) { setFreeOnly(false); } }, [effectiveProviderId, freeOnly, hasFreeOpenCodeModels]); useEffect(() => { if (previousEffectiveProviderIdRef.current === effectiveProviderId) { return; } previousEffectiveProviderIdRef.current = effectiveProviderId; setModelQuery(''); }, [effectiveProviderId]); useEffect(() => { if (effectiveProviderId === 'opencode') { return; } if (selectedOpenCodeSourceIds.size === 0 && !openCodeSourceFilterOpen) { return; } setSelectedOpenCodeSourceIds(new Set()); setOpenCodeSourceFilterOpen(false); }, [effectiveProviderId, openCodeSourceFilterOpen, selectedOpenCodeSourceIds]); useEffect(() => { if (!openCodeSourceFilterOpen && openCodeSourceQuery) { setOpenCodeSourceQuery(''); } }, [openCodeSourceFilterOpen, openCodeSourceQuery]); const openCodeSourceOptions = useMemo(() => { if (effectiveProviderId !== 'opencode') { return []; } const sourceOptions = new Map(); for (const metadata of openCodeModelMetadata) { const option = metadata.option; if (!option.value.trim()) { continue; } if (recommendedOnly && !metadata.isRecommended) { continue; } if (freeOnly && !metadata.isFree) { continue; } const sourceInfo = metadata.sourceInfo; if (!sourceInfo) { continue; } const existing = sourceOptions.get(sourceInfo.id); sourceOptions.set(sourceInfo.id, { id: sourceInfo.id, label: sourceInfo.label, count: (existing?.count ?? 0) + 1, }); } return Array.from(sourceOptions.values()).sort((left, right) => left.label.localeCompare(right.label, undefined, { sensitivity: 'base' }) ); }, [effectiveProviderId, freeOnly, openCodeModelMetadata, recommendedOnly]); useEffect(() => { if (selectedOpenCodeSourceIds.size === 0) { return; } const availableSourceIds = new Set(openCodeSourceOptions.map((source) => source.id)); const nextSelectedSourceIds = new Set( Array.from(selectedOpenCodeSourceIds).filter((sourceId) => availableSourceIds.has(sourceId)) ); if (nextSelectedSourceIds.size !== selectedOpenCodeSourceIds.size) { setSelectedOpenCodeSourceIds(nextSelectedSourceIds); } }, [openCodeSourceOptions, selectedOpenCodeSourceIds]); const filteredOpenCodeSourceOptions = useMemo(() => { const query = openCodeSourceQuery.trim().toLowerCase(); if (!query) { return openCodeSourceOptions; } return openCodeSourceOptions.filter((source) => [source.id, source.label].join(' ').toLowerCase().includes(query) ); }, [openCodeSourceOptions, openCodeSourceQuery]); const selectedOpenCodeSourceLabels = useMemo(() => { const labelById = new Map(openCodeSourceOptions.map((source) => [source.id, source.label])); return Array.from(selectedOpenCodeSourceIds) .map((sourceId) => labelById.get(sourceId)) .filter((label): label is string => Boolean(label)); }, [openCodeSourceOptions, selectedOpenCodeSourceIds]); const openCodeSourceFilterLabel = selectedOpenCodeSourceLabels.length === 0 ? t('modelSelector.openCode.allSources') : selectedOpenCodeSourceLabels.length === 1 ? selectedOpenCodeSourceLabels[0] : t('modelSelector.openCode.sourcesCount', { count: selectedOpenCodeSourceLabels.length, }); const toggleOpenCodeSourceFilter = (sourceId: string): void => { setSelectedOpenCodeSourceIds((previous) => { const next = new Set(previous); if (next.has(sourceId)) { next.delete(sourceId); } else { next.add(sourceId); } return next; }); }; const visibleOpenCodeModelMetadata = useMemo(() => { if (effectiveProviderId !== 'opencode') { return []; } const normalizedModelQuery = modelQuery.trim().toLowerCase(); const matchesModelQuery = (metadata: OpenCodeModelOptionMetadata): boolean => !normalizedModelQuery || metadata.searchText.includes(normalizedModelQuery); const concreteOptions = openCodeModelMetadata .filter((metadata) => metadata.option.value.trim().length > 0) .filter((metadata) => !recommendedOnly || metadata.isRecommended) .filter((metadata) => !freeOnly || metadata.isFree) .filter((metadata) => { if (selectedOpenCodeSourceIds.size === 0) { return true; } return Boolean( metadata.sourceInfo && selectedOpenCodeSourceIds.has(metadata.sourceInfo.id) ); }) .filter(matchesModelQuery) .sort((left, right) => { const recommendationOrder = compareTeamModelRecommendations( effectiveProviderId, left.option.value, right.option.value ); return recommendationOrder || left.index - right.index; }); if (recommendedOnly || freeOnly) { return concreteOptions; } return [ ...openCodeModelMetadata .filter((metadata) => metadata.option.value.trim().length === 0) .filter(matchesModelQuery), ...concreteOptions, ]; }, [ effectiveProviderId, freeOnly, modelQuery, openCodeModelMetadata, recommendedOnly, selectedOpenCodeSourceIds, ]); const visibleModelOptions = useMemo(() => { const normalizedModelQuery = modelQuery.trim().toLowerCase(); const matchesModelQuery = (option: (typeof modelOptions)[number]): boolean => { if (!normalizedModelQuery) { return true; } const modelRecommendation = effectiveProviderId === 'opencode' ? getTeamModelRecommendation(effectiveProviderId, option.value) : null; return [ option.value, option.label, option.badgeLabel ?? '', modelRecommendation?.label ?? '', modelRecommendation?.reason ?? '', ] .join(' ') .toLowerCase() .includes(normalizedModelQuery); }; if (effectiveProviderId !== 'opencode') { return modelOptions.filter(matchesModelQuery); } return visibleOpenCodeModelMetadata.map((metadata) => metadata.option); }, [effectiveProviderId, modelOptions, modelQuery, visibleOpenCodeModelMetadata]); const visibleOpenCodeModelGroups = useMemo(() => { if (effectiveProviderId !== 'opencode') { return []; } const groups = new Map(); for (const metadata of visibleOpenCodeModelMetadata) { const option = metadata.option; if (!option.value.trim()) { continue; } const sourceGroup = metadata.sourceInfo; const groupId = sourceGroup ? `source:${sourceGroup.id}` : `route:${metadata.routeGroup.id}`; const groupLabel = sourceGroup?.label ?? metadata.routeGroup.label; const existingGroup = groups.get(groupId); if (existingGroup) { existingGroup.options.push(option); existingGroup.rank = Math.min(existingGroup.rank, metadata.routeGroup.rank); existingGroup.firstIndex = Math.min(existingGroup.firstIndex, metadata.index); } else { groups.set(groupId, { groupId, groupLabel, rank: metadata.routeGroup.rank, sortLabel: groupLabel.toLowerCase(), firstIndex: metadata.index, options: [option], }); } } return Array.from(groups.values()).sort( (left, right) => left.rank - right.rank || left.sortLabel.localeCompare(right.sortLabel, undefined, { sensitivity: 'base' }) || left.firstIndex - right.firstIndex ); }, [effectiveProviderId, visibleOpenCodeModelMetadata]); const visibleDefaultModelOptions = visibleModelOptions.filter((option) => !option.value.trim()); const visibleConcreteModelOptionCount = visibleModelOptions.length - visibleDefaultModelOptions.length; const concreteModelOptionCount = modelOptions.filter((option) => option.value.trim()).length; const shouldShowOpenCodeCatalogLoading = isOpenCodeCatalogHydrating(runtimeProviderStatus); const shouldShowModelSearch = !shouldShowOpenCodeCatalogLoading && concreteModelOptionCount > 8; const trimmedModelQuery = modelQuery.trim(); const shouldConstrainModelListHeight = visibleModelOptions.length > 8; const shouldVirtualizeOpenCodeModels = effectiveProviderId === 'opencode' && !shouldShowOpenCodeCatalogLoading && visibleConcreteModelOptionCount > OPENCODE_MODEL_VIRTUALIZATION_THRESHOLD; const emptyModelListMessage = trimmedModelQuery ? t('modelSelector.empty.noSearchMatches') : effectiveProviderId === 'opencode' && recommendedOnly && freeOnly ? t('modelSelector.empty.recommendedFreeOpenCode') : effectiveProviderId === 'opencode' && freeOnly ? t('modelSelector.empty.freeOpenCode') : effectiveProviderId === 'opencode' && recommendedOnly ? t('modelSelector.empty.recommendedOpenCode') : t('modelSelector.empty.noModels'); const activeProviderDisabledReason = activeProviderSelectable ? null : getProviderDisabledReason(effectiveProviderId); const canActivateInspectedOpenCode = effectiveProviderId === 'opencode' && isInspectingInactiveProvider && activeProviderSelectable; const activeProviderStatusPanel = activeProviderDisabledReason && effectiveProviderId === 'opencode' ? { tone: 'warning' as const, title: t('modelSelector.openCodeStatus.notReadyTitle'), summary: getOpenCodeReadinessSummary(runtimeProviderStatus, t), message: getOpenCodeReadinessMessage(runtimeProviderStatus, t), reason: activeProviderDisabledReason, actionLabel: null, } : effectiveProviderId === 'opencode' && runtimeProviderStatus?.supported === true && runtimeProviderStatus.authenticated === false ? { tone: 'warning' as const, title: hasFreeOpenCodeModelRoute(runtimeProviderStatus) ? t('modelSelector.openCodeStatus.freeModelsAvailableTitle') : t('modelSelector.openCodeStatus.providerNotConnectedTitle'), summary: getOpenCodeReadinessSummary(runtimeProviderStatus, t), message: getOpenCodeReadinessMessage(runtimeProviderStatus, t), reason: null, actionLabel: null, } : canActivateInspectedOpenCode ? { tone: 'ready' as const, title: t('modelSelector.openCodeStatus.readyTitle'), summary: getOpenCodeReadinessSummary(runtimeProviderStatus, t), message: t('modelSelector.openCodeStatus.readyMessage'), reason: null, actionLabel: t('modelSelector.openCodeStatus.useOpenCode'), } : null; const activeProviderNotice = providerNoticeById?.[effectiveProviderId] ?? null; const getModelAdvisoryBadgeLabel = (reason: string | null): string => reason?.toLowerCase().includes('ping not confirmed') ? t('modelSelector.advisory.pingNotConfirmed') : t('modelSelector.advisory.note'); const renderModelOption = (opt: TeamRuntimeModelOption): React.JSX.Element => { const modelDisabledReason = getTeamModelUiDisabledReason( effectiveProviderId, opt.value, runtimeProviderStatus ); const availabilityStatus = opt.value === '' ? 'available' : (opt.availabilityStatus ?? 'available'); const availabilityReason = opt.value === '' ? null : (opt.availabilityReason ?? null); const runtimeUnavailableReason = opt.value !== '' && availabilityStatus === 'unavailable' ? (availabilityReason ?? t('modelSelector.unavailableInRuntime')) : null; const modelAdvisoryReason = opt.value === '' ? null : (modelAdvisoryReasonByValue?.[opt.value] ?? null); const modelIssueReason = opt.value === '' ? null : (modelIssueReasonByValue?.[opt.value] ?? null); const modelUnavailableReason = opt.value === '' ? null : (modelUnavailableReasonByValue?.[opt.value] ?? getOpenCodeOpenAiRouteAuthUnavailableReason( effectiveProviderId, opt.value, runtimeProviderStatus ) ?? runtimeUnavailableReason); const hasBlockingModelIssue = Boolean(modelIssueReason || modelUnavailableReason); const hasModelAdvisory = Boolean(modelAdvisoryReason) && !hasBlockingModelIssue; const modelSelectable = !isInspectingInactiveProvider && activeProviderSelectable && !modelUnavailableReason && !modelDisabledReason && (opt.value === '' || availabilityStatus == null || availabilityStatus === 'available'); const modelStatusMessage = modelUnavailableReason ?? modelIssueReason ?? modelAdvisoryReason ?? modelDisabledReason ?? availabilityReason ?? null; const openCodeMetadata = effectiveProviderId === 'opencode' ? openCodeModelMetadataByValue.get(opt.value) : null; let modelRecommendation: ReturnType = null; if (effectiveProviderId === 'opencode') { modelRecommendation = openCodeMetadata?.recommendation ?? getTeamModelRecommendation(effectiveProviderId, opt.value); } const openCodePricingInfo = effectiveProviderId === 'opencode' ? (openCodeMetadata?.pricingInfo ?? null) : null; const openCodeRouteMetadata = effectiveProviderId === 'opencode' ? (openCodeMetadata?.routeMetadata ?? null) : null; const openCodeRouteKind = openCodeRouteMetadata?.routeKind ?? null; const openCodeProofState = openCodeRouteMetadata?.proofState ?? null; const modelButtonTitle = modelStatusMessage ?? (opt.value === '' ? defaultModelTooltip : undefined); const showNewRibbon = isAnthropicOpus48NewBadgeVisible(effectiveProviderId, opt.value); return ( ); }; return (
{ if (!isTeamProviderId(nextValue)) { return; } if (isInspectingInactiveProvider && nextValue === selectedProviderId) { setInspectedProviderId(null); return; } if (isProviderSelectable(nextValue)) { setInspectedProviderId(null); onProviderChange(nextValue); return; } if (isProviderInspectable(nextValue)) { setInspectedProviderId(nextValue); } }} >
{PROVIDERS.map((provider) => { const providerDisabledReason = getProviderDisabledReason(provider.id); const providerSelectable = isProviderSelectable(provider.id); const providerInspectable = isProviderInspectable(provider.id); const statusBadge = getProviderStatusBadge(provider.id); const statusBadgeLabel = getProviderStatusBadgeLabel(statusBadge); return ( {provider.label} {statusBadgeLabel ? ( {statusBadgeLabel} ) : null} ); })}
{!multimodelAvailable ? (

{t('modelSelector.multimodelRequired')}

) : null}
{activeProviderNotice ? (
{activeProviderNotice}
) : null} {activeProviderStatusPanel ? (
{activeProviderStatusPanel.tone === 'ready' ? ( ) : ( )}

{activeProviderStatusPanel.title}

{activeProviderStatusPanel.summary}

{activeProviderStatusPanel.message}

{activeProviderStatusPanel.reason ? (

{t('modelSelector.reason', { reason: activeProviderStatusPanel.reason, })}

) : null} {activeProviderStatusPanel.actionLabel ? ( ) : null}
) : null} {shouldAwaitRuntimeModelList ? (

{t('modelSelector.runtimeModelsSyncing')}

) : null} {showAnthropicCompatibleCustomModelInput ? (
onValueChange(event.currentTarget.value.trim())} placeholder={t('modelSelector.placeholders.customModelId')} className="h-8 text-xs" disabled={isInspectingInactiveProvider || !activeProviderSelectable} /> {anthropicCompatibleCatalogWarning ? (

{anthropicCompatibleCatalogWarning}

) : null}
) : null} {shouldShowModelSearch ? (
setModelQuery(event.target.value)} placeholder={t('modelSelector.searchModels')} aria-label={t('modelSelector.searchModels')} className="h-9 pr-3 text-sm" style={{ paddingLeft: 40 }} />
) : null} {!shouldShowOpenCodeCatalogLoading && ((effectiveProviderId === 'opencode' && openCodeSourceOptions.length > 1) || hasRecommendedOpenCodeModels || hasFreeOpenCodeModels) ? (
{effectiveProviderId === 'opencode' && openCodeSourceOptions.length > 1 ? (
{t('modelSelector.openCode.noSourcesFound')} {selectedOpenCodeSourceIds.size > 0 && !openCodeSourceQuery.trim() ? ( setSelectedOpenCodeSourceIds(new Set())} className="flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-xs text-[var(--color-text-muted)] outline-none data-[selected=true]:bg-[var(--color-surface-raised)] data-[selected=true]:text-[var(--color-text)]" > {t('modelSelector.openCode.allSources')} ) : null} {filteredOpenCodeSourceOptions.map((source) => { const selected = selectedOpenCodeSourceIds.has(source.id); return ( toggleOpenCodeSourceFilter(source.id)} className="flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-xs outline-none data-[selected=true]:bg-[var(--color-surface-raised)] data-[selected=true]:text-[var(--color-text)]" > toggleOpenCodeSourceFilter(source.id)} onClick={(event) => event.stopPropagation()} className="size-3.5" aria-label={t('modelSelector.openCode.filterSource', { source: source.label, })} /> {source.label} {source.count} ); })}
) : null} {hasRecommendedOpenCodeModels ? (
setRecommendedOnly(checked === true)} className="size-3.5" />
) : null} {hasFreeOpenCodeModels ? (
setFreeOnly(checked === true)} className="size-3.5" />
) : null}
) : null} {effectiveProviderId === 'opencode' ? ( shouldShowOpenCodeCatalogLoading ? (
{visibleDefaultModelOptions.length > 0 ? (
{visibleDefaultModelOptions.map(renderModelOption)}
) : null}
) : shouldVirtualizeOpenCodeModels ? ( ) : (
{visibleDefaultModelOptions.length > 0 ? (
{visibleDefaultModelOptions.map(renderModelOption)}
) : null} {visibleOpenCodeModelGroups.map((group) => (

{group.groupLabel}

{group.options.length}
{group.options.map(renderModelOption)}
))}
) ) : (
{visibleModelOptions.map(renderModelOption)}
)} {visibleModelOptions.length === 0 && !shouldShowOpenCodeCatalogLoading ? (
{emptyModelListMessage}
) : null}
); };