feat(FN-5204): add test mode activation across settings, engine, and dashboard

- Add core settings schema/types support for testMode with model-resolution override handling
- Enforce engine session lane overrides in test mode with targeted helper coverage
- Add dashboard settings toggle plus persistent test-mode banner and related component tests
- Update settings documentation and parity/roundtrip tests for the new test mode behavior
This commit is contained in:
Fusion (runfusion.ai)
2026-05-22 00:15:14 -07:00
committed by gsxdsm
parent fbf7e2cb4d
commit 9c2b61eec6
23 changed files with 557 additions and 73 deletions

View File

@@ -0,0 +1,111 @@
import { describe, expect, it } from "vitest";
import {
resolveExecutorSessionModel,
resolveHeartbeatSessionModels,
resolveMergerSessionModel,
resolvePlanningSessionModel,
} from "../agent-session-helpers.js";
const assignedAgentRuntimeConfig = {
modelProvider: "anthropic",
modelId: "claude-sonnet-4-5",
};
describe("agent-session-helpers test mode overrides", () => {
it("forces every resolver lane to mock when settings.testMode is true", () => {
const settings = {
testMode: true,
defaultProvider: "openai",
defaultModelId: "gpt-4.1",
executionProvider: "openai",
executionModelId: "gpt-4.1",
planningProvider: "openai",
planningModelId: "gpt-4.1",
defaultProviderOverride: "openai",
defaultModelIdOverride: "gpt-4.1",
};
expect(resolveExecutorSessionModel("openai", "gpt-4.1", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolvePlanningSessionModel("openai", "gpt-4.1", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolveMergerSessionModel(settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolveHeartbeatSessionModels(settings, assignedAgentRuntimeConfig)).toEqual({
defaultProvider: "mock",
defaultModelId: "scripted",
fallbackProvider: undefined,
fallbackModelId: undefined,
});
});
it("forces every resolver lane to mock when defaultProvider is mock", () => {
const settings = {
defaultProvider: "mock",
defaultModelId: "custom",
executionProvider: "openai",
executionModelId: "gpt-4.1",
planningProvider: "openai",
planningModelId: "gpt-4.1",
defaultProviderOverride: "openai",
defaultModelIdOverride: "gpt-4.1",
};
expect(resolveExecutorSessionModel("openai", "gpt-4.1", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolvePlanningSessionModel("openai", "gpt-4.1", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolveMergerSessionModel(settings, assignedAgentRuntimeConfig)).toEqual({
provider: "mock",
modelId: "scripted",
});
expect(resolveHeartbeatSessionModels(settings, assignedAgentRuntimeConfig)).toEqual({
defaultProvider: "mock",
defaultModelId: "scripted",
fallbackProvider: undefined,
fallbackModelId: undefined,
});
});
it("keeps existing behavior when test mode is inactive", () => {
const settings = {
executionProvider: "openai",
executionModelId: "gpt-4.1",
planningProvider: "openai",
planningModelId: "gpt-4.1",
defaultProviderOverride: "openai",
defaultModelIdOverride: "gpt-4.1",
defaultProvider: "openai",
defaultModelId: "gpt-4.1",
};
expect(resolveExecutorSessionModel("task-provider", "task-model", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "anthropic",
modelId: "claude-sonnet-4-5",
});
expect(resolvePlanningSessionModel("task-provider", "task-model", settings, assignedAgentRuntimeConfig)).toEqual({
provider: "anthropic",
modelId: "claude-sonnet-4-5",
});
expect(resolveMergerSessionModel(settings, assignedAgentRuntimeConfig)).toEqual({
provider: "anthropic",
modelId: "claude-sonnet-4-5",
});
expect(resolveHeartbeatSessionModels(settings, assignedAgentRuntimeConfig)).toEqual({
defaultProvider: "anthropic",
defaultModelId: "claude-sonnet-4-5",
fallbackProvider: "openai",
fallbackModelId: "gpt-4.1",
});
});
});