@kodelyth/discord 2026.5.39 → 2026.6.1

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 (126) hide show
  1. package/dist/account-inspect-Dqw-enky.js +81 -0
  2. package/dist/account-inspect-api.js +10 -0
  3. package/dist/accounts-B7OBFePq.js +224 -0
  4. package/dist/action-runtime-api.js +2 -0
  5. package/dist/agent-components.runtime-DVY_1VB4.js +4 -0
  6. package/dist/allow-list-B0s7evD7.js +354 -0
  7. package/dist/api-CXAcv9nZ.js +130 -0
  8. package/dist/api.js +23 -0
  9. package/dist/approval-handler.runtime-B9xUAF3n.js +426 -0
  10. package/dist/audit-DoiK49WO.js +24 -0
  11. package/dist/audit-core-BGrq3G7r.js +105 -0
  12. package/dist/channel-U_aeoFwW.js +795 -0
  13. package/dist/channel-actions-BxEBnEuv.js +173 -0
  14. package/dist/channel-actions.runtime-CPtpH-yl.js +263 -0
  15. package/dist/channel-api-BfjklLby.js +21 -0
  16. package/dist/channel-config-api.js +2 -0
  17. package/dist/channel-plugin-api.js +2 -0
  18. package/dist/channel.setup-BUSC0apv.js +337 -0
  19. package/dist/components-luonoe13.js +909 -0
  20. package/dist/config-api-DSYGqaLQ.js +2 -0
  21. package/dist/config-schema-DIqJBGwC.js +357 -0
  22. package/dist/configured-state.js +6 -0
  23. package/dist/contract-api.js +8 -0
  24. package/dist/conversation-identity-DXAm0_Mk.js +270 -0
  25. package/dist/directory-config-CYbuMmPS.js +49 -0
  26. package/dist/directory-contract-api.js +2 -0
  27. package/dist/directory-live-DX4dLRpJ.js +159 -0
  28. package/dist/doctor-bbKSvGVD.js +244 -0
  29. package/dist/doctor-contract-Btjt6NJD.js +383 -0
  30. package/dist/doctor-contract-api.js +2 -0
  31. package/dist/gateway-registry-BKSpa4GB.js +74 -0
  32. package/dist/handle-action.guild-admin-B5BArS2n.js +286 -0
  33. package/dist/inbound-context-WAOqhGlT.js +48 -0
  34. package/dist/inbound-event-delivery-C-1Ji3WP.js +65 -0
  35. package/dist/index.js +26 -0
  36. package/dist/manager.runtime-DXHynKE4.js +2356 -0
  37. package/dist/message-handler-mXzc3tA_.js +381 -0
  38. package/dist/message-handler.preflight-BPD1a347.js +1113 -0
  39. package/dist/message-handler.process-GUa3aV8z.js +1438 -0
  40. package/dist/message-utils-dUbem16p.js +549 -0
  41. package/dist/outbound-adapter-C18OAc1y.js +536 -0
  42. package/dist/pluralkit-D1Q2x0w5.js +22 -0
  43. package/dist/preflight-audio-CZtpWcIm.js +72 -0
  44. package/dist/preflight-audio.runtime-Brx_0_xW.js +7 -0
  45. package/dist/preview-streaming-D_slNIiO.js +8 -0
  46. package/dist/probe-D--Ca4JF.js +139 -0
  47. package/dist/probe.runtime-DQBchZzv.js +2 -0
  48. package/dist/provider-B2-31CIT.js +9565 -0
  49. package/dist/provider-session.runtime-BwzzSsrH.js +6 -0
  50. package/dist/provider.runtime-CP3oHLls.js +2 -0
  51. package/dist/resolve-allowlist-common-CqxPLcJO.js +34 -0
  52. package/dist/resolve-channels-0LX4pUbB.js +265 -0
  53. package/dist/resolve-users-CztOv0Qs.js +120 -0
  54. package/dist/runtime-DUaw66V_.js +1073 -0
  55. package/dist/runtime-api.actions.js +3 -0
  56. package/dist/runtime-api.js +30 -0
  57. package/dist/runtime-api.lookup.js +7 -0
  58. package/dist/runtime-api.monitor-CvVKvEXW.js +5 -0
  59. package/dist/runtime-api.monitor.js +8 -0
  60. package/dist/runtime-api.send.js +6 -0
  61. package/dist/runtime-api.threads.js +6 -0
  62. package/dist/runtime-fC6f4UF2.js +8 -0
  63. package/dist/runtime-setter-api.js +2 -0
  64. package/dist/secret-config-contract-B6WW5V88.js +115 -0
  65. package/dist/secret-contract-api.js +2 -0
  66. package/dist/security-audit-CnyIQKz6.js +120 -0
  67. package/dist/security-audit-contract-api.js +2 -0
  68. package/dist/security-audit.runtime-CQSkjNLu.js +2 -0
  69. package/dist/security-contract-DLvYOgLM.js +26 -0
  70. package/dist/security-contract-api.js +2 -0
  71. package/dist/security-doctor-DepqtNCI.js +18 -0
  72. package/dist/send-DCtPCHGk.js +881 -0
  73. package/dist/send.components-Bcgxvm52.js +474 -0
  74. package/dist/send.outbound-S9t0UuHc.js +330 -0
  75. package/dist/send.receipt-CDn3GBWC.js +3119 -0
  76. package/dist/send.shared-D4iBnAmn.js +669 -0
  77. package/dist/sender-identity-CxCe3_1a.js +43 -0
  78. package/dist/session-contract-Dwhw3RTY.js +6 -0
  79. package/dist/session-key-api.js +2 -0
  80. package/dist/session-key-normalization-CP8dPUid.js +23 -0
  81. package/dist/setup-entry.js +11 -0
  82. package/dist/setup-plugin-api.js +2 -0
  83. package/dist/shared-AIlvuZXt.js +171 -0
  84. package/dist/subagent-hooks-8bK-mgiU.js +120 -0
  85. package/dist/subagent-hooks-api.js +22 -0
  86. package/dist/system-events-Ba1TklaL.js +34 -0
  87. package/dist/target-resolver-BrtFQtoK.js +82 -0
  88. package/dist/targets-DWLLZE2l.js +3 -0
  89. package/dist/test-api.js +45 -0
  90. package/dist/thread-binding-api.js +4 -0
  91. package/dist/thread-bindings-9aKRmZv0.js +255 -0
  92. package/dist/thread-bindings.discord-api-ssGH5wc2.js +244 -0
  93. package/dist/thread-bindings.manager-0YBHGemk.js +534 -0
  94. package/dist/thread-bindings.session-updates-DJZGIwaU.js +54 -0
  95. package/dist/thread-bindings.state-eTFl-PqJ.js +318 -0
  96. package/dist/timeouts-CEwuGaWT.js +52 -0
  97. package/dist/timeouts.js +2 -0
  98. package/dist/typing-BmJKRpCS.js +14 -0
  99. package/package.json +19 -7
  100. package/account-inspect-api.js +0 -7
  101. package/action-runtime-api.js +0 -7
  102. package/api.js +0 -7
  103. package/channel-config-api.js +0 -7
  104. package/channel-plugin-api.js +0 -7
  105. package/configured-state.js +0 -7
  106. package/contract-api.js +0 -7
  107. package/directory-contract-api.js +0 -7
  108. package/doctor-contract-api.js +0 -7
  109. package/index.js +0 -7
  110. package/runtime-api.actions.js +0 -7
  111. package/runtime-api.js +0 -7
  112. package/runtime-api.lookup.js +0 -7
  113. package/runtime-api.monitor.js +0 -7
  114. package/runtime-api.send.js +0 -7
  115. package/runtime-api.threads.js +0 -7
  116. package/runtime-setter-api.js +0 -7
  117. package/secret-contract-api.js +0 -7
  118. package/security-audit-contract-api.js +0 -7
  119. package/security-contract-api.js +0 -7
  120. package/session-key-api.js +0 -7
  121. package/setup-entry.js +0 -7
  122. package/setup-plugin-api.js +0 -7
  123. package/subagent-hooks-api.js +0 -7
  124. package/test-api.js +0 -7
  125. package/thread-binding-api.js +0 -7
  126. package/timeouts.js +0 -7
@@ -0,0 +1,6 @@
1
+ import { a as reconcileAcpThreadBindingsOnStartup } from "./thread-bindings-9aKRmZv0.js";
2
+ import { n as createThreadBindingManager, t as createNoopThreadBindingManager } from "./thread-bindings.manager-0YBHGemk.js";
3
+ import { t as createDiscordMessageHandler } from "./message-handler-mXzc3tA_.js";
4
+ import { resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled } from "klaw/plugin-sdk/conversation-runtime";
5
+ import { getAcpSessionManager, isAcpRuntimeError } from "klaw/plugin-sdk/acp-runtime";
6
+ export { createDiscordMessageHandler, createNoopThreadBindingManager, createThreadBindingManager, getAcpSessionManager, isAcpRuntimeError, reconcileAcpThreadBindingsOnStartup, resolveThreadBindingIdleTimeoutMs, resolveThreadBindingMaxAgeMs, resolveThreadBindingsEnabled };
@@ -0,0 +1,2 @@
1
+ import { t as monitorDiscordProvider } from "./provider-B2-31CIT.js";
2
+ export { monitorDiscordProvider };
@@ -0,0 +1,34 @@
1
+ import { p as normalizeDiscordToken } from "./accounts-B7OBFePq.js";
2
+ import { n as fetchDiscord } from "./api-CXAcv9nZ.js";
3
+ import { a as normalizeDiscordSlug } from "./allow-list-B0s7evD7.js";
4
+ //#region extensions/discord/src/guilds.ts
5
+ async function listGuilds(token, fetcher) {
6
+ return (await fetchDiscord("/users/@me/guilds", token, fetcher)).filter((guild) => typeof guild.id === "string" && typeof guild.name === "string").map((guild) => ({
7
+ id: guild.id,
8
+ name: guild.name,
9
+ slug: normalizeDiscordSlug(guild.name)
10
+ }));
11
+ }
12
+ //#endregion
13
+ //#region extensions/discord/src/resolve-allowlist-common.ts
14
+ function resolveDiscordAllowlistToken(token) {
15
+ return normalizeDiscordToken(token, "channels.discord.token");
16
+ }
17
+ function buildDiscordUnresolvedResults(entries, buildResult) {
18
+ return entries.map((input) => buildResult(input));
19
+ }
20
+ function findDiscordGuildByName(guilds, input) {
21
+ const slug = normalizeDiscordSlug(input);
22
+ if (!slug) return;
23
+ return guilds.find((guild) => guild.slug === slug);
24
+ }
25
+ function filterDiscordGuilds(guilds, params) {
26
+ if (params.guildId) return guilds.filter((guild) => guild.id === params.guildId);
27
+ if (params.guildName) {
28
+ const match = findDiscordGuildByName(guilds, params.guildName);
29
+ return match ? [match] : [];
30
+ }
31
+ return guilds;
32
+ }
33
+ //#endregion
34
+ export { listGuilds as i, filterDiscordGuilds as n, resolveDiscordAllowlistToken as r, buildDiscordUnresolvedResults as t };
@@ -0,0 +1,265 @@
1
+ import { Wt as __exportAll } from "./send.receipt-CDn3GBWC.js";
2
+ import { n as fetchDiscord, t as DiscordApiError } from "./api-CXAcv9nZ.js";
3
+ import { a as normalizeDiscordSlug } from "./allow-list-B0s7evD7.js";
4
+ import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-CqxPLcJO.js";
5
+ //#region extensions/discord/src/resolve-channels.ts
6
+ var resolve_channels_exports = /* @__PURE__ */ __exportAll({ resolveDiscordChannelAllowlist: () => resolveDiscordChannelAllowlist });
7
+ function parseDiscordChannelInput(raw) {
8
+ const trimmed = raw.trim();
9
+ if (!trimmed) return {};
10
+ const mention = trimmed.match(/^<#(\d+)>$/);
11
+ if (mention) return { channelId: mention[1] };
12
+ const channelPrefix = trimmed.match(/^(?:channel:|discord:)?(\d+)$/i);
13
+ if (channelPrefix) return { channelId: channelPrefix[1] };
14
+ const guildPrefix = trimmed.match(/^(?:guild:|server:)?(\d+)$/i);
15
+ if (guildPrefix && !trimmed.includes("/") && !trimmed.includes("#")) return {
16
+ guildId: guildPrefix[1],
17
+ guildOnly: true
18
+ };
19
+ const split = trimmed.includes("/") ? trimmed.split("/") : trimmed.split("#");
20
+ if (split.length >= 2) {
21
+ const guild = split[0]?.trim();
22
+ const channel = split.slice(1).join("#").trim();
23
+ if (!channel) return guild ? {
24
+ guild: guild.trim(),
25
+ guildOnly: true
26
+ } : {};
27
+ if (guild && /^\d+$/.test(guild)) {
28
+ if (/^\d+$/.test(channel)) return {
29
+ guildId: guild,
30
+ channelId: channel
31
+ };
32
+ return {
33
+ guildId: guild,
34
+ channel
35
+ };
36
+ }
37
+ return {
38
+ guild,
39
+ channel
40
+ };
41
+ }
42
+ return {
43
+ guild: trimmed,
44
+ guildOnly: true
45
+ };
46
+ }
47
+ async function listGuildChannels(token, fetcher, guildId) {
48
+ return (await fetchDiscord(`/guilds/${guildId}/channels`, token, fetcher)).map((channel) => {
49
+ const archived = channel.thread_metadata?.archived;
50
+ return {
51
+ id: typeof channel.id === "string" ? channel.id : "",
52
+ name: typeof channel.name === "string" ? channel.name : "",
53
+ guildId,
54
+ type: channel.type,
55
+ archived
56
+ };
57
+ }).filter((channel) => Boolean(channel.id) && Boolean(channel.name));
58
+ }
59
+ async function fetchChannel(token, fetcher, channelId) {
60
+ let raw;
61
+ try {
62
+ raw = await fetchDiscord(`/channels/${channelId}`, token, fetcher);
63
+ } catch (err) {
64
+ if (err instanceof DiscordApiError && err.status === 403) return { status: "forbidden" };
65
+ if (err instanceof DiscordApiError && err.status === 404) return { status: "not-found" };
66
+ throw err;
67
+ }
68
+ if (!raw || typeof raw.guild_id !== "string" || typeof raw.id !== "string") return { status: "invalid" };
69
+ return {
70
+ status: "found",
71
+ channel: {
72
+ id: raw.id,
73
+ name: typeof raw.name === "string" ? raw.name : "",
74
+ guildId: raw.guild_id,
75
+ type: raw.type
76
+ }
77
+ };
78
+ }
79
+ function preferActiveMatch(candidates) {
80
+ if (candidates.length === 0) return;
81
+ const scored = candidates.map((channel) => {
82
+ const isThread = channel.type === 11 || channel.type === 12;
83
+ return {
84
+ channel,
85
+ score: (Boolean(channel.archived) ? 0 : 2) + (isThread ? 0 : 1)
86
+ };
87
+ });
88
+ scored.sort((a, b) => b.score - a.score);
89
+ return scored[0]?.channel ?? candidates[0];
90
+ }
91
+ async function resolveDiscordChannelAllowlist(params) {
92
+ const token = resolveDiscordAllowlistToken(params.token);
93
+ if (!token) return buildDiscordUnresolvedResults(params.entries, (input) => ({
94
+ input,
95
+ resolved: false
96
+ }));
97
+ const fetcher = params.fetcher ?? fetch;
98
+ const guilds = await listGuilds(token, fetcher);
99
+ const channelsByGuild = /* @__PURE__ */ new Map();
100
+ const getChannels = (guildId) => {
101
+ const existing = channelsByGuild.get(guildId);
102
+ if (existing) return existing;
103
+ const promise = listGuildChannels(token, fetcher, guildId);
104
+ channelsByGuild.set(guildId, promise);
105
+ return promise;
106
+ };
107
+ const results = [];
108
+ for (const input of params.entries) {
109
+ const parsed = parseDiscordChannelInput(input);
110
+ if (parsed.guildOnly) {
111
+ const guild = filterDiscordGuilds(guilds, {
112
+ guildId: parsed.guildId,
113
+ guildName: parsed.guild
114
+ })[0];
115
+ if (guild) results.push({
116
+ input,
117
+ resolved: true,
118
+ guildId: guild.id,
119
+ guildName: guild.name
120
+ });
121
+ else results.push({
122
+ input,
123
+ resolved: false,
124
+ guildId: parsed.guildId,
125
+ guildName: parsed.guild
126
+ });
127
+ continue;
128
+ }
129
+ if (parsed.channelId) {
130
+ const channelId = parsed.channelId;
131
+ const result = await fetchChannel(token, fetcher, channelId);
132
+ if (result.status === "found") {
133
+ const channel = result.channel;
134
+ if (parsed.guildId && parsed.guildId !== channel.guildId) {
135
+ const expectedGuild = guilds.find((entry) => entry.id === parsed.guildId);
136
+ const actualGuild = guilds.find((entry) => entry.id === channel.guildId);
137
+ results.push({
138
+ input,
139
+ resolved: false,
140
+ guildId: parsed.guildId,
141
+ guildName: expectedGuild?.name,
142
+ channelId,
143
+ channelName: channel.name,
144
+ note: actualGuild?.name ? `channel belongs to guild ${actualGuild.name}` : "channel belongs to a different guild"
145
+ });
146
+ continue;
147
+ }
148
+ const guild = guilds.find((entry) => entry.id === channel.guildId);
149
+ results.push({
150
+ input,
151
+ resolved: true,
152
+ guildId: channel.guildId,
153
+ guildName: guild?.name,
154
+ channelId: channel.id,
155
+ channelName: channel.name,
156
+ archived: channel.archived
157
+ });
158
+ continue;
159
+ }
160
+ if (result.status === "not-found" && parsed.guildId) {
161
+ const guild = guilds.find((entry) => entry.id === parsed.guildId);
162
+ if (guild) {
163
+ const match = preferActiveMatch((await getChannels(guild.id)).filter((channel) => normalizeDiscordSlug(channel.name) === normalizeDiscordSlug(channelId)));
164
+ if (match) {
165
+ results.push({
166
+ input,
167
+ resolved: true,
168
+ guildId: guild.id,
169
+ guildName: guild.name,
170
+ channelId: match.id,
171
+ channelName: match.name,
172
+ archived: match.archived
173
+ });
174
+ continue;
175
+ }
176
+ }
177
+ }
178
+ results.push({
179
+ input,
180
+ resolved: false,
181
+ guildId: parsed.guildId,
182
+ channelId
183
+ });
184
+ continue;
185
+ }
186
+ if (parsed.guildId || parsed.guild) {
187
+ const guild = filterDiscordGuilds(guilds, {
188
+ guildId: parsed.guildId,
189
+ guildName: parsed.guild
190
+ })[0];
191
+ const channelQuery = parsed.channel?.trim();
192
+ if (!guild || !channelQuery) {
193
+ results.push({
194
+ input,
195
+ resolved: false,
196
+ guildId: parsed.guildId,
197
+ guildName: parsed.guild,
198
+ channelName: channelQuery ?? parsed.channel
199
+ });
200
+ continue;
201
+ }
202
+ const channels = await getChannels(guild.id);
203
+ const normalizedChannelQuery = normalizeDiscordSlug(channelQuery);
204
+ const isNumericId = /^\d+$/.test(channelQuery);
205
+ let matches = channels.filter((channel) => isNumericId ? channel.id === channelQuery : normalizeDiscordSlug(channel.name) === normalizedChannelQuery);
206
+ if (isNumericId && matches.length === 0) matches = channels.filter((channel) => normalizeDiscordSlug(channel.name) === normalizedChannelQuery);
207
+ const match = preferActiveMatch(matches);
208
+ if (match) results.push({
209
+ input,
210
+ resolved: true,
211
+ guildId: guild.id,
212
+ guildName: guild.name,
213
+ channelId: match.id,
214
+ channelName: match.name,
215
+ archived: match.archived
216
+ });
217
+ else results.push({
218
+ input,
219
+ resolved: false,
220
+ guildId: guild.id,
221
+ guildName: guild.name,
222
+ channelName: parsed.channel,
223
+ note: `channel not found in guild ${guild.name}`
224
+ });
225
+ continue;
226
+ }
227
+ const channelName = input.trim().replace(/^#/, "");
228
+ if (!channelName) {
229
+ results.push({
230
+ input,
231
+ resolved: false,
232
+ channelName
233
+ });
234
+ continue;
235
+ }
236
+ const candidates = [];
237
+ for (const guild of guilds) {
238
+ const channels = await getChannels(guild.id);
239
+ for (const channel of channels) if (normalizeDiscordSlug(channel.name) === normalizeDiscordSlug(channelName)) candidates.push(channel);
240
+ }
241
+ const match = preferActiveMatch(candidates);
242
+ if (match) {
243
+ const guild = guilds.find((entry) => entry.id === match.guildId);
244
+ results.push({
245
+ input,
246
+ resolved: true,
247
+ guildId: match.guildId,
248
+ guildName: guild?.name,
249
+ channelId: match.id,
250
+ channelName: match.name,
251
+ archived: match.archived,
252
+ note: candidates.length > 1 && guild?.name ? `matched multiple; chose ${guild.name}` : void 0
253
+ });
254
+ continue;
255
+ }
256
+ results.push({
257
+ input,
258
+ resolved: false,
259
+ channelName
260
+ });
261
+ }
262
+ return results;
263
+ }
264
+ //#endregion
265
+ export { resolve_channels_exports as n, resolveDiscordChannelAllowlist as t };
@@ -0,0 +1,120 @@
1
+ import { Wt as __exportAll } from "./send.receipt-CDn3GBWC.js";
2
+ import { n as fetchDiscord } from "./api-CXAcv9nZ.js";
3
+ import { i as listGuilds, n as filterDiscordGuilds, r as resolveDiscordAllowlistToken, t as buildDiscordUnresolvedResults } from "./resolve-allowlist-common-CqxPLcJO.js";
4
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "klaw/plugin-sdk/string-coerce-runtime";
5
+ //#region extensions/discord/src/resolve-users.ts
6
+ var resolve_users_exports = /* @__PURE__ */ __exportAll({ resolveDiscordUserAllowlist: () => resolveDiscordUserAllowlist });
7
+ function parseDiscordUserInput(raw) {
8
+ const trimmed = raw.trim();
9
+ if (!trimmed) return {};
10
+ const mention = trimmed.match(/^<@!?(\d+)>$/);
11
+ if (mention) return { userId: mention[1] };
12
+ const prefixed = trimmed.match(/^(?:user:|discord:)?(\d+)$/i);
13
+ if (prefixed) return { userId: prefixed[1] };
14
+ const split = trimmed.includes("/") ? trimmed.split("/") : trimmed.split("#");
15
+ if (split.length >= 2) {
16
+ const guild = split[0]?.trim();
17
+ const user = split.slice(1).join("#").trim();
18
+ if (guild && /^\d+$/.test(guild)) return {
19
+ guildId: guild,
20
+ userName: user
21
+ };
22
+ return {
23
+ guildName: guild,
24
+ userName: user
25
+ };
26
+ }
27
+ return { userName: trimmed.replace(/^@/, "") };
28
+ }
29
+ function scoreDiscordMember(member, query) {
30
+ const q = normalizeLowercaseStringOrEmpty(query);
31
+ const user = member.user;
32
+ const candidates = [
33
+ user.username,
34
+ user.global_name,
35
+ member.nick ?? void 0
36
+ ].map((value) => {
37
+ const normalized = normalizeOptionalString(value);
38
+ return normalized ? normalizeLowercaseStringOrEmpty(normalized) : void 0;
39
+ }).filter(Boolean);
40
+ let score = 0;
41
+ if (candidates.some((value) => value === q)) score += 3;
42
+ if (candidates.some((value) => value?.includes(q))) score += 1;
43
+ if (!user.bot) score += 1;
44
+ return score;
45
+ }
46
+ async function resolveDiscordUserAllowlist(params) {
47
+ const token = resolveDiscordAllowlistToken(params.token);
48
+ if (!token) return buildDiscordUnresolvedResults(params.entries, (input) => ({
49
+ input,
50
+ resolved: false
51
+ }));
52
+ const fetcher = params.fetcher ?? fetch;
53
+ let guilds = null;
54
+ const getGuilds = async () => {
55
+ if (!guilds) guilds = await listGuilds(token, fetcher);
56
+ return guilds;
57
+ };
58
+ const results = [];
59
+ for (const input of params.entries) {
60
+ const parsed = parseDiscordUserInput(input);
61
+ if (parsed.userId) {
62
+ results.push({
63
+ input,
64
+ resolved: true,
65
+ id: parsed.userId
66
+ });
67
+ continue;
68
+ }
69
+ const query = parsed.userName?.trim();
70
+ if (!query) {
71
+ results.push({
72
+ input,
73
+ resolved: false
74
+ });
75
+ continue;
76
+ }
77
+ const guildList = filterDiscordGuilds(await getGuilds(), {
78
+ guildId: parsed.guildId,
79
+ guildName: parsed.guildName?.trim()
80
+ });
81
+ let best = null;
82
+ let matches = 0;
83
+ for (const guild of guildList) {
84
+ const paramsObj = new URLSearchParams({
85
+ query,
86
+ limit: "25"
87
+ });
88
+ const members = await fetchDiscord(`/guilds/${guild.id}/members/search?${paramsObj.toString()}`, token, fetcher);
89
+ for (const member of members) {
90
+ const score = scoreDiscordMember(member, query);
91
+ if (score === 0) continue;
92
+ matches += 1;
93
+ if (!best || score > best.score) best = {
94
+ member,
95
+ guild,
96
+ score
97
+ };
98
+ }
99
+ }
100
+ if (best) {
101
+ const user = best.member.user;
102
+ const name = normalizeOptionalString(best.member.nick) ?? normalizeOptionalString(user.global_name) ?? normalizeOptionalString(user.username);
103
+ results.push({
104
+ input,
105
+ resolved: true,
106
+ id: user.id,
107
+ name,
108
+ guildId: best.guild.id,
109
+ guildName: best.guild.name,
110
+ note: matches > 1 ? "multiple matches; chose best" : void 0
111
+ });
112
+ } else results.push({
113
+ input,
114
+ resolved: false
115
+ });
116
+ }
117
+ return results;
118
+ }
119
+ //#endregion
120
+ export { resolve_users_exports as n, resolveDiscordUserAllowlist as t };