diff --git a/src/plugin-handlers/agent-config-handler.ts b/src/plugin-handlers/agent-config-handler.ts index 91cbf2a96..f270fd0af 100644 --- a/src/plugin-handlers/agent-config-handler.ts +++ b/src/plugin-handlers/agent-config-handler.ts @@ -23,9 +23,12 @@ type AgentConfigRecord = Record | undefined> & { plan?: Record; }; -function hasConfiguredDefaultAgent(config: Record): boolean { +function getConfiguredDefaultAgent(config: Record): string | undefined { const defaultAgent = config.default_agent; - return typeof defaultAgent === "string" && defaultAgent.trim().length > 0; + if (typeof defaultAgent !== "string") return undefined; + + const trimmedDefaultAgent = defaultAgent.trim(); + return trimmedDefaultAgent.length > 0 ? trimmedDefaultAgent : undefined; } export async function applyAgentConfig(params: { @@ -107,11 +110,17 @@ export async function applyAgentConfig(params: { const plannerEnabled = params.pluginConfig.sisyphus_agent?.planner_enabled ?? true; const replacePlan = params.pluginConfig.sisyphus_agent?.replace_plan ?? true; const shouldDemotePlan = plannerEnabled && replacePlan; + const configuredDefaultAgent = getConfiguredDefaultAgent(params.config); + + if (configuredDefaultAgent) { + (params.config as { default_agent?: string }).default_agent = + getAgentDisplayName(configuredDefaultAgent); + } const configAgent = params.config.agent as AgentConfigRecord | undefined; if (isSisyphusEnabled && builtinAgents.sisyphus) { - if (!hasConfiguredDefaultAgent(params.config)) { + if (!configuredDefaultAgent) { (params.config as { default_agent?: string }).default_agent = getAgentDisplayName("sisyphus"); } diff --git a/src/plugin-handlers/config-handler.test.ts b/src/plugin-handlers/config-handler.test.ts index c8e25f588..a86f67835 100644 --- a/src/plugin-handlers/config-handler.test.ts +++ b/src/plugin-handlers/config-handler.test.ts @@ -350,7 +350,7 @@ describe("Agent permission defaults", () => { }) describe("default_agent behavior with Sisyphus orchestration", () => { - test("preserves existing default_agent when already set", async () => { + test("canonicalizes configured default_agent key to display name", async () => { // #given const pluginConfig: OhMyOpenCodeConfig = {} const config: Record = { @@ -371,7 +371,32 @@ describe("default_agent behavior with Sisyphus orchestration", () => { await handler(config) // #then - expect(config.default_agent).toBe("hephaestus") + expect(config.default_agent).toBe(getAgentDisplayName("hephaestus")) + }) + + test("preserves existing display-name default_agent", async () => { + // #given + const pluginConfig: OhMyOpenCodeConfig = {} + const displayName = getAgentDisplayName("hephaestus") + const config: Record = { + model: "anthropic/claude-opus-4-6", + default_agent: displayName, + agent: {}, + } + const handler = createConfigHandler({ + ctx: { directory: "/tmp" }, + pluginConfig, + modelCacheState: { + anthropicContext1MEnabled: false, + modelContextLimitsCache: new Map(), + }, + }) + + // #when + await handler(config) + + // #then + expect(config.default_agent).toBe(displayName) }) test("sets default_agent to sisyphus when missing", async () => {