diff --git a/assets/oh-my-opencode.schema.json b/assets/oh-my-opencode.schema.json index 55385f5c6..b19e68bb1 100644 --- a/assets/oh-my-opencode.schema.json +++ b/assets/oh-my-opencode.schema.json @@ -36,7 +36,8 @@ "metis", "momus", "atlas", - "athena" + "athena", + "council-member" ] } }, diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index cf164d199..a8688faa8 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -10,6 +10,9 @@ exports[`generateModelConfig no providers available returns ULTIMATE_FALLBACK fo "atlas": { "model": "opencode/glm-4.7-free", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/glm-4.7-free", }, @@ -75,6 +78,9 @@ exports[`generateModelConfig single native provider uses Claude models when only "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -141,6 +147,9 @@ exports[`generateModelConfig single native provider uses Claude models with isMa "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -208,6 +217,9 @@ exports[`generateModelConfig single native provider uses OpenAI models when only "atlas": { "model": "openai/gpt-5.2", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -279,6 +291,9 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa "atlas": { "model": "openai/gpt-5.2", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -350,6 +365,9 @@ exports[`generateModelConfig single native provider uses Gemini models when only "atlas": { "model": "google/gemini-3-pro-preview", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -415,6 +433,9 @@ exports[`generateModelConfig single native provider uses Gemini models with isMa "atlas": { "model": "google/gemini-3-pro-preview", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -496,6 +517,9 @@ exports[`generateModelConfig all native providers uses preferred models from fal "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -590,6 +614,9 @@ exports[`generateModelConfig all native providers uses preferred models with isM "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -669,6 +696,9 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "opencode/claude-haiku-4-5", }, @@ -747,6 +777,9 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "opencode/claude-haiku-4-5", }, @@ -826,6 +859,9 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when "atlas": { "model": "github-copilot/claude-sonnet-4.5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "github-copilot/gpt-5-mini", }, @@ -904,6 +940,9 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with "atlas": { "model": "github-copilot/claude-sonnet-4.5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "github-copilot/gpt-5-mini", }, @@ -982,6 +1021,9 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian whe "atlas": { "model": "opencode/glm-4.7-free", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -1040,6 +1082,9 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian wit "atlas": { "model": "opencode/glm-4.7-free", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "opencode/gpt-5-nano", }, @@ -1099,6 +1144,9 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -1177,6 +1225,9 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb "atlas": { "model": "github-copilot/claude-sonnet-4.5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "github-copilot/gpt-5-mini", }, @@ -1255,6 +1306,9 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + ZAI combinat "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -1332,6 +1386,9 @@ exports[`generateModelConfig mixed provider scenarios uses Gemini + Claude combi "atlas": { "model": "anthropic/claude-sonnet-4-5", }, + "council-member": { + "model": "opencode/glm-4.7-free", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -1402,6 +1459,9 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "opencode/claude-haiku-4-5", }, @@ -1496,6 +1556,9 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, @@ -1590,6 +1653,9 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is "atlas": { "model": "opencode/kimi-k2.5-free", }, + "council-member": { + "model": "opencode/gpt-5-nano", + }, "explore": { "model": "anthropic/claude-haiku-4-5", }, diff --git a/src/shared/agent-display-names.test.ts b/src/shared/agent-display-names.test.ts index 161b012c9..80db9e72e 100644 --- a/src/shared/agent-display-names.test.ts +++ b/src/shared/agent-display-names.test.ts @@ -192,6 +192,7 @@ describe("AGENT_DISPLAY_NAMES", () => { librarian: "librarian", explore: "explore", "multimodal-looker": "multimodal-looker", + "council-member": "council-member", } // when checking the constant diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 3f4803bab..43a416d9e 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -179,8 +179,8 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { expect(hephaestus.requiresModel).toBeUndefined() }) - test("all 11 builtin agents have valid fallbackChain arrays", () => { - // #given - list of 11 agent names + test("all 12 builtin agents have valid fallbackChain arrays", () => { + // #given - list of 12 agent names const expectedAgents = [ "sisyphus", "hephaestus", @@ -193,13 +193,14 @@ describe("AGENT_MODEL_REQUIREMENTS", () => { "momus", "atlas", "athena", + "council-member", ] // when - checking AGENT_MODEL_REQUIREMENTS const definedAgents = Object.keys(AGENT_MODEL_REQUIREMENTS) // #then - all agents present with valid fallbackChain - expect(definedAgents).toHaveLength(11) + expect(definedAgents).toHaveLength(12) for (const agent of expectedAgents) { const requirement = AGENT_MODEL_REQUIREMENTS[agent] expect(requirement).toBeDefined()