import type { ReactNode } from 'react' import { Box, Text } from '../ink.js' import { useMainLoopModel } from '../hooks/useMainLoopModel.js' import { useAppState, useSetAppState } from '../state/AppState.js' import type { EffortLevel } from '../utils/effort.js' import { getAvailableEffortLevels, getDisplayedEffortLevel, getEffortLevelDescription, getEffortLevelLabel, modelSupportsEffort, modelUsesOpenAIEffort, } from '../utils/effort.js' import { getAPIProvider } from '../utils/model/providers.js' import { getReasoningEffortForModel } from '../services/api/providerConfig.js' import { Select } from './CustomSelect/select.js' import { effortLevelToSymbol } from './EffortIndicator.js' import { KeyboardShortcutHint } from './design-system/KeyboardShortcutHint.js' import { Byline } from './design-system/Byline.js' type EffortOption = { label: ReactNode value: string description: string isAvailable: boolean } type Props = { onSelect: (effort: EffortLevel | undefined) => void onCancel?: () => void } export function EffortPicker({ onSelect, onCancel }: Props) { const model = useMainLoopModel() const appStateEffort = useAppState((s: any) => s.effortValue) const setAppState = useSetAppState() const provider = getAPIProvider() const usesOpenAIEffort = modelUsesOpenAIEffort(model) const availableLevels = getAvailableEffortLevels(model) const currentDisplayedLevel = getDisplayedEffortLevel(model, appStateEffort) // For OpenAI/Codex, get the model's default reasoning effort const modelReasoningEffort = usesOpenAIEffort ? getReasoningEffortForModel(model) : undefined const options: EffortOption[] = [ { label: , value: 'auto', description: 'Use the default effort level for your model', isAvailable: true, }, ...availableLevels.map(level => { const displayLevel = usesOpenAIEffort ? (level === 'xhigh' ? 'max' : level) : level const isCurrent = currentDisplayedLevel === displayLevel return { label: ( ), value: level, description: getEffortLevelDescription(level as EffortLevel), isAvailable: true, } }), ] function handleSelect(value: string) { if (value === 'auto') { setAppState(prev => ({ ...prev, effortValue: undefined, })) onSelect(undefined) } else { const effortLevel = value as EffortLevel setAppState(prev => ({ ...prev, effortValue: effortLevel, })) onSelect(effortLevel) } } function handleCancel() { onCancel?.() } const supportsEffort = modelSupportsEffort(model) // For OpenAI/Codex, use the model's default reasoning effort as initial focus // For Claude, use the displayed effort level or 'auto' const initialFocus = usesOpenAIEffort ? (modelReasoningEffort || 'auto') : (appStateEffort ? String(appStateEffort) : 'auto') return ( Set effort level {usesOpenAIEffort ? `OpenAI/Codex provider (${provider})` : supportsEffort ? `Claude model · ${provider} provider` : `Effort not supported for this model` }