From 0a18ceee204fea5b2536042ad6f20e2c2ca5b80e Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 28 May 2026 18:14:30 +0900 Subject: [PATCH] fix(todo): normalize continuation agent names --- .../continuation-injection-agent-name.test.ts | 34 +++++++++++++++++++ .../continuation-injection.ts | 8 +++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/hooks/todo-continuation-enforcer/continuation-injection-agent-name.test.ts b/src/hooks/todo-continuation-enforcer/continuation-injection-agent-name.test.ts index 093ad886e..fcf509cf4 100644 --- a/src/hooks/todo-continuation-enforcer/continuation-injection-agent-name.test.ts +++ b/src/hooks/todo-continuation-enforcer/continuation-injection-agent-name.test.ts @@ -45,4 +45,38 @@ describe("injectContinuation agent names", () => { // then expect(capturedAgent).toBe("Hephaestus - Deep Agent") }) + + test("#given resolved agent is an invisible-prefixed config key #when continuation is injected #then promptAsync receives the display name", async () => { + // given + let capturedAgent: string | undefined + const ctx = unsafeTestValue[0]["ctx"]>({ + directory: "/tmp/test", + client: { + session: { + todo: async () => ({ data: [{ id: "1", content: "todo", status: "pending", priority: "high" }] }), + promptAsync: async (input: { body: { agent?: string } }) => { + capturedAgent = input.body.agent + return {} + }, + }, + }, + }) + const sessionStateStore = unsafeTestValue[0]["sessionStateStore"]>({ + getExistingState: () => ({ inFlight: false, lastInjectedAt: 0, consecutiveFailures: 0 }), + }) + + // when + await injectContinuation({ + ctx, + sessionID: "ses_invisible_lowercase_builtin_agent", + resolvedInfo: { + agent: "\u200Bhephaestus", + model: { providerID: "openai", modelID: "gpt-5.5" }, + }, + sessionStateStore, + }) + + // then + expect(capturedAgent).toBe("Hephaestus - Deep Agent") + }) }) diff --git a/src/hooks/todo-continuation-enforcer/continuation-injection.ts b/src/hooks/todo-continuation-enforcer/continuation-injection.ts index 8b799595d..af79a62a2 100644 --- a/src/hooks/todo-continuation-enforcer/continuation-injection.ts +++ b/src/hooks/todo-continuation-enforcer/continuation-injection.ts @@ -20,7 +20,7 @@ import { log } from "../../shared/logger" import { isSqliteBackend } from "../../shared/opencode-storage-detection" import { getAgentConfigKey, - normalizeAgentForPromptKey, + normalizeAgentForPrompt, stripAgentListSortPrefix, } from "../../shared/agent-display-names" import { dispatchInternalPrompt, isInternalPromptDispatchAccepted } from "../shared/prompt-async-gate" @@ -132,7 +132,11 @@ export async function injectContinuation(args: { tools = tools ?? previousMessage?.tools } - const promptAgent = resolveRegisteredAgentName(agentName) ?? normalizeAgentForPromptKey(agentName) + const agentConfigKey = getAgentConfigKey(agentName ?? "") + const registeredAgentName = resolveRegisteredAgentName(agentName) + const promptAgent = registeredAgentName !== undefined && registeredAgentName !== agentConfigKey + ? registeredAgentName + : normalizeAgentForPrompt(agentName) const launchAgent = promptAgent ? stripAgentListSortPrefix(promptAgent).trim() || undefined : undefined if (promptAgent && skipAgents.some(s => getAgentConfigKey(s) === getAgentConfigKey(promptAgent))) {