fix(team): avoid leaking lead backend into mixed member summary

This commit is contained in:
777genius 2026-04-22 20:16:27 +03:00
parent 5ab14682a2
commit 7cdee429ec
2 changed files with 40 additions and 4 deletions

View file

@ -45,14 +45,25 @@ export function resolveMemberRuntimeSummary(
spawnEntry: MemberSpawnStatusEntry | undefined,
runtimeEntry?: TeamAgentRuntimeEntry
): string | undefined {
const memberProviderBackendId = (member as ResolvedTeamMember & { providerBackendId?: string })
.providerBackendId;
const configuredProvider: TeamProviderId =
member.providerId ?? launchParams?.providerId ?? 'anthropic';
const configuredModel = member.model?.trim() || launchParams?.model?.trim() || '';
const configuredEffort = member.effort ?? launchParams?.effort;
const inheritsLeadRuntimeDefaults =
member.providerId == null ||
launchParams?.providerId == null ||
member.providerId === launchParams.providerId;
const configuredModel =
member.model?.trim() || (inheritsLeadRuntimeDefaults ? launchParams?.model?.trim() || '' : '');
const configuredEffort =
member.effort ?? (inheritsLeadRuntimeDefaults ? launchParams?.effort : undefined);
const runtimeModel = spawnEntry?.runtimeModel?.trim() || runtimeEntry?.runtimeModel?.trim();
const configuredProviderBackendId =
memberProviderBackendId ??
(inheritsLeadRuntimeDefaults ? launchParams?.providerBackendId : undefined);
const backendLabel = normalizeMemberBackendLabel(
configuredProvider,
formatTeamProviderBackendLabel(configuredProvider, launchParams?.providerBackendId)
formatTeamProviderBackendLabel(configuredProvider, configuredProviderBackendId)
);
const memorySuffix =
typeof runtimeEntry?.rssBytes === 'number' && runtimeEntry.rssBytes > 0

View file

@ -4,7 +4,9 @@ import { resolveMemberRuntimeSummary } from '@renderer/utils/memberRuntimeSummar
import type { MemberSpawnStatusEntry, ResolvedTeamMember } from '@shared/types';
function createMember(overrides: Partial<ResolvedTeamMember> = {}): ResolvedTeamMember {
type TestResolvedTeamMember = ResolvedTeamMember & { providerBackendId?: string };
function createMember(overrides: Partial<TestResolvedTeamMember> = {}): TestResolvedTeamMember {
return {
name: 'alice',
agentId: 'alice@test-team',
@ -118,4 +120,27 @@ describe('resolveMemberRuntimeSummary', () => {
)
).toBe('5.4 Mini · Medium · Codex');
});
it('does not leak the lead backend label into OpenCode side-lane members', () => {
const member = createMember({
providerId: 'opencode',
providerBackendId: undefined,
model: 'opencode/nemotron-3-super-free',
effort: undefined,
});
expect(
resolveMemberRuntimeSummary(
member,
{
providerId: 'codex',
providerBackendId: 'codex-native',
model: 'gpt-5.4',
effort: 'medium',
limitContext: false,
},
undefined
)
).toBe('nemotron-3-super-free · via OpenCode');
});
});