From 342d16404e028ed00d8501ef3dda2791c3207704 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:16:15 -0500 Subject: [PATCH] refactor: retire discord bridge ownership --- extensions/discord/account-api.ts | 1 + extensions/discord/src/accounts.ts | 18 +++++----- package.json | 4 +++ scripts/lib/plugin-sdk-entrypoints.json | 1 + src/channels/discord/plugin-sdk-bridge.ts | 25 -------------- src/plugin-sdk/account-action-gate.ts | 1 + src/plugin-sdk/account-resolution.ts | 17 +++++++--- .../channel-import-guardrails.test.ts | 8 +++++ src/plugin-sdk/discord-core.ts | 2 +- src/plugin-sdk/discord.ts | 34 ++++++++----------- 10 files changed, 53 insertions(+), 58 deletions(-) create mode 100644 extensions/discord/account-api.ts delete mode 100644 src/channels/discord/plugin-sdk-bridge.ts create mode 100644 src/plugin-sdk/account-action-gate.ts diff --git a/extensions/discord/account-api.ts b/extensions/discord/account-api.ts new file mode 100644 index 00000000000..feaaa1c5835 --- /dev/null +++ b/extensions/discord/account-api.ts @@ -0,0 +1 @@ +export * from "./src/accounts.js"; diff --git a/extensions/discord/src/accounts.ts b/extensions/discord/src/accounts.ts index ea28be7fb0d..6c7b457ecb1 100644 --- a/extensions/discord/src/accounts.ts +++ b/extensions/discord/src/accounts.ts @@ -1,12 +1,12 @@ -import { - createAccountActionGate, - createAccountListHelpers, - normalizeAccountId, - resolveAccountEntry, - type OpenClawConfig, - type DiscordAccountConfig, - type DiscordActionConfig, -} from "./runtime-api.js"; +import { createAccountActionGate } from "openclaw/plugin-sdk/account-action-gate"; +import { createAccountListHelpers } from "openclaw/plugin-sdk/account-helpers"; +import { normalizeAccountId } from "openclaw/plugin-sdk/account-id"; +import type { + DiscordAccountConfig, + DiscordActionConfig, + OpenClawConfig, +} from "openclaw/plugin-sdk/discord-core"; +import { resolveAccountEntry } from "openclaw/plugin-sdk/routing"; import { resolveDiscordToken } from "./token.js"; export type ResolvedDiscordAccount = { diff --git a/package.json b/package.json index d28200d336f..9f442a712ea 100644 --- a/package.json +++ b/package.json @@ -362,6 +362,10 @@ "types": "./dist/plugin-sdk/zalouser.d.ts", "default": "./dist/plugin-sdk/zalouser.js" }, + "./plugin-sdk/account-action-gate": { + "types": "./dist/plugin-sdk/account-action-gate.d.ts", + "default": "./dist/plugin-sdk/account-action-gate.js" + }, "./plugin-sdk/account-helpers": { "types": "./dist/plugin-sdk/account-helpers.d.ts", "default": "./dist/plugin-sdk/account-helpers.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index e0d707523a8..8d19552d471 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -80,6 +80,7 @@ "voice-call", "zalo", "zalouser", + "account-action-gate", "account-helpers", "account-id", "account-resolution", diff --git a/src/channels/discord/plugin-sdk-bridge.ts b/src/channels/discord/plugin-sdk-bridge.ts deleted file mode 100644 index 36fc40ab10f..00000000000 --- a/src/channels/discord/plugin-sdk-bridge.ts +++ /dev/null @@ -1,25 +0,0 @@ -export type { - DiscordPluralKitConfig, - DiscordSendComponents, - DiscordSendEmbeds, - InspectedDiscordAccount, - ResolvedDiscordAccount, -} from "../../../extensions/discord/api.js"; - -export { - inspectDiscordAccount, - listDiscordAccountIds, - resolveDiscordAccount, - resolveDefaultDiscordAccountId, - resolveDiscordGroupRequireMention, - resolveDiscordGroupToolPolicy, -} from "../../../extensions/discord/api.js"; -export { - fetchVoiceStatusDiscord, - getGateway, - getPresence, - hasAnyGuildPermissionDiscord, - kickMemberDiscord, - monitorDiscordProvider, - unpinMessageDiscord, -} from "../../../extensions/discord/runtime-api.js"; diff --git a/src/plugin-sdk/account-action-gate.ts b/src/plugin-sdk/account-action-gate.ts new file mode 100644 index 00000000000..3995b2a2083 --- /dev/null +++ b/src/plugin-sdk/account-action-gate.ts @@ -0,0 +1 @@ +export { createAccountActionGate } from "../channels/plugins/account-action-gate.js"; diff --git a/src/plugin-sdk/account-resolution.ts b/src/plugin-sdk/account-resolution.ts index 94dd74ae5ea..384ebbe204f 100644 --- a/src/plugin-sdk/account-resolution.ts +++ b/src/plugin-sdk/account-resolution.ts @@ -1,3 +1,8 @@ +import { + resolveDiscordAccount as resolveDiscordAccountImpl, + type ResolvedDiscordAccount as DiscordResolvedDiscordAccount, +} from "../../extensions/discord/account-api.js"; + export type { OpenClawConfig } from "../config/config.js"; export { createAccountActionGate } from "../channels/plugins/account-action-gate.js"; @@ -10,10 +15,6 @@ export { normalizeOptionalAccountId, } from "../routing/session-key.js"; export { normalizeE164, pathExists, resolveUserPath } from "../utils.js"; -export { - resolveDiscordAccount, - type ResolvedDiscordAccount, -} from "../channels/discord/plugin-sdk-bridge.js"; export { resolveSlackAccount, type ResolvedSlackAccount, @@ -27,6 +28,14 @@ export { type ResolvedSignalAccount, } from "../channels/signal/plugin-sdk-bridge.js"; +export type ResolvedDiscordAccount = DiscordResolvedDiscordAccount; + +export function resolveDiscordAccount( + ...args: Parameters +): ReturnType { + return resolveDiscordAccountImpl(...args); +} + /** Resolve an account by id, then fall back to the default account when the primary lacks credentials. */ export function resolveAccountWithDefaultFallback(params: { accountId?: string | null; diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index 24b7e091362..a75447fbd32 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -444,6 +444,14 @@ describe("channel import guardrails", () => { expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); }); + it("keeps plugin-sdk/discord off the Discord bridge entirely", () => { + const text = readSource("src/plugin-sdk/discord.ts"); + expect(text).not.toMatch(/plugin-sdk-bridge\.js/); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/); + expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/session-key-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-core.ts b/src/plugin-sdk/discord-core.ts index 4de83bafb7d..7803b4d290c 100644 --- a/src/plugin-sdk/discord-core.ts +++ b/src/plugin-sdk/discord-core.ts @@ -1,5 +1,5 @@ export type { ChannelPlugin } from "./channel-plugin-common.js"; -export type { DiscordActionConfig } from "../config/types.js"; +export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js"; export { buildChannelConfigSchema, getChatChannelMeta } from "./channel-plugin-common.js"; export type { OpenClawConfig } from "../config/config.js"; export { withNormalizedTimestamp } from "../agents/date-time.js"; diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index 2c3e7c7d27b..1b824a9cd92 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -1,13 +1,25 @@ import { createDiscordActionGate, collectDiscordStatusIssues, + inspectDiscordAccount, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, + listDiscordAccountIds, looksLikeDiscordTargetId, normalizeDiscordMessagingTarget, normalizeDiscordOutboundTarget, readDiscordComponentSpec, + resolveDefaultDiscordAccountId, resolveDiscordChannelId, + resolveDiscordGroupRequireMention, + resolveDiscordGroupToolPolicy, +} from "../../extensions/discord/api.js"; +import type { + DiscordPluralKitConfig, + DiscordSendComponents, + DiscordSendEmbeds, + InspectedDiscordAccount, + ResolvedDiscordAccount, } from "../../extensions/discord/api.js"; import type { ThreadBindingManager, @@ -38,6 +50,8 @@ import { getGateway, getPresence, getThreadBindingManager, + hasAnyGuildPermissionDiscord, + kickMemberDiscord, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, listThreadBindingsBySessionKey, @@ -74,31 +88,13 @@ import { setChannelPermissionDiscord, timeoutMemberDiscord, unbindThreadBindingsBySessionKey, + unpinMessageDiscord, uploadEmojiDiscord, uploadStickerDiscord, readMessagesDiscord, searchMessagesDiscord, } from "../../extensions/discord/runtime-api.js"; import { normalizeExplicitDiscordSessionKey } from "../../extensions/discord/session-key-api.js"; -import type { - DiscordPluralKitConfig, - DiscordSendComponents, - DiscordSendEmbeds, - InspectedDiscordAccount, - ResolvedDiscordAccount, -} from "../channels/discord/plugin-sdk-bridge.js"; -import { - inspectDiscordAccount, - listDiscordAccountIds, - resolveDefaultDiscordAccountId, - resolveDiscordGroupRequireMention, - resolveDiscordGroupToolPolicy, -} from "../channels/discord/plugin-sdk-bridge.js"; -import { - hasAnyGuildPermissionDiscord, - kickMemberDiscord, - unpinMessageDiscord, -} from "../channels/discord/plugin-sdk-bridge.js"; export type { ChannelAccountSnapshot,