@openclaw/discord 2026.9.6 → 2026.9.8

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 (150) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{account-inspect-BwQj24ht.mjs → account-inspect-De8hOUxG.mjs} +1 -1
  3. package/dist/.setup/{accounts-CwJQoLjM.mjs → accounts-ChaMcixG.mjs} +1 -4
  4. package/dist/.setup/{activities-api-COU4-0nR.mjs → activities-api-tvbsU2e3.mjs} +38 -66
  5. package/dist/.setup/{api-CBK9zcq5.mjs → api-DVbJwZVt.mjs} +10 -2
  6. package/dist/.setup/{approval-handler.runtime-CbBktBb4.mjs → approval-handler.runtime-DxCK2Rux.mjs} +49 -125
  7. package/dist/.setup/{approval-message-updates-jf9zMaIC.mjs → approval-message-updates-BKFqavHZ.mjs} +2 -2
  8. package/dist/.setup/{audit-vKbh-LFR.mjs → audit-CLg9I71N.mjs} +5 -5
  9. package/dist/.setup/{channel-Dv4e3Jpc.mjs → channel-DxlUVU9t.mjs} +121 -227
  10. package/dist/.setup/{channel-type-DKnjV1XW.mjs → channel-type-DRCrEMss.mjs} +22 -22
  11. package/dist/.setup/{channel.setup-0NX6FFwi.mjs → channel.setup-CRo1GjV7.mjs} +6 -9
  12. package/dist/.setup/{components-yBEb75bB.mjs → components-Cq1PvIpN.mjs} +41 -69
  13. package/dist/.setup/{config-schema-CiZz-mtA.mjs → config-schema-oxELUSDx.mjs} +19 -44
  14. package/dist/.setup/{conversation-binding-route-B7qImK_b.mjs → conversation-binding-route-Caz_XuFH.mjs} +10 -5
  15. package/dist/.setup/{directory-config-BytTftz-.mjs → directory-config-esqNn0Eo.mjs} +6 -9
  16. package/dist/.setup/{directory-live--EGTH0DC.mjs → directory-live-DtKRHuGV.mjs} +6 -12
  17. package/dist/.setup/{discord-BXpHW-cu.mjs → discord-0xJYfdDD.mjs} +82 -386
  18. package/dist/.setup/{doctor-D1R-uFIu.mjs → doctor-BCl1H5tl.mjs} +21 -36
  19. package/dist/.setup/{doctor-contract-Co5vRCZ6.mjs → doctor-contract-CvvgwrrG.mjs} +41 -50
  20. package/dist/.setup/{channel-actions.runtime-leZuw01r.mjs → handle-action-CUvQWnE7.mjs} +67 -104
  21. package/dist/.setup/{handle-action.guild-admin-DcFa8NwA.mjs → handle-action.guild-admin-Df-8gVle.mjs} +62 -120
  22. package/dist/.setup/{live-policy-config-eKQ-PLdy.mjs → live-policy-config-8Pv20CHc.mjs} +2 -3
  23. package/dist/.setup/{message-handler-X6ejmbtY.mjs → message-handler-B-Jk4oDk.mjs} +18 -94
  24. package/dist/.setup/{message-handler.preflight-pluralkit-8Xji34AF.mjs → message-handler.preflight-pluralkit-CWLUBVcx.mjs} +8 -10
  25. package/dist/.setup/{message-handler.preflight-DE_POxFc.mjs → message-handler.preflight-v-__NSDq.mjs} +69 -180
  26. package/dist/.setup/{message-handler.process-CCmIVnxy.mjs → message-handler.process-BNFFuChn.mjs} +65 -86
  27. package/dist/.setup/{outbound-adapter-ClIgmu4F.mjs → outbound-adapter-BobT-kse.mjs} +105 -19
  28. package/dist/.setup/{outbound-session-route-VulUE0yV.mjs → outbound-session-route-zVGxxceg.mjs} +140 -108
  29. package/dist/.setup/{pluralkit-CdAt1G0P.mjs → pluralkit-a6_NLfH9.mjs} +1 -1
  30. package/dist/.setup/{presence-cache-dYSHPWMx.mjs → presence-cache-Di3H3DIU.mjs} +0 -4
  31. package/dist/.setup/{probe-CupW4we4.mjs → probe-LYrIHlBF.mjs} +13 -4
  32. package/dist/.setup/{provider-iOf73HW-.mjs → provider-B_G5hASF.mjs} +721 -1416
  33. package/dist/.setup/provider-session.runtime-BYlTBFD2.mjs +6 -0
  34. package/dist/.setup/provider.runtime-CUE3UxER.mjs +2 -0
  35. package/dist/.setup/{realtime-session.runtime-Dz8uVutq.mjs → realtime-session.runtime-oUd9DOcz.mjs} +41 -55
  36. package/dist/.setup/{receive-recovery-DHst8WRx.mjs → receive-recovery-CHPOsnLc.mjs} +1 -4
  37. package/dist/.setup/{resolve-allowlist-common-CwMBzbx9.mjs → resolve-allowlist-common-DPdRggu5.mjs} +4 -7
  38. package/dist/.setup/{resolve-channels-BbvsLQOZ.mjs → resolve-channels-BFPNRmVv.mjs} +21 -40
  39. package/dist/.setup/{resolve-users-ByFlR7LQ.mjs → resolve-users-0-aBuCy3.mjs} +4 -4
  40. package/dist/.setup/{retry-BEYkDy0P.mjs → retry-pz_cSha2.mjs} +3 -3
  41. package/dist/.setup/rolldown-runtime-B4FMCO8f.mjs +28 -0
  42. package/dist/.setup/{runtime-B8lJfyrA.mjs → runtime-FN000lxA.mjs} +60 -162
  43. package/dist/.setup/runtime-doctor-migrations-CshUGl36.mjs +159 -0
  44. package/dist/.setup/{runtime-DisDbixd.mjs → runtime-sUksZ--Q.mjs} +2 -5
  45. package/dist/.setup/{secret-config-contract-DFu9hfU8.mjs → secret-config-contract-uOE2J7yM.mjs} +15 -85
  46. package/dist/.setup/{security-audit-s5w50-Ly.mjs → security-audit-Cdaegq7C.mjs} +3 -1
  47. package/dist/.setup/{send-CIBzvXjS.mjs → send-CrfEI6Bs.mjs} +53 -108
  48. package/dist/.setup/{send.components-ChY21qr-.mjs → send.components-DxQAMfES.mjs} +62 -107
  49. package/dist/.setup/{send.outbound-QTyuFupn.mjs → send.outbound-BISKnb-a.mjs} +66 -140
  50. package/dist/.setup/{send.shared-VNvWfX2T.mjs → send.shared-DGFkbkQR.mjs} +10 -25
  51. package/dist/.setup/{sender-identity-0Ymgvmaj.mjs → sender-identity-B9X5Vb9R.mjs} +2 -3
  52. package/dist/.setup/setup-plugin-api-BQUBxbhe.mjs +3 -0
  53. package/dist/.setup/{shared-DHPDaMSx.mjs → shared-B3wZ4hN-.mjs} +25 -32
  54. package/dist/.setup/{subagent-hooks-CjW7r8Pe.mjs → subagent-hooks-nlUE9ow7.mjs} +5 -6
  55. package/dist/.setup/system-events-CdeZnvPV.mjs +33 -0
  56. package/dist/.setup/{target-resolver-BXpy6VT8.mjs → target-resolver-BuLapkhy.mjs} +9 -12
  57. package/dist/.setup/targets-0KUcEIYx.mjs +3 -0
  58. package/dist/.setup/{thread-bindings-CEh2dhqP.mjs → thread-bindings-D7TfgjR_.mjs} +33 -35
  59. package/dist/.setup/{thread-bindings.manager-ve-i6oqt.mjs → thread-bindings.manager-DN-NissX.mjs} +325 -233
  60. package/dist/.setup/thread-bindings.session-updates-CshfKghV.mjs +359 -0
  61. package/dist/.setup/{thread-bindings.state-BThFQEga.mjs → thread-bindings.state-g6v9zAym.mjs} +21 -62
  62. package/dist/.setup/{transcripts-source-DVegW0WI.mjs → transcripts-source-p8EV179h.mjs} +76 -235
  63. package/dist/.setup/{typing-BKZL5fGj.mjs → typing-BiHCzBRu.mjs} +2 -1
  64. package/dist/.setup/{voice-runtime-elTtjEIG.mjs → voice-runtime-B46rcwrG.mjs} +140 -244
  65. package/dist/account-inspect-api.js +1 -1
  66. package/dist/action-runtime-api.js +1 -1
  67. package/dist/activities-api.js +1 -1
  68. package/dist/api.js +18 -18
  69. package/dist/channel-config-api.js +1 -1
  70. package/dist/channel-plugin-api.js +1 -1
  71. package/dist/directory-contract-api.js +1 -1
  72. package/dist/doctor-contract-api.js +4 -4
  73. package/dist/index.js +1 -1
  74. package/dist/runtime-api.js +20 -20
  75. package/dist/secret-contract-api.js +1 -1
  76. package/dist/security-audit-contract-api.js +1 -1
  77. package/dist/setup-entry.js +1 -1
  78. package/dist/setup-plugin-api.js +1 -1
  79. package/dist/src/voice/audio-worker.runtime.js +15 -24
  80. package/dist/subagent-hooks-api.js +3 -4
  81. package/dist/transcripts-source-api.js +1 -1
  82. package/node_modules/@types/node/README.md +2 -2
  83. package/node_modules/@types/node/child_process.d.ts +1 -1
  84. package/node_modules/@types/node/crypto.d.ts +20 -8
  85. package/node_modules/@types/node/ffi.d.ts +14 -0
  86. package/node_modules/@types/node/http2.d.ts +3 -2
  87. package/node_modules/@types/node/net.d.ts +16 -4
  88. package/node_modules/@types/node/package.json +2 -17
  89. package/node_modules/@types/node/process.d.ts +1 -0
  90. package/node_modules/@types/node/quic.d.ts +39 -1
  91. package/node_modules/@types/node/stream/iter.d.ts +9 -12
  92. package/node_modules/@types/node/test/reporters.d.ts +1 -0
  93. package/node_modules/@types/node/test.d.ts +72 -0
  94. package/node_modules/@types/node/tls.d.ts +14 -10
  95. package/node_modules/@types/node/vm.d.ts +2 -1
  96. package/node_modules/@types/node/worker_threads.d.ts +4 -1
  97. package/node_modules/typebox/build/compile/code.mjs +1 -2
  98. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  99. package/node_modules/typebox/build/format/iri.mjs +16 -9
  100. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  101. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  102. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  103. package/node_modules/typebox/build/guard/index.mjs +6 -0
  104. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  105. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  106. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  107. package/node_modules/typebox/build/schema/build.mjs +2 -3
  108. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  109. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  110. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  111. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  112. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  113. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  114. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  115. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  116. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  117. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  118. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  119. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  120. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  121. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  122. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  123. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  124. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  125. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  126. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  127. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  128. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  129. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  130. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  131. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  132. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  133. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  134. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  135. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  136. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  137. package/node_modules/typebox/package.json +1 -1
  138. package/node_modules/typebox/readme.md +3 -1
  139. package/openclaw.plugin.json +21 -1
  140. package/package.json +5 -5
  141. package/dist/.setup/agent-components.runtime-CEPrf2SY.mjs +0 -4
  142. package/dist/.setup/probe.runtime-DBQ_AGPe.mjs +0 -2
  143. package/dist/.setup/provider-session.runtime-DrGAYnZv.mjs +0 -6
  144. package/dist/.setup/provider.runtime-BmjW_pIw.mjs +0 -2
  145. package/dist/.setup/security-audit.runtime-DHtYenx9.mjs +0 -2
  146. package/dist/.setup/setup-plugin-api-Dvr41dyx.mjs +0 -3
  147. package/dist/.setup/system-events-B2YEEMbS.mjs +0 -34
  148. package/dist/.setup/targets-CvemhN3i.mjs +0 -3
  149. package/dist/.setup/thread-bindings.session-updates-DCQq1WZ5.mjs +0 -55
  150. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -1,13 +1,13 @@
1
- import { C as withDiscordRequestAuthority } from "./discord-BXpHW-cu.mjs";
2
- import { i as buildDiscordPresentationComponents, m as coerceDiscordComponentParam, r as buildDiscordInteractiveComponents } from "./components-yBEb75bB.mjs";
3
- import { b as resolveDiscordChannelId, g as matchesDiscordToolContextTarget, y as parseDiscordTarget } from "./retry-BEYkDy0P.mjs";
4
- import "./targets-CvemhN3i.mjs";
5
- import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-B8lJfyrA.mjs";
1
+ import { i as buildDiscordPresentationComponents, m as coerceDiscordComponentParam, r as buildDiscordInteractiveComponents } from "./components-Cq1PvIpN.mjs";
2
+ import { C as withDiscordRequestAuthority } from "./discord-0xJYfdDD.mjs";
3
+ import { _ as matchesDiscordToolContextTarget, b as parseDiscordTarget, x as resolveDiscordChannelId } from "./retry-pz_cSha2.mjs";
4
+ import "./targets-0KUcEIYx.mjs";
5
+ import { a as readDiscordAutoArchiveDurationParam, t as handleDiscordAction } from "./runtime-FN000lxA.mjs";
6
6
  import "../action-runtime-api.js";
7
- import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-VulUE0yV.mjs";
8
- import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-DcFa8NwA.mjs";
7
+ import { b as discordInboundEventDelivery, i as isDiscordComponentSpecWithinMessageLimit, n as DISCORD_PRESENTATION_CAPABILITIES } from "./outbound-session-route-zVGxxceg.mjs";
8
+ import { t as tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin-Df-8gVle.mjs";
9
9
  import { n as notifyDiscordActiveTurnThreadCreated, r as notifyDiscordActiveTurnThreadReplyDelivered } from "./active-turn-thread-route-fmHl1HNd.mjs";
10
- import { normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
10
+ import { asOptionalRecord, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
11
11
  import { adaptMessagePresentationForChannel, normalizeLegacyInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText } from "openclaw/plugin-sdk/interactive-runtime";
12
12
  import { resolveReactionMessageId } from "openclaw/plugin-sdk/channel-actions";
13
13
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
@@ -15,7 +15,7 @@ import { readPositiveIntegerParam as readPositiveIntegerParam$1, readStringArray
15
15
  //#region extensions/discord/src/actions/handle-action.ts
16
16
  const providerId = "discord";
17
17
  function withCurrentSourceReplyRoute(result) {
18
- const details = result.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : {};
18
+ const details = asOptionalRecord(result.details) ?? {};
19
19
  return {
20
20
  ...result,
21
21
  details: {
@@ -55,8 +55,13 @@ async function dispatchDiscordMessageAction(ctx) {
55
55
  ...ctx.progressSnapshot ? { progressSnapshot: ctx.progressSnapshot } : {},
56
56
  ...readPolicyOptions
57
57
  };
58
+ const runAction = ({ action: runtimeAction, ...payload }) => handleDiscordAction({
59
+ action: runtimeAction,
60
+ accountId: accountId ?? void 0,
61
+ ...payload
62
+ }, cfg, actionOptions);
58
63
  const notifyVisibleOutbound = (result, to, fallbackSessionKey) => {
59
- if ((result.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : void 0)?.ok !== true) return;
64
+ if (asOptionalRecord(result.details)?.ok !== true) return;
60
65
  discordInboundEventDelivery.notify({
61
66
  sessionKey: ctx.sessionKey ?? fallbackSessionKey ?? void 0,
62
67
  to,
@@ -65,7 +70,7 @@ async function dispatchDiscordMessageAction(ctx) {
65
70
  });
66
71
  };
67
72
  const withAdoptedThreadReplyRoute = (result, to, fallbackSessionKey) => {
68
- if ((result.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : void 0)?.ok !== true) return result;
73
+ if (asOptionalRecord(result.details)?.ok !== true) return result;
69
74
  let target;
70
75
  try {
71
76
  target = parseDiscordTarget(to, { defaultKind: "channel" });
@@ -79,27 +84,33 @@ async function dispatchDiscordMessageAction(ctx) {
79
84
  })) return withCurrentSourceReplyRoute(result);
80
85
  return result;
81
86
  };
82
- const readTarget = () => {
83
- const target = readStringParam$1(params, "channelId") ?? readStringParam$1(params, "to") ?? readCurrentDiscordTarget(ctx.toolContext);
87
+ const readTarget = ([firstKey, secondKey] = ["channelId", "to"]) => {
88
+ const target = readStringParam$1(params, firstKey) ?? readStringParam$1(params, secondKey) ?? readCurrentDiscordTarget(ctx.toolContext);
84
89
  if (!target) throw new Error("Discord channel target is required (use channel:<id>).");
85
90
  return target;
86
91
  };
87
92
  const resolveChannelId = () => resolveDiscordChannelId(readTarget());
88
- const readSendTarget = () => {
89
- const target = readStringParam$1(params, "to") ?? readStringParam$1(params, "target") ?? readCurrentDiscordTarget(ctx.toolContext);
90
- if (!target) throw new Error("Discord channel target is required (use channel:<id>).");
91
- return target;
92
- };
93
- if (action === "send") {
94
- const to = readSendTarget();
95
- const asVoice = readBooleanParam(params, "asVoice") === true;
96
- const mediaUrl = readStringParam$1(params, "media", { trim: false }) ?? readStringParam$1(params, "path", { trim: false }) ?? readStringParam$1(params, "filePath", { trim: false });
93
+ if (action === "send" || action === "upload-file") {
94
+ const to = readTarget(["to", "target"]);
95
+ const asVoice = action === "send" ? readBooleanParam(params, "asVoice") === true : void 0;
96
+ const [firstMediaKey, lastMediaKey] = action === "send" ? ["media", "filePath"] : ["filePath", "media"];
97
+ const mediaUrl = readStringParam$1(params, firstMediaKey, { trim: false }) ?? readStringParam$1(params, "path", { trim: false }) ?? readStringParam$1(params, lastMediaKey, { trim: false });
98
+ if (action === "upload-file" && !mediaUrl) {
99
+ if (readStringParam$1(params, "buffer", { trim: false })) throw new Error("Use action: \"send\" for base64 buffer attachments; upload-file requires filePath, path, or media.");
100
+ throw new Error("upload-file requires filePath, path, or media.");
101
+ }
97
102
  const content = readStringParam$1(params, "message", {
98
103
  allowEmpty: true,
99
104
  trim: false
100
- });
101
- const explicitComponents = coerceDiscordComponentParam(params.components);
102
- const presentation = explicitComponents == null ? normalizeMessagePresentation(params.presentation) : void 0;
105
+ }) ?? (action === "upload-file" ? readStringParam$1(params, "content", {
106
+ allowEmpty: true,
107
+ trim: false
108
+ }) ?? readStringParam$1(params, "caption", {
109
+ allowEmpty: true,
110
+ trim: false
111
+ }) ?? "" : void 0);
112
+ const explicitComponents = action === "send" ? coerceDiscordComponentParam(params.components) : void 0;
113
+ const presentation = action === "send" && explicitComponents == null ? normalizeMessagePresentation(params.presentation) : void 0;
103
114
  const adaptedPresentation = presentation ? adaptMessagePresentationForChannel({
104
115
  presentation,
105
116
  capabilities: DISCORD_PRESENTATION_CAPABILITIES
@@ -111,9 +122,9 @@ async function dispatchDiscordMessageAction(ctx) {
111
122
  includesMedia: Boolean(mediaUrl)
112
123
  }) ? generatedPresentationComponents : void 0;
113
124
  const presentationFellBack = Boolean(generatedPresentationComponents && !presentationComponents);
114
- const rawComponents = presentationFellBack ? void 0 : explicitComponents ?? presentationComponents ?? buildDiscordInteractiveComponents(normalizeLegacyInteractiveReply(params.interactive));
125
+ const rawComponents = action !== "send" || presentationFellBack ? void 0 : explicitComponents ?? presentationComponents ?? buildDiscordInteractiveComponents(normalizeLegacyInteractiveReply(params.interactive));
115
126
  const components = Boolean(rawComponents) && (typeof rawComponents === "function" || typeof rawComponents === "object") ? rawComponents : void 0;
116
- const rawEmbeds = params.embeds;
127
+ const rawEmbeds = action === "send" ? params.embeds : void 0;
117
128
  const embeds = Array.isArray(rawEmbeds) ? rawEmbeds : void 0;
118
129
  const deliveryContent = presentationFellBack && presentation ? renderMessagePresentationFallbackText({
119
130
  text: content,
@@ -125,63 +136,25 @@ async function dispatchDiscordMessageAction(ctx) {
125
136
  const suppressEmbeds = readBooleanParam(params, "suppressEmbeds");
126
137
  const sessionKey = readStringParam$1(params, "__sessionKey");
127
138
  const agentId = readStringParam$1(params, "__agentId");
128
- const threadName = readStringParam$1(params, "threadName");
129
- const result = await handleDiscordAction({
139
+ const threadName = action === "send" ? readStringParam$1(params, "threadName") : void 0;
140
+ const result = await runAction({
130
141
  action: "sendMessage",
131
- accountId: accountId ?? void 0,
132
142
  to,
133
143
  content: deliveryContent,
134
144
  ...threadName ? { threadName } : {},
135
145
  mediaUrl: mediaUrl ?? void 0,
136
146
  filename: filename ?? void 0,
137
147
  replyTo: replyTo ?? void 0,
138
- components,
139
- embeds,
140
- asVoice,
148
+ ...action === "send" ? {
149
+ components,
150
+ embeds,
151
+ asVoice
152
+ } : {},
141
153
  silent,
142
154
  ...suppressEmbeds === void 0 ? {} : { suppressEmbeds },
143
155
  __sessionKey: sessionKey ?? void 0,
144
156
  __agentId: agentId ?? void 0
145
- }, cfg, actionOptions);
146
- notifyVisibleOutbound(result, to, sessionKey);
147
- return withAdoptedThreadReplyRoute(result, to, sessionKey);
148
- }
149
- if (action === "upload-file") {
150
- const to = readSendTarget();
151
- const mediaUrl = readStringParam$1(params, "filePath", { trim: false }) ?? readStringParam$1(params, "path", { trim: false }) ?? readStringParam$1(params, "media", { trim: false });
152
- if (!mediaUrl) {
153
- if (readStringParam$1(params, "buffer", { trim: false })) throw new Error("Use action: \"send\" for base64 buffer attachments; upload-file requires filePath, path, or media.");
154
- throw new Error("upload-file requires filePath, path, or media.");
155
- }
156
- const content = readStringParam$1(params, "message", {
157
- allowEmpty: true,
158
- trim: false
159
- }) ?? readStringParam$1(params, "content", {
160
- allowEmpty: true,
161
- trim: false
162
- }) ?? readStringParam$1(params, "caption", {
163
- allowEmpty: true,
164
- trim: false
165
157
  });
166
- const filename = readStringParam$1(params, "filename");
167
- const replyTo = readStringParam$1(params, "replyTo");
168
- const silent = readBooleanParam(params, "silent") === true;
169
- const suppressEmbeds = readBooleanParam(params, "suppressEmbeds");
170
- const sessionKey = readStringParam$1(params, "__sessionKey");
171
- const agentId = readStringParam$1(params, "__agentId");
172
- const result = await handleDiscordAction({
173
- action: "sendMessage",
174
- accountId: accountId ?? void 0,
175
- to,
176
- content: content ?? "",
177
- mediaUrl,
178
- filename: filename ?? void 0,
179
- replyTo: replyTo ?? void 0,
180
- silent,
181
- ...suppressEmbeds === void 0 ? {} : { suppressEmbeds },
182
- __sessionKey: sessionKey ?? void 0,
183
- __agentId: agentId ?? void 0
184
- }, cfg, actionOptions);
185
158
  notifyVisibleOutbound(result, to, sessionKey);
186
159
  return withAdoptedThreadReplyRoute(result, to, sessionKey);
187
160
  }
@@ -194,38 +167,35 @@ async function dispatchDiscordMessageAction(ctx) {
194
167
  if (!messageId) throw new Error("messageId required. Provide messageId explicitly or react to the current inbound message.");
195
168
  const emoji = readStringParam$1(params, "emoji", { allowEmpty: true });
196
169
  const remove = readBooleanParam(params, "remove");
197
- return await handleDiscordAction({
170
+ return await runAction({
198
171
  action: "react",
199
- accountId: accountId ?? void 0,
200
172
  channelId: readTarget(),
201
173
  messageId,
202
174
  emoji,
203
175
  remove
204
- }, cfg, actionOptions);
176
+ });
205
177
  }
206
178
  if (action === "reactions") {
207
179
  const messageId = readStringParam$1(params, "messageId", { required: true });
208
180
  const limit = readPositiveIntegerParam$1(params, "limit");
209
- return await handleDiscordAction({
181
+ return await runAction({
210
182
  action: "reactions",
211
- accountId: accountId ?? void 0,
212
183
  channelId: readTarget(),
213
184
  messageId,
214
185
  limit
215
- }, cfg, actionOptions);
186
+ });
216
187
  }
217
188
  if (action === "read") {
218
189
  const limit = readPositiveIntegerParam$1(params, "limit");
219
- return await handleDiscordAction({
190
+ return await runAction({
220
191
  action: "readMessages",
221
- accountId: accountId ?? void 0,
222
192
  channelId: resolveChannelId(),
223
193
  limit,
224
194
  before: readStringParam$1(params, "before"),
225
195
  after: readStringParam$1(params, "after"),
226
196
  around: readStringParam$1(params, "around"),
227
197
  messageId: readStringParam$1(params, "messageId")
228
- }, cfg, actionOptions);
198
+ });
229
199
  }
230
200
  if (action === "edit" || action === "delete") {
231
201
  const messageId = readStringParam$1(params, "messageId", { required: true });
@@ -234,44 +204,40 @@ async function dispatchDiscordMessageAction(ctx) {
234
204
  target,
235
205
  toolContext: ctx.toolContext
236
206
  }) ? readCurrentDiscordTarget(ctx.toolContext) : void 0;
237
- return await handleDiscordAction({
207
+ return await runAction({
238
208
  action: action === "edit" ? "editMessage" : "deleteMessage",
239
- accountId: accountId ?? void 0,
240
209
  channelId: resolveDiscordChannelId(currentDmChannel ?? target),
241
210
  messageId,
242
211
  ...action === "edit" ? { content: params.message } : {}
243
- }, cfg, actionOptions);
212
+ });
244
213
  }
245
214
  if (action === "pin" || action === "unpin" || action === "list-pins") {
246
215
  const messageId = action === "list-pins" ? void 0 : readStringParam$1(params, "messageId", { required: true });
247
- return await handleDiscordAction({
216
+ return await runAction({
248
217
  action: action === "pin" ? "pinMessage" : action === "unpin" ? "unpinMessage" : "listPins",
249
- accountId: accountId ?? void 0,
250
218
  channelId: resolveChannelId(),
251
219
  messageId
252
- }, cfg, actionOptions);
220
+ });
253
221
  }
254
- if (action === "permissions") return await handleDiscordAction({
222
+ if (action === "permissions") return await runAction({
255
223
  action: "permissions",
256
- accountId: accountId ?? void 0,
257
224
  channelId: resolveChannelId()
258
- }, cfg, actionOptions);
225
+ });
259
226
  if (action === "thread-create") {
260
227
  const name = readStringParam$1(params, "threadName", { required: true });
261
228
  const messageId = readStringParam$1(params, "messageId");
262
229
  const content = readStringParam$1(params, "message", { trim: false });
263
230
  const autoArchiveMinutes = readDiscordAutoArchiveDurationParam(params, "autoArchiveMin");
264
231
  const appliedTags = readStringArrayParam$1(params, "appliedTags");
265
- const result = await handleDiscordAction({
232
+ const result = await runAction({
266
233
  action: "threadCreate",
267
- accountId: accountId ?? void 0,
268
234
  channelId: resolveChannelId(),
269
235
  name,
270
236
  messageId,
271
237
  content,
272
238
  autoArchiveMinutes,
273
239
  appliedTags: appliedTags ?? void 0
274
- }, cfg, actionOptions);
240
+ });
275
241
  const details = result.details && typeof result.details === "object" && !Array.isArray(result.details) ? result.details : void 0;
276
242
  if (details?.ok === true) {
277
243
  const threadId = typeof details.thread?.id === "string" ? details.thread.id : void 0;
@@ -288,30 +254,27 @@ async function dispatchDiscordMessageAction(ctx) {
288
254
  }
289
255
  if (action === "sticker") {
290
256
  const to = readStringParam$1(params, "to", { required: true });
291
- const stickerIds = readStringArrayParam$1(params, "stickerId", {
292
- required: true,
293
- label: "sticker-id"
294
- }) ?? [];
295
- const result = await handleDiscordAction({
257
+ const result = await runAction({
296
258
  action: "sticker",
297
- accountId: accountId ?? void 0,
298
259
  to,
299
- stickerIds,
260
+ stickerIds: readStringArrayParam$1(params, "stickerId", {
261
+ required: true,
262
+ label: "sticker-id"
263
+ }) ?? [],
300
264
  content: readStringParam$1(params, "message", { trim: false }),
301
265
  ...readBooleanParam(params, "silent") === true ? { silent: true } : {}
302
- }, cfg, actionOptions);
266
+ });
303
267
  notifyVisibleOutbound(result, to);
304
268
  return result;
305
269
  }
306
- if (action === "set-presence") return await handleDiscordAction({
270
+ if (action === "set-presence") return await runAction({
307
271
  action: "setPresence",
308
- accountId: accountId ?? void 0,
309
272
  status: readStringParam$1(params, "status"),
310
273
  activityType: readStringParam$1(params, "activityType"),
311
274
  activityName: readStringParam$1(params, "activityName"),
312
275
  activityUrl: readStringParam$1(params, "activityUrl"),
313
276
  activityState: readStringParam$1(params, "activityState")
314
- }, cfg, actionOptions);
277
+ });
315
278
  const adminResult = await tryHandleDiscordMessageActionGuildAdmin({
316
279
  ctx,
317
280
  resolveChannelId,
@@ -1,10 +1,50 @@
1
- import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-B8lJfyrA.mjs";
1
+ import { c as readDiscordChannelMoveParams, n as isDiscordModerationAction, o as readDiscordChannelCreateParams, r as readDiscordModerationCommand, s as readDiscordChannelEditParams, t as handleDiscordAction } from "./runtime-FN000lxA.mjs";
2
2
  import "../action-runtime-api.js";
3
- import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-VulUE0yV.mjs";
3
+ import { y as isTrustedRequesterGuildAdminAction } from "./outbound-session-route-zVGxxceg.mjs";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
6
6
  import { readNonNegativeIntegerParam, readPositiveIntegerParam, readStringArrayParam, readStringParam } from "openclaw/plugin-sdk/param-readers";
7
7
  //#region extensions/discord/src/actions/handle-action.guild-admin.ts
8
+ const guildMetadataReads = {
9
+ "member-info": {
10
+ action: "memberInfo",
11
+ requiredParams: ["userId", "guildId"]
12
+ },
13
+ "role-info": {
14
+ action: "roleInfo",
15
+ requiredParams: ["guildId"]
16
+ },
17
+ "channel-info": {
18
+ action: "channelInfo",
19
+ requiredParams: ["channelId"]
20
+ },
21
+ "channel-list": {
22
+ action: "channelList",
23
+ requiredParams: ["guildId"]
24
+ },
25
+ "voice-status": {
26
+ action: "voiceStatus",
27
+ requiredParams: ["guildId", "userId"]
28
+ },
29
+ "event-list": {
30
+ action: "eventList",
31
+ requiredParams: ["guildId"]
32
+ }
33
+ };
34
+ const channelMutation = {
35
+ "channel-create": {
36
+ action: "channelCreate",
37
+ read: readDiscordChannelCreateParams
38
+ },
39
+ "channel-edit": {
40
+ action: "channelEdit",
41
+ read: readDiscordChannelEditParams
42
+ },
43
+ "channel-move": {
44
+ action: "channelMove",
45
+ read: readDiscordChannelMoveParams
46
+ }
47
+ };
8
48
  function readDiscordRequesterSenderId(ctx) {
9
49
  const currentProvider = normalizeOptionalString(ctx.toolContext?.currentChannelProvider);
10
50
  if (currentProvider?.toLowerCase() === "discord") return normalizeOptionalString(ctx.requesterSenderId);
@@ -23,22 +63,13 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
23
63
  const { action, params: actionParams, cfg } = ctx;
24
64
  const accountId = ctx.accountId ?? readStringParam(actionParams, "accountId");
25
65
  const senderUserId = readDiscordRequesterSenderId(ctx);
26
- if (action === "member-info") {
27
- const userId = readStringParam(actionParams, "userId", { required: true });
28
- const guildId = readStringParam(actionParams, "guildId", { required: true });
66
+ const metadataRead = guildMetadataReads[action];
67
+ if (metadataRead) {
68
+ const values = Object.fromEntries(metadataRead.requiredParams.map((key) => [key, readStringParam(actionParams, key, { required: true })]));
29
69
  return await handleDiscordAction({
30
- action: "memberInfo",
70
+ action: metadataRead.action,
31
71
  accountId: accountId ?? void 0,
32
- guildId,
33
- userId
34
- }, cfg, readPolicyOptions);
35
- }
36
- if (action === "role-info") {
37
- const guildId = readStringParam(actionParams, "guildId", { required: true });
38
- return await handleDiscordAction({
39
- action: "roleInfo",
40
- accountId: accountId ?? void 0,
41
- guildId
72
+ ...values
42
73
  }, cfg, readPolicyOptions);
43
74
  }
44
75
  if (action === "emoji-list") {
@@ -102,43 +133,12 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
102
133
  ...senderParam(senderUserId)
103
134
  }, cfg);
104
135
  }
105
- if (action === "channel-info") {
106
- const channelId = readStringParam(actionParams, "channelId", { required: true });
107
- return await handleDiscordAction({
108
- action: "channelInfo",
109
- accountId: accountId ?? void 0,
110
- channelId
111
- }, cfg, readPolicyOptions);
112
- }
113
- if (action === "channel-list") {
114
- const guildId = readStringParam(actionParams, "guildId", { required: true });
115
- return await handleDiscordAction({
116
- action: "channelList",
117
- accountId: accountId ?? void 0,
118
- guildId
119
- }, cfg, readPolicyOptions);
120
- }
121
- if (action === "channel-create") {
122
- const guildId = readStringParam(actionParams, "guildId", { required: true });
123
- return await handleDiscordAction({
124
- action: "channelCreate",
125
- accountId: accountId ?? void 0,
126
- ...readDiscordChannelCreateParams({
127
- ...actionParams,
128
- guildId
129
- }),
130
- ...senderParam(senderUserId)
131
- }, cfg);
132
- }
133
- if (action === "channel-edit") {
134
- const channelId = readStringParam(actionParams, "channelId", { required: true });
136
+ if (action === "channel-create" || action === "channel-edit" || action === "channel-move") {
137
+ const mutation = channelMutation[action];
135
138
  return await handleDiscordAction({
136
- action: "channelEdit",
139
+ action: mutation.action,
137
140
  accountId: accountId ?? void 0,
138
- ...readDiscordChannelEditParams({
139
- ...actionParams,
140
- channelId
141
- }),
141
+ ...mutation.read(actionParams),
142
142
  ...senderParam(senderUserId)
143
143
  }, cfg);
144
144
  }
@@ -151,73 +151,21 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
151
151
  ...senderParam(senderUserId)
152
152
  }, cfg);
153
153
  }
154
- if (action === "channel-move") {
155
- const guildId = readStringParam(actionParams, "guildId", { required: true });
156
- const channelId = readStringParam(actionParams, "channelId", { required: true });
154
+ if (action === "category-create" || action === "category-edit" || action === "category-delete") {
155
+ const creating = action === "category-create";
156
+ const categoryId = readStringParam(actionParams, creating ? "guildId" : "categoryId", { required: true });
157
+ const fields = action === "category-delete" ? {} : {
158
+ name: readStringParam(actionParams, "name", { required: creating }),
159
+ position: readNonNegativeIntegerParam(actionParams, "position")
160
+ };
157
161
  return await handleDiscordAction({
158
- action: "channelMove",
162
+ action: creating ? "categoryCreate" : action === "category-edit" ? "categoryEdit" : "categoryDelete",
159
163
  accountId: accountId ?? void 0,
160
- ...readDiscordChannelMoveParams({
161
- ...actionParams,
162
- guildId,
163
- channelId
164
- }),
164
+ ...creating ? { guildId: categoryId } : { categoryId },
165
+ ...fields,
165
166
  ...senderParam(senderUserId)
166
167
  }, cfg);
167
168
  }
168
- if (action === "category-create") {
169
- const guildId = readStringParam(actionParams, "guildId", { required: true });
170
- const name = readStringParam(actionParams, "name", { required: true });
171
- const position = readNonNegativeIntegerParam(actionParams, "position");
172
- return await handleDiscordAction({
173
- action: "categoryCreate",
174
- accountId: accountId ?? void 0,
175
- guildId,
176
- name,
177
- position: position ?? void 0,
178
- ...senderParam(senderUserId)
179
- }, cfg);
180
- }
181
- if (action === "category-edit") {
182
- const categoryId = readStringParam(actionParams, "categoryId", { required: true });
183
- const name = readStringParam(actionParams, "name");
184
- const position = readNonNegativeIntegerParam(actionParams, "position");
185
- return await handleDiscordAction({
186
- action: "categoryEdit",
187
- accountId: accountId ?? void 0,
188
- categoryId,
189
- name: name ?? void 0,
190
- position: position ?? void 0,
191
- ...senderParam(senderUserId)
192
- }, cfg);
193
- }
194
- if (action === "category-delete") {
195
- const categoryId = readStringParam(actionParams, "categoryId", { required: true });
196
- return await handleDiscordAction({
197
- action: "categoryDelete",
198
- accountId: accountId ?? void 0,
199
- categoryId,
200
- ...senderParam(senderUserId)
201
- }, cfg);
202
- }
203
- if (action === "voice-status") {
204
- const guildId = readStringParam(actionParams, "guildId", { required: true });
205
- const userId = readStringParam(actionParams, "userId", { required: true });
206
- return await handleDiscordAction({
207
- action: "voiceStatus",
208
- accountId: accountId ?? void 0,
209
- guildId,
210
- userId
211
- }, cfg, readPolicyOptions);
212
- }
213
- if (action === "event-list") {
214
- const guildId = readStringParam(actionParams, "guildId", { required: true });
215
- return await handleDiscordAction({
216
- action: "eventList",
217
- accountId: accountId ?? void 0,
218
- guildId
219
- }, cfg, readPolicyOptions);
220
- }
221
169
  if (action === "event-create") {
222
170
  const guildId = readStringParam(actionParams, "guildId", { required: true });
223
171
  const name = readStringParam(actionParams, "eventName", { required: true });
@@ -253,14 +201,8 @@ async function tryHandleDiscordMessageActionGuildAdmin(params) {
253
201
  })
254
202
  });
255
203
  return await handleDiscordAction({
256
- action: moderation.action,
204
+ ...moderation,
257
205
  accountId: accountId ?? void 0,
258
- guildId: moderation.guildId,
259
- userId: moderation.userId,
260
- durationMinutes: moderation.durationMinutes,
261
- until: moderation.until,
262
- reason: moderation.reason,
263
- deleteMessageDays: moderation.deleteMessageDays,
264
206
  senderUserId
265
207
  }, cfg);
266
208
  }
@@ -1,4 +1,4 @@
1
- import { i as normalizeDiscordAllowList } from "./channel-type-DKnjV1XW.mjs";
1
+ import { i as normalizeDiscordAllowList } from "./channel-type-DRCrEMss.mjs";
2
2
  import { defineStableChannelIngressIdentity } from "openclaw/plugin-sdk/channel-ingress-runtime";
3
3
  //#region extensions/discord/src/monitor/ingress-identity.ts
4
4
  const DISCORD_ALLOW_LIST_PREFIXES = [
@@ -20,8 +20,7 @@ function normalizeDiscordIdEntry(entry) {
20
20
  function normalizeDiscordNameEntry(entry) {
21
21
  const text = entry.trim();
22
22
  if (!text || text === "*" || normalizeDiscordIdEntry(text) || /#\d{4}$/.test(text)) return null;
23
- const nameSlug = normalizeDiscordAllowList([text], DISCORD_ALLOW_LIST_PREFIXES)?.names.values().next().value;
24
- return typeof nameSlug === "string" && nameSlug ? nameSlug : null;
23
+ return normalizeDiscordNameSubject(text);
25
24
  }
26
25
  function normalizeDiscordTagEntry(entry) {
27
26
  const text = entry.trim();