From 4a690b452a571fe528e6e2750e819271a3dec8db Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 6 Apr 2026 04:37:13 +0100 Subject: [PATCH] fix(discord): narrow binding runtime imports --- .../discord/src/monitor/message-handler.preflight.ts | 6 +++--- .../discord/src/monitor/native-command-route.ts | 2 +- extensions/discord/src/monitor/native-command.ts | 5 +++-- package.json | 4 ++++ scripts/lib/plugin-sdk-entrypoints.json | 1 + src/plugin-sdk/conversation-binding-runtime.ts | 11 +++++++++++ 6 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 src/plugin-sdk/conversation-binding-runtime.ts diff --git a/extensions/discord/src/monitor/message-handler.preflight.ts b/extensions/discord/src/monitor/message-handler.preflight.ts index 879cf4bf994..604c5de4dc8 100644 --- a/extensions/discord/src/monitor/message-handler.preflight.ts +++ b/extensions/discord/src/monitor/message-handler.preflight.ts @@ -12,7 +12,7 @@ import { hasControlCommand } from "openclaw/plugin-sdk/command-detection"; import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-surface"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/config-runtime"; -import type { SessionBindingRecord } from "openclaw/plugin-sdk/conversation-runtime"; +import type { SessionBindingRecord } from "openclaw/plugin-sdk/conversation-binding-runtime"; import { enqueueSystemEvent, recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { recordPendingHistoryEntryIfEnabled, @@ -65,7 +65,7 @@ export type { const DISCORD_BOUND_THREAD_SYSTEM_PREFIXES = ["⚙️", "🤖", "🧰"]; let conversationRuntimePromise: - | Promise + | Promise | undefined; let pluralkitRuntimePromise: Promise | undefined; let discordSendRuntimePromise: Promise | undefined; @@ -74,7 +74,7 @@ let systemEventsRuntimePromise: Promise | u let discordThreadingRuntimePromise: Promise | undefined; async function loadConversationRuntime() { - conversationRuntimePromise ??= import("openclaw/plugin-sdk/conversation-runtime"); + conversationRuntimePromise ??= import("openclaw/plugin-sdk/conversation-binding-runtime"); return await conversationRuntimePromise; } diff --git a/extensions/discord/src/monitor/native-command-route.ts b/extensions/discord/src/monitor/native-command-route.ts index 4c5966c6d28..b98d9adf5af 100644 --- a/extensions/discord/src/monitor/native-command-route.ts +++ b/extensions/discord/src/monitor/native-command-route.ts @@ -1,5 +1,5 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; -import * as conversationRuntime from "openclaw/plugin-sdk/conversation-runtime"; +import * as conversationRuntime from "openclaw/plugin-sdk/conversation-binding-runtime"; import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing"; import { resolveDiscordBoundConversationRoute, diff --git a/extensions/discord/src/monitor/native-command.ts b/extensions/discord/src/monitor/native-command.ts index fb2595d3495..44650d83522 100644 --- a/extensions/discord/src/monitor/native-command.ts +++ b/extensions/discord/src/monitor/native-command.ts @@ -231,15 +231,16 @@ function resolveDiscordGuildNativeCommandAuthorized(params: { configured: hasAccessRestrictions, allowed: memberAllowed, }; + const fallbackAuthorizers = [policyAuthorizer, ownerAuthorizer, memberAuthorizer]; return resolveCommandAuthorizedFromAuthorizers({ useAccessGroups: params.useAccessGroups, authorizers: params.useAccessGroups ? params.commandsAllowFromAccess.configured ? [commandAllowlistAuthorizer] - : [policyAuthorizer, ownerAuthorizer, memberAuthorizer] + : fallbackAuthorizers : params.commandsAllowFromAccess.configured ? [commandAllowlistAuthorizer] - : [memberAuthorizer], + : fallbackAuthorizers, modeWhenAccessGroupsOff: "configured", }); } diff --git a/package.json b/package.json index 2ec46b4627a..924df088765 100644 --- a/package.json +++ b/package.json @@ -211,6 +211,10 @@ "types": "./dist/plugin-sdk/media-generation-runtime.d.ts", "default": "./dist/plugin-sdk/media-generation-runtime.js" }, + "./plugin-sdk/conversation-binding-runtime": { + "types": "./dist/plugin-sdk/conversation-binding-runtime.d.ts", + "default": "./dist/plugin-sdk/conversation-binding-runtime.js" + }, "./plugin-sdk/conversation-runtime": { "types": "./dist/plugin-sdk/conversation-runtime.d.ts", "default": "./dist/plugin-sdk/conversation-runtime.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 20960e72fbd..0da5996b3ab 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -42,6 +42,7 @@ "ssrf-runtime", "media-runtime", "media-generation-runtime", + "conversation-binding-runtime", "conversation-runtime", "matrix-runtime-heavy", "matrix-runtime-shared", diff --git a/src/plugin-sdk/conversation-binding-runtime.ts b/src/plugin-sdk/conversation-binding-runtime.ts new file mode 100644 index 00000000000..a3ffeab7005 --- /dev/null +++ b/src/plugin-sdk/conversation-binding-runtime.ts @@ -0,0 +1,11 @@ +export { + ensureConfiguredBindingRouteReady, + resolveConfiguredBindingRoute, + type ConfiguredBindingRouteResult, +} from "../channels/plugins/binding-routing.js"; +export { + type SessionBindingRecord, + getSessionBindingService, +} from "../infra/outbound/session-binding-service.js"; +export { isPluginOwnedSessionBindingRecord } from "../plugins/conversation-binding.js"; +export { buildPairingReply } from "../pairing/pairing-messages.js";