import React from 'react'; import { isAnthropicHaikuTeamModel } from '@renderer/utils/teamModelCatalog'; import { LeadModelRow } from './LeadModelRow'; import { MembersEditorSection } from './MembersEditorSection'; import type { MemberDraft } from './membersEditorTypes'; import type { MentionSuggestion } from '@renderer/types/mention'; import type { EffortLevel, TeamProviderId } from '@shared/types'; interface TeamRosterEditorSectionProps { members: MemberDraft[]; onMembersChange: (members: MemberDraft[]) => void; fieldError?: string; validateMemberName?: (name: string) => string | null; showWorkflow?: boolean; showJsonEditor?: boolean; draftKeyPrefix?: string; projectPath?: string | null; taskSuggestions?: MentionSuggestion[]; teamSuggestions?: MentionSuggestion[]; hideMembersContent?: boolean; existingMembers?: readonly { name: string; color?: string; removedAt?: number | string | null }[]; defaultProviderId?: TeamProviderId; inheritedProviderId: TeamProviderId; inheritedModel: string; inheritedEffort?: EffortLevel; inheritModelSettingsByDefault?: boolean; forceInheritedModelSettings?: boolean; lockProviderModel?: boolean; modelLockReason?: string; providerId: TeamProviderId; model: string; effort?: EffortLevel; limitContext: boolean; onProviderChange: (providerId: TeamProviderId) => void; onModelChange: (model: string) => void; onEffortChange: (effort: string) => void; onLimitContextChange: (value: boolean) => void; syncModelsWithTeammates: boolean; onSyncModelsWithTeammatesChange: (value: boolean) => void; headerTop?: React.ReactNode; headerBottom?: React.ReactNode; softDeleteMembers?: boolean; leadWarningText?: string | null; memberWarningById?: Record; memberInfoById?: Record; disableGeminiOption?: boolean; leadModelIssueText?: string | null; memberModelIssueById?: Record; modelIssueReasonByProvider?: Partial< Record>> >; modelUnavailableReasonByProvider?: Partial< Record>> >; showWorktreeIsolationControls?: boolean; teammateWorktreeDefault?: boolean; worktreeIsolationDisabledReason?: string | null; onTeammateWorktreeDefaultChange?: (enabled: boolean) => void; } export const TeamRosterEditorSection = ({ members, onMembersChange, fieldError, validateMemberName, showWorkflow = false, showJsonEditor = true, draftKeyPrefix, projectPath, taskSuggestions, teamSuggestions, hideMembersContent = false, existingMembers, defaultProviderId = 'anthropic', inheritedProviderId, inheritedModel, inheritedEffort, inheritModelSettingsByDefault = false, forceInheritedModelSettings = false, lockProviderModel = false, modelLockReason, providerId, model, effort, limitContext, onProviderChange, onModelChange, onEffortChange, onLimitContextChange, syncModelsWithTeammates, onSyncModelsWithTeammatesChange, headerTop, headerBottom, softDeleteMembers = false, leadWarningText, memberWarningById, memberInfoById, disableGeminiOption = false, leadModelIssueText, memberModelIssueById, modelIssueReasonByProvider, modelUnavailableReasonByProvider, showWorktreeIsolationControls = false, teammateWorktreeDefault = false, worktreeIsolationDisabledReason, onTeammateWorktreeDefaultChange, }: TeamRosterEditorSectionProps): React.JSX.Element => { const canUseCustomMemberRuntimes = !hideMembersContent && !forceInheritedModelSettings && !syncModelsWithTeammates; const activeRuntimeMembers = canUseCustomMemberRuntimes ? members.filter((member) => !member.removedAt) : []; const hasCustomAnthropicRuntime = activeRuntimeMembers.some( (member) => member.providerId === 'anthropic' ); const hasMemberAnthropicRuntimeWithContextChoice = activeRuntimeMembers.some((member) => { if (member.providerId === 'anthropic') { const memberModel = member.model?.trim(); return !memberModel || !isAnthropicHaikuTeamModel(memberModel); } if (member.providerId == null && providerId === 'anthropic') { const memberModel = member.model?.trim(); return Boolean(memberModel && !isAnthropicHaikuTeamModel(memberModel)); } return false; }); const hasAnthropicRuntime = providerId === 'anthropic' || hasCustomAnthropicRuntime; const disableAnthropicContextLimit = providerId === 'anthropic' && isAnthropicHaikuTeamModel(model) && !hasMemberAnthropicRuntimeWithContextChoice; return ( {headerTop} {headerBottom} } memberWarningById={memberWarningById} memberInfoById={memberInfoById} /> ); };