diff --git a/src/channels/discord/plugin-sdk-bridge.ts b/src/channels/discord/plugin-sdk-bridge.ts index b2a9009458b..1a226a67dad 100644 --- a/src/channels/discord/plugin-sdk-bridge.ts +++ b/src/channels/discord/plugin-sdk-bridge.ts @@ -47,8 +47,6 @@ export { getPresence, hasAnyGuildPermissionDiscord, kickMemberDiscord, - listDiscordDirectoryGroupsLive, - listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, @@ -64,8 +62,6 @@ export { removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, - resolveDiscordChannelAllowlist, - resolveDiscordUserAllowlist, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, @@ -79,7 +75,3 @@ export { uploadEmojiDiscord, uploadStickerDiscord, } from "../../../extensions/discord/runtime-api.js"; -export { - listDiscordDirectoryGroupsFromConfig, - listDiscordDirectoryPeersFromConfig, -} from "../../../extensions/discord/api.js"; diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index ca550e9c83a..c1645c92a87 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -368,6 +368,19 @@ describe("channel import guardrails", () => { expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/session-key-api\.js";/); }); + it("keeps Discord directory 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(?:listDiscordDirectoryGroupsFromConfig|listDiscordDirectoryPeersFromConfig|listDiscordDirectoryGroupsLive|listDiscordDirectoryPeersLive|resolveDiscordChannelAllowlist|resolveDiscordUserAllowlist)\b/, + ); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/); + 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 ec1abd7bd0b..99593957075 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -1,3 +1,7 @@ +import { + listDiscordDirectoryGroupsFromConfig, + listDiscordDirectoryPeersFromConfig, +} from "../../extensions/discord/api.js"; import type { ThreadBindingManager, ThreadBindingRecord, @@ -6,7 +10,11 @@ import type { import { autoBindSpawnedDiscordSubagent, getThreadBindingManager, + listDiscordDirectoryGroupsLive, + listDiscordDirectoryPeersLive, listThreadBindingsBySessionKey, + resolveDiscordChannelAllowlist, + resolveDiscordUserAllowlist, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingInactivityExpiresAt, resolveThreadBindingMaxAgeExpiresAt, @@ -63,8 +71,6 @@ import { getPresence, hasAnyGuildPermissionDiscord, kickMemberDiscord, - listDiscordDirectoryGroupsLive, - listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, @@ -80,8 +86,6 @@ import { removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, - resolveDiscordChannelAllowlist, - resolveDiscordUserAllowlist, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, @@ -94,8 +98,6 @@ import { unpinMessageDiscord, uploadEmojiDiscord, uploadStickerDiscord, - listDiscordDirectoryGroupsFromConfig, - listDiscordDirectoryPeersFromConfig, } from "../channels/discord/plugin-sdk-bridge.js"; export type { diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index 8de2d6d1d4c..4c81e3bd7c8 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -266,6 +266,10 @@ describe("plugin-sdk subpath exports", () => { it("exports Discord helpers", () => { expect(typeof discordSdk.buildChannelConfigSchema).toBe("function"); expect(typeof discordSdk.DiscordConfigSchema).toBe("object"); + expect(typeof discordSdk.listDiscordDirectoryGroupsFromConfig).toBe("function"); + expect(typeof discordSdk.listDiscordDirectoryPeersFromConfig).toBe("function"); + expect(typeof discordSdk.listDiscordDirectoryGroupsLive).toBe("function"); + expect(typeof discordSdk.listDiscordDirectoryPeersLive).toBe("function"); expect(typeof discordSdk.getThreadBindingManager).toBe("function"); expect(typeof discordSdk.listThreadBindingsBySessionKey).toBe("function"); expect(typeof discordSdk.normalizeExplicitDiscordSessionKey).toBe("function");