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').
This commit is contained in:
YeonGyu-Kim
2026-02-16 20:42:45 +09:00
parent 71df52fc5c
commit c71a80a86c
8 changed files with 58 additions and 7 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -66,7 +66,6 @@ export async function buildPrometheusAgentConfig(params: {
params.pluginPrometheusOverride?.maxTokens ?? categoryConfig?.maxTokens;
const base: Record<string, unknown> = {
name: "Prometheus (Plan Builder)",
...(resolvedModel ? { model: resolvedModel } : {}),
...(variantToUse ? { variant: variantToUse } : {}),
mode: "all",

View File

@@ -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

View File

@@ -36,3 +36,19 @@ export function getAgentDisplayName(configKey: string): string {
// Unknown agent: return original key
return configKey
}
const REVERSE_DISPLAY_NAMES: Record<string, string> = 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
}