diff --git a/src/main/services/team/TeamProvisioningService.ts b/src/main/services/team/TeamProvisioningService.ts index 4bf1deb7..0225c311 100644 --- a/src/main/services/team/TeamProvisioningService.ts +++ b/src/main/services/team/TeamProvisioningService.ts @@ -12947,6 +12947,16 @@ export class TeamProvisioningService { } launchArgs.push(...parseCliArgs(request.extraCliArgs)); launchArgs.push(...providerArgs); + // When the lead uses a different provider than some teammates (e.g., anthropic lead + // with codex teammates), the lead needs the teammate provider's launch args so they + // can be inherited by the teammate subprocess via buildInheritedCliFlags. + // Without this, a codex teammate spawned from an anthropic lead has no way to learn + // about the required forced_login_method (chatgpt/api) and fails to start. + const crossProviderMemberArgs = await this.buildCrossProviderMemberArgs( + resolvedProviderId, + effectiveMemberSpecs + ); + launchArgs.push(...crossProviderMemberArgs); const finalLaunchArgs = mergeJsonSettingsArgs(launchArgs); const runtimeWarning = buildRuntimeLaunchWarning(request, shellEnv, { geminiRuntimeAuth, @@ -21417,6 +21427,37 @@ export class TeamProvisioningService { }; } + private async buildCrossProviderMemberArgs( + primaryProviderId: TeamProviderId, + memberSpecs: TeamCreateRequest['members'] + ): Promise { + const crossProviderIds = new Set(); + for (const member of memberSpecs) { + const memberId = resolveTeamProviderId( + normalizeTeamMemberProviderId(member.providerId) ?? primaryProviderId + ); + if (memberId !== primaryProviderId) { + crossProviderIds.add(memberId); + } + } + const args: string[] = []; + for (const providerId of crossProviderIds) { + try { + const env = await this.buildProvisioningEnv(providerId); + if (env.providerArgs) { + args.push(...env.providerArgs); + } + } catch (error) { + console.error( + `[TeamProvisioningService] Failed to build cross-provider args for provider "${providerId}"`, + error + ); + // Best-effort: don't block launch if cross-provider env resolution fails + } + } + return args; + } + private async resolveControlApiBaseUrl(): Promise { if (!this.controlApiBaseUrlResolver) { return null;