From 347610d1c779fc2f01756b5ed0be596bce293502 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:05:08 -0500 Subject: [PATCH] refactor: migrate discord gateway ownership --- src/plugin-sdk/channel-import-guardrails.test.ts | 12 ++++++++++++ src/plugin-sdk/discord.ts | 8 ++++---- src/plugin-sdk/subpaths.test.ts | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index 243572e557b..362be4e058d 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -419,6 +419,18 @@ describe("channel import guardrails", () => { expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); }); + it("keeps Discord gateway ownership on extension public seams", () => { + const text = readSource("src/plugin-sdk/discord.ts"); + const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)] + .map((match) => match[0]) + .filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js")) + .join("\n"); + expect(bridgeImports).not.toMatch( + /\b(?:fetchVoiceStatusDiscord|getGateway|getPresence|monitorDiscordProvider)\b/, + ); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); + }); + it("keeps channel helper modules off their own SDK barrels", () => { for (const source of SAME_CHANNEL_SDK_GUARDS) { const text = readSource(source.path); diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index d2c744ef552..7528cd6c989 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -33,6 +33,9 @@ import { fetchReactionsDiscord, fetchRoleInfoDiscord, fetchChannelInfoDiscord, + fetchVoiceStatusDiscord, + getGateway, + getPresence, getThreadBindingManager, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, @@ -42,6 +45,7 @@ import { listPinsDiscord, listScheduledEventsDiscord, listThreadsDiscord, + monitorDiscordProvider, moveChannelDiscord, pinMessageDiscord, reactMessageDiscord, @@ -90,12 +94,8 @@ import { import { DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, - fetchVoiceStatusDiscord, - getGateway, - getPresence, hasAnyGuildPermissionDiscord, kickMemberDiscord, - monitorDiscordProvider, probeDiscord, unpinMessageDiscord, } from "../channels/discord/plugin-sdk-bridge.js"; diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index 8b46659cc7f..04ca82510f5 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -273,7 +273,11 @@ describe("plugin-sdk subpath exports", () => { expect(typeof discordSdk.listDiscordDirectoryGroupsLive).toBe("function"); expect(typeof discordSdk.listDiscordDirectoryPeersLive).toBe("function"); expect(typeof discordSdk.fetchChannelInfoDiscord).toBe("function"); + expect(typeof discordSdk.fetchVoiceStatusDiscord).toBe("function"); + expect(typeof discordSdk.getGateway).toBe("function"); + expect(typeof discordSdk.getPresence).toBe("function"); expect(typeof discordSdk.listThreadsDiscord).toBe("function"); + expect(typeof discordSdk.monitorDiscordProvider).toBe("function"); expect(typeof discordSdk.normalizeDiscordOutboundTarget).toBe("function"); expect(typeof discordSdk.readMessagesDiscord).toBe("function"); expect(typeof discordSdk.resolveDiscordChannelId).toBe("function");