diff --git a/apps/server/src/orchestration-v2/SubagentProjection.test.ts b/apps/server/src/orchestration-v2/SubagentProjection.test.ts index 29deb33a3ae6e..87204d763d2df 100644 --- a/apps/server/src/orchestration-v2/SubagentProjection.test.ts +++ b/apps/server/src/orchestration-v2/SubagentProjection.test.ts @@ -1,6 +1,7 @@ import { assert, it } from "@effect/vitest"; import { CommandId, + EnvironmentId, type ModelSelection, NodeId, RunId, @@ -82,10 +83,15 @@ function makeParentThread(): OrchestrationV2AppThread { }; } -it("keeps a subagent child awake when its parent thread is snoozed", () => { +it("resets a subagent child's snooze, title job and remote delegation but keeps its workspace", () => { const parentThread: OrchestrationV2AppThread = { ...makeParentThread(), titleRegeneration: { requestId: CommandId.make("command:parent-title"), startedAt: snoozedAt }, + delegatedFrom: { + environmentId: EnvironmentId.make("linked-environment"), + threadId: ThreadId.make("linked-parent"), + title: "Linked parent", + }, }; const childProviderThreadId = ProviderThreadId.make("provider-thread:subagent-awake-child"); const parentNodeId = NodeId.make("node:subagent-parent"); @@ -105,6 +111,7 @@ it("keeps a subagent child awake when its parent thread is snoozed", () => { assert.isNull(childThread.snoozedUntil); assert.isNull(childThread.snoozedAt); assert.isNull(childThread.titleRegeneration); + assert.isUndefined(childThread.delegatedFrom); assert.equal(childThread.projectId, parentThread.projectId); assert.equal(childThread.runtimeMode, parentThread.runtimeMode); assert.equal(childThread.interactionMode, parentThread.interactionMode); diff --git a/packages/provider-core/src/server/subagentProjection.ts b/packages/provider-core/src/server/subagentProjection.ts index f476bdc70ff80..f2c3092bf17da 100644 --- a/packages/provider-core/src/server/subagentProjection.ts +++ b/packages/provider-core/src/server/subagentProjection.ts @@ -61,8 +61,10 @@ export function makeSubagentChildThread(input: { readonly createdBy: OrchestrationV2Actor; readonly creationSource: OrchestrationV2CreationSource; }): OrchestrationV2AppThread { + // The remote parent delegated the parent thread, not its subagents. + const { delegatedFrom: _delegatedFrom, ...inherited } = input.parentThread; return { - ...input.parentThread, + ...inherited, createdBy: input.createdBy, creationSource: input.creationSource, id: input.childThreadId,