fix: prefer target entry for subagent spawn

This commit is contained in:
Tak Hoffman
2026-04-10 20:52:51 -05:00
parent 9d63e54e33
commit daccfa2152
2 changed files with 76 additions and 3 deletions

View File

@@ -234,6 +234,78 @@ describe("subagents spawn action", () => {
);
});
it("prefers the requester-key session entry for group metadata", async () => {
spawnSubagentDirectMock.mockResolvedValue(acceptedResult());
await handleSubagentsSpawnAction(
buildContext({
requesterKey: "agent:main:target",
sessionEntry: {
sessionId: "wrapper-session",
updatedAt: Date.now(),
groupId: "wrapper-group",
groupChannel: "#wrapper",
space: "wrapper-space",
},
}),
);
const call = spawnSubagentDirectMock.mock.calls.at(-1);
expect(call?.[1]).toEqual(
expect.objectContaining({
agentSessionKey: "agent:main:target",
agentGroupId: "wrapper-group",
agentGroupChannel: "#wrapper",
agentGroupSpace: "wrapper-space",
}),
);
spawnSubagentDirectMock.mockClear();
await handleSubagentsSpawnAction(
{
...buildContext({
requesterKey: "agent:main:target",
sessionEntry: {
sessionId: "wrapper-session",
updatedAt: Date.now(),
groupId: "wrapper-group",
groupChannel: "#wrapper",
space: "wrapper-space",
},
}),
params: {
...buildContext({
requesterKey: "agent:main:target",
sessionEntry: {
sessionId: "wrapper-session",
updatedAt: Date.now(),
groupId: "wrapper-group",
groupChannel: "#wrapper",
space: "wrapper-space",
},
}).params,
sessionStore: {
"agent:main:target": {
sessionId: "target-session",
updatedAt: Date.now(),
groupId: "target-group",
groupChannel: "#target",
space: "target-space",
},
},
},
},
);
expect(spawnSubagentDirectMock).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
agentSessionKey: "agent:main:target",
agentGroupId: "target-group",
agentGroupChannel: "#target",
agentGroupSpace: "target-space",
}),
);
});
it("falls back to OriginatingTo when command.to is missing", async () => {
spawnSubagentDirectMock.mockResolvedValue(acceptedResult());
await handleSubagentsSpawnAction(

View File

@@ -7,6 +7,7 @@ export async function handleSubagentsSpawnAction(
ctx: SubagentsCommandContext,
): Promise<CommandHandlerResult> {
const { params, requesterKey, restTokens } = ctx;
const requesterSessionEntry = params.sessionStore?.[requesterKey] ?? params.sessionEntry;
const agentId = restTokens[0];
const taskParts: string[] = [];
@@ -51,9 +52,9 @@ export async function handleSubagentsSpawnAction(
agentAccountId: params.ctx.AccountId,
agentTo: normalizedTo,
agentThreadId: params.ctx.MessageThreadId,
agentGroupId: params.sessionEntry?.groupId ?? null,
agentGroupChannel: params.sessionEntry?.groupChannel ?? null,
agentGroupSpace: params.sessionEntry?.space ?? null,
agentGroupId: requesterSessionEntry?.groupId ?? null,
agentGroupChannel: requesterSessionEntry?.groupChannel ?? null,
agentGroupSpace: requesterSessionEntry?.space ?? null,
},
);
if (result.status === "accepted") {