From 1ea9137c01ed2225d73cc6bc1d9a17504ffb7a39 Mon Sep 17 00:00:00 2001 From: Dax Date: Tue, 21 Jul 2026 16:54:01 -0400 Subject: [PATCH] fix(core): identify spawned subagents (#38189) --- packages/core/src/tool/subagent.ts | 6 +++++- packages/core/test/tool-subagent.test.ts | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/tool/subagent.ts b/packages/core/src/tool/subagent.ts index 1e459a674e..347a399885 100644 --- a/packages/core/src/tool/subagent.ts +++ b/packages/core/src/tool/subagent.ts @@ -185,7 +185,11 @@ export const Plugin = { const run = Effect.gen(function* () { // The child session owns its agent/model (set at create); prompt only admits input. - yield* runtime.session.prompt({ sessionID: child.id, text: input.prompt, resume: false }) + yield* runtime.session.prompt({ + sessionID: child.id, + text: ["You are a subagent spawned by another session.", input.prompt].join("\n"), + resume: false, + }) yield* runtime.session.resume(child.id) return yield* latestAssistantText(child.id) }).pipe(Effect.onInterrupt(() => runtime.session.interrupt(child.id))) diff --git a/packages/core/test/tool-subagent.test.ts b/packages/core/test/tool-subagent.test.ts index f86d0d1845..bf17b9092c 100644 --- a/packages/core/test/tool-subagent.test.ts +++ b/packages/core/test/tool-subagent.test.ts @@ -273,6 +273,9 @@ describe("SubagentTool", () => { agent: "reviewer", model: childModel, }) + expect((yield* sessions.pending(child.id)).find((message) => message.type === "user")?.data.text).toBe( + "You are a subagent spawned by another session.\nreview this", + ) const fallback = yield* settleTool(registry, { sessionID: parent.id,