From 299ed8cb3901034dc35b8d8e67c7ff562412cdea Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:01:51 -0500 Subject: [PATCH] fix: honor slack default pairing account --- extensions/slack/src/channel.test.ts | 44 ++++++++++++++++++++++++++++ extensions/slack/src/channel.ts | 3 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/extensions/slack/src/channel.test.ts b/extensions/slack/src/channel.test.ts index f5a77d896e0..826a664fd55 100644 --- a/extensions/slack/src/channel.test.ts +++ b/extensions/slack/src/channel.test.ts @@ -10,6 +10,9 @@ import { clearSlackRuntime, setSlackRuntime } from "./runtime.js"; const { handleSlackActionMock } = vi.hoisted(() => ({ handleSlackActionMock: vi.fn(), })); +const { sendMessageSlackMock } = vi.hoisted(() => ({ + sendMessageSlackMock: vi.fn(), +})); vi.mock("./action-runtime.js", async () => { const actual = await vi.importActual("./action-runtime.js"); @@ -19,8 +22,14 @@ vi.mock("./action-runtime.js", async () => { }; }); +vi.mock("./send.runtime.js", () => ({ + sendMessageSlack: sendMessageSlackMock, +})); + beforeEach(async () => { handleSlackActionMock.mockReset(); + sendMessageSlackMock.mockReset(); + sendMessageSlackMock.mockResolvedValue({ messageId: "msg-1", channelId: "D123" }); setSlackRuntime({ channel: { slack: { @@ -180,6 +189,41 @@ describe("slackPlugin actions", () => { }); }); + it("uses configured defaultAccount for pairing approval notifications", async () => { + setSlackRuntime({ + config: { + loadConfig: () => + ({ + channels: { + slack: { + defaultAccount: "work", + accounts: { + work: { + botToken: "xoxb-work", + }, + }, + }, + }, + }) as OpenClawConfig, + }, + } as never); + + const notify = slackPlugin.pairing?.notifyApproval; + if (!notify) { + throw new Error("slack pairing notify unavailable"); + } + + await notify({ + id: "U12345678", + message: "approved", + }); + + expect(sendMessageSlackMock).toHaveBeenCalledWith( + "user:U12345678", + expect.stringContaining("approved"), + ); + }); + it("keeps blocks optional in the message tool schema", () => { const discovery = slackPlugin.actions?.describeMessageTool({ cfg: { diff --git a/extensions/slack/src/channel.ts b/extensions/slack/src/channel.ts index 9e021b8a650..21096817291 100644 --- a/extensions/slack/src/channel.ts +++ b/extensions/slack/src/channel.ts @@ -32,6 +32,7 @@ import { } from "openclaw/plugin-sdk/status-helpers"; import { listEnabledSlackAccounts, + resolveDefaultSlackAccountId, resolveSlackAccount, resolveSlackReplyToMode, type ResolvedSlackAccount, @@ -489,7 +490,7 @@ export const slackPlugin: ChannelPlugin = crea const cfg = getSlackRuntime().config.loadConfig(); const account = resolveSlackAccount({ cfg, - accountId: DEFAULT_ACCOUNT_ID, + accountId: resolveDefaultSlackAccountId(cfg), }); const { sendMessageSlack } = await loadSlackSendRuntime(); const token = getTokenForOperation(account, "write");