From 629a4d3e1b0658ff2b1ab1caf9341247c98f2bdb Mon Sep 17 00:00:00 2001 From: justsisyphus Date: Fri, 23 Jan 2026 18:50:03 +0900 Subject: [PATCH] feat(shared): add agent display names module --- src/shared/agent-display-names.test.ts | 158 +++++++++++++++++++++++++ src/shared/agent-display-names.ts | 37 ++++++ 2 files changed, 195 insertions(+) create mode 100644 src/shared/agent-display-names.test.ts create mode 100644 src/shared/agent-display-names.ts diff --git a/src/shared/agent-display-names.test.ts b/src/shared/agent-display-names.test.ts new file mode 100644 index 000000000..b2e6bea25 --- /dev/null +++ b/src/shared/agent-display-names.test.ts @@ -0,0 +1,158 @@ +import { describe, it, expect } from "bun:test" +import { AGENT_DISPLAY_NAMES, getAgentDisplayName } from "./agent-display-names" + +describe("getAgentDisplayName", () => { + it("returns display name for lowercase config key (new format)", () => { + // #given config key "sisyphus" + const configKey = "sisyphus" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Sisyphus (Ultraworker)" + expect(result).toBe("Sisyphus (Ultraworker)") + }) + + it("returns display name for uppercase config key (old format - case-insensitive)", () => { + // #given config key "Sisyphus" (old format) + const configKey = "Sisyphus" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Sisyphus (Ultraworker)" (case-insensitive lookup) + expect(result).toBe("Sisyphus (Ultraworker)") + }) + + it("returns original key for unknown agents (fallback)", () => { + // #given config key "custom-agent" + const configKey = "custom-agent" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "custom-agent" (original key unchanged) + expect(result).toBe("custom-agent") + }) + + it("returns display name for atlas", () => { + // #given config key "atlas" + const configKey = "atlas" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Atlas (Plan Execution Orchestrator)" + expect(result).toBe("Atlas (Plan Execution Orchestrator)") + }) + + it("returns display name for prometheus", () => { + // #given config key "prometheus" + const configKey = "prometheus" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Prometheus (Plan Builder)" + expect(result).toBe("Prometheus (Plan Builder)") + }) + + it("returns display name for sisyphus-junior", () => { + // #given config key "sisyphus-junior" + const configKey = "sisyphus-junior" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Sisyphus-Junior" + expect(result).toBe("Sisyphus-Junior") + }) + + it("returns display name for metis", () => { + // #given config key "metis" + const configKey = "metis" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Metis (Plan Consultant)" + expect(result).toBe("Metis (Plan Consultant)") + }) + + it("returns display name for momus", () => { + // #given config key "momus" + const configKey = "momus" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "Momus (Plan Reviewer)" + expect(result).toBe("Momus (Plan Reviewer)") + }) + + it("returns display name for oracle", () => { + // #given config key "oracle" + const configKey = "oracle" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "oracle" + expect(result).toBe("oracle") + }) + + it("returns display name for librarian", () => { + // #given config key "librarian" + const configKey = "librarian" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "librarian" + expect(result).toBe("librarian") + }) + + it("returns display name for explore", () => { + // #given config key "explore" + const configKey = "explore" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "explore" + expect(result).toBe("explore") + }) + + it("returns display name for multimodal-looker", () => { + // #given config key "multimodal-looker" + const configKey = "multimodal-looker" + + // #when getAgentDisplayName called + const result = getAgentDisplayName(configKey) + + // #then returns "multimodal-looker" + expect(result).toBe("multimodal-looker") + }) +}) + +describe("AGENT_DISPLAY_NAMES", () => { + it("contains all expected agent mappings", () => { + // #given expected mappings + const expectedMappings = { + sisyphus: "Sisyphus (Ultraworker)", + atlas: "Atlas (Plan Execution Orchestrator)", + prometheus: "Prometheus (Plan Builder)", + "sisyphus-junior": "Sisyphus-Junior", + metis: "Metis (Plan Consultant)", + momus: "Momus (Plan Reviewer)", + oracle: "oracle", + librarian: "librarian", + explore: "explore", + "multimodal-looker": "multimodal-looker", + } + + // #when checking the constant + // #then contains all expected mappings + expect(AGENT_DISPLAY_NAMES).toEqual(expectedMappings) + }) +}) \ No newline at end of file diff --git a/src/shared/agent-display-names.ts b/src/shared/agent-display-names.ts new file mode 100644 index 000000000..82c08b2c8 --- /dev/null +++ b/src/shared/agent-display-names.ts @@ -0,0 +1,37 @@ +/** + * Agent config keys to display names mapping. + * Config keys are lowercase (e.g., "sisyphus", "atlas"). + * Display names include suffixes for UI/logs (e.g., "Sisyphus (Ultraworker)"). + */ +export const AGENT_DISPLAY_NAMES: Record = { + sisyphus: "Sisyphus (Ultraworker)", + atlas: "Atlas (Plan Execution Orchestrator)", + prometheus: "Prometheus (Plan Builder)", + "sisyphus-junior": "Sisyphus-Junior", + metis: "Metis (Plan Consultant)", + momus: "Momus (Plan Reviewer)", + oracle: "oracle", + librarian: "librarian", + explore: "explore", + "multimodal-looker": "multimodal-looker", +} + +/** + * Get display name for an agent config key. + * Uses case-insensitive lookup for backward compatibility. + * Returns original key if not found. + */ +export function getAgentDisplayName(configKey: string): string { + // Try exact match first + const exactMatch = AGENT_DISPLAY_NAMES[configKey] + if (exactMatch !== undefined) return exactMatch + + // Fall back to case-insensitive search + const lowerKey = configKey.toLowerCase() + for (const [k, v] of Object.entries(AGENT_DISPLAY_NAMES)) { + if (k.toLowerCase() === lowerKey) return v + } + + // Unknown agent: return original key + return configKey +} \ No newline at end of file