From 2c70ec604d0f496a024cf5feba63e90eb067f28e Mon Sep 17 00:00:00 2001 From: ismeth Date: Fri, 27 Mar 2026 19:38:56 +0100 Subject: [PATCH] fix(delegate-task): block self-delegation to prevent infinite recursion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds generic self-recursion guard in subagent-resolver using getAgentConfigKey() to normalize display names and config keys. Catches athena-junior spawning itself — the only subagent with task() access not already covered by existing guards. --- src/tools/delegate-task/subagent-resolver.ts | 8 ++++++++ src/tools/delegate-task/sync-continuation.test.ts | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/tools/delegate-task/subagent-resolver.ts b/src/tools/delegate-task/subagent-resolver.ts index 1d67f24b4..104917c5a 100644 --- a/src/tools/delegate-task/subagent-resolver.ts +++ b/src/tools/delegate-task/subagent-resolver.ts @@ -60,6 +60,14 @@ Create the work plan directly - that's your job as the planning agent.`, } } + if (parentAgent && getAgentConfigKey(agentName) === getAgentConfigKey(parentAgent)) { + return { + agentToUse: "", + categoryModel: undefined, + error: `Cannot spawn "${agentName}" from within itself. Self-delegation creates infinite recursion. Use category-based delegation to spawn a Sisyphus-Junior worker instead (e.g., category="quick" or category="deep").`, + } + } + let agentToUse = agentName let categoryModel: DelegatedModelConfig | undefined let fallbackChain: FallbackEntry[] | undefined = undefined diff --git a/src/tools/delegate-task/sync-continuation.test.ts b/src/tools/delegate-task/sync-continuation.test.ts index fa05e93ab..1f749e9f1 100644 --- a/src/tools/delegate-task/sync-continuation.test.ts +++ b/src/tools/delegate-task/sync-continuation.test.ts @@ -530,6 +530,7 @@ describe("executeSyncContinuation - toast cleanup error paths", () => { task: false, call_omo_agent: false, question: false, + switch_agent: false, write: false, edit: false, }) @@ -600,6 +601,7 @@ describe("executeSyncContinuation - toast cleanup error paths", () => { task: false, call_omo_agent: false, question: false, + switch_agent: false, write: false, edit: false, })