fix(discord): honor threadId for thread-reply

This commit is contained in:
Paul Pamment
2026-01-26 17:00:34 +00:00
committed by Shadow
parent 8e051a418f
commit 9e6b45faab
2 changed files with 33 additions and 1 deletions

View File

@@ -127,4 +127,30 @@ describe("handleDiscordMessageAction", () => {
}), }),
); );
}); });
it("accepts threadId for thread replies (tool compatibility)", async () => {
sendMessageDiscord.mockClear();
const handleDiscordMessageAction = await loadHandleDiscordMessageAction();
await handleDiscordMessageAction({
action: "thread-reply",
params: {
// The `message` tool uses `threadId`.
threadId: "999",
// Include a conflicting channelId to ensure threadId takes precedence.
channelId: "123",
message: "hi",
},
cfg: {} as ClawdbotConfig,
accountId: "ops",
});
expect(sendMessageDiscord).toHaveBeenCalledWith(
"channel:999",
"hi",
expect.objectContaining({
accountId: "ops",
}),
);
});
}); });

View File

@@ -393,11 +393,17 @@ export async function tryHandleDiscordMessageActionGuildAdmin(params: {
}); });
const mediaUrl = readStringParam(actionParams, "media", { trim: false }); const mediaUrl = readStringParam(actionParams, "media", { trim: false });
const replyTo = readStringParam(actionParams, "replyTo"); const replyTo = readStringParam(actionParams, "replyTo");
// `message.thread-reply` (tool) uses `threadId`, while the CLI historically used `to`/`channelId`.
// Prefer `threadId` when present to avoid accidentally replying in the parent channel.
const threadId = readStringParam(actionParams, "threadId");
const channelId = threadId ?? resolveChannelId();
return await handleDiscordAction( return await handleDiscordAction(
{ {
action: "threadReply", action: "threadReply",
accountId: accountId ?? undefined, accountId: accountId ?? undefined,
channelId: resolveChannelId(), channelId,
content, content,
mediaUrl: mediaUrl ?? undefined, mediaUrl: mediaUrl ?? undefined,
replyTo: replyTo ?? undefined, replyTo: replyTo ?? undefined,