import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ClawdbotConfig } from "../../config/config.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createTestRegistry } from "../../test-utils/channel-plugins.js"; import { slackPlugin } from "../../../extensions/slack/src/channel.js"; const mocks = vi.hoisted(() => ({ executeSendAction: vi.fn(), recordSessionMetaFromInbound: vi.fn(async () => ({ ok: true })), })); vi.mock("./outbound-send-service.js", async () => { const actual = await vi.importActual( "./outbound-send-service.js", ); return { ...actual, executeSendAction: mocks.executeSendAction, }; }); vi.mock("../../config/sessions.js", async () => { const actual = await vi.importActual( "../../config/sessions.js", ); return { ...actual, recordSessionMetaFromInbound: mocks.recordSessionMetaFromInbound, }; }); import { runMessageAction } from "./message-action-runner.js"; const slackConfig = { channels: { slack: { botToken: "xoxb-test", appToken: "xapp-test", }, }, } as ClawdbotConfig; describe("runMessageAction Slack threading", () => { beforeEach(async () => { const { createPluginRuntime } = await import("../../plugins/runtime/index.js"); const { setSlackRuntime } = await import("../../../extensions/slack/src/runtime.js"); const runtime = createPluginRuntime(); setSlackRuntime(runtime); setActivePluginRegistry( createTestRegistry([ { pluginId: "slack", source: "test", plugin: slackPlugin, }, ]), ); }); afterEach(() => { setActivePluginRegistry(createTestRegistry([])); mocks.executeSendAction.mockReset(); mocks.recordSessionMetaFromInbound.mockReset(); }); it("uses toolContext thread when auto-threading is active", async () => { mocks.executeSendAction.mockResolvedValue({ handledBy: "plugin", payload: {}, }); await runMessageAction({ cfg: slackConfig, action: "send", params: { channel: "slack", target: "channel:C123", message: "hi", }, toolContext: { currentChannelId: "C123", currentThreadTs: "111.222", replyToMode: "all", }, agentId: "main", }); const call = mocks.executeSendAction.mock.calls[0]?.[0]; expect(call?.ctx?.mirror?.sessionKey).toBe("agent:main:slack:channel:c123:thread:111.222"); }); });