From c71a80a86ccf3689c08812647ba17c418f91eb79 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 16 Feb 2026 20:42:45 +0900 Subject: [PATCH] Revert name fields from agent configs, add getAgentConfigKey reverse lookup Remove crash-causing name fields from 6 agent configs (sisyphus, hephaestus, atlas, metis, momus, prometheus). The name field approach breaks opencode because Agent.get(agent.name) uses name as lookup key. Add getAgentConfigKey() to agent-display-names.ts for resolving display names back to lowercase config keys (e.g. 'Atlas (Plan Executor)' -> 'atlas'). --- src/agents/atlas/agent.ts | 1 - src/agents/hephaestus.ts | 1 - src/agents/metis.ts | 1 - src/agents/momus.ts | 1 - src/agents/sisyphus.ts | 1 - .../prometheus-agent-config-builder.ts | 1 - src/shared/agent-display-names.test.ts | 43 ++++++++++++++++++- src/shared/agent-display-names.ts | 16 +++++++ 8 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/agents/atlas/agent.ts b/src/agents/atlas/agent.ts index 87d3550c..c4aa65f7 100644 --- a/src/agents/atlas/agent.ts +++ b/src/agents/atlas/agent.ts @@ -99,7 +99,6 @@ export function createAtlasAgent(ctx: OrchestratorContext): AgentConfig { ]) const baseConfig = { - name: "Atlas (Plan Executor)", description: "Orchestrates work via task() to complete ALL tasks in a todo list until fully done. (Atlas - OhMyOpenCode)", mode: MODE, diff --git a/src/agents/hephaestus.ts b/src/agents/hephaestus.ts index 99d8575e..1ac55275 100644 --- a/src/agents/hephaestus.ts +++ b/src/agents/hephaestus.ts @@ -633,7 +633,6 @@ export function createHephaestusAgent( : buildHephaestusPrompt([], tools, skills, categories, useTaskSystem); return { - name: "Hephaestus (Deep Agent)", description: "Autonomous Deep Worker - goal-oriented execution with GPT 5.2 Codex. Explores thoroughly before acting, uses explore/librarian agents for comprehensive context, completes tasks end-to-end. Inspired by AmpCode deep mode. (Hephaestus - OhMyOpenCode)", mode: MODE, diff --git a/src/agents/metis.ts b/src/agents/metis.ts index ebf6c6b1..f25c96c9 100644 --- a/src/agents/metis.ts +++ b/src/agents/metis.ts @@ -311,7 +311,6 @@ const metisRestrictions = createAgentToolRestrictions([ export function createMetisAgent(model: string): AgentConfig { return { - name: "Metis (Plan Consultant)", description: "Pre-planning consultant that analyzes requests to identify hidden intentions, ambiguities, and AI failure points. (Metis - OhMyOpenCode)", mode: MODE, diff --git a/src/agents/momus.ts b/src/agents/momus.ts index ae9ada61..457e354b 100644 --- a/src/agents/momus.ts +++ b/src/agents/momus.ts @@ -197,7 +197,6 @@ export function createMomusAgent(model: string): AgentConfig { ]) const base = { - name: "Momus (Plan Critic)", description: "Expert reviewer for evaluating work plans against rigorous clarity, verifiability, and completeness standards. (Momus - OhMyOpenCode)", mode: MODE, diff --git a/src/agents/sisyphus.ts b/src/agents/sisyphus.ts index d4ca62d1..11ecdc34 100644 --- a/src/agents/sisyphus.ts +++ b/src/agents/sisyphus.ts @@ -539,7 +539,6 @@ export function createSisyphusAgent( call_omo_agent: "deny", } as AgentConfig["permission"]; const base = { - name: "Sisyphus (Ultraworker)", description: "Powerful AI orchestrator. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically via category+skills combinations. Uses explore for internal code (parallel-friendly), librarian for external docs. (Sisyphus - OhMyOpenCode)", mode: MODE, diff --git a/src/plugin-handlers/prometheus-agent-config-builder.ts b/src/plugin-handlers/prometheus-agent-config-builder.ts index 0db8ec05..54fa0ddc 100644 --- a/src/plugin-handlers/prometheus-agent-config-builder.ts +++ b/src/plugin-handlers/prometheus-agent-config-builder.ts @@ -66,7 +66,6 @@ export async function buildPrometheusAgentConfig(params: { params.pluginPrometheusOverride?.maxTokens ?? categoryConfig?.maxTokens; const base: Record = { - name: "Prometheus (Plan Builder)", ...(resolvedModel ? { model: resolvedModel } : {}), ...(variantToUse ? { variant: variantToUse } : {}), mode: "all", diff --git a/src/shared/agent-display-names.test.ts b/src/shared/agent-display-names.test.ts index 05da7d5c..3d7276a1 100644 --- a/src/shared/agent-display-names.test.ts +++ b/src/shared/agent-display-names.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "bun:test" -import { AGENT_DISPLAY_NAMES, getAgentDisplayName } from "./agent-display-names" +import { AGENT_DISPLAY_NAMES, getAgentDisplayName, getAgentConfigKey } from "./agent-display-names" describe("getAgentDisplayName", () => { it("returns display name for lowercase config key (new format)", () => { @@ -135,6 +135,47 @@ describe("getAgentDisplayName", () => { }) }) +describe("getAgentConfigKey", () => { + it("resolves display name to config key", () => { + // given display name "Sisyphus (Ultraworker)" + // when getAgentConfigKey called + // then returns "sisyphus" + expect(getAgentConfigKey("Sisyphus (Ultraworker)")).toBe("sisyphus") + }) + + it("resolves display name case-insensitively", () => { + // given display name in different case + // when getAgentConfigKey called + // then returns "atlas" + expect(getAgentConfigKey("atlas (plan executor)")).toBe("atlas") + }) + + it("passes through lowercase config keys unchanged", () => { + // given lowercase config key "prometheus" + // when getAgentConfigKey called + // then returns "prometheus" + expect(getAgentConfigKey("prometheus")).toBe("prometheus") + }) + + it("returns lowercased unknown agents", () => { + // given unknown agent name + // when getAgentConfigKey called + // then returns lowercased + expect(getAgentConfigKey("Custom-Agent")).toBe("custom-agent") + }) + + it("resolves all core agent display names", () => { + // given all core display names + // when/then each resolves to its config key + expect(getAgentConfigKey("Hephaestus (Deep Agent)")).toBe("hephaestus") + expect(getAgentConfigKey("Prometheus (Plan Builder)")).toBe("prometheus") + expect(getAgentConfigKey("Atlas (Plan Executor)")).toBe("atlas") + expect(getAgentConfigKey("Metis (Plan Consultant)")).toBe("metis") + expect(getAgentConfigKey("Momus (Plan Critic)")).toBe("momus") + expect(getAgentConfigKey("Sisyphus-Junior")).toBe("sisyphus-junior") + }) +}) + describe("AGENT_DISPLAY_NAMES", () => { it("contains all expected agent mappings", () => { // given expected mappings diff --git a/src/shared/agent-display-names.ts b/src/shared/agent-display-names.ts index 4370da36..a0bda224 100644 --- a/src/shared/agent-display-names.ts +++ b/src/shared/agent-display-names.ts @@ -35,4 +35,20 @@ export function getAgentDisplayName(configKey: string): string { // Unknown agent: return original key return configKey +} + +const REVERSE_DISPLAY_NAMES: Record = Object.fromEntries( + Object.entries(AGENT_DISPLAY_NAMES).map(([key, displayName]) => [displayName.toLowerCase(), key]), +) + +/** + * Resolve an agent name (display name or config key) to its lowercase config key. + * "Atlas (Plan Executor)" → "atlas", "atlas" → "atlas", "unknown" → "unknown" + */ +export function getAgentConfigKey(agentName: string): string { + const lower = agentName.toLowerCase() + const reversed = REVERSE_DISPLAY_NAMES[lower] + if (reversed !== undefined) return reversed + if (AGENT_DISPLAY_NAMES[lower] !== undefined) return lower + return lower } \ No newline at end of file