import { describe, expect, it } from "vitest"; import type { ClawdbotConfig } from "../../config/config.js"; import { applyCrossContextDecoration, buildCrossContextDecoration, enforceCrossContextPolicy, } from "./outbound-policy.js"; const slackConfig = { channels: { slack: { botToken: "xoxb-test", appToken: "xapp-test", }, }, } as ClawdbotConfig; const discordConfig = { channels: { discord: {}, }, } as ClawdbotConfig; describe("outbound policy", () => { it("blocks cross-provider sends by default", () => { expect(() => enforceCrossContextPolicy({ cfg: slackConfig, channel: "telegram", action: "send", args: { to: "telegram:@ops" }, toolContext: { currentChannelId: "C12345678", currentChannelProvider: "slack" }, }), ).toThrow(/Cross-context messaging denied/); }); it("allows cross-provider sends when enabled", () => { const cfg = { ...slackConfig, tools: { message: { crossContext: { allowAcrossProviders: true } }, }, } as ClawdbotConfig; expect(() => enforceCrossContextPolicy({ cfg, channel: "telegram", action: "send", args: { to: "telegram:@ops" }, toolContext: { currentChannelId: "C12345678", currentChannelProvider: "slack" }, }), ).not.toThrow(); }); it("blocks same-provider cross-context when disabled", () => { const cfg = { ...slackConfig, tools: { message: { crossContext: { allowWithinProvider: false } } }, } as ClawdbotConfig; expect(() => enforceCrossContextPolicy({ cfg, channel: "slack", action: "send", args: { to: "C99999999" }, toolContext: { currentChannelId: "C12345678", currentChannelProvider: "slack" }, }), ).toThrow(/Cross-context messaging denied/); }); it("uses embeds when available and preferred", async () => { const decoration = await buildCrossContextDecoration({ cfg: discordConfig, channel: "discord", target: "123", toolContext: { currentChannelId: "C12345678", currentChannelProvider: "discord" }, }); expect(decoration).not.toBeNull(); const applied = applyCrossContextDecoration({ message: "hello", decoration: decoration!, preferEmbeds: true, }); expect(applied.usedEmbeds).toBe(true); expect(applied.embeds?.length).toBeGreaterThan(0); expect(applied.message).toBe("hello"); }); });