* fix(app): keep profile modes scoped to providers Applying a profile through sequential field setters allowed a provider change to race mode persistence, poisoning modeless provider preferences with another provider's mode. Apply profiles as one form transition and heal invalid provider-scoped mode preferences when profiles are used. * test(app): cover profile features across providers
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { AgentMode } from "@getpaseo/protocol/agent-types";
|
|
import { resolveAgentControlsMode, resolveNextAgentModeId } from "./mode";
|
|
|
|
const PLAN_MODE = { id: "plan", label: "Plan" } satisfies AgentMode;
|
|
|
|
const MODES = [
|
|
PLAN_MODE,
|
|
{ id: "build", label: "Build" },
|
|
{ id: "full-access", label: "Full Access" },
|
|
] satisfies AgentMode[];
|
|
|
|
describe("resolveAgentControlsMode", () => {
|
|
it("uses ready mode when no controlled agent controls are provided", () => {
|
|
expect(resolveAgentControlsMode(undefined)).toBe("ready");
|
|
});
|
|
|
|
it("uses draft mode when controlled agent controls are provided", () => {
|
|
expect(
|
|
resolveAgentControlsMode({
|
|
providerDefinitions: [],
|
|
selectedProvider: "codex",
|
|
modeOptions: [],
|
|
selectedMode: "",
|
|
onSelectMode: () => undefined,
|
|
models: [],
|
|
selectedModel: "",
|
|
onSelectModel: () => undefined,
|
|
isModelLoading: false,
|
|
modelSelectorProviders: [],
|
|
isAllModelsLoading: false,
|
|
onSelectProviderAndModel: () => undefined,
|
|
thinkingOptions: [],
|
|
selectedThinkingOptionId: "",
|
|
onSelectThinkingOption: () => undefined,
|
|
onApplyAgentProfile: () => undefined,
|
|
}),
|
|
).toBe("draft");
|
|
});
|
|
});
|
|
|
|
describe("resolveNextAgentModeId", () => {
|
|
it("cycles from the selected mode to the next mode", () => {
|
|
expect(resolveNextAgentModeId({ modeOptions: MODES, selectedMode: "build" })).toBe(
|
|
"full-access",
|
|
);
|
|
});
|
|
|
|
it("wraps from the last mode to the first mode", () => {
|
|
expect(resolveNextAgentModeId({ modeOptions: MODES, selectedMode: "full-access" })).toBe(
|
|
"plan",
|
|
);
|
|
});
|
|
|
|
it("treats an empty selection as the visible first mode", () => {
|
|
expect(resolveNextAgentModeId({ modeOptions: MODES, selectedMode: "" })).toBe("build");
|
|
});
|
|
|
|
it("treats a stale selection as the visible first mode", () => {
|
|
expect(resolveNextAgentModeId({ modeOptions: MODES, selectedMode: "deleted-mode" })).toBe(
|
|
"build",
|
|
);
|
|
});
|
|
|
|
it("returns null when there are fewer than two modes", () => {
|
|
expect(resolveNextAgentModeId({ modeOptions: [], selectedMode: "" })).toBeNull();
|
|
expect(resolveNextAgentModeId({ modeOptions: [PLAN_MODE], selectedMode: "plan" })).toBeNull();
|
|
});
|
|
});
|