Preserve draft composer permission mode (#1175)
This commit is contained in:
@@ -372,6 +372,7 @@ export function useAgentFormState(options: UseAgentFormStateOptions = {}): UseAg
|
|||||||
}
|
}
|
||||||
const providerDef = selectableProviderDefinitionMap.get(provider);
|
const providerDef = selectableProviderDefinitionMap.get(provider);
|
||||||
const providerModels = allProviderModels.get(provider) ?? null;
|
const providerModels = allProviderModels.get(provider) ?? null;
|
||||||
|
const providerPrefs = preferences?.providerPreferences?.[provider];
|
||||||
const normalizedModelId = normalizeSelectedModelId(modelId);
|
const normalizedModelId = normalizeSelectedModelId(modelId);
|
||||||
const nextModelId = normalizedModelId || resolveDefaultModelId(providerModels);
|
const nextModelId = normalizedModelId || resolveDefaultModelId(providerModels);
|
||||||
|
|
||||||
@@ -381,6 +382,7 @@ export function useAgentFormState(options: UseAgentFormStateOptions = {}): UseAg
|
|||||||
modelId,
|
modelId,
|
||||||
providerDef,
|
providerDef,
|
||||||
providerModels,
|
providerModels,
|
||||||
|
providerPrefs,
|
||||||
});
|
});
|
||||||
void updatePreferences((current) =>
|
void updatePreferences((current) =>
|
||||||
mergeSelectedComposerPreferences({
|
mergeSelectedComposerPreferences({
|
||||||
@@ -392,7 +394,12 @@ export function useAgentFormState(options: UseAgentFormStateOptions = {}): UseAg
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
[allProviderModels, selectableProviderDefinitionMap, updatePreferences],
|
[
|
||||||
|
allProviderModels,
|
||||||
|
preferences?.providerPreferences,
|
||||||
|
selectableProviderDefinitionMap,
|
||||||
|
updatePreferences,
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const setModeFromUser = useCallback(
|
const setModeFromUser = useCallback(
|
||||||
|
|||||||
@@ -768,6 +768,21 @@ describe("resolveAgentForm", () => {
|
|||||||
expect(next.userModified.model).toBe(true);
|
expect(next.userModified.model).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("preserves the current preferred mode when selecting a provider and model", () => {
|
||||||
|
const state = makeState({ provider: "codex", modeId: "full-access" });
|
||||||
|
const next = resolveAgentForm(state, {
|
||||||
|
type: "SET_PROVIDER_AND_MODEL_FROM_USER",
|
||||||
|
provider: "codex",
|
||||||
|
modelId: "gpt-5.3-codex",
|
||||||
|
providerDef: TEST_CODEX_DEFINITION,
|
||||||
|
providerModels: CODEX_MODELS,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(next.form.provider).toBe("codex");
|
||||||
|
expect(next.form.model).toBe("gpt-5.3-codex");
|
||||||
|
expect(next.form.modeId).toBe("full-access");
|
||||||
|
});
|
||||||
|
|
||||||
it("falls back to provider default model when modelId is empty", () => {
|
it("falls back to provider default model when modelId is empty", () => {
|
||||||
const state = makeState();
|
const state = makeState();
|
||||||
const next = resolveAgentForm(state, {
|
const next = resolveAgentForm(state, {
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ export type AgentFormAction =
|
|||||||
modelId: string;
|
modelId: string;
|
||||||
providerDef: AgentProviderDefinition | undefined;
|
providerDef: AgentProviderDefinition | undefined;
|
||||||
providerModels: AgentModelDefinition[] | null;
|
providerModels: AgentModelDefinition[] | null;
|
||||||
|
providerPrefs?: ProviderPrefs | undefined;
|
||||||
}
|
}
|
||||||
| { type: "SET_MODE_FROM_USER"; modeId: string }
|
| { type: "SET_MODE_FROM_USER"; modeId: string }
|
||||||
| {
|
| {
|
||||||
@@ -417,6 +418,27 @@ function pickNextModeForProvider(input: {
|
|||||||
return providerDef?.defaultModeId ?? "";
|
return providerDef?.defaultModeId ?? "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pickNextModeForProviderAndModel(input: {
|
||||||
|
currentProvider: AgentProvider | null;
|
||||||
|
currentModeId: string;
|
||||||
|
provider: AgentProvider;
|
||||||
|
providerDef: AgentProviderDefinition | undefined;
|
||||||
|
providerPrefs: ProviderPrefs | undefined;
|
||||||
|
}): string {
|
||||||
|
const validModeIds = input.providerDef?.modes.map((m) => m.id) ?? [];
|
||||||
|
if (
|
||||||
|
input.currentProvider === input.provider &&
|
||||||
|
input.currentModeId &&
|
||||||
|
validModeIds.includes(input.currentModeId)
|
||||||
|
) {
|
||||||
|
return input.currentModeId;
|
||||||
|
}
|
||||||
|
return pickNextModeForProvider({
|
||||||
|
providerDef: input.providerDef,
|
||||||
|
providerPrefs: input.providerPrefs,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function pickNextThinkingOptionForProvider(input: {
|
function pickNextThinkingOptionForProvider(input: {
|
||||||
providerModels: AgentModelDefinition[] | null;
|
providerModels: AgentModelDefinition[] | null;
|
||||||
providerPrefs: ProviderPrefs | undefined;
|
providerPrefs: ProviderPrefs | undefined;
|
||||||
@@ -494,12 +516,19 @@ export function resolveAgentForm(
|
|||||||
modelId: nextModelId,
|
modelId: nextModelId,
|
||||||
requestedThinkingOptionId: "",
|
requestedThinkingOptionId: "",
|
||||||
});
|
});
|
||||||
|
const nextModeId = pickNextModeForProviderAndModel({
|
||||||
|
currentProvider: state.form.provider,
|
||||||
|
currentModeId: state.form.modeId,
|
||||||
|
provider: action.provider,
|
||||||
|
providerDef: action.providerDef,
|
||||||
|
providerPrefs: action.providerPrefs,
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
form: {
|
form: {
|
||||||
...state.form,
|
...state.form,
|
||||||
provider: action.provider,
|
provider: action.provider,
|
||||||
model: nextModelId,
|
model: nextModelId,
|
||||||
modeId: action.providerDef?.defaultModeId ?? "",
|
modeId: nextModeId,
|
||||||
thinkingOptionId: nextThinkingOptionId,
|
thinkingOptionId: nextThinkingOptionId,
|
||||||
},
|
},
|
||||||
userModified: { ...state.userModified, provider: true, model: true },
|
userModified: { ...state.userModified, provider: true, model: true },
|
||||||
|
|||||||
Reference in New Issue
Block a user