import { type ModelConfigSnapshot, type ModelRoleConfig } from './api'; import { type Messages } from './i18n'; import { type AgentType, type EffortValue, effortValuesForAgent, formatEffortOption, isEffortSupported, isPresetModel, PRESET_MODELS, } from './settings-options'; const MODEL_ROLES = ['owner', 'reviewer', 'arbiter'] as const; export type ModelRole = (typeof MODEL_ROLES)[number]; function modelRoleLabel(role: ModelRole, t: Messages): string { if (role === 'owner') return t.settings.models.roleOwner; if (role === 'reviewer') return t.settings.models.roleReviewer; return t.settings.models.roleArbiter; } function modelRoleHint(role: ModelRole, t: Messages): string { if (role === 'owner') return t.settings.models.roleOwnerHint; if (role === 'reviewer') return t.settings.models.roleReviewerHint; return t.settings.models.roleArbiterHint; } function agentTypeLabel(agentType: AgentType, t: Messages): string { return agentType === 'codex' ? t.settings.models.agentTypeCodex : t.settings.models.agentTypeClaude; } function effortLabel(value: EffortValue, t: Messages): string { if (value === '') return t.settings.models.effortDefault; const key = value as keyof typeof t.settings.models.effortOptions; const localized = t.settings.models.effortOptions[key] ?? value; return formatEffortOption(value, localized); } function modelGroupLabel(model: string, t: Messages): string { if ((PRESET_MODELS.codex as readonly string[]).includes(model)) { return t.settings.models.groupCodex; } if ((PRESET_MODELS.claude as readonly string[]).includes(model)) { return t.settings.models.groupClaude; } return t.settings.models.groupCustom; } function effortOptionsForRole( draft: ModelConfigSnapshot, role: ModelRole, ): readonly EffortValue[] { const agentType = draft.agentTypes?.[role]; if (agentType) return effortValuesForAgent(agentType); return effortValuesForAgent('codex'); } export function hasUnsupportedModelEffort(draft: ModelConfigSnapshot): boolean { for (const role of MODEL_ROLES) { const agentType = draft.agentTypes?.[role]; if (!agentType) continue; if (!isEffortSupported(agentType, draft[role].effort)) return true; } return false; } export function ModelRoleFields({ draft, onChange, t, }: { draft: ModelConfigSnapshot; onChange: (role: ModelRole, patch: Partial) => void; t: Messages; }) { return (
{MODEL_ROLES.map((role) => { const roleConfig = draft[role]; const agentType = draft.agentTypes?.[role] ?? null; const effortOptions = effortOptionsForRole(draft, role); const effortInvalid = agentType !== null && roleConfig.effort !== '' && !isEffortSupported(agentType, roleConfig.effort); const usingCustom = roleConfig.model.trim() !== '' && !isPresetModel(roleConfig.model); return (
{role} {modelRoleLabel(role, t)}

{modelRoleHint(role, t)}

{agentType ? (

{t.settings.models.agentTypeLabel}:{' '} {agentTypeLabel(agentType, t)}

) : null}
{usingCustom ? ( ) : null} {effortInvalid && agentType ? ( ) : null} {roleConfig.model || roleConfig.effort ? (

{roleConfig.model ? modelGroupLabel(roleConfig.model, t) : t.settings.models.modelDefault} {' ยท '} {roleConfig.effort ? effortLabel(roleConfig.effort as EffortValue, t) : t.settings.models.effortDefault}

) : null}
); })}
); }