@openclaw/discord 2026.5.16-beta.3 → 2026.5.16-beta.4

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 (74) hide show
  1. package/dist/api.js +12 -12
  2. package/dist/{approval-handler.runtime-CS97g4S1.js → approval-handler.runtime-B5Dd-jlK.js} +1 -1
  3. package/dist/{channel-DdqtpKwY.js → channel-DeO4mqqA.js} +13 -13
  4. package/dist/{channel-actions-0dOFg3Mu.js → channel-actions--MV0t13k.js} +14 -7
  5. package/dist/{channel-actions.runtime-BB30vneH.js → channel-actions.runtime-G9ARNi7H.js} +29 -8
  6. package/dist/channel-config-api.js +1 -1
  7. package/dist/channel-plugin-api.js +1 -1
  8. package/dist/{channel.setup-BwmvzHMR.js → channel.setup-DMqaeOeB.js} +3 -3
  9. package/dist/contract-api.js +7 -7
  10. package/dist/{conversation-identity-Dh8wIQ_K.js → conversation-identity-Bpwp-7uO.js} +1 -1
  11. package/dist/directory-contract-api.js +1 -1
  12. package/dist/{doctor-CWTWiBru.js → doctor-DfHqek8h.js} +3 -3
  13. package/dist/{doctor-contract-ftWAMvBl.js → doctor-contract-AkgUZQHW.js} +1 -1
  14. package/dist/doctor-contract-api.js +1 -1
  15. package/dist/inbound-event-delivery-D8zHG9Lz.js +65 -0
  16. package/dist/{manager.runtime-BU2-AM3y.js → manager.runtime-BsOZkg8V.js} +2 -2
  17. package/dist/{message-handler-CgU3pJi2.js → message-handler-B-SLojCO.js} +6 -6
  18. package/dist/{message-handler.preflight-DFw-r_C5.js → message-handler.preflight-DPcejg12.js} +26 -12
  19. package/dist/{message-handler.process-Ce7Xh_dH.js → message-handler.process-B9kCtqjZ.js} +55 -18
  20. package/dist/{message-utils-CY91O2k2.js → message-utils-BZoXOhcI.js} +2 -2
  21. package/dist/{outbound-adapter-Fe4Ee_GO.js → outbound-adapter-DyTqAH35.js} +11 -2
  22. package/dist/{preflight-audio-DFGpAvzi.js → preflight-audio-B0keJeQe.js} +1 -1
  23. package/dist/{probe.runtime-9hi1GYNU.js → probe.runtime-CvMZb8ZL.js} +1 -1
  24. package/dist/{provider-C4J1o-3R.js → provider-BYIVfxV_.js} +15 -15
  25. package/dist/{provider-session.runtime-Y2zL_aqr.js → provider-session.runtime-B-8Gitv9.js} +3 -3
  26. package/dist/provider.runtime-BZj7ZoKH.js +2 -0
  27. package/dist/{resolve-channels-u7_agBcm.js → resolve-channels-CerN-VOT.js} +1 -1
  28. package/dist/{resolve-users-Bc25I6OP.js → resolve-users-DIG4uHLS.js} +1 -1
  29. package/dist/runtime-api.actions.js +1 -1
  30. package/dist/runtime-api.js +15 -15
  31. package/dist/runtime-api.lookup.js +4 -4
  32. package/dist/runtime-api.monitor-DJZRR16k.js +5 -0
  33. package/dist/runtime-api.monitor.js +5 -5
  34. package/dist/runtime-api.threads.js +5 -5
  35. package/dist/secret-contract-api.js +1 -1
  36. package/dist/{security-audit-CLPZKYi4.js → security-audit-Dx3j4a0l.js} +1 -1
  37. package/dist/security-audit-contract-api.js +1 -1
  38. package/dist/{security-audit.runtime-CCm9leFJ.js → security-audit.runtime-C5nnf0k8.js} +1 -1
  39. package/dist/security-contract-api.js +1 -1
  40. package/dist/session-key-api.js +1 -1
  41. package/dist/setup-plugin-api.js +1 -1
  42. package/dist/{shared-LuaeDRhK.js → shared-CpwVKWm5.js} +7 -7
  43. package/dist/{subagent-hooks-vwV-pjIA.js → subagent-hooks-DguyFWsd.js} +1 -1
  44. package/dist/subagent-hooks-api.js +1 -1
  45. package/dist/test-api.js +4 -4
  46. package/dist/{thread-bindings-BwcE40jS.js → thread-bindings-CqKojFDg.js} +4 -4
  47. package/dist/{thread-bindings.discord-api-BtXi8-Fz.js → thread-bindings.discord-api-BQJf05t-.js} +1 -1
  48. package/dist/{thread-bindings.manager-BL5QlX3G.js → thread-bindings.manager-kjSGaifo.js} +2 -2
  49. package/dist/{thread-bindings.session-updates-ZnRRzzgf.js → thread-bindings.session-updates-CgOqEOPe.js} +1 -1
  50. package/dist/timeouts.js +1 -1
  51. package/dist/{typing-C_8U8J7E.js → typing-DudlJ-Fv.js} +1 -1
  52. package/package.json +4 -4
  53. package/dist/provider.runtime-DMPCr3Hh.js +0 -2
  54. package/dist/runtime-api.monitor-dlMXA_pv.js +0 -5
  55. /package/dist/{agent-components.runtime-CEMbMQcQ.js → agent-components.runtime-BIemD2Iz.js} +0 -0
  56. /package/dist/{audit-BZOw16KT.js → audit-CPAL0IL6.js} +0 -0
  57. /package/dist/{config-schema-D0eb2vPJ.js → config-schema-B6sPhXLp.js} +0 -0
  58. /package/dist/{directory-config-CW_JusGS.js → directory-config-mr3WFi1h.js} +0 -0
  59. /package/dist/{handle-action.guild-admin-DOW3XfEG.js → handle-action.guild-admin-DUVD8LGs.js} +0 -0
  60. /package/dist/{inbound-context-BdfOEkhj.js → inbound-context-CzEAvKgx.js} +0 -0
  61. /package/dist/{pluralkit-B2AqgTHV.js → pluralkit-BHV93ojA.js} +0 -0
  62. /package/dist/{preflight-audio.runtime-Drc-OFcp.js → preflight-audio.runtime-DT1Hmhsq.js} +0 -0
  63. /package/dist/{preview-streaming-CXTZydhx.js → preview-streaming-nClS_TQx.js} +0 -0
  64. /package/dist/{probe-CiBYm-vD.js → probe-DW9lJUZB.js} +0 -0
  65. /package/dist/{resolve-allowlist-common-DybgkAjk.js → resolve-allowlist-common-COuUtNM8.js} +0 -0
  66. /package/dist/{secret-config-contract-B3347_eU.js → secret-config-contract-57_WV6qt.js} +0 -0
  67. /package/dist/{security-contract-DyCRvz_Q.js → security-contract-BWDASKVo.js} +0 -0
  68. /package/dist/{security-doctor-Cp-NqNdS.js → security-doctor-DepqtNCI.js} +0 -0
  69. /package/dist/{sender-identity-BTGL3VbF.js → sender-identity-DC0FdEcU.js} +0 -0
  70. /package/dist/{session-contract-ugfEa9Xc.js → session-contract-Dwhw3RTY.js} +0 -0
  71. /package/dist/{session-key-normalization-B7h83qD2.js → session-key-normalization-DnCXUKGA.js} +0 -0
  72. /package/dist/{system-events-Bnit0zkQ.js → system-events-CEehp53f.js} +0 -0
  73. /package/dist/{thread-bindings.state-BdBeo7Rx.js → thread-bindings.state-CSphZOiL.js} +0 -0
  74. /package/dist/{timeouts-snXNwR4m.js → timeouts-CEwuGaWT.js} +0 -0
package/dist/api.js CHANGED
@@ -5,19 +5,19 @@ import { _ as parseDiscordComponentCustomId, b as parseDiscordModalCustomIdForIn
5
5
  import { n as fetchDiscord, r as requestDiscord, t as DiscordApiError } from "./api-DgQLz1wq.js";
6
6
  import { i as parseDiscordSendTarget, n as resolveDiscordTarget } from "./target-resolver-BsGT9hI7.js";
7
7
  import "./targets-DwW6OieO.js";
8
- import { a as getDiscordExecApprovalApprovers, c as shouldSuppressLocalDiscordExecApprovalPrompt, o as isDiscordExecApprovalApprover, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-Dh8wIQ_K.js";
9
- import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./channel-DdqtpKwY.js";
10
- import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-B7h83qD2.js";
11
- import { t as discordSetupPlugin } from "./channel.setup-BwmvzHMR.js";
12
- import { n as handleDiscordSubagentEnded, r as handleDiscordSubagentSpawning, t as handleDiscordSubagentDeliveryTarget } from "./subagent-hooks-vwV-pjIA.js";
13
- import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-DOW3XfEG.js";
14
- import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-CW_JusGS.js";
15
- import { t as fetchPluralKitMessageInfo } from "./pluralkit-B2AqgTHV.js";
16
- import { a as resolveDiscordPrivilegedIntentsFromFlags, i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-CiBYm-vD.js";
17
- import { t as collectDiscordSecurityAuditFindings } from "./security-audit-CLPZKYi4.js";
18
- 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-snXNwR4m.js";
8
+ import { a as getDiscordExecApprovalApprovers, c as shouldSuppressLocalDiscordExecApprovalPrompt, o as isDiscordExecApprovalApprover, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-Bpwp-7uO.js";
9
+ import { i as resolveDiscordGroupToolPolicy, n as collectDiscordStatusIssues, r as resolveDiscordGroupRequireMention, t as discordPlugin } from "./channel-DeO4mqqA.js";
10
+ import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-DnCXUKGA.js";
11
+ import { t as discordSetupPlugin } from "./channel.setup-DMqaeOeB.js";
12
+ import { n as handleDiscordSubagentEnded, r as handleDiscordSubagentSpawning, t as handleDiscordSubagentDeliveryTarget } from "./subagent-hooks-DguyFWsd.js";
13
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-DUVD8LGs.js";
14
+ import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-mr3WFi1h.js";
15
+ import { t as fetchPluralKitMessageInfo } from "./pluralkit-BHV93ojA.js";
16
+ import { a as resolveDiscordPrivilegedIntentsFromFlags, i as probeDiscord, n as fetchDiscordApplicationSummary, r as parseApplicationIdFromToken, t as fetchDiscordApplicationId } from "./probe-DW9lJUZB.js";
17
+ import { t as collectDiscordSecurityAuditFindings } from "./security-audit-Dx3j4a0l.js";
18
+ 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-CEwuGaWT.js";
19
19
  import { resolveOpenProviderRuntimeGroupPolicy as resolveDiscordRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
20
20
  //#region extensions/discord/api.ts
21
- const handleDiscordMessageAction = async (...args) => (await import("./channel-actions.runtime-BB30vneH.js")).handleDiscordMessageAction(...args);
21
+ const handleDiscordMessageAction = async (...args) => (await import("./channel-actions.runtime-G9ARNi7H.js")).handleDiscordMessageAction(...args);
22
22
  //#endregion
23
23
  export { DISCORD_ATTACHMENT_IDLE_TIMEOUT_MS, DISCORD_ATTACHMENT_TOTAL_TIMEOUT_MS, DISCORD_COMPONENT_ATTACHMENT_PREFIX, DISCORD_COMPONENT_CUSTOM_ID_KEY, DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, DISCORD_MODAL_CUSTOM_ID_KEY, DiscordApiError, DiscordFormModal, buildDiscordComponentCustomId, buildDiscordComponentMessage, buildDiscordComponentMessageFlags, buildDiscordInteractiveComponents, buildDiscordModalCustomId, collectDiscordSecurityAuditFindings, collectDiscordStatusIssues, createDiscordActionGate, createDiscordFormModal, discordPlugin, discordSetupPlugin, fetchDiscord, fetchDiscordApplicationId, fetchDiscordApplicationSummary, fetchPluralKitMessageInfo, formatDiscordComponentEventText, getDiscordExecApprovalApprovers, handleDiscordMessageAction, handleDiscordSubagentDeliveryTarget, handleDiscordSubagentEnded, handleDiscordSubagentSpawning, inspectDiscordAccount, isDiscordExecApprovalApprover, isDiscordExecApprovalClientEnabled, listDiscordAccountIds, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, listEnabledDiscordAccounts, looksLikeDiscordTargetId, mergeAbortSignals, mergeDiscordAccountConfig, normalizeDiscordMessagingTarget, normalizeDiscordOutboundTarget, normalizeExplicitDiscordSessionKey, parseApplicationIdFromToken, parseDiscordComponentCustomId, parseDiscordComponentCustomIdForInteraction as parseDiscordComponentCustomIdForCarbon, parseDiscordComponentCustomIdForInteraction, parseDiscordModalCustomId, parseDiscordModalCustomIdForInteraction as parseDiscordModalCustomIdForCarbon, parseDiscordModalCustomIdForInteraction, parseDiscordSendTarget, parseDiscordTarget, probeDiscord, readDiscordComponentSpec, requestDiscord, resolveDefaultDiscordAccountId, resolveDiscordAccount, resolveDiscordAccountConfig, resolveDiscordChannelId, resolveDiscordComponentAttachmentName, resolveDiscordGroupRequireMention, resolveDiscordGroupToolPolicy, resolveDiscordMaxLinesPerMessage, resolveDiscordPrivilegedIntentsFromFlags, resolveDiscordRuntimeGroupPolicy, resolveDiscordTarget, shouldSuppressLocalDiscordExecApprovalPrompt, tryHandleDiscordMessageActionGuildAdmin };
@@ -1,7 +1,7 @@
1
1
  import { B as Container, J as Separator, K as Row, M as serializePayload, R as Button, Wt as __exportAll, X as TextDisplay, ft as editChannelMessage, nt as createUserDmChannel, st as createChannelMessage, ut as deleteChannelMessage } from "./send.receipt-nKLxvA1s.js";
2
2
  import { t as inspectDiscordAccount } from "./account-inspect-B_N30NV0.js";
3
3
  import { M as createDiscordClient, b as stripUndefinedFields } from "./send.shared-Bdj-DP6-.js";
4
- import { i as shouldHandleDiscordApprovalRequest, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-Dh8wIQ_K.js";
4
+ import { i as shouldHandleDiscordApprovalRequest, s as isDiscordExecApprovalClientEnabled } from "./conversation-identity-Bpwp-7uO.js";
5
5
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { ButtonStyle } from "discord-api-types/v10";
7
7
  import { logDebug, logError } from "openclaw/plugin-sdk/logging-core";
@@ -3,13 +3,13 @@ import { c as resolveDiscordAccountAllowFrom, r as listDiscordAccountIds, s as r
3
3
  import { a as projectCredentialSnapshotFields, n as PAIRING_APPROVED_MESSAGE, o as resolveConfiguredFromCredentialStatuses, r as buildTokenChannelStatusSummary, t as DEFAULT_ACCOUNT_ID } from "./channel-api-JudoSiJv.js";
4
4
  import { x as resolveDiscordOutboundSessionRoute } from "./components-Cgm7XT8-.js";
5
5
  import { t as getDiscordRuntime } from "./runtime-Tqtvj5GX.js";
6
- import { c as shouldSuppressLocalDiscordExecApprovalPrompt, n as resolveDiscordCurrentConversationIdentity, r as getDiscordApprovalCapability } from "./conversation-identity-Dh8wIQ_K.js";
6
+ import { c as shouldSuppressLocalDiscordExecApprovalPrompt, n as resolveDiscordCurrentConversationIdentity, r as getDiscordApprovalCapability } from "./conversation-identity-Bpwp-7uO.js";
7
7
  import { r as resolveRequiredDiscordChannelPermissions } from "./audit-core-DRyoXREU.js";
8
- import { t as discordMessageActions$1 } from "./channel-actions-0dOFg3Mu.js";
9
- import { n as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-ZnRRzzgf.js";
10
- import { n as discordOutbound } from "./outbound-adapter-Fe4Ee_GO.js";
11
- import { a as discordSecurityAdapter, i as discordSetupAdapter, n as discordConfigAdapter, t as createDiscordPluginBase } from "./shared-LuaeDRhK.js";
12
- import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-B7h83qD2.js";
8
+ import { t as discordMessageActions$1 } from "./channel-actions--MV0t13k.js";
9
+ import { n as setThreadBindingMaxAgeBySessionKey, t as setThreadBindingIdleTimeoutBySessionKey } from "./thread-bindings.session-updates-CgOqEOPe.js";
10
+ import { n as discordOutbound } from "./outbound-adapter-DyTqAH35.js";
11
+ import { a as discordSecurityAdapter, i as discordSetupAdapter, n as discordConfigAdapter, t as createDiscordPluginBase } from "./shared-CpwVKWm5.js";
12
+ import { t as normalizeExplicitDiscordSessionKey } from "./session-key-normalization-DnCXUKGA.js";
13
13
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
14
14
  import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
15
15
  import { sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
@@ -126,21 +126,21 @@ let discordProbeRuntimePromise;
126
126
  let discordAuditModulePromise;
127
127
  let discordSendModulePromise;
128
128
  let discordDirectoryLiveModulePromise;
129
- const loadDiscordDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-CW_JusGS.js").then((n) => n.t));
130
- const loadDiscordResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-u7_agBcm.js").then((n) => n.n));
131
- const loadDiscordResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-Bc25I6OP.js").then((n) => n.n));
132
- const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-BL5QlX3G.js").then((n) => n.a));
129
+ const loadDiscordDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-mr3WFi1h.js").then((n) => n.t));
130
+ const loadDiscordResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-CerN-VOT.js").then((n) => n.n));
131
+ const loadDiscordResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-DIG4uHLS.js").then((n) => n.n));
132
+ const loadDiscordThreadBindingsManagerModule = createLazyRuntimeModule(() => import("./thread-bindings.manager-kjSGaifo.js").then((n) => n.a));
133
133
  const loadDiscordTargetResolverModule = createLazyRuntimeModule(() => import("./target-resolver-BsGT9hI7.js").then((n) => n.r));
134
134
  async function loadDiscordProviderRuntime() {
135
- discordProviderRuntimePromise ??= import("./provider.runtime-DMPCr3Hh.js");
135
+ discordProviderRuntimePromise ??= import("./provider.runtime-BZj7ZoKH.js");
136
136
  return await discordProviderRuntimePromise;
137
137
  }
138
138
  async function loadDiscordProbeRuntime() {
139
- discordProbeRuntimePromise ??= import("./probe.runtime-9hi1GYNU.js");
139
+ discordProbeRuntimePromise ??= import("./probe.runtime-CvMZb8ZL.js");
140
140
  return await discordProbeRuntimePromise;
141
141
  }
142
142
  async function loadDiscordAuditModule() {
143
- discordAuditModulePromise ??= import("./audit-BZOw16KT.js").then((n) => n.n);
143
+ discordAuditModulePromise ??= import("./audit-CPAL0IL6.js").then((n) => n.n);
144
144
  return await discordAuditModulePromise;
145
145
  }
146
146
  async function loadDiscordSendModule() {
@@ -1,13 +1,14 @@
1
1
  import { r as listDiscordAccountIds, t as createDiscordActionGate } from "./accounts-DnNVBDfc.js";
2
2
  import { t as inspectDiscordAccount } from "./account-inspect-B_N30NV0.js";
3
3
  import { d as readDiscordComponentSpec } from "./components-Cgm7XT8-.js";
4
+ import { i as withDiscordInboundEventDeliveryMetadata } from "./inbound-event-delivery-D8zHG9Lz.js";
4
5
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
6
  import { createUnionActionGate } from "openclaw/plugin-sdk/channel-actions";
6
7
  import { extractToolSend } from "openclaw/plugin-sdk/tool-send";
7
8
  //#region extensions/discord/src/channel-actions.ts
8
9
  let discordChannelActionsRuntimePromise;
9
10
  async function loadDiscordChannelActionsRuntime() {
10
- discordChannelActionsRuntimePromise ??= import("./channel-actions.runtime-BB30vneH.js");
11
+ discordChannelActionsRuntimePromise ??= import("./channel-actions.runtime-G9ARNi7H.js");
11
12
  return await discordChannelActionsRuntimePromise;
12
13
  }
13
14
  function listDiscoverableDiscordAccounts(cfg) {
@@ -125,6 +126,10 @@ const discordMessageActions = {
125
126
  },
126
127
  prepareSendPayload: ({ ctx, payload }) => {
127
128
  if (ctx.action !== "send") return null;
129
+ const payloadWithDeliveryMetadata = withDiscordInboundEventDeliveryMetadata(payload, {
130
+ sessionKey: ctx.sessionKey,
131
+ inboundEventKind: ctx.inboundEventKind
132
+ });
128
133
  const rawComponents = ctx.params.components;
129
134
  if (typeof rawComponents === "function") return null;
130
135
  const componentSpec = rawComponents && typeof rawComponents === "object" && !Array.isArray(rawComponents) ? readDiscordComponentSpec(rawComponents) : void 0;
@@ -132,12 +137,12 @@ const discordMessageActions = {
132
137
  const embeds = Array.isArray(ctx.params.embeds) ? ctx.params.embeds : void 0;
133
138
  if ((componentSpec || nativeComponents) && embeds?.length) return null;
134
139
  const filename = normalizeOptionalString(ctx.params.filename);
135
- if (!componentSpec && !nativeComponents && !embeds?.length && !filename) return payload;
136
- const discordData = payload.channelData?.discord && typeof payload.channelData.discord === "object" && !Array.isArray(payload.channelData.discord) ? payload.channelData.discord : {};
140
+ if (!componentSpec && !nativeComponents && !embeds?.length && !filename) return payloadWithDeliveryMetadata;
141
+ const discordData = payloadWithDeliveryMetadata.channelData?.discord && typeof payloadWithDeliveryMetadata.channelData.discord === "object" && !Array.isArray(payloadWithDeliveryMetadata.channelData.discord) ? payloadWithDeliveryMetadata.channelData.discord : {};
137
142
  return {
138
- ...payload,
143
+ ...payloadWithDeliveryMetadata,
139
144
  channelData: {
140
- ...payload.channelData,
145
+ ...payloadWithDeliveryMetadata.channelData,
141
146
  discord: {
142
147
  ...discordData,
143
148
  ...componentSpec ? { components: componentSpec } : {},
@@ -148,7 +153,7 @@ const discordMessageActions = {
148
153
  }
149
154
  };
150
155
  },
151
- handleAction: async ({ action, params, cfg, accountId, requesterSenderId, toolContext, mediaAccess, mediaLocalRoots, mediaReadFile }) => {
156
+ handleAction: async ({ action, params, cfg, accountId, requesterSenderId, toolContext, mediaAccess, mediaLocalRoots, mediaReadFile, sessionKey, inboundEventKind }) => {
152
157
  return await (await loadDiscordChannelActionsRuntime()).handleDiscordMessageAction({
153
158
  action,
154
159
  params,
@@ -158,7 +163,9 @@ const discordMessageActions = {
158
163
  toolContext,
159
164
  mediaAccess,
160
165
  mediaLocalRoots,
161
- mediaReadFile
166
+ mediaReadFile,
167
+ ...sessionKey ? { sessionKey } : {},
168
+ ...inboundEventKind ? { inboundEventKind } : {}
162
169
  });
163
170
  }
164
171
  };
@@ -3,7 +3,8 @@ import { i as buildDiscordPresentationComponents, r as buildDiscordInteractiveCo
3
3
  import { t as handleDiscordAction } from "./runtime-ToiiUiXe.js";
4
4
  import "./targets-DwW6OieO.js";
5
5
  import "./action-runtime-api.js";
6
- import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-DOW3XfEG.js";
6
+ import { r as notifyDiscordInboundEventOutboundSuccess } from "./inbound-event-delivery-D8zHG9Lz.js";
7
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-DUVD8LGs.js";
7
8
  import { normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
8
9
  import { resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
9
10
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
@@ -24,6 +25,12 @@ async function handleDiscordMessageAction(ctx) {
24
25
  mediaLocalRoots: ctx.mediaLocalRoots,
25
26
  mediaReadFile: ctx.mediaReadFile
26
27
  };
28
+ const notifyVisibleOutbound = (to, fallbackSessionKey) => notifyDiscordInboundEventOutboundSuccess({
29
+ sessionKey: ctx.sessionKey ?? fallbackSessionKey ?? void 0,
30
+ to,
31
+ accountId,
32
+ inboundEventKind: ctx.inboundEventKind
33
+ });
27
34
  const readTarget = () => {
28
35
  const target = readStringParam(params, "channelId") ?? readStringParam(params, "to") ?? readCurrentDiscordTarget(ctx.toolContext);
29
36
  if (!target) throw new Error("Discord channel target is required (use channel:<id>).");
@@ -55,7 +62,7 @@ async function handleDiscordMessageAction(ctx) {
55
62
  const sessionKey = readStringParam(params, "__sessionKey");
56
63
  const agentId = readStringParam(params, "__agentId");
57
64
  const threadName = readStringParam(params, "threadName");
58
- return await handleDiscordAction({
65
+ const result = await handleDiscordAction({
59
66
  action: "sendMessage",
60
67
  accountId: accountId ?? void 0,
61
68
  to,
@@ -72,6 +79,8 @@ async function handleDiscordMessageAction(ctx) {
72
79
  __sessionKey: sessionKey ?? void 0,
73
80
  __agentId: agentId ?? void 0
74
81
  }, cfg, actionOptions);
82
+ notifyVisibleOutbound(to, sessionKey);
83
+ return result;
75
84
  }
76
85
  if (action === "upload-file") {
77
86
  const to = readSendTarget();
@@ -84,7 +93,7 @@ async function handleDiscordMessageAction(ctx) {
84
93
  const suppressEmbeds = readBooleanParam(params, "suppressEmbeds");
85
94
  const sessionKey = readStringParam(params, "__sessionKey");
86
95
  const agentId = readStringParam(params, "__agentId");
87
- return await handleDiscordAction({
96
+ const result = await handleDiscordAction({
88
97
  action: "sendMessage",
89
98
  accountId: accountId ?? void 0,
90
99
  to,
@@ -97,6 +106,8 @@ async function handleDiscordMessageAction(ctx) {
97
106
  __sessionKey: sessionKey ?? void 0,
98
107
  __agentId: agentId ?? void 0
99
108
  }, cfg, actionOptions);
109
+ notifyVisibleOutbound(to, sessionKey);
110
+ return result;
100
111
  }
101
112
  if (action === "poll") {
102
113
  const to = readStringParam(params, "to", { required: true });
@@ -107,7 +118,7 @@ async function handleDiscordMessageAction(ctx) {
107
118
  integer: true,
108
119
  strict: true
109
120
  });
110
- return await handleDiscordAction({
121
+ const result = await handleDiscordAction({
111
122
  action: "poll",
112
123
  accountId: accountId ?? void 0,
113
124
  to,
@@ -117,6 +128,8 @@ async function handleDiscordMessageAction(ctx) {
117
128
  durationHours: durationHours ?? void 0,
118
129
  content: readStringParam(params, "message")
119
130
  }, cfg, actionOptions);
131
+ notifyVisibleOutbound(to);
132
+ return result;
120
133
  }
121
134
  if (action === "react") {
122
135
  const messageId = normalizeOptionalStringifiedId(resolveReactionMessageId({
@@ -198,7 +211,7 @@ async function handleDiscordMessageAction(ctx) {
198
211
  const content = readStringParam(params, "message");
199
212
  const autoArchiveMinutes = readNumberParam(params, "autoArchiveMin", { integer: true });
200
213
  const appliedTags = readStringArrayParam(params, "appliedTags");
201
- return await handleDiscordAction({
214
+ const result = await handleDiscordAction({
202
215
  action: "threadCreate",
203
216
  accountId: accountId ?? void 0,
204
217
  channelId: resolveChannelId(),
@@ -208,19 +221,24 @@ async function handleDiscordMessageAction(ctx) {
208
221
  autoArchiveMinutes,
209
222
  appliedTags: appliedTags ?? void 0
210
223
  }, cfg, actionOptions);
224
+ notifyVisibleOutbound(resolveChannelId());
225
+ return result;
211
226
  }
212
227
  if (action === "sticker") {
228
+ const to = readStringParam(params, "to", { required: true });
213
229
  const stickerIds = readStringArrayParam(params, "stickerId", {
214
230
  required: true,
215
231
  label: "sticker-id"
216
232
  }) ?? [];
217
- return await handleDiscordAction({
233
+ const result = await handleDiscordAction({
218
234
  action: "sticker",
219
235
  accountId: accountId ?? void 0,
220
- to: readStringParam(params, "to", { required: true }),
236
+ to,
221
237
  stickerIds,
222
238
  content: readStringParam(params, "message")
223
239
  }, cfg, actionOptions);
240
+ notifyVisibleOutbound(to);
241
+ return result;
224
242
  }
225
243
  if (action === "set-presence") return await handleDiscordAction({
226
244
  action: "setPresence",
@@ -235,7 +253,10 @@ async function handleDiscordMessageAction(ctx) {
235
253
  ctx,
236
254
  resolveChannelId
237
255
  });
238
- if (adminResult !== void 0) return adminResult;
256
+ if (adminResult !== void 0) {
257
+ if (action === "thread-reply") notifyVisibleOutbound(readStringParam(params, "threadId") ?? readTarget());
258
+ return adminResult;
259
+ }
239
260
  throw new Error(`Action ${action} is not supported for provider ${providerId}.`);
240
261
  }
241
262
  //#endregion
@@ -1,2 +1,2 @@
1
- import { t as DiscordChannelConfigSchema } from "./config-schema-D0eb2vPJ.js";
1
+ import { t as DiscordChannelConfigSchema } from "./config-schema-B6sPhXLp.js";
2
2
  export { DiscordChannelConfigSchema };
@@ -1,2 +1,2 @@
1
- import { t as discordPlugin } from "./channel-DdqtpKwY.js";
1
+ import { t as discordPlugin } from "./channel-DeO4mqqA.js";
2
2
  export { discordPlugin };
@@ -1,7 +1,7 @@
1
1
  import { a as mergeDiscordAccountConfig, c as resolveDiscordAccountAllowFrom, l as resolveDiscordAccountConfig, m as resolveDiscordToken, o as resolveDefaultDiscordAccountId } from "./accounts-DnNVBDfc.js";
2
- import { i as discordSetupAdapter, t as createDiscordPluginBase } from "./shared-LuaeDRhK.js";
3
- import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-u7_agBcm.js";
4
- import { t as resolveDiscordUserAllowlist } from "./resolve-users-Bc25I6OP.js";
2
+ import { i as discordSetupAdapter, t as createDiscordPluginBase } from "./shared-CpwVKWm5.js";
3
+ import { t as resolveDiscordChannelAllowlist } from "./resolve-channels-CerN-VOT.js";
4
+ import { t as resolveDiscordUserAllowlist } from "./resolve-users-DIG4uHLS.js";
5
5
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
6
6
  import { hasConfiguredSecretInput, normalizeSecretInputString } from "openclaw/plugin-sdk/secret-input";
7
7
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -1,8 +1,8 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-ftWAMvBl.js";
2
- import { n as secretTargetRegistryEntries, t as collectRuntimeConfigAssignments } from "./secret-config-contract-B3347_eU.js";
3
- import { n as unsupportedSecretRefSurfacePatterns, t as collectUnsupportedSecretRefConfigCandidates } from "./security-contract-DyCRvz_Q.js";
4
- import { t as deriveLegacySessionChatType } from "./session-contract-ugfEa9Xc.js";
5
- import { r as createThreadBindingManager, t as __testing } from "./thread-bindings.manager-BL5QlX3G.js";
6
- import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-CW_JusGS.js";
7
- import { t as collectDiscordSecurityAuditFindings } from "./security-audit-CLPZKYi4.js";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-AkgUZQHW.js";
2
+ import { n as secretTargetRegistryEntries, t as collectRuntimeConfigAssignments } from "./secret-config-contract-57_WV6qt.js";
3
+ import { n as unsupportedSecretRefSurfacePatterns, t as collectUnsupportedSecretRefConfigCandidates } from "./security-contract-BWDASKVo.js";
4
+ import { t as deriveLegacySessionChatType } from "./session-contract-Dwhw3RTY.js";
5
+ import { r as createThreadBindingManager, t as __testing } from "./thread-bindings.manager-kjSGaifo.js";
6
+ import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-mr3WFi1h.js";
7
+ import { t as collectDiscordSecurityAuditFindings } from "./security-audit-Dx3j4a0l.js";
8
8
  export { collectDiscordSecurityAuditFindings, collectRuntimeConfigAssignments, collectUnsupportedSecretRefConfigCandidates, createThreadBindingManager, deriveLegacySessionChatType, __testing as discordThreadBindingTesting, legacyConfigRules, listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig, normalizeCompatibilityConfig, secretTargetRegistryEntries, unsupportedSecretRefSurfacePatterns };
@@ -229,7 +229,7 @@ function createDiscordApprovalCapability(configOverride) {
229
229
  request,
230
230
  configOverride
231
231
  }),
232
- load: async () => (await import("./approval-handler.runtime-CS97g4S1.js").then((n) => n.t)).discordApprovalNativeRuntime
232
+ load: async () => (await import("./approval-handler.runtime-B5Dd-jlK.js").then((n) => n.t)).discordApprovalNativeRuntime
233
233
  })
234
234
  });
235
235
  }
@@ -1,2 +1,2 @@
1
- import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-CW_JusGS.js";
1
+ import { n as listDiscordDirectoryGroupsFromConfig, r as listDiscordDirectoryPeersFromConfig } from "./directory-config-mr3WFi1h.js";
2
2
  export { listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig };
@@ -1,8 +1,8 @@
1
1
  import { o as resolveDefaultDiscordAccountId } from "./accounts-DnNVBDfc.js";
2
2
  import { t as inspectDiscordAccount } from "./account-inspect-B_N30NV0.js";
3
- import { r as DISCORD_LEGACY_CONFIG_RULES } from "./shared-LuaeDRhK.js";
4
- import { n as normalizeCompatibilityConfig } from "./doctor-contract-ftWAMvBl.js";
5
- import { t as isDiscordMutableAllowEntry } from "./security-doctor-Cp-NqNdS.js";
3
+ import { r as DISCORD_LEGACY_CONFIG_RULES } from "./shared-CpwVKWm5.js";
4
+ import { n as normalizeCompatibilityConfig } from "./doctor-contract-AkgUZQHW.js";
5
+ import { t as isDiscordMutableAllowEntry } from "./security-doctor-DepqtNCI.js";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { collectProviderDangerousNameMatchingScopes } from "openclaw/plugin-sdk/runtime-doctor";
8
8
  //#region extensions/discord/src/doctor.ts
@@ -1,4 +1,4 @@
1
- import { t as resolveDiscordPreviewStreamMode } from "./preview-streaming-CXTZydhx.js";
1
+ import { t as resolveDiscordPreviewStreamMode } from "./preview-streaming-nClS_TQx.js";
2
2
  import { asObjectRecord, normalizeLegacyChannelAliases } from "openclaw/plugin-sdk/runtime-doctor";
3
3
  //#region extensions/discord/src/doctor-contract.ts
4
4
  const LEGACY_TTS_PROVIDER_KEYS = [
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-ftWAMvBl.js";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-AkgUZQHW.js";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -0,0 +1,65 @@
1
+ //#region extensions/discord/src/inbound-event-delivery.ts
2
+ const DISCORD_INBOUND_EVENT_DELIVERY_KEY = "__openclawInboundEventDelivery";
3
+ const registry = /* @__PURE__ */ new Map();
4
+ function normalizeDiscordDeliveryTarget(value) {
5
+ return value.trim().replace(/^discord:/iu, "").replace(/^channel:/iu, "").toLowerCase();
6
+ }
7
+ function resolveDiscordInboundEventDeliveryCorrelationKey(sessionKey, inboundEventKind) {
8
+ const key = sessionKey?.trim();
9
+ if (!key) return;
10
+ return inboundEventKind === "room_event" ? `${key}:room_event` : key;
11
+ }
12
+ function beginDiscordInboundEventDeliveryCorrelation(sessionKey, event, options) {
13
+ const key = resolveDiscordInboundEventDeliveryCorrelationKey(sessionKey, options?.inboundEventKind);
14
+ if (!key) return () => {};
15
+ registry.set(key, event);
16
+ return () => {
17
+ if (registry.get(key) === event) registry.delete(key);
18
+ };
19
+ }
20
+ function notifyDiscordInboundEventOutboundSuccess(params) {
21
+ const key = resolveDiscordInboundEventDeliveryCorrelationKey(params.sessionKey, params.inboundEventKind);
22
+ if (!key) return;
23
+ const event = registry.get(key);
24
+ if (!event || normalizeDiscordDeliveryTarget(event.outboundTo) !== normalizeDiscordDeliveryTarget(params.to)) return;
25
+ if (event.outboundAccountId && params.accountId && params.accountId !== event.outboundAccountId) return;
26
+ registry.delete(key);
27
+ event.markInboundEventDelivered();
28
+ }
29
+ function readRecord(value) {
30
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
31
+ }
32
+ function readString(value) {
33
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
34
+ }
35
+ function withDiscordInboundEventDeliveryMetadata(payload, params) {
36
+ const sessionKey = params.sessionKey?.trim();
37
+ if (!sessionKey || params.inboundEventKind !== "room_event") return payload;
38
+ const channelData = readRecord(payload.channelData) ?? {};
39
+ const discordData = readRecord(channelData.discord) ?? {};
40
+ return {
41
+ ...payload,
42
+ channelData: {
43
+ ...channelData,
44
+ discord: {
45
+ ...discordData,
46
+ [DISCORD_INBOUND_EVENT_DELIVERY_KEY]: {
47
+ sessionKey,
48
+ inboundEventKind: params.inboundEventKind
49
+ }
50
+ }
51
+ }
52
+ };
53
+ }
54
+ function notifyDiscordInboundEventOutboundPayloadSuccess(params) {
55
+ const metadata = readRecord(readRecord(readRecord(params.payload.channelData)?.discord)?.[DISCORD_INBOUND_EVENT_DELIVERY_KEY]);
56
+ if (!metadata) return;
57
+ notifyDiscordInboundEventOutboundSuccess({
58
+ sessionKey: readString(metadata.sessionKey),
59
+ inboundEventKind: readString(metadata.inboundEventKind),
60
+ to: params.to,
61
+ accountId: params.accountId
62
+ });
63
+ }
64
+ //#endregion
65
+ export { withDiscordInboundEventDeliveryMetadata as i, notifyDiscordInboundEventOutboundPayloadSuccess as n, notifyDiscordInboundEventOutboundSuccess as r, beginDiscordInboundEventDeliveryCorrelation as t };
@@ -3,8 +3,8 @@ import { c as resolveDiscordAccountAllowFrom } from "./accounts-DnNVBDfc.js";
3
3
  import { a as normalizeDiscordSlug, b as formatDiscordUserTag, m as resolveDiscordOwnerAccess } from "./allow-list-CBI-M84K.js";
4
4
  import { i as formatMention } from "./send.outbound-BKh71kjw.js";
5
5
  import { t as getDiscordRuntime } from "./runtime-Tqtvj5GX.js";
6
- import { o as authorizeDiscordVoiceIngress, u as resolveDiscordVoiceEnabled } from "./provider-C4J1o-3R.js";
7
- import { t as buildDiscordGroupSystemPrompt } from "./inbound-context-BdfOEkhj.js";
6
+ import { o as authorizeDiscordVoiceIngress, u as resolveDiscordVoiceEnabled } from "./provider-BYIVfxV_.js";
7
+ import { t as buildDiscordGroupSystemPrompt } from "./inbound-context-CzEAvKgx.js";
8
8
  import { createRequire } from "node:module";
9
9
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
10
10
  import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
@@ -1,8 +1,8 @@
1
1
  import { N as createDiscordRestClient } from "./send.shared-Bdj-DP6-.js";
2
- import { d as resolveDiscordChannelNameSafe, l as resolveDiscordChannelIdSafe, p as resolveDiscordChannelParentSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-BtXi8-Fz.js";
3
- import { a as mergeAbortSignals } from "./timeouts-snXNwR4m.js";
4
- import { c as hasDiscordMessageStickers, d as resolveDiscordMessageChannelId, r as resolveDiscordMessageText } from "./message-utils-CY91O2k2.js";
5
- import { t as sendTyping } from "./typing-C_8U8J7E.js";
2
+ import { d as resolveDiscordChannelNameSafe, l as resolveDiscordChannelIdSafe, p as resolveDiscordChannelParentSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-BQJf05t-.js";
3
+ import { a as mergeAbortSignals } from "./timeouts-CEwuGaWT.js";
4
+ import { c as hasDiscordMessageStickers, d as resolveDiscordMessageChannelId, r as resolveDiscordMessageText } from "./message-utils-BZoXOhcI.js";
5
+ import { t as sendTyping } from "./typing-DudlJ-Fv.js";
6
6
  import { danger, logVerbose } from "openclaw/plugin-sdk/runtime-env";
7
7
  import { resolveOpenProviderRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
8
8
  import { resolveBatchedReplyThreadingPolicy } from "openclaw/plugin-sdk/reply-reference";
@@ -121,7 +121,7 @@ function applyImplicitReplyBatchGate(ctx, replyToMode, isBatched) {
121
121
  //#region extensions/discord/src/monitor/message-run-queue.ts
122
122
  let messageProcessRuntimePromise;
123
123
  async function loadMessageProcessRuntime() {
124
- messageProcessRuntimePromise ??= import("./message-handler.process-Ce7Xh_dH.js");
124
+ messageProcessRuntimePromise ??= import("./message-handler.process-B9kCtqjZ.js");
125
125
  return await messageProcessRuntimePromise;
126
126
  }
127
127
  async function processDiscordQueuedMessage(params) {
@@ -173,7 +173,7 @@ function createDiscordMessageRunQueue(params) {
173
173
  //#region extensions/discord/src/monitor/message-handler.ts
174
174
  let messagePreflightRuntimePromise;
175
175
  async function loadMessagePreflightRuntime() {
176
- messagePreflightRuntimePromise ??= import("./message-handler.preflight-DFw-r_C5.js");
176
+ messagePreflightRuntimePromise ??= import("./message-handler.preflight-DPcejg12.js");
177
177
  return await messagePreflightRuntimePromise;
178
178
  }
179
179
  function isNonEmptyString(value) {
@@ -1,13 +1,13 @@
1
1
  import { A as Message, c as discord_exports, mt as getChannelMessage } from "./send.receipt-nKLxvA1s.js";
2
2
  import { o as resolveDefaultDiscordAccountId } from "./accounts-DnNVBDfc.js";
3
3
  import { S as resolveTimestampMs, _ as resolveGroupDmAllow, a as normalizeDiscordSlug, b as formatDiscordUserTag, c as resolveDiscordChannelConfigWithFallback, d as resolveDiscordGuildEntry, f as resolveDiscordMemberAccessState, g as resolveDiscordShouldRequireMention, i as normalizeDiscordDisplaySlug, n as isDiscordGroupAllowedByPolicy, x as resolveDiscordSystemLocation } from "./allow-list-CBI-M84K.js";
4
- import { t as resolveDiscordConversationIdentity } from "./conversation-identity-Dh8wIQ_K.js";
5
- import { l as isRecentlyUnboundThreadWebhookMessage } from "./thread-bindings.state-BdBeo7Rx.js";
6
- import { d as resolveDiscordChannelNameSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-BtXi8-Fz.js";
7
- import "./thread-bindings-BwcE40jS.js";
8
- import { C as resolveDiscordDmCommandAccess, f as buildDiscordRoutePeer, g as handleDiscordDmCommandDecision, h as shouldIgnoreStaleDiscordRouteBinding, m as resolveDiscordEffectiveRoute, p as resolveDiscordConversationRoute, w as resolveDiscordTextCommandAccess } from "./provider-C4J1o-3R.js";
9
- import { d as resolveDiscordMessageChannelId, l as resolveDiscordMessageStickers, o as resolveMediaList, r as resolveDiscordMessageText, u as resolveDiscordChannelInfo } from "./message-utils-CY91O2k2.js";
10
- import { n as resolveDiscordWebhookId, t as resolveDiscordSenderIdentity } from "./sender-identity-BTGL3VbF.js";
4
+ import { t as resolveDiscordConversationIdentity } from "./conversation-identity-Bpwp-7uO.js";
5
+ import { l as isRecentlyUnboundThreadWebhookMessage } from "./thread-bindings.state-CSphZOiL.js";
6
+ import { d as resolveDiscordChannelNameSafe, u as resolveDiscordChannelInfoSafe } from "./thread-bindings.discord-api-BQJf05t-.js";
7
+ import "./thread-bindings-CqKojFDg.js";
8
+ import { C as resolveDiscordDmCommandAccess, f as buildDiscordRoutePeer, g as handleDiscordDmCommandDecision, h as shouldIgnoreStaleDiscordRouteBinding, m as resolveDiscordEffectiveRoute, p as resolveDiscordConversationRoute, w as resolveDiscordTextCommandAccess } from "./provider-BYIVfxV_.js";
9
+ import { d as resolveDiscordMessageChannelId, l as resolveDiscordMessageStickers, o as resolveMediaList, r as resolveDiscordMessageText, u as resolveDiscordChannelInfo } from "./message-utils-BZoXOhcI.js";
10
+ import { n as resolveDiscordWebhookId, t as resolveDiscordSenderIdentity } from "./sender-identity-DC0FdEcU.js";
11
11
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
12
12
  import { getChildLogger, logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env";
13
13
  import { recordChannelActivity } from "openclaw/plugin-sdk/channel-activity-runtime";
@@ -15,10 +15,11 @@ import { formatAllowlistMatchMeta } from "openclaw/plugin-sdk/allow-from";
15
15
  import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime";
16
16
  import { enqueueSystemEvent } from "openclaw/plugin-sdk/system-event-runtime";
17
17
  import { mimeTypeFromFilePath } from "openclaw/plugin-sdk/media-mime";
18
- import { buildMentionRegexes, implicitMentionKindWhen, logInboundDrop, matchesMentionWithExplicit, resolveInboundMentionDecision, toInboundMediaFacts } from "openclaw/plugin-sdk/channel-inbound";
18
+ import { buildMentionRegexes, classifyChannelInboundEvent, implicitMentionKindWhen, logInboundDrop, matchesMentionWithExplicit, resolveInboundMentionDecision, resolveUnmentionedGroupInboundPolicy, toInboundMediaFacts } from "openclaw/plugin-sdk/channel-inbound";
19
19
  import { logDebug } from "openclaw/plugin-sdk/logging-core";
20
20
  import { recordDroppedChannelTurnHistory } from "openclaw/plugin-sdk/inbound-reply-dispatch";
21
21
  import { hasControlCommand } from "openclaw/plugin-sdk/command-detection";
22
+ import { isAbortRequestText } from "openclaw/plugin-sdk/command-primitives-runtime";
22
23
  import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-surface";
23
24
  //#region extensions/discord/src/monitor/message-handler.dm-preflight.ts
24
25
  let conversationRuntimePromise$1;
@@ -426,19 +427,19 @@ let preflightAudioRuntimePromise;
426
427
  let systemEventsRuntimePromise;
427
428
  let discordThreadingRuntimePromise;
428
429
  async function loadPluralKitRuntime() {
429
- pluralkitRuntimePromise ??= import("./pluralkit-B2AqgTHV.js").then((n) => n.n);
430
+ pluralkitRuntimePromise ??= import("./pluralkit-BHV93ojA.js").then((n) => n.n);
430
431
  return await pluralkitRuntimePromise;
431
432
  }
432
433
  async function loadPreflightAudioRuntime() {
433
- preflightAudioRuntimePromise ??= import("./preflight-audio-DFGpAvzi.js");
434
+ preflightAudioRuntimePromise ??= import("./preflight-audio-B0keJeQe.js");
434
435
  return await preflightAudioRuntimePromise;
435
436
  }
436
437
  async function loadSystemEventsRuntime() {
437
- systemEventsRuntimePromise ??= import("./system-events-Bnit0zkQ.js");
438
+ systemEventsRuntimePromise ??= import("./system-events-CEehp53f.js");
438
439
  return await systemEventsRuntimePromise;
439
440
  }
440
441
  async function loadDiscordThreadingRuntime() {
441
- discordThreadingRuntimePromise ??= import("./provider-C4J1o-3R.js").then((n) => n.v);
442
+ discordThreadingRuntimePromise ??= import("./provider-BYIVfxV_.js").then((n) => n.v);
442
443
  return await discordThreadingRuntimePromise;
443
444
  }
444
445
  function isPreflightAborted(abortSignal) {
@@ -921,6 +922,7 @@ async function preflightDiscordMessage(params) {
921
922
  surface: "discord"
922
923
  });
923
924
  const hasControlCommandInMessage = hasControlCommand(baseText, params.cfg);
925
+ const hasAbortRequest = isAbortRequestText(baseText);
924
926
  if (!isDirectMessage) {
925
927
  const commandAccess = await resolveDiscordTextCommandAccess({
926
928
  accountId: params.accountId,
@@ -965,6 +967,16 @@ async function preflightDiscordMessage(params) {
965
967
  }
966
968
  });
967
969
  const effectiveWasMentioned = mentionDecision.effectiveWasMentioned;
970
+ const inboundEventKind = classifyChannelInboundEvent({
971
+ conversation: { kind: isDirectMessage ? "direct" : isGroupDm ? "group" : "channel" },
972
+ unmentionedGroupPolicy: resolveUnmentionedGroupInboundPolicy({
973
+ cfg: params.cfg,
974
+ agentId: effectiveRoute.agentId
975
+ }),
976
+ wasMentioned: effectiveWasMentioned,
977
+ hasControlCommand: hasControlCommandInMessage,
978
+ hasAbortRequest
979
+ });
968
980
  logDebug(`[discord-preflight] shouldRequireMention=${shouldRequireMention} baseRequireMention=${shouldRequireMentionByConfig} boundThreadSession=${isBoundThreadSession} mentionDecision.shouldSkip=${mentionDecision.shouldSkip} wasMentioned=${wasMentioned}`);
969
981
  if (isGuildMessage && shouldRequireMention) {
970
982
  if (mentionDecision.shouldSkip) {
@@ -1087,9 +1099,11 @@ async function preflightDiscordMessage(params) {
1087
1099
  channelAllowed,
1088
1100
  shouldRequireMention,
1089
1101
  hasAnyMention,
1102
+ hasControlCommand: hasControlCommandInMessage,
1090
1103
  allowTextCommands,
1091
1104
  shouldBypassMention: mentionDecision.shouldBypassMention,
1092
1105
  effectiveWasMentioned,
1106
+ inboundEventKind,
1093
1107
  canDetectMention,
1094
1108
  historyEntry,
1095
1109
  botLoopProtection