125 lines
4.1 KiB
TypeScript
125 lines
4.1 KiB
TypeScript
import { normalizeCreateLaunchProviderForUi } from '@renderer/utils/geminiUiFreeze';
|
|
import { getDefaultProviderBackendId } from '@renderer/utils/providerBackendIdentity';
|
|
import { normalizeExplicitTeamModelForUi } from '@renderer/utils/teamModelAvailability';
|
|
import { extractProviderScopedBaseModel } from '@renderer/utils/teamModelContext';
|
|
import { isLeadMember } from '@shared/utils/leadDetection';
|
|
import { normalizeOptionalTeamProviderId } from '@shared/utils/teamProvider';
|
|
|
|
import type { ResolvedTeamMember, TeamCreateRequest, TeamProviderId } from '@shared/types';
|
|
|
|
interface PreviousLaunchParamsLike {
|
|
providerId?: TeamProviderId;
|
|
providerBackendId?: string;
|
|
model?: string;
|
|
effort?: string;
|
|
fastMode?: 'inherit' | 'on' | 'off';
|
|
limitContext?: boolean;
|
|
}
|
|
|
|
interface LaunchDialogPrefillInput {
|
|
members: readonly ResolvedTeamMember[];
|
|
savedRequest: TeamCreateRequest | null;
|
|
previousLaunchParams?: PreviousLaunchParamsLike;
|
|
multimodelEnabled: boolean;
|
|
storedProviderId: TeamProviderId;
|
|
storedEffort: string;
|
|
storedFastMode: 'inherit' | 'on' | 'off';
|
|
storedLimitContext: boolean;
|
|
getStoredModel: (providerId: TeamProviderId) => string;
|
|
}
|
|
|
|
interface LaunchDialogPrefillResult {
|
|
providerId: TeamProviderId;
|
|
providerBackendId?: string;
|
|
model: string;
|
|
effort: string;
|
|
fastMode: 'inherit' | 'on' | 'off';
|
|
limitContext: boolean;
|
|
}
|
|
|
|
function normalizeModelCandidate(
|
|
model: string | undefined,
|
|
providerId: TeamProviderId | undefined
|
|
): string {
|
|
const trimmed = model?.trim() ?? '';
|
|
if (!trimmed || trimmed === 'default' || trimmed === '__default__') {
|
|
return '';
|
|
}
|
|
return extractProviderScopedBaseModel(trimmed, providerId) ?? '';
|
|
}
|
|
|
|
function canReuseModelForSelectedProvider(
|
|
sourceProviderId: TeamProviderId | undefined,
|
|
selectedProviderId: TeamProviderId
|
|
): boolean {
|
|
if (!sourceProviderId || sourceProviderId === 'gemini') {
|
|
return false;
|
|
}
|
|
return selectedProviderId === normalizeCreateLaunchProviderForUi(sourceProviderId, true);
|
|
}
|
|
|
|
export function resolveLaunchDialogPrefill({
|
|
members,
|
|
savedRequest,
|
|
previousLaunchParams,
|
|
multimodelEnabled,
|
|
storedProviderId,
|
|
storedEffort,
|
|
storedFastMode,
|
|
storedLimitContext,
|
|
getStoredModel,
|
|
}: LaunchDialogPrefillInput): LaunchDialogPrefillResult {
|
|
const currentLead = members.find((member) => isLeadMember(member));
|
|
const currentLeadProviderId = normalizeOptionalTeamProviderId(currentLead?.providerId);
|
|
const savedRequestProviderId = normalizeOptionalTeamProviderId(savedRequest?.providerId);
|
|
const previousLaunchProviderId = normalizeOptionalTeamProviderId(
|
|
previousLaunchParams?.providerId
|
|
);
|
|
|
|
const providerId = normalizeCreateLaunchProviderForUi(
|
|
currentLeadProviderId ?? savedRequestProviderId ?? previousLaunchProviderId ?? storedProviderId,
|
|
multimodelEnabled
|
|
);
|
|
|
|
const modelCandidates = [
|
|
{
|
|
providerId: currentLeadProviderId,
|
|
model: normalizeModelCandidate(currentLead?.model, currentLeadProviderId),
|
|
},
|
|
{
|
|
providerId: savedRequestProviderId,
|
|
model: normalizeModelCandidate(savedRequest?.model, savedRequestProviderId),
|
|
},
|
|
{
|
|
providerId: previousLaunchProviderId,
|
|
model: normalizeModelCandidate(previousLaunchParams?.model, previousLaunchProviderId),
|
|
},
|
|
];
|
|
|
|
const matchingModel = modelCandidates.find(
|
|
(candidate) =>
|
|
candidate.model && canReuseModelForSelectedProvider(candidate.providerId, providerId)
|
|
)?.model;
|
|
|
|
const effort =
|
|
currentLead?.effort ?? savedRequest?.effort ?? previousLaunchParams?.effort ?? storedEffort;
|
|
const fastMode =
|
|
savedRequest?.fastMode ?? previousLaunchParams?.fastMode ?? storedFastMode ?? 'inherit';
|
|
const limitContext =
|
|
previousLaunchParams?.limitContext ?? savedRequest?.limitContext ?? storedLimitContext;
|
|
|
|
return {
|
|
providerId,
|
|
providerBackendId:
|
|
previousLaunchParams?.providerBackendId?.trim() ||
|
|
savedRequest?.providerBackendId?.trim() ||
|
|
getDefaultProviderBackendId(providerId) ||
|
|
undefined,
|
|
model: matchingModel
|
|
? normalizeExplicitTeamModelForUi(providerId, matchingModel)
|
|
: getStoredModel(providerId),
|
|
effort,
|
|
fastMode,
|
|
limitContext,
|
|
};
|
|
}
|