From a515f3ea47914f08d4c8f47a8ffee8978737a971 Mon Sep 17 00:00:00 2001 From: ismeth Date: Thu, 12 Feb 2026 14:14:33 +0100 Subject: [PATCH] test(04-01): add Athena registration and schema regressions - verify Athena primary agents honor uiSelectedModel and override precedence - add schema tests to lock athena acceptance in builtin and overridable names --- src/agents/utils.test.ts | 63 +++++++++++++++++++++++++++ src/config/schema/agent-names.test.ts | 25 +++++++++++ 2 files changed, 88 insertions(+) diff --git a/src/agents/utils.test.ts b/src/agents/utils.test.ts index b63a34827..e5c2588a7 100644 --- a/src/agents/utils.test.ts +++ b/src/agents/utils.test.ts @@ -168,6 +168,69 @@ describe("createBuiltinAgents with model overrides", () => { } }) + test("Athena uses uiSelectedModel when provided", async () => { + // #given + const fetchSpy = spyOn(shared, "fetchAvailableModels").mockResolvedValue( + new Set(["openai/gpt-5.2", "anthropic/claude-opus-4-6"]) + ) + const uiSelectedModel = "openai/gpt-5.2" + + try { + // #when + const agents = await createBuiltinAgents( + [], + {}, + undefined, + TEST_DEFAULT_MODEL, + undefined, + undefined, + [], + undefined, + undefined, + uiSelectedModel + ) + + // #then + expect(agents.athena).toBeDefined() + expect(agents.athena.model).toBe("openai/gpt-5.2") + } finally { + fetchSpy.mockRestore() + } + }) + + test("user config model takes priority over uiSelectedModel for athena", async () => { + // #given + const fetchSpy = spyOn(shared, "fetchAvailableModels").mockResolvedValue( + new Set(["openai/gpt-5.2", "anthropic/claude-opus-4-6"]) + ) + const uiSelectedModel = "openai/gpt-5.2" + const overrides = { + athena: { model: "anthropic/claude-opus-4-6" }, + } + + try { + // #when + const agents = await createBuiltinAgents( + [], + overrides, + undefined, + TEST_DEFAULT_MODEL, + undefined, + undefined, + [], + undefined, + undefined, + uiSelectedModel + ) + + // #then + expect(agents.athena).toBeDefined() + expect(agents.athena.model).toBe("anthropic/claude-opus-4-6") + } finally { + fetchSpy.mockRestore() + } + }) + test("Sisyphus is created on first run when no availableModels or cache exist", async () => { // #given const systemDefaultModel = "anthropic/claude-opus-4-6" diff --git a/src/config/schema/agent-names.test.ts b/src/config/schema/agent-names.test.ts index d6b80a29b..17dc00c8b 100644 --- a/src/config/schema/agent-names.test.ts +++ b/src/config/schema/agent-names.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from "bun:test" +import { BuiltinAgentNameSchema, OverridableAgentNameSchema } from "./agent-names" import { OhMyOpenCodeConfigSchema } from "./oh-my-opencode-config" describe("OhMyOpenCodeConfigSchema disabled_skills", () => { @@ -21,3 +22,27 @@ describe("OhMyOpenCodeConfigSchema disabled_skills", () => { } }) }) + +describe("agent name schemas", () => { + test("BuiltinAgentNameSchema accepts athena", () => { + //#given + const candidate = "athena" + + //#when + const result = BuiltinAgentNameSchema.safeParse(candidate) + + //#then + expect(result.success).toBe(true) + }) + + test("OverridableAgentNameSchema accepts athena", () => { + //#given + const candidate = "athena" + + //#when + const result = OverridableAgentNameSchema.safeParse(candidate) + + //#then + expect(result.success).toBe(true) + }) +})