@openclaw/discord 2026.5.26 → 2026.5.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/action-runtime-api.js +1 -1
  2. package/dist/api.js +12 -12
  3. package/dist/{approval-handler.runtime-BlGs6D0-.js → approval-handler.runtime-BDxD97LJ.js} +18 -5
  4. package/dist/{audit-DE8lNdMv.js → audit-BdUjE2tr.js} +3 -3
  5. package/dist/{channel-XYTSE8wN.js → channel-9YoMy5Jf.js} +16 -16
  6. package/dist/{channel-actions-DICb5UUl.js → channel-actions-DZfkB0nd.js} +17 -2
  7. package/dist/{channel-actions.runtime-92Esj8jy.js → channel-actions.runtime-suaDJHH0.js} +5 -5
  8. package/dist/channel-plugin-api.js +1 -1
  9. package/dist/{channel.setup-JaozRxYz.js → channel.setup-B-kHacpx.js} +3 -3
  10. package/dist/{components-Bpf9ITyn.js → components-Dlc81IU5.js} +1 -1
  11. package/dist/contract-api.js +3 -3
  12. package/dist/{conversation-identity-Be5JQPP9.js → conversation-identity-DAEgiGDV.js} +2 -2
  13. package/dist/{directory-config-oK2sOZ2m.js → directory-config-Cgp0csDd.js} +1 -1
  14. package/dist/directory-contract-api.js +1 -1
  15. package/dist/{directory-live-BRjo48ro.js → directory-live-C-ECRrM8.js} +1 -1
  16. package/dist/{doctor-DBPfLj15.js → doctor-Q80i7GdG.js} +2 -2
  17. package/dist/{doctor-contract-CLMMYrdF.js → doctor-contract-8-Ia3d_X.js} +1 -1
  18. package/dist/doctor-contract-api.js +1 -1
  19. package/dist/{handle-action.guild-admin-_LgqCYcN.js → handle-action.guild-admin-DWFTAcfd.js} +30 -12
  20. package/dist/index.js +1 -1
  21. package/dist/{manager.runtime-Bs0ngLSw.js → manager.runtime-D6V2SPKr.js} +3 -3
  22. package/dist/{message-handler-B9n5CtIS.js → message-handler-B5-UG_oD.js} +7 -7
  23. package/dist/{message-handler.preflight-Cu8cFBgW.js → message-handler.preflight-Ddww-wnF.js} +12 -13
  24. package/dist/{message-handler.process-DO17vBlT.js → message-handler.process-HWGh2NOP.js} +379 -352
  25. package/dist/{message-utils-DxHZcpPf.js → message-utils-4w0_DPFE.js} +1 -1
  26. package/dist/{outbound-adapter-C8lzfSt6.js → outbound-adapter-DYUYRaBd.js} +7 -8
  27. package/dist/{pluralkit-CTbOoDPp.js → pluralkit-BS1MuvYs.js} +1 -1
  28. package/dist/{preview-streaming-CQ7PsV9J.js → preview-streaming-DXT8oJdo.js} +1 -1
  29. package/dist/{provider-D3RwHRhI.js → provider-CO6pih5z.js} +21 -24
  30. package/dist/{provider-session.runtime-DbNYskMy.js → provider-session.runtime-BD5XLPI8.js} +3 -3
  31. package/dist/provider.runtime-pUGk7VR5.js +2 -0
  32. package/dist/{resolve-channels-CIV0C8ST.js → resolve-channels-pD06YNCU.js} +1 -1
  33. package/dist/{resolve-users-LZKYHrJx.js → resolve-users-BiWLqNNO.js} +1 -1
  34. package/dist/runtime-api.actions.js +2 -2
  35. package/dist/runtime-api.js +18 -18
  36. package/dist/runtime-api.lookup.js +4 -4
  37. package/dist/runtime-api.monitor-BjgSsR6H.js +5 -0
  38. package/dist/runtime-api.monitor.js +4 -4
  39. package/dist/runtime-api.send.js +5 -5
  40. package/dist/runtime-api.threads.js +3 -3
  41. package/dist/{runtime-DBkHf0qH.js → runtime-xSazIM0F.js} +144 -9
  42. package/dist/{send-CM1NFFrZ.js → send-BzXZ8iUI.js} +6 -3
  43. package/dist/{send.components-swKESEWc.js → send.components-AK8K4TwB.js} +4 -4
  44. package/dist/{send.outbound-BHQPWbwU.js → send.outbound-ZrMnBa8C.js} +3 -3
  45. package/dist/{send.receipt-D_6lR7zH.js → send.receipt-BzfsP3Bb.js} +1 -1
  46. package/dist/{send.shared-aYGYz83q.js → send.shared-ehnDGwXx.js} +81 -3
  47. package/dist/setup-plugin-api.js +1 -1
  48. package/dist/{shared-BwF8ShpE.js → shared-ToNRC7ax.js} +2 -2
  49. package/dist/{subagent-hooks-DHA_1pBI.js → subagent-hooks-Di_2iXU8.js} +2 -2
  50. package/dist/subagent-hooks-api.js +1 -1
  51. package/dist/{system-events-Cr3EqBah.js → system-events-DbqKnNPF.js} +1 -1
  52. package/dist/{target-resolver-CVgOsap6.js → target-resolver-DXPvq5-L.js} +2 -2
  53. package/dist/targets-BBVHRaeO.js +3 -0
  54. package/dist/test-api.js +3 -3
  55. package/dist/{thread-bindings-Dw4wcHWn.js → thread-bindings-Bw40FTRZ.js} +4 -4
  56. package/dist/{thread-bindings.discord-api-xCfun-pQ.js → thread-bindings.discord-api-irWYI8YX.js} +4 -4
  57. package/dist/{thread-bindings.manager-UJ5FvZfO.js → thread-bindings.manager-LoYZzlss.js} +3 -3
  58. package/dist/{transcripts-source-emawQzBc.js → transcripts-source-CwahHAYt.js} +1 -1
  59. package/dist/transcripts-source-api.js +1 -1
  60. package/dist/{typing-BhIpRSfR.js → typing-Cv09OhaY.js} +1 -1
  61. package/npm-shrinkwrap.json +3 -3
  62. package/openclaw.plugin.json +2 -0
  63. package/package.json +6 -6
  64. package/dist/provider.runtime-rUg1sHKP.js +0 -2
  65. package/dist/runtime-api.monitor-CUn-x5uG.js +0 -5
  66. package/dist/targets-CNDNKpqQ.js +0 -3
@@ -1,4 +1,4 @@
1
- import { u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-xCfun-pQ.js";
1
+ import { u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-irWYI8YX.js";
2
2
  import { a as mergeAbortSignals } from "./timeouts-l_PsHQvX.js";
3
3
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { ComponentType, StickerFormatType } from "discord-api-types/v10";
@@ -1,13 +1,12 @@
1
- import { o as normalizeDiscordOutboundTarget, s as chunkDiscordTextWithMode, t as createDiscordSendReceipt, x as DiscordError } from "./send.receipt-D_6lR7zH.js";
1
+ import { o as normalizeDiscordOutboundTarget, s as chunkDiscordTextWithMode, t as createDiscordSendReceipt, x as DiscordError } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { s as resolveDiscordAccount } from "./accounts-dXTfmnSZ.js";
3
- import { d as readDiscordComponentSpec } from "./components-Bpf9ITyn.js";
3
+ import { d as readDiscordComponentSpec } from "./components-Dlc81IU5.js";
4
4
  import { n as notifyDiscordInboundEventOutboundPayloadSuccess } from "./inbound-event-delivery-CEPlt2uz.js";
5
5
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { resolvePayloadMediaUrls, sendPayloadMediaSequenceOrFallback, sendTextMediaPayload } from "openclaw/plugin-sdk/reply-payload";
7
7
  import { resolveRetryConfig, retryAsync } from "openclaw/plugin-sdk/retry-runtime";
8
+ import { createReplyToFanout, resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-outbound";
8
9
  import { attachChannelToResult, createAttachedChannelResultAdapter } from "openclaw/plugin-sdk/channel-send-result";
9
- import { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-send-deps";
10
- import { createReplyToFanout } from "openclaw/plugin-sdk/outbound-runtime";
11
10
  //#region extensions/discord/src/delivery-retry.ts
12
11
  const DISCORD_DELIVERY_RETRY_DEFAULTS = {
13
12
  attempts: 3,
@@ -85,11 +84,11 @@ function normalizeDiscordApprovalPayload(payload) {
85
84
  let discordComponentSendPromise;
86
85
  let discordSharedInteractivePromise;
87
86
  async function sendDiscordComponentMessageLazy(...args) {
88
- discordComponentSendPromise ??= import("./send.components-swKESEWc.js").then((n) => n.i).then((module) => module.sendDiscordComponentMessage);
87
+ discordComponentSendPromise ??= import("./send.components-AK8K4TwB.js").then((n) => n.i).then((module) => module.sendDiscordComponentMessage);
89
88
  return await (await discordComponentSendPromise)(...args);
90
89
  }
91
90
  function loadDiscordSharedInteractive() {
92
- discordSharedInteractivePromise ??= import("./components-Bpf9ITyn.js").then((n) => n.a);
91
+ discordSharedInteractivePromise ??= import("./components-Dlc81IU5.js").then((n) => n.a);
93
92
  return discordSharedInteractivePromise;
94
93
  }
95
94
  function addPayloadTextFallback(spec, payload) {
@@ -124,7 +123,7 @@ async function resolveDiscordComponentSpec(payload) {
124
123
  //#region extensions/discord/src/outbound-send-context.ts
125
124
  let discordSendRuntimePromise;
126
125
  async function loadDiscordSendRuntime() {
127
- discordSendRuntimePromise ??= import("./send-CM1NFFrZ.js").then((n) => n.t);
126
+ discordSendRuntimePromise ??= import("./send-BzXZ8iUI.js").then((n) => n.t);
128
127
  return await discordSendRuntimePromise;
129
128
  }
130
129
  function resolveDiscordOutboundTarget(params) {
@@ -314,7 +313,7 @@ function stripDiscordInternalRuntimeScaffolding(text) {
314
313
  }
315
314
  let discordThreadBindingsPromise;
316
315
  function loadDiscordThreadBindings() {
317
- discordThreadBindingsPromise ??= import("./thread-bindings-Dw4wcHWn.js").then((n) => n.t);
316
+ discordThreadBindingsPromise ??= import("./thread-bindings-Bw40FTRZ.js").then((n) => n.t);
318
317
  return discordThreadBindingsPromise;
319
318
  }
320
319
  function resolveDiscordWebhookIdentity(params) {
@@ -1,4 +1,4 @@
1
- import { Wt as __exportAll } from "./send.receipt-D_6lR7zH.js";
1
+ import { Wt as __exportAll } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
3
3
  //#region extensions/discord/src/pluralkit.ts
4
4
  var pluralkit_exports = /* @__PURE__ */ __exportAll({ fetchPluralKitMessageInfo: () => fetchPluralKitMessageInfo });
@@ -1,4 +1,4 @@
1
- import { resolveChannelPreviewStreamMode } from "openclaw/plugin-sdk/channel-streaming";
1
+ import { resolveChannelPreviewStreamMode } from "openclaw/plugin-sdk/channel-outbound";
2
2
  //#region extensions/discord/src/preview-streaming.ts
3
3
  function resolveDiscordPreviewStreamMode(params = {}) {
4
4
  if (params.streaming === void 0 && params.streamMode === void 0) return "progress";
@@ -1,23 +1,23 @@
1
- import { $ as BaseMessageInteractiveComponent, A as User, B as Container, D as CommandWithSubcommands, E as Command, F as Modal, J as Separator, K as Row, O as Guild, R as Button, S as RateLimitError, Wt as __exportAll, X as TextDisplay, Y as StringSelectMenu, c as discord_exports, ct as createThread, d as MessageReactionAddListener, dt as editChannel, f as MessageReactionRemoveListener, g as ThreadUpdateListener, k as Message, l as InteractionCreateListener, m as ReadyListener, mt as getChannelMessage, p as PresenceUpdateListener, s as chunkDiscordTextWithMode, u as MessageCreateListener, v as Client, y as Plugin } from "./send.receipt-D_6lR7zH.js";
1
+ import { $ as BaseMessageInteractiveComponent, A as User, B as Container, D as CommandWithSubcommands, E as Command, F as Modal, J as Separator, K as Row, O as Guild, R as Button, S as RateLimitError, Wt as __exportAll, X as TextDisplay, Y as StringSelectMenu, c as discord_exports, ct as createThread, d as MessageReactionAddListener, dt as editChannel, f as MessageReactionRemoveListener, g as ThreadUpdateListener, k as Message, l as InteractionCreateListener, m as ReadyListener, mt as getChannelMessage, p as PresenceUpdateListener, s as chunkDiscordTextWithMode, u as MessageCreateListener, v as Client, y as Plugin } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { c as resolveDiscordAccountAllowFrom, d as resolveDiscordAccountDmPolicy, f as resolveDiscordMaxLinesPerMessage, p as normalizeDiscordToken, s as resolveDiscordAccount } from "./accounts-dXTfmnSZ.js";
3
- import { _ as parseDiscordComponentCustomId, b as parseDiscordModalCustomIdForInteraction, v as parseDiscordComponentCustomIdForInteraction, y as parseDiscordModalCustomId } from "./components-Bpf9ITyn.js";
4
- import { a as resolveDiscordComponentEntryWithPersistence, o as resolveDiscordModalEntryWithPersistence, t as editDiscordComponentMessage } from "./send.components-swKESEWc.js";
3
+ import { _ as parseDiscordComponentCustomId, b as parseDiscordModalCustomIdForInteraction, v as parseDiscordComponentCustomIdForInteraction, y as parseDiscordModalCustomId } from "./components-Dlc81IU5.js";
4
+ import { a as resolveDiscordComponentEntryWithPersistence, o as resolveDiscordModalEntryWithPersistence, t as editDiscordComponentMessage } from "./send.components-AK8K4TwB.js";
5
5
  import { c as setPresence, i as unregisterGateway, r as registerGateway } from "./gateway-registry-DPxmW0Db.js";
6
- import { L as DISCORD_REST_TIMEOUT_MS, N as createDiscordRestClient, R as validateDiscordProxyUrl, T as canViewDiscordGuildChannel, z as withValidatedDiscordProxy } from "./send.shared-aYGYz83q.js";
6
+ import { B as DISCORD_REST_TIMEOUT_MS, D as canViewDiscordGuildChannel, H as withValidatedDiscordProxy, I as createDiscordRestClient, V as validateDiscordProxyUrl } from "./send.shared-ehnDGwXx.js";
7
7
  import { a as summarizeDiscordResponseBody, i as isDiscordRateLimitResponseBody } from "./api-Kq7vtaSO.js";
8
8
  import { S as resolveTimestampMs, _ as resolveGroupDmAllow, a as normalizeDiscordSlug, b as formatDiscordUserTag, c as resolveDiscordChannelConfigWithFallback, d as resolveDiscordGuildEntry, f as resolveDiscordMemberAccessState, i as normalizeDiscordDisplaySlug, l as resolveDiscordChannelPolicyCommandAuthorizer, m as resolveDiscordOwnerAccess, n as isDiscordGroupAllowedByPolicy, o as resolveDiscordAllowListMatch, r as normalizeDiscordAllowList, v as shouldEmitDiscordReactionNotification, y as formatDiscordReactionEmoji } from "./allow-list-BnkWtVpA.js";
9
- import { s as sendVoiceMessageDiscord } from "./send-CM1NFFrZ.js";
10
- import { i as formatMention, t as sendMessageDiscord } from "./send.outbound-BHQPWbwU.js";
11
- import { a as getDiscordExecApprovalApprovers, s as isDiscordExecApprovalClientEnabled, t as resolveDiscordConversationIdentity } from "./conversation-identity-Be5JQPP9.js";
12
- import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-CIV0C8ST.js";
13
- import { t as resolveDiscordUserAllowlist } from "./resolve-users-LZKYHrJx.js";
14
- import { _ as formatThreadBindingDurationLabel, a as isThreadArchived, d as resolveDiscordChannelNameSafe, f as resolveDiscordChannelParentIdSafe, l as resolveDiscordChannelIdSafe, m as resolveDiscordChannelTopicSafe, p as resolveDiscordChannelParentSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-xCfun-pQ.js";
9
+ import { s as sendVoiceMessageDiscord } from "./send-BzXZ8iUI.js";
10
+ import { i as formatMention, t as sendMessageDiscord } from "./send.outbound-ZrMnBa8C.js";
11
+ import { a as getDiscordExecApprovalApprovers, s as isDiscordExecApprovalClientEnabled, t as resolveDiscordConversationIdentity } from "./conversation-identity-DAEgiGDV.js";
12
+ import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-pD06YNCU.js";
13
+ import { t as resolveDiscordUserAllowlist } from "./resolve-users-BiWLqNNO.js";
14
+ import { _ as formatThreadBindingDurationLabel, a as isThreadArchived, d as resolveDiscordChannelNameSafe, f as resolveDiscordChannelParentIdSafe, l as resolveDiscordChannelIdSafe, m as resolveDiscordChannelTopicSafe, p as resolveDiscordChannelParentSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-irWYI8YX.js";
15
15
  import { r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-DfIM7zSY.js";
16
16
  import { o as raceWithTimeout, s as withAbortTimeout } from "./timeouts-l_PsHQvX.js";
17
- import { d as resolveDiscordMessageChannelId, n as resolveDiscordForwardedMessagesTextFromSnapshots, t as resolveDiscordEmbedText, u as resolveDiscordChannelInfo } from "./message-utils-DxHZcpPf.js";
17
+ import { d as resolveDiscordMessageChannelId, n as resolveDiscordForwardedMessagesTextFromSnapshots, t as resolveDiscordEmbedText, u as resolveDiscordChannelInfo } from "./message-utils-4w0_DPFE.js";
18
18
  import { t as resolveDiscordSenderIdentity } from "./sender-identity-BFp5w0F8.js";
19
19
  import { n as buildDiscordInboundAccessContext, t as buildDiscordGroupSystemPrompt } from "./inbound-context-B5EsqsSr.js";
20
- import "./approval-handler.runtime-BlGs6D0-.js";
20
+ import "./approval-handler.runtime-BDxD97LJ.js";
21
21
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-id";
22
22
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeOptionalStringifiedId, normalizeStringEntries, normalizeStringEntriesLower, summarizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
23
23
  import { buildAgentSessionKey, deriveLastRoutePolicy, isAcpSessionKey, isSubagentSessionKey, parseAgentSessionKey, resolveAgentIdFromSessionKey, resolveAgentRoute } from "openclaw/plugin-sdk/routing";
@@ -38,16 +38,14 @@ import { createNonExitingRuntime, createSubsystemLogger, danger, formatDurationS
38
38
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
39
39
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
40
40
  import { chunkItems, sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
41
- import { createChannelMessageReplyPipeline, sendDurableMessageBatch } from "openclaw/plugin-sdk/channel-message";
41
+ import { buildOutboundSessionContext, createChannelMessageReplyPipeline, resolveChannelStreamingBlockEnabled, sendDurableMessageBatch } from "openclaw/plugin-sdk/channel-outbound";
42
42
  import { fetchWithSsrFGuard, formatErrorMessage as formatErrorMessage$1 } from "openclaw/plugin-sdk/ssrf-runtime";
43
43
  import { GROUP_POLICY_BLOCKED_LABEL, resolveDefaultGroupPolicy, resolveOpenProviderRuntimeGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
44
44
  import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing";
45
45
  import { CHANNEL_APPROVAL_NATIVE_RUNTIME_CONTEXT_CAPABILITY } from "openclaw/plugin-sdk/approval-handler-adapter-runtime";
46
46
  import { readJsonFileWithFallback, writeJsonFileAtomically } from "openclaw/plugin-sdk/json-store";
47
47
  import { resolveStateDir } from "openclaw/plugin-sdk/state-paths";
48
- import { buildOutboundSessionContext } from "openclaw/plugin-sdk/outbound-runtime";
49
48
  import { addAllowlistUserEntriesFromConfigEntry, buildAllowlistResolutionSummary, canonicalizeAllowlistWithResolvedIds, patchAllowlistUsersInConfigEntries, summarizeMapping } from "openclaw/plugin-sdk/allow-from";
50
- import { resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-streaming";
51
49
  import { buildPairingReply, upsertChannelPairingRequest, upsertChannelPairingRequest as upsertChannelPairingRequest$1 } from "openclaw/plugin-sdk/conversation-runtime";
52
50
  import { clearExpiredCooldowns, ensureAuthProfileStore, isProfileInCooldown, resolveAgentAvatar, resolveDefaultModelForAgent, resolveHumanDelayConfig, resolveProfilesUnavailableReason } from "openclaw/plugin-sdk/agent-runtime";
53
51
  import { truncateUtf16Safe, withTimeout } from "openclaw/plugin-sdk/text-utility-runtime";
@@ -59,7 +57,7 @@ import { applyModelOverrideToSessionEntry, resolveChannelModelOverride } from "o
59
57
  import { completeWithPreparedSimpleCompletionModel, extractAssistantText, prepareSimpleCompletionModelForAgent } from "openclaw/plugin-sdk/simple-completion-runtime";
60
58
  import { createReplyReferencePlanner } from "openclaw/plugin-sdk/reply-reference";
61
59
  import { getSessionEntry, loadSessionStore, readSessionUpdatedAt as readSessionUpdatedAt$1, resolveStorePath, resolveStorePath as resolveStorePath$1, updateSessionStore } from "openclaw/plugin-sdk/session-store-runtime";
62
- import { formatInboundEnvelope, resolveEnvelopeFormatOptions } from "openclaw/plugin-sdk/channel-inbound";
60
+ import { formatInboundEnvelope, resolveEnvelopeFormatOptions, runChannelInboundEvent } from "openclaw/plugin-sdk/channel-inbound";
63
61
  import { buildCommandTextFromArgs, findCommandByNativeName, formatCommandArgMenuTitle, listChatCommands, listNativeCommandSpecsForConfig, listSkillCommandsForAgents, resolveCommandAuthorizedFromAuthorizers, resolveNativeCommandSessionTargets, resolveStoredModelOverride, serializeCommandArgs } from "openclaw/plugin-sdk/command-auth-native";
64
62
  import { buildCommandTextFromArgs as buildCommandTextFromArgs$1, findCommandByNativeName as findCommandByNativeName$1, parseCommandArgs, resolveCommandArgChoices, resolveCommandArgMenu, serializeCommandArgs as serializeCommandArgs$1 } from "openclaw/plugin-sdk/native-command-registry";
65
63
  import { resolveDirectStatusReplyForSession } from "openclaw/plugin-sdk/command-status-runtime";
@@ -79,7 +77,6 @@ import { captureHttpExchange, captureWsEvent, resolveDebugProxySettings, resolve
79
77
  import * as dns from "node:dns";
80
78
  import { registerChannelRuntimeContext } from "openclaw/plugin-sdk/channel-runtime-context";
81
79
  import { logDebug, logError } from "openclaw/plugin-sdk/logging-core";
82
- import { runInboundReplyTurn } from "openclaw/plugin-sdk/inbound-reply-dispatch";
83
80
  import { resolveApprovalOverGateway } from "openclaw/plugin-sdk/approval-gateway-runtime";
84
81
  import { resolveRequestUrl } from "openclaw/plugin-sdk/request-url";
85
82
  import { Agent as Agent$1, fetch as fetch$1 } from "undici";
@@ -7764,7 +7761,7 @@ async function loadConversationRuntime$1() {
7764
7761
  return await conversationRuntimePromise$1;
7765
7762
  }
7766
7763
  async function loadTypingRuntime() {
7767
- typingRuntimePromise ??= import("./typing-BhIpRSfR.js").then((n) => n.n);
7764
+ typingRuntimePromise ??= import("./typing-Cv09OhaY.js").then((n) => n.n);
7768
7765
  return await typingRuntimePromise;
7769
7766
  }
7770
7767
  function buildDiscordComponentConversationLabel(params) {
@@ -7935,7 +7932,7 @@ async function dispatchDiscordComponentEvent(params) {
7935
7932
  replyToMode,
7936
7933
  startId: params.replyToId
7937
7934
  });
7938
- await runInboundReplyTurn({
7935
+ await runChannelInboundEvent({
7939
7936
  channel: "discord",
7940
7937
  accountId,
7941
7938
  raw: interaction,
@@ -8185,7 +8182,7 @@ async function dispatchPluginDiscordInteractiveEvent(params) {
8185
8182
  //#region extensions/discord/src/monitor/agent-components.handlers.ts
8186
8183
  let componentsRuntimePromise;
8187
8184
  async function loadComponentsRuntime() {
8188
- componentsRuntimePromise ??= import("./components-Bpf9ITyn.js").then((n) => n.t);
8185
+ componentsRuntimePromise ??= import("./components-Dlc81IU5.js").then((n) => n.t);
8189
8186
  return await componentsRuntimePromise;
8190
8187
  }
8191
8188
  async function handleDiscordComponentEvent(params) {
@@ -9417,7 +9414,7 @@ async function runDiscordGatewayLifecycle(params) {
9417
9414
  gatewayEmitter?.removeListener(DISCORD_GATEWAY_TRANSPORT_ACTIVITY_EVENT, onGatewayTransportActivity);
9418
9415
  if (params.voiceManager) {
9419
9416
  await params.voiceManager.destroy();
9420
- const { setDiscordTranscriptsVoiceManager } = await import("./transcripts-source-emawQzBc.js").then((n) => n.n);
9417
+ const { setDiscordTranscriptsVoiceManager } = await import("./transcripts-source-CwahHAYt.js").then((n) => n.n);
9421
9418
  setDiscordTranscriptsVoiceManager({
9422
9419
  accountId: params.accountId,
9423
9420
  manager: null
@@ -9695,7 +9692,7 @@ function logDiscordStartupPhase(params) {
9695
9692
  });
9696
9693
  }
9697
9694
  async function loadDiscordVoiceRuntime() {
9698
- const promise = discordVoiceRuntimePromise ?? import("./manager.runtime-Bs0ngLSw.js");
9695
+ const promise = discordVoiceRuntimePromise ?? import("./manager.runtime-D6V2SPKr.js");
9699
9696
  discordVoiceRuntimePromise = promise;
9700
9697
  try {
9701
9698
  return await promise;
@@ -9705,7 +9702,7 @@ async function loadDiscordVoiceRuntime() {
9705
9702
  }
9706
9703
  }
9707
9704
  async function loadDiscordProviderSessionRuntime() {
9708
- const promise = discordProviderSessionRuntimePromise ?? import("./provider-session.runtime-DbNYskMy.js");
9705
+ const promise = discordProviderSessionRuntimePromise ?? import("./provider-session.runtime-BD5XLPI8.js");
9709
9706
  discordProviderSessionRuntimePromise = promise;
9710
9707
  try {
9711
9708
  return await promise;
@@ -9975,7 +9972,7 @@ async function monitorDiscordProvider(opts = {}) {
9975
9972
  runtime,
9976
9973
  botUserId
9977
9974
  });
9978
- const { setDiscordTranscriptsVoiceManager } = await import("./transcripts-source-emawQzBc.js").then((n) => n.n);
9975
+ const { setDiscordTranscriptsVoiceManager } = await import("./transcripts-source-CwahHAYt.js").then((n) => n.n);
9979
9976
  setDiscordTranscriptsVoiceManager({
9980
9977
  accountId: account.accountId,
9981
9978
  manager: voiceManager
@@ -1,6 +1,6 @@
1
- import { a as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-Dw4wcHWn.js";
2
- import { n as createThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-UJ5FvZfO.js";
3
- import { t as createDiscordMessageHandler } from "./message-handler-B9n5CtIS.js";
1
+ import { a as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-Bw40FTRZ.js";
2
+ import { n as createThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-LoYZzlss.js";
3
+ import { t as createDiscordMessageHandler } from "./message-handler-B5-UG_oD.js";
4
4
  import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "openclaw/plugin-sdk/conversation-runtime";
5
5
  import { getAcpSessionManager, isAcpRuntimeError } from "openclaw/plugin-sdk/acp-runtime";
6
6
  export { createDiscordMessageHandler, createNoopThreadBindingManager, createThreadBindingManager, getAcpSessionManager, isAcpRuntimeError, reconcileAcpThreadBindingsOnStartup, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled };
@@ -0,0 +1,2 @@
1
+ import { t as monitorDiscordProvider } from "./provider-CO6pih5z.js";
2
+ export { monitorDiscordProvider };
@@ -1,4 +1,4 @@
1
- import { Wt as __exportAll } from "./send.receipt-D_6lR7zH.js";
1
+ import { Wt as __exportAll } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { n as fetchDiscord, t as DiscordApiError } from "./api-Kq7vtaSO.js";
3
3
  import { a as normalizeDiscordSlug } from "./allow-list-BnkWtVpA.js";
4
4
  import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-QzX-w4-_.js";
@@ -1,4 +1,4 @@
1
- import { Wt as __exportAll } from "./send.receipt-D_6lR7zH.js";
1
+ import { Wt as __exportAll } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { n as fetchDiscord } from "./api-Kq7vtaSO.js";
3
3
  import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-QzX-w4-_.js";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -1,3 +1,3 @@
1
- import { a as readDiscordChannelCreateParams, c as readDiscordParentIdParam, i as requiredGuildPermissionForModerationAction, n as isDiscordModerationAction, o as readDiscordChannelEditParams, r as readDiscordModerationCommand, s as readDiscordChannelMoveParams, t as handleDiscordAction } from "./runtime-DBkHf0qH.js";
2
- import { t as discordMessageActions } from "./channel-actions-DICb5UUl.js";
1
+ import { a as readDiscordChannelCreateParams, c as readDiscordParentIdParam, i as requiredGuildPermissionForModerationAction, n as isDiscordModerationAction, o as readDiscordChannelEditParams, r as readDiscordModerationCommand, s as readDiscordChannelMoveParams, t as handleDiscordAction } from "./runtime-xSazIM0F.js";
2
+ import { t as discordMessageActions } from "./channel-actions-DZfkB0nd.js";
3
3
  export { discordMessageActions, handleDiscordAction, isDiscordModerationAction, readDiscordChannelCreateParams, readDiscordChannelEditParams, readDiscordChannelMoveParams, readDiscordModerationCommand, readDiscordParentIdParam, requiredGuildPermissionForModerationAction };
@@ -1,30 +1,30 @@
1
- import { x as resolveDiscordOutboundSessionRoute } from "./components-Bpf9ITyn.js";
2
- import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./send.components-swKESEWc.js";
1
+ import { x as resolveDiscordOutboundSessionRoute } from "./components-Dlc81IU5.js";
2
+ import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./send.components-AK8K4TwB.js";
3
3
  import { a as clearPresences, c as setPresence, i as unregisterGateway, n as getGateway, o as getPresence, r as registerGateway, s as presenceCacheSize, t as clearGateways } from "./gateway-registry-DPxmW0Db.js";
4
- import { D as fetchMemberGuildPermissionsDiscord, E as fetchChannelPermissionsDiscord, O as hasAllGuildPermissionsDiscord, k as hasAnyGuildPermissionDiscord, w as DiscordSendError } from "./send.shared-aYGYz83q.js";
5
- import { n as listDiscordDirectoryGroupsLive, r as listDiscordDirectoryPeersLive } from "./directory-live-BRjo48ro.js";
4
+ import { A as hasAllGuildPermissionsDiscord, M as hasAnyGuildPermissionDiscord, O as fetchChannelPermissionsDiscord, k as fetchMemberGuildPermissionsDiscord, w as DiscordSendError } from "./send.shared-ehnDGwXx.js";
5
+ import { n as listDiscordDirectoryGroupsLive, r as listDiscordDirectoryPeersLive } from "./directory-live-C-ECRrM8.js";
6
6
  import { _ as resolveGroupDmAllow, a as normalizeDiscordSlug, c as resolveDiscordChannelConfigWithFallback, d as resolveDiscordGuildEntry, g as resolveDiscordShouldRequireMention, n as isDiscordGroupAllowedByPolicy, r as normalizeDiscordAllowList, s as resolveDiscordChannelConfig, t as allowListMatches, u as resolveDiscordCommandAuthorized, v as shouldEmitDiscordReactionNotification } from "./allow-list-BnkWtVpA.js";
7
- import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-CM1NFFrZ.js";
8
- import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-BHQPWbwU.js";
9
- import { a as readDiscordChannelCreateParams, c as readDiscordParentIdParam, i as requiredGuildPermissionForModerationAction, n as isDiscordModerationAction, o as readDiscordChannelEditParams, r as readDiscordModerationCommand, s as readDiscordChannelMoveParams, t as handleDiscordAction } from "./runtime-DBkHf0qH.js";
7
+ import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-BzXZ8iUI.js";
8
+ import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-ZrMnBa8C.js";
9
+ import { a as readDiscordChannelCreateParams, c as readDiscordParentIdParam, i as requiredGuildPermissionForModerationAction, n as isDiscordModerationAction, o as readDiscordChannelEditParams, r as readDiscordModerationCommand, s as readDiscordChannelMoveParams, t as handleDiscordAction } from "./runtime-xSazIM0F.js";
10
10
  import { r as setDiscordRuntime } from "./runtime-DgnVQ7zW.js";
11
- import { t as discordMessageActions } from "./channel-actions-DICb5UUl.js";
11
+ import { t as discordMessageActions } from "./channel-actions-DZfkB0nd.js";
12
12
  import { C as resolveThreadBindingMaxAgeMs, S as resolveThreadBindingMaxAgeExpiresAt, b as resolveThreadBindingIdleTimeoutMs, l as isRecentlyUnboundThreadWebhookMessage, x as resolveThreadBindingInactivityExpiresAt } from "./thread-bindings.state-BsOnj5NX.js";
13
13
  import { n as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-D5gY2ZTE.js";
14
- import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-CIV0C8ST.js";
15
- import { t as resolveDiscordUserAllowlist } from "./resolve-users-LZKYHrJx.js";
16
- import { _ as formatThreadBindingDurationLabel, b as resolveThreadBindingThreadName, g as resolveThreadBindingPersonaFromRecord, h as resolveThreadBindingPersona, y as resolveThreadBindingIntroText } from "./thread-bindings.discord-api-xCfun-pQ.js";
17
- import { a as reconcileAcpThreadBindingsOnStartup, c as resolveDiscordThreadBindingMaxAgeMs, i as listThreadBindingsForAccount, l as resolveThreadBindingsEnabled, n as autoBindSpawnedDiscordSubagent, o as unbindThreadBindingsBySessionKey, r as listThreadBindingsBySessionKey, s as resolveDiscordThreadBindingIdleTimeoutMs } from "./thread-bindings-Dw4wcHWn.js";
18
- import { i as testing, n as createThreadBindingManager, r as getThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-UJ5FvZfO.js";
14
+ import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-pD06YNCU.js";
15
+ import { t as resolveDiscordUserAllowlist } from "./resolve-users-BiWLqNNO.js";
16
+ import { _ as formatThreadBindingDurationLabel, b as resolveThreadBindingThreadName, g as resolveThreadBindingPersonaFromRecord, h as resolveThreadBindingPersona, y as resolveThreadBindingIntroText } from "./thread-bindings.discord-api-irWYI8YX.js";
17
+ import { a as reconcileAcpThreadBindingsOnStartup, c as resolveDiscordThreadBindingMaxAgeMs, i as listThreadBindingsForAccount, l as resolveThreadBindingsEnabled, n as autoBindSpawnedDiscordSubagent, o as unbindThreadBindingsBySessionKey, r as listThreadBindingsBySessionKey, s as resolveDiscordThreadBindingIdleTimeoutMs } from "./thread-bindings-Bw40FTRZ.js";
18
+ import { i as testing, n as createThreadBindingManager, r as getThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-LoYZzlss.js";
19
19
  import { a as resolveDiscordPrivilegedIntentsFromFlags, i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-DfIM7zSY.js";
20
20
  import { a as mergeAbortSignals, i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, r as DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-l_PsHQvX.js";
21
21
  import "./runtime-api.actions.js";
22
- import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./audit-DE8lNdMv.js";
22
+ import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./audit-BdUjE2tr.js";
23
23
  import "./runtime-api.lookup.js";
24
- import { S as sanitizeDiscordThreadName, _ as registerDiscordListener, b as resolveDiscordReplyTarget, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-D3RwHRhI.js";
25
- import { i as buildDiscordMediaPayload } from "./message-utils-DxHZcpPf.js";
26
- import { t as createDiscordMessageHandler } from "./message-handler-B9n5CtIS.js";
27
- import "./runtime-api.monitor-CUn-x5uG.js";
24
+ import { S as sanitizeDiscordThreadName, _ as registerDiscordListener, b as resolveDiscordReplyTarget, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-CO6pih5z.js";
25
+ import { i as buildDiscordMediaPayload } from "./message-utils-4w0_DPFE.js";
26
+ import { t as createDiscordMessageHandler } from "./message-handler-B5-UG_oD.js";
27
+ import "./runtime-api.monitor-BjgSsR6H.js";
28
28
  import "./runtime-api.send.js";
29
29
  import "./runtime-api.threads.js";
30
30
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, DiscordSendError, testing as __testing, testing, addRoleDiscord, allowListMatches, auditDiscordChannelPermissions, autoBindSpawnedDiscordSubagent, banMemberDiscord, buildDiscordMediaPayload, clearGateways, clearPresences, collectDiscordAuditChannelIds, createChannelDiscord, createDiscordGatewayPlugin, createDiscordMessageHandler, createDiscordNativeCommand, createNoopThreadBindingManager, createScheduledEventDiscord, createThreadBindingManager, createThreadDiscord, deleteChannelDiscord, deleteMessageDiscord, discordMessageActions, editChannelDiscord, editDiscordComponentMessage, editMessageDiscord, fetchChannelInfoDiscord, fetchChannelPermissionsDiscord, fetchDiscordApplicationId, fetchDiscordApplicationSummary, fetchMemberGuildPermissionsDiscord, fetchMemberInfoDiscord, fetchMessageDiscord, fetchReactionsDiscord, fetchRoleInfoDiscord, fetchVoiceStatusDiscord, formatThreadBindingDurationLabel, getGateway, getPresence, getThreadBindingManager, handleDiscordAction, hasAllGuildPermissionsDiscord, hasAnyGuildPermissionDiscord, isDiscordGroupAllowedByPolicy, isDiscordModerationAction, isRecentlyUnboundThreadWebhookMessage, kickMemberDiscord, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadBindingsBySessionKey, listThreadBindingsForAccount, listThreadsDiscord, mergeAbortSignals, monitorDiscordProvider, moveChannelDiscord, normalizeDiscordAllowList, normalizeDiscordSlug, parseApplicationIdFromToken, pinMessageDiscord, presenceCacheSize, probeDiscord, reactMessageDiscord, readDiscordChannelCreateParams, readDiscordChannelEditParams, readDiscordChannelMoveParams, readDiscordModerationCommand, readDiscordParentIdParam, readMessagesDiscord, reconcileAcpThreadBindingsOnStartup, registerBuiltDiscordComponentMessage, registerDiscordListener, registerGateway, removeChannelPermissionDiscord, removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, requiredGuildPermissionForModerationAction, resolveDiscordChannelAllowlist, resolveDiscordChannelConfig, resolveDiscordChannelConfigWithFallback, resolveDiscordCommandAuthorized, resolveDiscordGatewayIntents, resolveDiscordGuildEntry, resolveDiscordOutboundSessionRoute, resolveDiscordPrivilegedIntentsFromFlags, resolveDiscordReplyTarget, resolveDiscordShouldRequireMention, resolveDiscordThreadBindingIdleTimeoutMs, resolveDiscordThreadBindingMaxAgeMs, resolveDiscordUserAllowlist, resolveEventCoverImage, resolveGroupDmAllow, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingInactivityExpiresAt, resolveThreadBindingIntroText, resolveThreadBindingMaxAgeExpiresAt, resolveThreadBindingMaxAgeMs, resolveThreadBindingPersona, resolveThreadBindingPersonaFromRecord, resolveThreadBindingThreadName, resolveThreadBindingsEnabled, sanitizeDiscordThreadName, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, sendPollDiscord, sendStickerDiscord, sendTypingDiscord, sendVoiceMessageDiscord, sendWebhookMessageDiscord, setChannelPermissionDiscord, setDiscordRuntime, setPresence, setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, shouldEmitDiscordReactionNotification, timeoutMemberDiscord, unbindThreadBindingsBySessionKey, unpinMessageDiscord, unregisterGateway, uploadEmojiDiscord, uploadStickerDiscord, waitForDiscordGatewayPluginRegistration };
@@ -1,7 +1,7 @@
1
- import { n as listDiscordDirectoryGroupsLive, r as listDiscordDirectoryPeersLive } from "./directory-live-BRjo48ro.js";
1
+ import { n as listDiscordDirectoryGroupsLive, r as listDiscordDirectoryPeersLive } from "./directory-live-C-ECRrM8.js";
2
2
  import { r as setDiscordRuntime } from "./runtime-DgnVQ7zW.js";
3
- import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-CIV0C8ST.js";
4
- import { t as resolveDiscordUserAllowlist } from "./resolve-users-LZKYHrJx.js";
3
+ import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-pD06YNCU.js";
4
+ import { t as resolveDiscordUserAllowlist } from "./resolve-users-BiWLqNNO.js";
5
5
  import { a as resolveDiscordPrivilegedIntentsFromFlags, i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-DfIM7zSY.js";
6
- import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./audit-DE8lNdMv.js";
6
+ import { r as collectDiscordAuditChannelIds, t as auditDiscordChannelPermissions } from "./audit-BdUjE2tr.js";
7
7
  export { auditDiscordChannelPermissions, collectDiscordAuditChannelIds, fetchDiscordApplicationId, fetchDiscordApplicationSummary, listDiscordDirectoryGroupsLive, listDiscordDirectoryPeersLive, parseApplicationIdFromToken, probeDiscord, resolveDiscordChannelAllowlist, resolveDiscordPrivilegedIntentsFromFlags, resolveDiscordUserAllowlist, setDiscordRuntime };
@@ -0,0 +1,5 @@
1
+ import "./allow-list-BnkWtVpA.js";
2
+ import "./provider-CO6pih5z.js";
3
+ import "./message-utils-4w0_DPFE.js";
4
+ import "./message-handler-B5-UG_oD.js";
5
+ export {};
@@ -1,8 +1,8 @@
1
1
  import { a as clearPresences, c as setPresence, i as unregisterGateway, n as getGateway, o as getPresence, r as registerGateway, s as presenceCacheSize, t as clearGateways } from "./gateway-registry-DPxmW0Db.js";
2
2
  import { _ as resolveGroupDmAllow, a as normalizeDiscordSlug, c as resolveDiscordChannelConfigWithFallback, d as resolveDiscordGuildEntry, g as resolveDiscordShouldRequireMention, n as isDiscordGroupAllowedByPolicy, r as normalizeDiscordAllowList, s as resolveDiscordChannelConfig, t as allowListMatches, u as resolveDiscordCommandAuthorized, v as shouldEmitDiscordReactionNotification } from "./allow-list-BnkWtVpA.js";
3
3
  import { a as mergeAbortSignals, i as DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, n as DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, r as DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, t as DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS } from "./timeouts-l_PsHQvX.js";
4
- import { S as sanitizeDiscordThreadName, _ as registerDiscordListener, b as resolveDiscordReplyTarget, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-D3RwHRhI.js";
5
- import { i as buildDiscordMediaPayload } from "./message-utils-DxHZcpPf.js";
6
- import { t as createDiscordMessageHandler } from "./message-handler-B9n5CtIS.js";
7
- import "./runtime-api.monitor-CUn-x5uG.js";
4
+ import { S as sanitizeDiscordThreadName, _ as registerDiscordListener, b as resolveDiscordReplyTarget, c as resolveDiscordGatewayIntents, d as createDiscordNativeCommand, l as waitForDiscordGatewayPluginRegistration, s as createDiscordGatewayPlugin, t as monitorDiscordProvider } from "./provider-CO6pih5z.js";
5
+ import { i as buildDiscordMediaPayload } from "./message-utils-4w0_DPFE.js";
6
+ import { t as createDiscordMessageHandler } from "./message-handler-B5-UG_oD.js";
7
+ import "./runtime-api.monitor-BjgSsR6H.js";
8
8
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, allowListMatches, buildDiscordMediaPayload, clearGateways, clearPresences, createDiscordGatewayPlugin, createDiscordMessageHandler, createDiscordNativeCommand, getGateway, getPresence, isDiscordGroupAllowedByPolicy, mergeAbortSignals, monitorDiscordProvider, normalizeDiscordAllowList, normalizeDiscordSlug, presenceCacheSize, registerDiscordListener, registerGateway, resolveDiscordChannelConfig, resolveDiscordChannelConfigWithFallback, resolveDiscordCommandAuthorized, resolveDiscordGatewayIntents, resolveDiscordGuildEntry, resolveDiscordReplyTarget, resolveDiscordShouldRequireMention, resolveGroupDmAllow, sanitizeDiscordThreadName, setPresence, shouldEmitDiscordReactionNotification, unregisterGateway, waitForDiscordGatewayPluginRegistration };
@@ -1,6 +1,6 @@
1
- import { x as resolveDiscordOutboundSessionRoute } from "./components-Bpf9ITyn.js";
2
- import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./send.components-swKESEWc.js";
3
- import { D as fetchMemberGuildPermissionsDiscord, E as fetchChannelPermissionsDiscord, O as hasAllGuildPermissionsDiscord, k as hasAnyGuildPermissionDiscord, w as DiscordSendError } from "./send.shared-aYGYz83q.js";
4
- import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-CM1NFFrZ.js";
5
- import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-BHQPWbwU.js";
1
+ import { x as resolveDiscordOutboundSessionRoute } from "./components-Dlc81IU5.js";
2
+ import { n as registerBuiltDiscordComponentMessage, r as sendDiscordComponentMessage, t as editDiscordComponentMessage } from "./send.components-AK8K4TwB.js";
3
+ import { A as hasAllGuildPermissionsDiscord, M as hasAnyGuildPermissionDiscord, O as fetchChannelPermissionsDiscord, k as fetchMemberGuildPermissionsDiscord, w as DiscordSendError } from "./send.shared-ehnDGwXx.js";
4
+ import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, c as sendWebhookMessageDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, m as listPinsDiscord, n as fetchReactionsDiscord, o as sendTypingDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-BzXZ8iUI.js";
5
+ import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-ZrMnBa8C.js";
6
6
  export { DiscordSendError, addRoleDiscord, banMemberDiscord, createChannelDiscord, createScheduledEventDiscord, createThreadDiscord, deleteChannelDiscord, deleteMessageDiscord, editChannelDiscord, editDiscordComponentMessage, editMessageDiscord, fetchChannelInfoDiscord, fetchChannelPermissionsDiscord, fetchMemberGuildPermissionsDiscord, fetchMemberInfoDiscord, fetchMessageDiscord, fetchReactionsDiscord, fetchRoleInfoDiscord, fetchVoiceStatusDiscord, hasAllGuildPermissionsDiscord, hasAnyGuildPermissionDiscord, kickMemberDiscord, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadsDiscord, moveChannelDiscord, pinMessageDiscord, reactMessageDiscord, readMessagesDiscord, registerBuiltDiscordComponentMessage, removeChannelPermissionDiscord, removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, resolveDiscordOutboundSessionRoute, resolveEventCoverImage, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, sendPollDiscord, sendStickerDiscord, sendTypingDiscord, sendVoiceMessageDiscord, sendWebhookMessageDiscord, setChannelPermissionDiscord, timeoutMemberDiscord, unpinMessageDiscord, uploadEmojiDiscord, uploadStickerDiscord };
@@ -1,6 +1,6 @@
1
1
  import { C as resolveThreadBindingMaxAgeMs, S as resolveThreadBindingMaxAgeExpiresAt, b as resolveThreadBindingIdleTimeoutMs, l as isRecentlyUnboundThreadWebhookMessage, x as resolveThreadBindingInactivityExpiresAt } from "./thread-bindings.state-BsOnj5NX.js";
2
2
  import { n as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-D5gY2ZTE.js";
3
- import { _ as formatThreadBindingDurationLabel, b as resolveThreadBindingThreadName, g as resolveThreadBindingPersonaFromRecord, h as resolveThreadBindingPersona, y as resolveThreadBindingIntroText } from "./thread-bindings.discord-api-xCfun-pQ.js";
4
- import { a as reconcileAcpThreadBindingsOnStartup, c as resolveDiscordThreadBindingMaxAgeMs, i as listThreadBindingsForAccount, l as resolveThreadBindingsEnabled, n as autoBindSpawnedDiscordSubagent, o as unbindThreadBindingsBySessionKey, r as listThreadBindingsBySessionKey, s as resolveDiscordThreadBindingIdleTimeoutMs } from "./thread-bindings-Dw4wcHWn.js";
5
- import { i as testing, n as createThreadBindingManager, r as getThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-UJ5FvZfO.js";
3
+ import { _ as formatThreadBindingDurationLabel, b as resolveThreadBindingThreadName, g as resolveThreadBindingPersonaFromRecord, h as resolveThreadBindingPersona, y as resolveThreadBindingIntroText } from "./thread-bindings.discord-api-irWYI8YX.js";
4
+ import { a as reconcileAcpThreadBindingsOnStartup, c as resolveDiscordThreadBindingMaxAgeMs, i as listThreadBindingsForAccount, l as resolveThreadBindingsEnabled, n as autoBindSpawnedDiscordSubagent, o as unbindThreadBindingsBySessionKey, r as listThreadBindingsBySessionKey, s as resolveDiscordThreadBindingIdleTimeoutMs } from "./thread-bindings-Bw40FTRZ.js";
5
+ import { i as testing, n as createThreadBindingManager, r as getThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-LoYZzlss.js";
6
6
  export { testing as __testing, testing, autoBindSpawnedDiscordSubagent, createNoopThreadBindingManager, createThreadBindingManager, formatThreadBindingDurationLabel, getThreadBindingManager, isRecentlyUnboundThreadWebhookMessage, listThreadBindingsBySessionKey, listThreadBindingsForAccount, reconcileAcpThreadBindingsOnStartup, resolveDiscordThreadBindingIdleTimeoutMs, resolveDiscordThreadBindingMaxAgeMs, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingInactivityExpiresAt, resolveThreadBindingIntroText, resolveThreadBindingMaxAgeExpiresAt, resolveThreadBindingMaxAgeMs, resolveThreadBindingPersona, resolveThreadBindingPersonaFromRecord, resolveThreadBindingThreadName, resolveThreadBindingsEnabled, setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey };
@@ -1,15 +1,15 @@
1
- import { Ut as resolveDiscordChannelId } from "./send.receipt-D_6lR7zH.js";
1
+ import { Ut as resolveDiscordChannelId } from "./send.receipt-BzfsP3Bb.js";
2
2
  import { a as mergeDiscordAccountConfig, o as resolveDefaultDiscordAccountId, t as createDiscordActionGate } from "./accounts-dXTfmnSZ.js";
3
- import { d as readDiscordComponentSpec } from "./components-Bpf9ITyn.js";
4
- import { c as jsonResult, d as readNumberParam, f as readReactionParams, g as withNormalizedTimestamp, h as resolvePollMaxSelections, l as parseAvailableTags, m as readStringParam, p as readStringArrayParam, r as sendDiscordComponentMessage, s as assertMediaNotDataUrl, u as readBooleanParam } from "./send.components-swKESEWc.js";
3
+ import { d as readDiscordComponentSpec } from "./components-Dlc81IU5.js";
4
+ import { c as jsonResult, d as readNumberParam, f as readReactionParams, g as withNormalizedTimestamp, h as resolvePollMaxSelections, l as parseAvailableTags, m as readStringParam, p as readStringArrayParam, r as sendDiscordComponentMessage, s as assertMediaNotDataUrl, u as readBooleanParam } from "./send.components-AK8K4TwB.js";
5
5
  import { n as getGateway, o as getPresence } from "./gateway-registry-DPxmW0Db.js";
6
- import { A as isThreadChannelType, E as fetchChannelPermissionsDiscord, P as createDiscordRuntimeAccountContext, d as resolveDiscordTargetChannelId, k as hasAnyGuildPermissionDiscord } from "./send.shared-aYGYz83q.js";
6
+ import { E as canManageGuildRoleDiscord, L as createDiscordRuntimeAccountContext, M as hasAnyGuildPermissionDiscord, N as isThreadChannelType$1, O as fetchChannelPermissionsDiscord, T as canManageGuildMemberRoleDiscord, d as resolveDiscordTargetChannelId, j as hasAnyChannelPermissionDiscord } from "./send.shared-ehnDGwXx.js";
7
7
  import { a as normalizeDiscordSlug, c as resolveDiscordChannelConfigWithFallback, n as isDiscordGroupAllowedByPolicy } from "./allow-list-BnkWtVpA.js";
8
- import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, l as DiscordThreadInitialMessageError, m as listPinsDiscord, n as fetchReactionsDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, w as fetchGuildInfoDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-CM1NFFrZ.js";
9
- import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-BHQPWbwU.js";
10
- import "./targets-CNDNKpqQ.js";
8
+ import { A as listScheduledEventsDiscord, B as moveChannelDiscord, C as fetchChannelInfoDiscord, D as fetchVoiceStatusDiscord, E as fetchRoleInfoDiscord, F as uploadEmojiDiscord, H as setChannelPermissionDiscord, I as uploadStickerDiscord, L as createChannelDiscord, M as resolveEventCoverImage, N as timeoutMemberDiscord, O as kickMemberDiscord, P as listGuildEmojisDiscord, R as deleteChannelDiscord, S as createScheduledEventDiscord, T as fetchMemberInfoDiscord, V as removeChannelPermissionDiscord, _ as readMessagesDiscord, a as removeReactionDiscord, b as addRoleDiscord, d as deleteMessageDiscord, f as editMessageDiscord, g as pinMessageDiscord, h as listThreadsDiscord, i as removeOwnReactionsDiscord, j as removeRoleDiscord, k as listGuildChannelsDiscord, l as DiscordThreadInitialMessageError, m as listPinsDiscord, n as fetchReactionsDiscord, p as fetchMessageDiscord, r as reactMessageDiscord, s as sendVoiceMessageDiscord, u as createThreadDiscord, v as searchMessagesDiscord, w as fetchGuildInfoDiscord, x as banMemberDiscord, y as unpinMessageDiscord, z as editChannelDiscord } from "./send-BzXZ8iUI.js";
9
+ import { n as sendPollDiscord, r as sendStickerDiscord, t as sendMessageDiscord } from "./send.outbound-ZrMnBa8C.js";
10
+ import "./targets-BBVHRaeO.js";
11
11
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
12
- import { PermissionFlagsBits } from "discord-api-types/v10";
12
+ import { ChannelType, PermissionFlagsBits } from "discord-api-types/v10";
13
13
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
14
14
  import { resolveOpenProviderRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
15
15
  //#region extensions/discord/src/actions/runtime.shared.ts
@@ -69,6 +69,8 @@ function readDiscordChannelMoveParams(params) {
69
69
  //#region extensions/discord/src/actions/runtime.guild.ts
70
70
  const discordGuildActionRuntime = {
71
71
  addRoleDiscord,
72
+ canManageGuildRoleDiscord,
73
+ canManageGuildMemberRoleDiscord,
72
74
  createChannelDiscord,
73
75
  createScheduledEventDiscord,
74
76
  resolveEventCoverImage,
@@ -76,6 +78,8 @@ const discordGuildActionRuntime = {
76
78
  editChannelDiscord,
77
79
  fetchChannelInfoDiscord,
78
80
  fetchMemberInfoDiscord,
81
+ hasAnyChannelPermissionDiscord,
82
+ hasAnyGuildPermissionDiscord,
79
83
  fetchRoleInfoDiscord,
80
84
  fetchVoiceStatusDiscord,
81
85
  listGuildChannelsDiscord,
@@ -88,6 +92,130 @@ const discordGuildActionRuntime = {
88
92
  uploadEmojiDiscord,
89
93
  uploadStickerDiscord
90
94
  };
95
+ const expressionPermissions = [
96
+ PermissionFlagsBits.ManageGuildExpressions,
97
+ PermissionFlagsBits.CreateGuildExpressions,
98
+ PermissionFlagsBits.ManageEmojisAndStickers
99
+ ];
100
+ const channelGuard = {
101
+ gate: "channels",
102
+ disabledMessage: "Discord channel management is disabled.",
103
+ permissions: [PermissionFlagsBits.ManageChannels]
104
+ };
105
+ const existingChannelGuard = {
106
+ ...channelGuard,
107
+ permissionScope: "channel"
108
+ };
109
+ const channelPermissionGuard = {
110
+ ...channelGuard,
111
+ permissions: [PermissionFlagsBits.ManageRoles],
112
+ permissionScope: "channel"
113
+ };
114
+ const guildAdminActionGuards = {
115
+ emojiUpload: {
116
+ gate: "emojiUploads",
117
+ disabledMessage: "Discord emoji uploads are disabled.",
118
+ permissions: expressionPermissions
119
+ },
120
+ stickerUpload: {
121
+ gate: "stickerUploads",
122
+ disabledMessage: "Discord sticker uploads are disabled.",
123
+ permissions: expressionPermissions
124
+ },
125
+ roleAdd: {
126
+ gate: "roles",
127
+ defaultEnabled: false,
128
+ disabledMessage: "Discord role changes are disabled.",
129
+ permissions: [PermissionFlagsBits.ManageRoles]
130
+ },
131
+ roleRemove: {
132
+ gate: "roles",
133
+ defaultEnabled: false,
134
+ disabledMessage: "Discord role changes are disabled.",
135
+ permissions: [PermissionFlagsBits.ManageRoles]
136
+ },
137
+ eventCreate: {
138
+ gate: "events",
139
+ disabledMessage: "Discord events are disabled.",
140
+ permissions: [PermissionFlagsBits.ManageEvents, PermissionFlagsBits.CreateEvents]
141
+ },
142
+ channelCreate: channelGuard,
143
+ channelEdit: existingChannelGuard,
144
+ channelDelete: existingChannelGuard,
145
+ channelMove: existingChannelGuard,
146
+ categoryCreate: channelGuard,
147
+ categoryEdit: existingChannelGuard,
148
+ categoryDelete: existingChannelGuard,
149
+ channelPermissionSet: channelPermissionGuard,
150
+ channelPermissionRemove: channelPermissionGuard
151
+ };
152
+ function isThreadChannelType(channelType) {
153
+ return channelType === ChannelType.GuildNewsThread || channelType === ChannelType.GuildPublicThread || channelType === ChannelType.GuildPrivateThread;
154
+ }
155
+ function isLockedThreadChannel(channel) {
156
+ if (!channel || typeof channel !== "object") return false;
157
+ return channel.thread_metadata?.locked === true;
158
+ }
159
+ function assertGuildAdminActionEnabled(action, isActionEnabled) {
160
+ const guard = guildAdminActionGuards[action];
161
+ if (guard && !isActionEnabled(guard.gate, guard.defaultEnabled)) throw new Error(guard.disabledMessage);
162
+ }
163
+ async function resolveGuildIdForGuildAdminAction(params) {
164
+ const guildId = readStringParam(params.values, "guildId");
165
+ if (guildId) return guildId;
166
+ const channelLikeId = readStringParam(params.values, "channelId") ?? readStringParam(params.values, "categoryId");
167
+ if (!channelLikeId) return;
168
+ const channel = await discordGuildActionRuntime.fetchChannelInfoDiscord(channelLikeId, createDiscordActionOptions({
169
+ cfg: params.cfg,
170
+ accountId: params.accountId
171
+ }));
172
+ return "guild_id" in channel ? channel.guild_id ?? void 0 : void 0;
173
+ }
174
+ function readChannelScopedPermissionTargetId(action, values) {
175
+ if (action === "eventCreate") return readStringParam(values, "channelId");
176
+ if (action === "categoryEdit" || action === "categoryDelete") return readStringParam(values, "categoryId");
177
+ return readStringParam(values, "channelId");
178
+ }
179
+ async function resolveGuildAdminActionPermissions(params) {
180
+ if (params.action !== "channelEdit") return params.guard.permissions;
181
+ const channelId = readStringParam(params.values, "channelId");
182
+ if (!channelId) return params.guard.permissions;
183
+ const channel = await discordGuildActionRuntime.fetchChannelInfoDiscord(channelId, createDiscordActionOptions({
184
+ cfg: params.cfg,
185
+ accountId: params.accountId
186
+ }));
187
+ if (!isThreadChannelType("type" in channel ? channel.type : void 0)) return params.guard.permissions;
188
+ return params.values.archived === false && !("name" in params.values) && !("topic" in params.values) && !("position" in params.values) && !("parentId" in params.values) && !("clearParent" in params.values) && !("nsfw" in params.values) && !("rateLimitPerUser" in params.values) && !("locked" in params.values) && !("autoArchiveDuration" in params.values) && !isLockedThreadChannel(channel) ? [PermissionFlagsBits.ManageThreads, PermissionFlagsBits.SendMessagesInThreads] : [PermissionFlagsBits.ManageThreads];
189
+ }
190
+ async function verifySenderGuildAdminPermission(params) {
191
+ const guard = guildAdminActionGuards[params.action];
192
+ const senderUserId = readStringParam(params.values, "senderUserId");
193
+ if (!guard?.permissions.length || !senderUserId) return;
194
+ const requiredPermissions = await resolveGuildAdminActionPermissions({
195
+ ...params,
196
+ guard
197
+ });
198
+ const guildId = await resolveGuildIdForGuildAdminAction(params);
199
+ if (!guildId) throw new Error(`Guild id required to authorize Discord guild action: ${params.action}`);
200
+ const actionOptions = createDiscordActionOptions({
201
+ cfg: params.cfg,
202
+ accountId: params.accountId
203
+ });
204
+ const targetChannelId = guard?.permissionScope === "channel" || params.action === "eventCreate" ? readChannelScopedPermissionTargetId(params.action, params.values) : void 0;
205
+ if (!(targetChannelId ? await discordGuildActionRuntime.hasAnyChannelPermissionDiscord(guildId, targetChannelId, senderUserId, requiredPermissions, actionOptions) : await discordGuildActionRuntime.hasAnyGuildPermissionDiscord(guildId, senderUserId, requiredPermissions, actionOptions))) throw new Error("Sender does not have required permissions for this guild action.");
206
+ if (params.action === "roleAdd" || params.action === "roleRemove") {
207
+ const targetUserId = readStringParam(params.values, "userId", { required: true });
208
+ const roleId = readStringParam(params.values, "roleId", { required: true });
209
+ if (!await discordGuildActionRuntime.canManageGuildMemberRoleDiscord(guildId, senderUserId, targetUserId, roleId, actionOptions, { assignablePermissionCeiling: params.action === "roleAdd" })) throw new Error("Sender cannot manage the requested role or member.");
210
+ }
211
+ if (params.action === "channelPermissionSet" || params.action === "channelPermissionRemove") {
212
+ const targetType = readStringParam(params.values, "targetType");
213
+ if (targetType === "member") return;
214
+ const targetId = readStringParam(params.values, "targetId", { required: true });
215
+ const canManageRole = await discordGuildActionRuntime.canManageGuildRoleDiscord(guildId, senderUserId, targetId, actionOptions);
216
+ if (canManageRole === false || targetType === "role" && canManageRole === null) throw new Error("Sender cannot manage the requested role overwrite.");
217
+ }
218
+ }
91
219
  async function runRoleMutation(params) {
92
220
  const guildId = readStringParam(params.values, "guildId", { required: true });
93
221
  const userId = readStringParam(params.values, "userId", { required: true });
@@ -110,6 +238,13 @@ function readChannelPermissionTarget(params) {
110
238
  async function handleDiscordGuildAction(action, params, isActionEnabled, cfg, options) {
111
239
  const accountId = readStringParam(params, "accountId");
112
240
  if (!cfg) throw new Error("Discord guild actions require a resolved runtime config.");
241
+ assertGuildAdminActionEnabled(action, isActionEnabled);
242
+ await verifySenderGuildAdminPermission({
243
+ action,
244
+ values: params,
245
+ accountId,
246
+ cfg
247
+ });
113
248
  const withOpts = (extra) => createDiscordActionOptions({
114
249
  cfg,
115
250
  accountId,
@@ -605,7 +740,7 @@ async function appendDiscordThreadRenameResult(ctx, params) {
605
740
  };
606
741
  }
607
742
  try {
608
- if (!isThreadChannelType((await discordMessagingActionRuntime.fetchChannelInfoDiscord(channelId, ctx.withOpts())).type)) return {
743
+ if (!isThreadChannelType$1((await discordMessagingActionRuntime.fetchChannelInfoDiscord(channelId, ctx.withOpts())).type)) return {
609
744
  ...params.payload,
610
745
  warning: "Discord threadName was ignored because the send target is not a thread."
611
746
  };