diff --git a/src/auto-reply/reply/commands-subagents-spawn.test.ts b/src/auto-reply/reply/commands-subagents-spawn.test.ts index 2302e436a0..e781b3c648 100644 --- a/src/auto-reply/reply/commands-subagents-spawn.test.ts +++ b/src/auto-reply/reply/commands-subagents-spawn.test.ts @@ -155,6 +155,8 @@ describe("/subagents spawn command", () => { const params = buildCommandTestParams("/subagents spawn beta do the thing", baseCfg, { CommandSource: "native", CommandTargetSessionKey: "agent:main:main", + OriginatingChannel: "discord", + OriginatingTo: "channel:12345", }); params.sessionKey = "agent:main:slack:slash:u1"; @@ -164,6 +166,8 @@ describe("/subagents spawn command", () => { expect(result?.reply?.text).toContain("Spawned subagent beta"); const [, spawnCtx] = spawnSubagentDirectMock.mock.calls[0]; expect(spawnCtx.agentSessionKey).toBe("agent:main:main"); + expect(spawnCtx.agentChannel).toBe("discord"); + expect(spawnCtx.agentTo).toBe("channel:12345"); }); it("returns forbidden for unauthorized cross-agent spawn", async () => { diff --git a/src/auto-reply/reply/commands-subagents.ts b/src/auto-reply/reply/commands-subagents.ts index 2ab1a8f6dc..269a4e0e1a 100644 --- a/src/auto-reply/reply/commands-subagents.ts +++ b/src/auto-reply/reply/commands-subagents.ts @@ -686,9 +686,9 @@ export const handleSubagentsCommand: CommandHandler = async (params, allowTextCo { task, agentId, model, thinking, cleanup: "keep", expectsCompletionMessage: true }, { agentSessionKey: requesterKey, - agentChannel: params.command.channel, + agentChannel: params.ctx.OriginatingChannel ?? params.command.channel, agentAccountId: params.ctx.AccountId, - agentTo: params.command.to, + agentTo: params.ctx.OriginatingTo ?? params.command.to, agentThreadId: params.ctx.MessageThreadId, agentGroupId: params.sessionEntry?.groupId ?? null, agentGroupChannel: params.sessionEntry?.groupChannel ?? null, diff --git a/src/discord/monitor/native-command.ts b/src/discord/monitor/native-command.ts index 2b4f0bc239..fcebb502dc 100644 --- a/src/discord/monitor/native-command.ts +++ b/src/discord/monitor/native-command.ts @@ -790,6 +790,11 @@ async function dispatchDiscordCommandInteraction(params: { Timestamp: Date.now(), CommandAuthorized: commandAuthorized, CommandSource: "native" as const, + // Native slash contexts use To=slash: for interaction routing. + // For follow-up delivery (for example subagent completion announces), + // preserve the real Discord target separately. + OriginatingChannel: "discord" as const, + OriginatingTo: isDirectMessage ? `user:${user.id}` : `channel:${channelId}`, }); const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({