@openclaw/discord 2026.7.2-beta.7 → 2026.8.1-beta.3

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 (114) hide show
  1. package/dist/{account-inspect-SXiCBCgP.js → account-inspect-D5xmUpnj.js} +49 -43
  2. package/dist/account-inspect-api.js +1 -1
  3. package/dist/accounts-DNl-oCEw.js +371 -0
  4. package/dist/action-runtime-api.js +1 -1
  5. package/dist/{active-turn-thread-route-MlKWp8RD.js → active-turn-thread-route-fmHl1HNd.js} +9 -11
  6. package/dist/{activities-api-DTKsuDxf.js → activities-api-KCBAmWxD.js} +133 -175
  7. package/dist/activities-api.js +1 -1
  8. package/dist/{allow-list-DzKrtfah.js → allow-list-BDMimASD.js} +2 -3
  9. package/dist/{api-DnrK9gML.js → api-DNVbJyEy.js} +7 -2
  10. package/dist/api.js +18 -18
  11. package/dist/{approval-handler.runtime-HymvFTYn.js → approval-handler.runtime-B12RCYr8.js} +6 -6
  12. package/dist/{approval-message-safety-DEyKVsAw.js → approval-message-safety-XGFPbDoI.js} +89 -3
  13. package/dist/{audit-CjsrabP8.js → audit-Yc7eZDd6.js} +5 -5
  14. package/dist/{channel-actions-uXFTJX3o.js → channel-actions-Dr2QI8Bf.js} +11 -7
  15. package/dist/{channel-actions.runtime-CIYU90sl.js → channel-actions.runtime-CODTvo7c.js} +99 -97
  16. package/dist/{channel-vKa-76xY.js → channel-cXYzGc4L.js} +102 -104
  17. package/dist/channel-config-api.js +1 -1
  18. package/dist/channel-plugin-api.js +1 -1
  19. package/dist/{channel.setup-CmcwZ_qd.js → channel.setup-CSiwnMgs.js} +16 -54
  20. package/dist/{outbound-session-route-H-HoyH5U.js → components-ezGKo_Yh.js} +69 -142
  21. package/dist/{config-schema-WHRQcY19.js → config-schema-DC5kDtQ5.js} +42 -11
  22. package/dist/conversation-binding-route-D6rCQ5S0.js +43 -0
  23. package/dist/{directory-config-D_LojtCe.js → directory-config-XyCfoqLg.js} +2 -2
  24. package/dist/directory-contract-api.js +1 -1
  25. package/dist/{directory-live-Bw5Ephzv.js → directory-live-Df0NbFJB.js} +7 -4
  26. package/dist/{doctor-Bc4S1qyd.js → doctor-DYY31GrO.js} +34 -13
  27. package/dist/{doctor-contract-CCFMIDk9.js → doctor-contract-DsWvKIXF.js} +2 -3
  28. package/dist/doctor-contract-api.js +147 -2
  29. package/dist/{handle-action.guild-admin-D6VRRW-C.js → handle-action.guild-admin-6Tvvinsa.js} +4 -7
  30. package/dist/{inbound-event-delivery-CEPlt2uz.js → inbound-event-delivery-De2qxTrP.js} +4 -25
  31. package/dist/index.js +5 -4
  32. package/dist/{message-handler-CeiSulIw.js → message-handler-B61q5MOF.js} +118 -33
  33. package/dist/{message-handler.preflight-DibgQFf2.js → message-handler.preflight-Bzg_Hawz.js} +75 -61
  34. package/dist/{message-handler.process-Dnc_oz9y.js → message-handler.process--4_712Ec.js} +236 -296
  35. package/dist/{message-utils-BgTwT_q7.js → message-utils-BXLLnFl6.js} +34 -35
  36. package/dist/{model-picker-preference-primitives-D25pnCOu.js → model-picker-preference-primitives-BHT1LkR_.js} +3 -3
  37. package/dist/{outbound-adapter-DtE-i2OJ.js → outbound-adapter-DxHTOqiN.js} +157 -68
  38. package/dist/{outbound-components-C7GVyfPh.js → outbound-components-B2PL0ooH.js} +3 -3
  39. package/dist/owner-access-Bg41VzAf.js +107 -0
  40. package/dist/{pluralkit-CD4B11JB.js → pluralkit-dUl4v1X3.js} +1 -1
  41. package/dist/{preflight-audio-BjnQZ5yS.js → preflight-audio-DrnqFA8U.js} +22 -28
  42. package/dist/{probe-BeWKhjqX.js → probe-BTdtVRwU.js} +37 -13
  43. package/dist/probe.runtime-Dq5-PRKT.js +2 -0
  44. package/dist/{provider-DfQJX3z5.js → provider-DlK_ynqt.js} +1131 -2021
  45. package/dist/{provider-session.runtime-Bo88k0pV.js → provider-session.runtime-CvvphHvs.js} +3 -3
  46. package/dist/provider.runtime-CzKGRiAF.js +2 -0
  47. package/dist/realtime-session.runtime-ysbMG8v7.js +1351 -0
  48. package/dist/{resolve-allowlist-common-DHERApxi.js → resolve-allowlist-common-DIVXbD1P.js} +3 -3
  49. package/dist/{resolve-channels-BjepAj8b.js → resolve-channels-CGeUoIqb.js} +4 -4
  50. package/dist/{resolve-users-Bc28htgt.js → resolve-users-BtKxLUZv.js} +3 -3
  51. package/dist/{chunk-DX4jpFQP.js → retry-DNsVTeTo.js} +308 -131
  52. package/dist/{runtime-BmW_j_hl.js → runtime-CQovMsH3.js} +12 -15
  53. package/dist/{runtime-_aRC6V2s.js → runtime-D71_VFLr.js} +49 -58
  54. package/dist/runtime-api.actions.js +2 -2
  55. package/dist/runtime-api.js +23 -23
  56. package/dist/runtime-api.lookup.js +5 -5
  57. package/dist/runtime-api.monitor-CzeTYF32.js +6 -0
  58. package/dist/runtime-api.monitor.js +6 -5
  59. package/dist/runtime-api.send.js +6 -6
  60. package/dist/runtime-api.threads.js +5 -6
  61. package/dist/sdk-runtime-37OU6_Yh.js +369 -0
  62. package/dist/{secret-config-contract-B1akrlyY.js → secret-config-contract-B3i6WxV5.js} +53 -25
  63. package/dist/secret-contract-api.js +1 -1
  64. package/dist/security-audit-contract-api.js +1 -1
  65. package/dist/{security-audit.runtime-CPN0xFYz.js → security-audit.runtime-BVKF9VtY.js} +1 -1
  66. package/dist/{send-CdkZ6zeW.js → send-rQIffSYu.js} +180 -91
  67. package/dist/{send.components-5uqwkjgE.js → send.components-ChK1wS7w.js} +32 -46
  68. package/dist/{send.outbound-D-80Ej-t.js → send.outbound-HIkgji_7.js} +57 -34
  69. package/dist/{send.reactions-CtlmGd_o.js → send.reactions-gmJ6yFPo.js} +14 -21
  70. package/dist/{send.receipt-CuwRrpFz.js → send.receipt-Cnhoautb.js} +29 -1
  71. package/dist/{send.shared-jpvAG_u6.js → send.shared-B3fpaLWJ.js} +112 -181
  72. package/dist/{sender-identity-mG_zsdox.js → sender-identity-BJtfyise.js} +1 -1
  73. package/dist/setup-entry.js +0 -5
  74. package/dist/setup-plugin-api.js +1 -1
  75. package/dist/{shared-CXF1tup1.js → shared-CaAaoksy.js} +27 -23
  76. package/dist/subagent-hooks-CNT2ZJTJ.js +49 -0
  77. package/dist/subagent-hooks-api.js +2 -6
  78. package/dist/subagent-progress-FPLqBY1s.js +110 -0
  79. package/dist/{system-events-DdUqf91B.js → system-events-Nuwoq_au.js} +2 -2
  80. package/dist/{target-resolver-C3s_2m0t.js → target-resolver-DIXShHaZ.js} +3 -3
  81. package/dist/targets-B2pf49zc.js +3 -0
  82. package/dist/{thread-bindings-C-M-ly7P.js → thread-bindings-VlymUnbz.js} +29 -28
  83. package/dist/{thread-bindings.manager-DYvSlrva.js → thread-bindings.manager-CngsgErq.js} +258 -29
  84. package/dist/{thread-bindings.session-updates-DAIlp7Px.js → thread-bindings.session-updates-CJb-BpPL.js} +1 -1
  85. package/dist/{thread-bindings.state-Cgi5uRn-.js → thread-bindings.state-D8OMdk4O.js} +3 -16
  86. package/dist/threading-DU6pgeGm.js +456 -0
  87. package/dist/transcripts-source-DeIMNbRh.js +265 -0
  88. package/dist/transcripts-source-api.js +7 -2
  89. package/dist/{typing--Mzo2kM7.js → typing-oLiS5Z13.js} +1 -1
  90. package/dist/voice-runtime-CjNFaynA.js +2549 -0
  91. package/openclaw.plugin.json +215 -25
  92. package/package.json +15 -11
  93. package/skills/discord/SKILL.md +22 -115
  94. package/dist/accounts-DJTf1LtA.js +0 -219
  95. package/dist/channel-api-CAJ0wMoV.js +0 -21
  96. package/dist/legacy-state-migrations-api.js +0 -138
  97. package/dist/manager.runtime-Bjav3pfC.js +0 -3655
  98. package/dist/preflight-audio.runtime-CoCXMM8r.js +0 -7
  99. package/dist/probe.runtime-DqFGFMbZ.js +0 -2
  100. package/dist/provider.runtime-Cy7XZmyh.js +0 -2
  101. package/dist/runtime-api.monitor-CCRubd3-.js +0 -5
  102. package/dist/session-binding-contract-api.js +0 -2
  103. package/dist/subagent-hooks-Dxy7Fmnq.js +0 -120
  104. package/dist/subagent-progress-DI3sYLLo.js +0 -664
  105. package/dist/targets-Dv_RN7vT.js +0 -3
  106. package/dist/thread-bindings.discord-api-BoDNqamb.js +0 -246
  107. package/dist/transcripts-source-DIKGsTGT.js +0 -123
  108. package/node_modules/p-map/index.d.ts +0 -155
  109. package/node_modules/p-map/index.js +0 -285
  110. package/node_modules/p-map/license +0 -9
  111. package/node_modules/p-map/package.json +0 -57
  112. package/node_modules/p-map/readme.md +0 -190
  113. package/dist/{audit-core-xwjIczO0.js → audit-core-BCX8UeFH.js} +1 -1
  114. package/dist/{security-audit-jGnJF__m.js → security-audit-BfJhAXZp.js} +1 -1
@@ -0,0 +1,265 @@
1
+ import { en as __exportAll } from "./retry-DNsVTeTo.js";
2
+ import { a as listEnabledDiscordAccounts, c as resolveDiscordAccount } from "./accounts-DNl-oCEw.js";
3
+ import { n as resolveDiscordVoiceEnabled, r as authorizeDiscordVoiceIngress, t as resolveDiscordVoiceAccess } from "./owner-access-Bg41VzAf.js";
4
+ import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
5
+ import { summarizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
6
+ import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
7
+ //#region extensions/discord/src/voice/transcripts-source.ts
8
+ var transcripts_source_exports = /* @__PURE__ */ __exportAll({
9
+ discordVoiceTranscriptsSourceProvider: () => discordVoiceTranscriptsSourceProvider,
10
+ setDiscordTranscriptsVoiceManager: () => setDiscordTranscriptsVoiceManager
11
+ });
12
+ const managersByAccountId = /* @__PURE__ */ new Map();
13
+ const managerWaiters = /* @__PURE__ */ new Set();
14
+ const ACCOUNT_ID_ERROR_MAX_CHARS = 64;
15
+ const ACCOUNT_ID_ERROR_MAX_ENTRIES = 4;
16
+ function formatAccountIdForError(accountId) {
17
+ return JSON.stringify(truncateUtf16Safe(accountId, ACCOUNT_ID_ERROR_MAX_CHARS));
18
+ }
19
+ function summarizeAccountIdsForError(accountIds) {
20
+ return summarizeStringEntries({
21
+ entries: accountIds.map(formatAccountIdForError),
22
+ limit: ACCOUNT_ID_ERROR_MAX_ENTRIES
23
+ });
24
+ }
25
+ function setDiscordTranscriptsVoiceManager(params) {
26
+ if (params.manager) {
27
+ managersByAccountId.set(params.accountId, params.manager);
28
+ for (const waiter of managerWaiters) if (!waiter.accountId || waiter.accountId === params.accountId) waiter.resolve();
29
+ } else managersByAccountId.delete(params.accountId);
30
+ }
31
+ const resolveDiscordTranscriptsAccountId = ({ cfg, source }) => {
32
+ const requestedAccountId = source.accountId?.trim();
33
+ const configuredVoiceAccounts = cfg ? listEnabledDiscordAccounts(cfg).filter((account) => resolveDiscordVoiceEnabled(account.config.voice)) : [];
34
+ const capableAccountIds = (cfg ? configuredVoiceAccounts.filter((account) => account.tokenStatus === "available").map((account) => account.accountId) : [...managersByAccountId.keys()]).toSorted();
35
+ if (requestedAccountId) {
36
+ if (!cfg || capableAccountIds.includes(requestedAccountId)) return {
37
+ ok: true,
38
+ value: requestedAccountId
39
+ };
40
+ if (resolveDiscordAccount({
41
+ cfg,
42
+ accountId: requestedAccountId
43
+ }).tokenStatus === "configured_unavailable") return {
44
+ ok: false,
45
+ error: `Discord account ${formatAccountIdForError(requestedAccountId)} has configured credentials that are unavailable in this runtime; resolve its SecretRef before using this account.`
46
+ };
47
+ return {
48
+ ok: false,
49
+ error: `Discord account ${formatAccountIdForError(requestedAccountId)} is not enabled for voice.`
50
+ };
51
+ }
52
+ if (capableAccountIds.length === 1) return {
53
+ ok: true,
54
+ value: capableAccountIds[0]
55
+ };
56
+ if (capableAccountIds.length === 0) return {
57
+ ok: false,
58
+ error: "No Discord account has available credentials and voice enabled; configure credentials and enable voice for an account."
59
+ };
60
+ const configuredDefaultAccountId = cfg?.channels?.discord?.defaultAccount?.trim();
61
+ if (configuredDefaultAccountId) {
62
+ const normalizedDefaultAccountId = normalizeAccountId(configuredDefaultAccountId);
63
+ if (capableAccountIds.includes(normalizedDefaultAccountId)) return {
64
+ ok: true,
65
+ value: normalizedDefaultAccountId
66
+ };
67
+ }
68
+ if (capableAccountIds.includes(DEFAULT_ACCOUNT_ID)) return {
69
+ ok: true,
70
+ value: DEFAULT_ACCOUNT_ID
71
+ };
72
+ return {
73
+ ok: false,
74
+ error: `Multiple Discord accounts are enabled for voice (${summarizeAccountIdsForError(capableAccountIds)}); specify accountId.`
75
+ };
76
+ };
77
+ async function waitForManager(request) {
78
+ const accountResolution = resolveDiscordTranscriptsAccountId({
79
+ cfg: request.cfg,
80
+ source: request.session.source
81
+ });
82
+ if (!accountResolution.ok) return accountResolution;
83
+ const accountId = accountResolution.value;
84
+ const existing = accountId ? managersByAccountId.get(accountId) : void 0;
85
+ if (existing) return {
86
+ ok: true,
87
+ value: existing
88
+ };
89
+ if (request.abortSignal?.aborted) return {
90
+ ok: true,
91
+ value: void 0
92
+ };
93
+ const startupWaitMs = request.startupWaitMs ?? 0;
94
+ if (startupWaitMs <= 0) return {
95
+ ok: true,
96
+ value: void 0
97
+ };
98
+ await new Promise((resolve) => {
99
+ const waiter = {
100
+ accountId,
101
+ resolve: () => {
102
+ clearTimeout(timer);
103
+ request.abortSignal?.removeEventListener("abort", waiter.resolve);
104
+ managerWaiters.delete(waiter);
105
+ resolve();
106
+ }
107
+ };
108
+ const timer = setTimeout(waiter.resolve, startupWaitMs);
109
+ timer.unref?.();
110
+ request.abortSignal?.addEventListener("abort", waiter.resolve, { once: true });
111
+ managerWaiters.add(waiter);
112
+ });
113
+ if (request.abortSignal?.aborted) return {
114
+ ok: true,
115
+ value: void 0
116
+ };
117
+ return {
118
+ ok: true,
119
+ value: accountId ? managersByAccountId.get(accountId) : void 0
120
+ };
121
+ }
122
+ const discordVoiceTranscriptsSourceProvider = {
123
+ id: "discord-voice",
124
+ aliases: ["discord"],
125
+ accessControl: {
126
+ channelId: "discord",
127
+ resolveAccountId: resolveDiscordTranscriptsAccountId,
128
+ async authorize({ caller, cfg, source }) {
129
+ if (caller.kind === "operator") return {
130
+ ok: true,
131
+ value: void 0
132
+ };
133
+ const guildId = source.guildId?.trim();
134
+ const channelId = source.channelId?.trim();
135
+ const callerAccountId = caller.accountId?.trim();
136
+ const sourceAccountId = source.accountId?.trim();
137
+ if (caller.channel !== "discord" || !cfg || !callerAccountId || sourceAccountId !== callerAccountId || !guildId || !channelId || caller.groupSpace !== guildId) return {
138
+ ok: false,
139
+ error: "You are not authorized to use this command."
140
+ };
141
+ const target = await managersByAccountId.get(callerAccountId)?.resolveAccessTarget({
142
+ guildId,
143
+ channelId
144
+ });
145
+ if (!target) return {
146
+ ok: false,
147
+ error: "Discord voice access target is unavailable."
148
+ };
149
+ const account = resolveDiscordAccount({
150
+ cfg,
151
+ accountId: callerAccountId
152
+ });
153
+ const access = await authorizeDiscordVoiceIngress({
154
+ cfg,
155
+ discordConfig: account.config,
156
+ accountId: account.accountId,
157
+ guild: target.guild,
158
+ guildId,
159
+ channelId,
160
+ ...target.channelName ? { channelName: target.channelName } : {},
161
+ channelSlug: target.channelSlug,
162
+ ...target.parentId ? { parentId: target.parentId } : {},
163
+ ...target.parentName ? { parentName: target.parentName } : {},
164
+ ...target.parentSlug ? { parentSlug: target.parentSlug } : {},
165
+ scope: target.scope,
166
+ memberRoleIds: [...caller.roleIds],
167
+ admissionAllowFrom: resolveDiscordVoiceAccess({
168
+ cfg,
169
+ discordConfig: account.config,
170
+ accountId: account.accountId
171
+ }).admissionAllowFrom,
172
+ sender: { id: caller.senderId }
173
+ });
174
+ return access.ok ? {
175
+ ok: true,
176
+ value: void 0
177
+ } : {
178
+ ok: false,
179
+ error: access.message
180
+ };
181
+ }
182
+ },
183
+ name: "Discord Voice",
184
+ sourceKinds: ["live-audio"],
185
+ async start(request) {
186
+ const managerResolution = await waitForManager(request);
187
+ if (!managerResolution.ok) return managerResolution;
188
+ const manager = managerResolution.value;
189
+ if (!manager) return {
190
+ ok: false,
191
+ error: "Discord voice manager is not available."
192
+ };
193
+ if (request.abortSignal?.aborted) return {
194
+ ok: false,
195
+ error: "Discord transcripts start aborted."
196
+ };
197
+ const guildId = request.session.source.guildId?.trim();
198
+ const channelId = request.session.source.channelId?.trim();
199
+ if (!guildId || !channelId) return {
200
+ ok: false,
201
+ error: "Discord transcripts require guildId and channelId."
202
+ };
203
+ const joined = await manager.join({
204
+ guildId,
205
+ channelId
206
+ }, { transcripts: {
207
+ sessionId: request.session.sessionId,
208
+ onUtterance: request.onUtterance
209
+ } });
210
+ if (!joined.ok) return {
211
+ ok: false,
212
+ error: joined.message
213
+ };
214
+ return {
215
+ ok: true,
216
+ session: request.session
217
+ };
218
+ },
219
+ async stop(request) {
220
+ const accountId = request.source.accountId?.trim();
221
+ if (!accountId) return {
222
+ ok: false,
223
+ error: "Discord transcripts require accountId to stop a voice session."
224
+ };
225
+ const manager = managersByAccountId.get(accountId);
226
+ if (!manager) return {
227
+ ok: false,
228
+ error: "Discord voice manager is not available."
229
+ };
230
+ const guildId = request.source.guildId?.trim();
231
+ if (!guildId) return {
232
+ ok: false,
233
+ error: "Discord transcripts require guildId."
234
+ };
235
+ const result = await manager.leave({
236
+ guildId,
237
+ channelId: request.source.channelId
238
+ }, { transcriptsSessionId: request.sessionId });
239
+ if (!result.ok) return {
240
+ ok: false,
241
+ error: result.message
242
+ };
243
+ return {
244
+ ok: true,
245
+ sessionId: request.sessionId,
246
+ stoppedAt: (/* @__PURE__ */ new Date()).toISOString()
247
+ };
248
+ },
249
+ async status(source) {
250
+ const accountId = source.accountId?.trim();
251
+ if (!accountId) return [];
252
+ return managersByAccountId.get(accountId)?.status().map((entry) => ({
253
+ active: entry.ok,
254
+ message: entry.message,
255
+ source: {
256
+ providerId: "discord-voice",
257
+ accountId,
258
+ guildId: entry.guildId,
259
+ channelId: entry.channelId
260
+ }
261
+ })) ?? [];
262
+ }
263
+ };
264
+ //#endregion
265
+ export { transcripts_source_exports as n, discordVoiceTranscriptsSourceProvider as t };
@@ -1,2 +1,7 @@
1
- import { t as discordVoiceTranscriptsSourceProvider } from "./transcripts-source-DIKGsTGT.js";
2
- export { discordVoiceTranscriptsSourceProvider };
1
+ import { t as discordVoiceTranscriptsSourceProvider } from "./transcripts-source-DeIMNbRh.js";
2
+ //#region extensions/discord/transcripts-source-api.ts
3
+ function registerDiscordTranscriptSourceProvider(api) {
4
+ api.registerTranscriptSourceProvider(discordVoiceTranscriptsSourceProvider);
5
+ }
6
+ //#endregion
7
+ export { registerDiscordTranscriptSourceProvider };
@@ -1,4 +1,4 @@
1
- import { Dt as sendChannelTyping, Yt as __exportAll } from "./chunk-DX4jpFQP.js";
1
+ import { Mt as sendChannelTyping, en as __exportAll } from "./retry-DNsVTeTo.js";
2
2
  import { c as raceWithTimeout } from "./timeouts-B9cy6RvQ.js";
3
3
  //#region extensions/discord/src/monitor/typing.ts
4
4
  var typing_exports = /* @__PURE__ */ __exportAll({ sendTyping: () => sendTyping });