@elizaos/plugin-discord 2.0.0-alpha.8 → 2.0.0-beta.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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +532 -0
  3. package/dist/account-client-pool.d.ts +35 -0
  4. package/dist/account-client-pool.d.ts.map +1 -0
  5. package/dist/accounts.d.ts.map +1 -1
  6. package/dist/actions/actionResultSemantics.d.ts +9 -0
  7. package/dist/actions/actionResultSemantics.d.ts.map +1 -0
  8. package/dist/actions/setup-credentials.d.ts +25 -0
  9. package/dist/actions/setup-credentials.d.ts.map +1 -0
  10. package/dist/addressing.d.ts +15 -0
  11. package/dist/addressing.d.ts.map +1 -0
  12. package/dist/allowlist.d.ts.map +1 -1
  13. package/dist/attachments.d.ts +1 -0
  14. package/dist/attachments.d.ts.map +1 -1
  15. package/dist/auto-enable.d.ts +4 -0
  16. package/dist/auto-enable.d.ts.map +1 -0
  17. package/dist/banner.d.ts.map +1 -1
  18. package/dist/compat.d.ts +4 -3
  19. package/dist/compat.d.ts.map +1 -1
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/connector-account-provider.d.ts +26 -0
  22. package/dist/connector-account-provider.d.ts.map +1 -0
  23. package/dist/debouncer.d.ts +28 -0
  24. package/dist/debouncer.d.ts.map +1 -0
  25. package/dist/discord-avatar-cache.d.ts +10 -0
  26. package/dist/discord-avatar-cache.d.ts.map +1 -0
  27. package/dist/discord-commands.d.ts +16 -0
  28. package/dist/discord-commands.d.ts.map +1 -0
  29. package/dist/discord-events.d.ts +56 -0
  30. package/dist/discord-events.d.ts.map +1 -0
  31. package/dist/discord-history.d.ts +56 -0
  32. package/dist/discord-history.d.ts.map +1 -0
  33. package/dist/discord-interactions.d.ts +47 -0
  34. package/dist/discord-interactions.d.ts.map +1 -0
  35. package/dist/discord-local-service.d.ts +94 -0
  36. package/dist/discord-local-service.d.ts.map +1 -0
  37. package/dist/discord-profiles.d.ts +26 -0
  38. package/dist/discord-profiles.d.ts.map +1 -0
  39. package/dist/discord-reactions.d.ts +30 -0
  40. package/dist/discord-reactions.d.ts.map +1 -0
  41. package/dist/draft-chunking.d.ts +9 -0
  42. package/dist/draft-chunking.d.ts.map +1 -0
  43. package/dist/draft-stream.d.ts +23 -0
  44. package/dist/draft-stream.d.ts.map +1 -0
  45. package/dist/environment.d.ts +1 -0
  46. package/dist/environment.d.ts.map +1 -1
  47. package/dist/generated/specs/spec-helpers.d.ts +4 -17
  48. package/dist/generated/specs/spec-helpers.d.ts.map +1 -1
  49. package/dist/generated/specs/specs.d.ts +13 -48
  50. package/dist/generated/specs/specs.d.ts.map +1 -1
  51. package/dist/identity.d.ts +8 -0
  52. package/dist/identity.d.ts.map +1 -0
  53. package/dist/inbound-envelope.d.ts +8 -0
  54. package/dist/inbound-envelope.d.ts.map +1 -0
  55. package/dist/index.browser.d.ts.map +1 -1
  56. package/dist/index.d.ts +22 -2
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +10173 -10074
  59. package/dist/index.js.map +49 -125
  60. package/dist/message-coalesce.d.ts +31 -0
  61. package/dist/message-coalesce.d.ts.map +1 -0
  62. package/dist/messages.d.ts +13 -2
  63. package/dist/messages.d.ts.map +1 -1
  64. package/dist/messaging.d.ts.map +1 -1
  65. package/dist/native-commands.d.ts.map +1 -1
  66. package/dist/owner-pairing-service.d.ts +73 -0
  67. package/dist/owner-pairing-service.d.ts.map +1 -0
  68. package/dist/permissionEvents.d.ts.map +1 -1
  69. package/dist/permissions.d.ts.map +1 -1
  70. package/dist/profileSync.d.ts +8 -0
  71. package/dist/profileSync.d.ts.map +1 -0
  72. package/dist/reasoning-tags.d.ts +2 -0
  73. package/dist/reasoning-tags.d.ts.map +1 -0
  74. package/dist/service.d.ts +156 -261
  75. package/dist/service.d.ts.map +1 -1
  76. package/dist/setup-routes.d.ts +23 -0
  77. package/dist/setup-routes.d.ts.map +1 -0
  78. package/dist/slash-commands.d.ts +39 -0
  79. package/dist/slash-commands.d.ts.map +1 -0
  80. package/dist/staleness.d.ts +25 -0
  81. package/dist/staleness.d.ts.map +1 -0
  82. package/dist/status-reactions.d.ts +11 -0
  83. package/dist/status-reactions.d.ts.map +1 -0
  84. package/dist/tests.d.ts.map +1 -1
  85. package/dist/types.d.ts +27 -3
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/typing.d.ts +7 -0
  88. package/dist/typing.d.ts.map +1 -0
  89. package/dist/user-account-scraper/discord-browser-scraper.d.ts +118 -0
  90. package/dist/user-account-scraper/discord-browser-scraper.d.ts.map +1 -0
  91. package/dist/user-account-scraper/discord-desktop-cdp.d.ts +33 -0
  92. package/dist/user-account-scraper/discord-desktop-cdp.d.ts.map +1 -0
  93. package/dist/user-account-scraper/index.d.ts +15 -0
  94. package/dist/user-account-scraper/index.d.ts.map +1 -0
  95. package/dist/user-account-scraper/service.d.ts +92 -0
  96. package/dist/user-account-scraper/service.d.ts.map +1 -0
  97. package/dist/utils.d.ts +11 -4
  98. package/dist/utils.d.ts.map +1 -1
  99. package/dist/vitest.config.d.ts +3 -0
  100. package/dist/vitest.config.d.ts.map +1 -0
  101. package/dist/voice.d.ts +8 -3
  102. package/dist/voice.d.ts.map +1 -1
  103. package/package.json +23 -20
  104. package/dist/actions/chatWithAttachments.d.ts +0 -4
  105. package/dist/actions/chatWithAttachments.d.ts.map +0 -1
  106. package/dist/actions/createPoll.d.ts +0 -4
  107. package/dist/actions/createPoll.d.ts.map +0 -1
  108. package/dist/actions/deleteMessage.d.ts +0 -4
  109. package/dist/actions/deleteMessage.d.ts.map +0 -1
  110. package/dist/actions/downloadMedia.d.ts +0 -4
  111. package/dist/actions/downloadMedia.d.ts.map +0 -1
  112. package/dist/actions/editMessage.d.ts +0 -4
  113. package/dist/actions/editMessage.d.ts.map +0 -1
  114. package/dist/actions/getUserInfo.d.ts +0 -4
  115. package/dist/actions/getUserInfo.d.ts.map +0 -1
  116. package/dist/actions/joinChannel.d.ts +0 -4
  117. package/dist/actions/joinChannel.d.ts.map +0 -1
  118. package/dist/actions/leaveChannel.d.ts +0 -4
  119. package/dist/actions/leaveChannel.d.ts.map +0 -1
  120. package/dist/actions/listChannels.d.ts +0 -4
  121. package/dist/actions/listChannels.d.ts.map +0 -1
  122. package/dist/actions/pinMessage.d.ts +0 -4
  123. package/dist/actions/pinMessage.d.ts.map +0 -1
  124. package/dist/actions/reactToMessage.d.ts +0 -4
  125. package/dist/actions/reactToMessage.d.ts.map +0 -1
  126. package/dist/actions/readChannel.d.ts +0 -4
  127. package/dist/actions/readChannel.d.ts.map +0 -1
  128. package/dist/actions/searchMessages.d.ts +0 -4
  129. package/dist/actions/searchMessages.d.ts.map +0 -1
  130. package/dist/actions/sendDM.d.ts +0 -4
  131. package/dist/actions/sendDM.d.ts.map +0 -1
  132. package/dist/actions/sendMessage.d.ts +0 -4
  133. package/dist/actions/sendMessage.d.ts.map +0 -1
  134. package/dist/actions/serverInfo.d.ts +0 -4
  135. package/dist/actions/serverInfo.d.ts.map +0 -1
  136. package/dist/actions/summarizeConversation.d.ts +0 -4
  137. package/dist/actions/summarizeConversation.d.ts.map +0 -1
  138. package/dist/actions/transcribeMedia.d.ts +0 -4
  139. package/dist/actions/transcribeMedia.d.ts.map +0 -1
  140. package/dist/actions/unpinMessage.d.ts +0 -4
  141. package/dist/actions/unpinMessage.d.ts.map +0 -1
  142. package/dist/generated/prompts/typescript/prompts.d.ts +0 -44
  143. package/dist/generated/prompts/typescript/prompts.d.ts.map +0 -1
  144. package/dist/providers/channelState.d.ts +0 -14
  145. package/dist/providers/channelState.d.ts.map +0 -1
  146. package/dist/providers/guildInfo.d.ts +0 -15
  147. package/dist/providers/guildInfo.d.ts.map +0 -1
  148. package/dist/providers/voiceState.d.ts +0 -12
  149. package/dist/providers/voiceState.d.ts.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Shaw Walters and elizaOS Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,532 @@
1
+ # @elizaos/plugin-discord
2
+
3
+ A Discord plugin implementation for ElizaOS, enabling rich integration with Discord servers for managing interactions, voice, and message handling.
4
+
5
+ ## Features
6
+
7
+ - Handle server join events and manage initial configurations
8
+ - Voice event management via the voice manager
9
+ - Manage and process new messages with the message manager
10
+ - Slash command registration and interaction handling
11
+ - Support for Discord attachments and media files
12
+ - Voice channel join/leave functionality
13
+ - Conversation summarization
14
+ - Media transcription capabilities
15
+ - Channel state and voice state providers
16
+ - Channel restriction support (limit bot to specific channels)
17
+ - Robust permissions management and audit event tracking
18
+ - Event-driven architecture with comprehensive event handling
19
+ - History backfill with efficient batch processing
20
+
21
+ ## Installation
22
+
23
+ As this is a workspace package, it's installed as part of the ElizaOS monorepo:
24
+
25
+ ```bash
26
+ bun install
27
+ ```
28
+
29
+ ## Configuration
30
+
31
+ The plugin requires the following environment variables:
32
+
33
+ ```bash
34
+ # Discord API Credentials (Required)
35
+ DISCORD_APPLICATION_ID=your_application_id
36
+ DISCORD_API_TOKEN=your_api_token
37
+
38
+ # Channel Restrictions (Optional)
39
+ # Comma-separated list of Discord channel IDs to restrict the bot to.
40
+ # If not set, the bot operates in all channels.
41
+ # These channels cannot be removed via the leaveChannel action.
42
+ CHANNEL_IDS=123456789012345678,987654321098765432
43
+
44
+ # Listen-only channels (Optional)
45
+ # Comma-separated list of channel IDs where the bot will only listen (not respond).
46
+ DISCORD_LISTEN_CHANNEL_IDS=123456789012345678
47
+
48
+ # Voice Channel (Optional)
49
+ # ID of the voice channel the bot should auto-join when scanning a guild.
50
+ # If not set, the bot selects based on member activity.
51
+ DISCORD_VOICE_CHANNEL_ID=123456789012345678
52
+
53
+ # Behavior Settings (Optional)
54
+ # If true, ignore messages from other bots (default: true)
55
+ DISCORD_SHOULD_IGNORE_BOT_MESSAGES=true
56
+
57
+ # If true, ignore direct messages by default (default: true).
58
+ # DMs can still be allowed explicitly via DISCORD_ALLOW_FROM / pairing allowlist.
59
+ DISCORD_SHOULD_IGNORE_DIRECT_MESSAGES=true
60
+
61
+ # If true, only respond when explicitly @mentioned (default: true)
62
+ DISCORD_SHOULD_RESPOND_ONLY_TO_MENTIONS=true
63
+
64
+ # Testing (Optional)
65
+ DISCORD_TEST_CHANNEL_ID=123456789012345678
66
+ ```
67
+
68
+ Settings can also be configured in your character file under `settings.discord`:
69
+
70
+ ```json
71
+ {
72
+ "settings": {
73
+ "discord": {
74
+ "shouldIgnoreBotMessages": true,
75
+ "shouldIgnoreDirectMessages": true,
76
+ "shouldRespondOnlyToMentions": true,
77
+ "allowedChannelIds": ["123456789012345678"]
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ ## Usage
84
+
85
+ ```json
86
+ {
87
+ "plugins": ["@elizaos/plugin-discord"]
88
+ }
89
+ ```
90
+
91
+ ## Slash Command Permissions
92
+
93
+ The plugin uses a hybrid permission system that combines Discord's native features with ElizaOS-specific controls.
94
+
95
+ ### Permission Layers
96
+
97
+ Commands go through multiple permission checks in this order:
98
+
99
+ 1. **Discord Native Checks** (before interaction fires):
100
+ - User must have required Discord permissions
101
+ - Command must be available in the current context (guild vs DM)
102
+
103
+ 2. **ElizaOS Channel Whitelist** (if `CHANNEL_IDS` is set):
104
+ - Commands only work in whitelisted channels
105
+ - Unless command has `bypassChannelWhitelist: true`
106
+
107
+ 3. **Custom Validator** (if provided):
108
+ - Runs custom validation logic
109
+ - Full programmatic control
110
+
111
+ ### Registering Commands
112
+
113
+ ```typescript
114
+ import { PermissionFlagsBits } from "discord.js";
115
+
116
+ // Simple command (works everywhere)
117
+ const helpCommand = {
118
+ name: "help",
119
+ description: "Show help information",
120
+ };
121
+
122
+ // Guild-only command
123
+ const serverInfoCommand = {
124
+ name: "serverinfo",
125
+ description: "Show server information",
126
+ guildOnly: true,
127
+ };
128
+
129
+ // Requires Discord permission
130
+ const configCommand = {
131
+ name: "config",
132
+ description: "Configure bot settings",
133
+ requiredPermissions: PermissionFlagsBits.ManageGuild,
134
+ };
135
+
136
+ // Bypasses channel whitelist
137
+ const utilityCommand = {
138
+ name: "export",
139
+ description: "Export data",
140
+ bypassChannelWhitelist: true,
141
+ };
142
+
143
+ // Advanced: custom validation
144
+ const adminCommand = {
145
+ name: "admin",
146
+ description: "Admin-only command",
147
+ validator: async (interaction, runtime) => {
148
+ const adminIds = runtime.getSetting("ADMIN_USER_IDS")?.split(",") ?? [];
149
+ return adminIds.includes(interaction.user.id);
150
+ },
151
+ };
152
+
153
+ // Register commands
154
+ await runtime.emitEvent(["DISCORD_REGISTER_COMMANDS"], {
155
+ commands: [
156
+ helpCommand,
157
+ serverInfoCommand,
158
+ configCommand,
159
+ utilityCommand,
160
+ adminCommand,
161
+ ],
162
+ });
163
+ ```
164
+
165
+ ### Permission Options
166
+
167
+ | Option | Type | Description |
168
+ | ------------------------ | ------------------ | --------------------------------------------------------------------- |
169
+ | `guildOnly` | `boolean` | If true, command only works in guilds (not DMs) |
170
+ | `bypassChannelWhitelist` | `boolean` | If true, bypasses `CHANNEL_IDS` restrictions |
171
+ | `requiredPermissions` | `bigint \| string` | Discord permission bitfield (e.g., `PermissionFlagsBits.ManageGuild`) |
172
+ | `contexts` | `number[]` | Raw Discord contexts (0=Guild, 1=BotDM, 2=PrivateChannel) |
173
+ | `guildIds` | `string[]` | Register only in specific guilds (instant updates) |
174
+ | `validator` | `function` | Custom validation function for advanced logic |
175
+
176
+ ### Common Permission Values
177
+
178
+ From Discord.js `PermissionFlagsBits`:
179
+
180
+ - `ManageGuild` - Server settings
181
+ - `ManageChannels` - Channel management
182
+ - `ManageMessages` - Delete messages
183
+ - `BanMembers` - Ban users
184
+ - `KickMembers` - Kick users
185
+ - `ModerateMembers` - Timeout users
186
+ - `ManageRoles` - Role management
187
+ - `Administrator` - Full access
188
+
189
+ ### Design Rationale
190
+
191
+ **Why Hybrid Approach?**
192
+
193
+ - Discord's native permissions are powerful but limited to role-based access
194
+ - ElizaOS needs programmatic control for channel restrictions and custom logic
195
+ - Combining both gives developers the best of both worlds
196
+
197
+ **Why Simple Flags?**
198
+
199
+ - `guildOnly: true` is clearer than `contexts: [0]`
200
+ - Abstracts Discord API details
201
+ - Sensible defaults: zero config should "just work"
202
+
203
+ **Why Keep Channel Whitelist?**
204
+
205
+ - Discord's channel permissions are UI-based (Server Settings > Integrations)
206
+ - Programmatic control is better for developer experience
207
+ - Allows dynamic, runtime-based channel restrictions
208
+
209
+ ### Available Actions
210
+
211
+ The plugin provides the following actions:
212
+
213
+ | Action | Description |
214
+ | -------------------------------- | -------------------------------------------------------- |
215
+ | **MESSAGE** | Send, read, search, list, react, edit, delete, pin, join, leave, or get user info through the Discord message connector |
216
+ | **DISCORD_SETUP_CREDENTIALS** | Set up Discord credential pairing |
217
+
218
+ ### Providers
219
+
220
+ Discord message context is exposed through the MESSAGE connector hooks rather than Discord-specific prompt providers.
221
+
222
+ ### Event Types
223
+
224
+ The plugin emits the following Discord-specific events:
225
+
226
+ | Event | Description |
227
+ | ------------------------------------- | ----------------------------------------- |
228
+ | `DISCORD_MESSAGE_RECEIVED` | When a message is received |
229
+ | `DISCORD_MESSAGE_SENT` | When a message is sent |
230
+ | `DISCORD_SLASH_COMMAND` | When a slash command is invoked |
231
+ | `DISCORD_MODAL_SUBMIT` | When a modal form is submitted |
232
+ | `DISCORD_REACTION_RECEIVED` | When a reaction is added to a message |
233
+ | `DISCORD_REACTION_REMOVED` | When a reaction is removed from a message |
234
+ | `DISCORD_WORLD_JOINED` | When the bot joins a guild |
235
+ | `DISCORD_SERVER_CONNECTED` | When connected to a server |
236
+ | `DISCORD_USER_JOINED` | When a user joins a guild |
237
+ | `DISCORD_USER_LEFT` | When a user leaves a guild |
238
+ | `DISCORD_VOICE_STATE_CHANGED` | When voice state changes |
239
+ | `DISCORD_CHANNEL_PERMISSIONS_CHANGED` | When channel permissions change |
240
+ | `DISCORD_ROLE_PERMISSIONS_CHANGED` | When role permissions change |
241
+ | `DISCORD_MEMBER_ROLES_CHANGED` | When a member's roles change |
242
+ | `DISCORD_ROLE_CREATED` | When a role is created |
243
+ | `DISCORD_ROLE_DELETED` | When a role is deleted |
244
+
245
+ ## Key Components
246
+
247
+ ### DiscordService
248
+
249
+ Main service class that extends ElizaOS Service:
250
+
251
+ - Handles authentication and session management
252
+ - Manages Discord client connection
253
+ - Processes events and interactions
254
+ - Supports channel history backfill with efficient batch processing
255
+
256
+ ### MessageManager
257
+
258
+ - Processes incoming messages and responses
259
+ - Handles attachments and media files
260
+ - Supports message formatting and templating
261
+ - Manages conversation context
262
+
263
+ ### VoiceManager
264
+
265
+ - Manages voice channel interactions
266
+ - Handles joining and leaving voice channels
267
+ - Processes voice events and audio streams
268
+ - Integrates with transcription services
269
+
270
+ ### Attachment Handler
271
+
272
+ - Downloads and processes Discord attachments
273
+ - Supports various media types
274
+ - Integrates with media transcription
275
+
276
+ ## Developer Guide
277
+
278
+ ### Custom Slash Commands
279
+
280
+ Register slash commands via the `DISCORD_REGISTER_COMMANDS` event, then listen for interactions:
281
+
282
+ ```typescript
283
+ // Register custom slash commands
284
+ await runtime.emitEvent(["DISCORD_REGISTER_COMMANDS"], {
285
+ commands: [
286
+ {
287
+ name: "mycommand",
288
+ description: "My custom command",
289
+ options: [
290
+ {
291
+ name: "input",
292
+ description: "User input",
293
+ type: 3, // STRING type
294
+ required: true,
295
+ },
296
+ ],
297
+ },
298
+ {
299
+ name: "serverinfo",
300
+ description: "Get server information",
301
+ guildOnly: true, // Only works in guilds, not DMs
302
+ },
303
+ ],
304
+ });
305
+
306
+ // Listen for slash command events to handle the interaction
307
+ runtime.registerEvent({
308
+ name: "DISCORD_SLASH_COMMAND",
309
+ handler: async (payload) => {
310
+ const { interaction, client, commands } = payload;
311
+
312
+ if (interaction.commandName === "mycommand") {
313
+ const input = interaction.options.getString("input");
314
+ await interaction.reply(`You said: ${input}`);
315
+ }
316
+ },
317
+ });
318
+ ```
319
+
320
+ ### Building on the Listen System
321
+
322
+ The `DISCORD_LISTEN_CHANNEL_IDS` setting creates "listen-only" channels where the bot receives messages but doesn't respond. This is useful for:
323
+
324
+ - **Monitoring channels** - Track activity without interrupting conversations
325
+ - **Data collection** - Gather messages for analysis or training
326
+ - **Conditional responses** - Build custom logic that decides when to respond
327
+
328
+ ```typescript
329
+ // Check if a channel is listen-only
330
+ const listenChannels = runtime.getSetting("DISCORD_LISTEN_CHANNEL_IDS");
331
+ const listenChannelIds = listenChannels?.split(",").map((s) => s.trim()) || [];
332
+
333
+ runtime.registerEvent({
334
+ name: "DISCORD_MESSAGE_RECEIVED",
335
+ handler: async (payload) => {
336
+ const { message } = payload;
337
+ const channelId = message.content.channelId;
338
+
339
+ if (listenChannelIds.includes(channelId)) {
340
+ // This is a listen-only channel - process without responding
341
+ await processMessageSilently(message);
342
+ }
343
+ },
344
+ });
345
+ ```
346
+
347
+ ### Handling Modal and Component Interactions
348
+
349
+ Modal submits and message components (buttons, select menus) bypass channel whitelists to support multi-step UI flows:
350
+
351
+ ```typescript
352
+ // Listen for modal submissions
353
+ runtime.registerEvent({
354
+ name: "DISCORD_MODAL_SUBMIT",
355
+ handler: async (payload) => {
356
+ const { interaction } = payload;
357
+ const fieldValue = interaction.fields.getTextInputValue("myField");
358
+ await interaction.reply(`Received: ${fieldValue}`);
359
+ },
360
+ });
361
+ ```
362
+
363
+ ### Permission Audit System
364
+
365
+ The plugin includes a comprehensive permission audit system that tracks all permission changes with full audit log integration. This is useful for:
366
+
367
+ - **Security monitoring** - Detect unauthorized permission escalations
368
+ - **Compliance logging** - Maintain records of who changed what and when
369
+ - **Bot self-protection** - Detect when the bot's permissions are modified
370
+
371
+ #### Event Payloads
372
+
373
+ **DISCORD_CHANNEL_PERMISSIONS_CHANGED** - When channel overwrites change:
374
+
375
+ ```typescript
376
+ interface ChannelPermissionsChangedPayload {
377
+ runtime: IAgentRuntime;
378
+ guild: { id: string; name: string };
379
+ channel: { id: string; name: string };
380
+ target: { type: "role" | "user"; id: string; name: string };
381
+ action: "CREATE" | "UPDATE" | "DELETE";
382
+ changes: Array<{
383
+ permission: string; // e.g., 'ManageMessages', 'Administrator'
384
+ oldState: "ALLOW" | "DENY" | "NEUTRAL";
385
+ newState: "ALLOW" | "DENY" | "NEUTRAL";
386
+ }>;
387
+ audit: {
388
+ executorId: string;
389
+ executorTag: string;
390
+ reason: string | null;
391
+ } | null;
392
+ }
393
+ ```
394
+
395
+ **DISCORD_ROLE_PERMISSIONS_CHANGED** - When role permissions change:
396
+
397
+ ```typescript
398
+ interface RolePermissionsChangedPayload {
399
+ runtime: IAgentRuntime;
400
+ guild: { id: string; name: string };
401
+ role: { id: string; name: string };
402
+ changes: PermissionDiff[];
403
+ audit: AuditInfo | null;
404
+ }
405
+ ```
406
+
407
+ **DISCORD_MEMBER_ROLES_CHANGED** - When a member's roles change:
408
+
409
+ ```typescript
410
+ interface MemberRolesChangedPayload {
411
+ runtime: IAgentRuntime;
412
+ guild: { id: string; name: string };
413
+ member: { id: string; tag: string };
414
+ added: Array<{ id: string; name: string; permissions: string[] }>;
415
+ removed: Array<{ id: string; name: string; permissions: string[] }>;
416
+ audit: AuditInfo | null;
417
+ }
418
+ ```
419
+
420
+ **DISCORD_ROLE_CREATED / DISCORD_ROLE_DELETED** - Role lifecycle:
421
+
422
+ ```typescript
423
+ interface RoleLifecyclePayload {
424
+ runtime: IAgentRuntime;
425
+ guild: { id: string; name: string };
426
+ role: { id: string; name: string; permissions: string[] };
427
+ audit: AuditInfo | null;
428
+ }
429
+ ```
430
+
431
+ #### Example: Security Monitoring
432
+
433
+ ```typescript
434
+ import { DiscordEventTypes } from "@elizaos/plugin-discord";
435
+
436
+ // Alert on dangerous permission grants
437
+ runtime.registerEvent({
438
+ name: DiscordEventTypes.CHANNEL_PERMISSIONS_CHANGED,
439
+ handler: async (payload) => {
440
+ const dangerousPerms = ["Administrator", "ManageGuild", "ManageRoles"];
441
+
442
+ for (const change of payload.changes) {
443
+ if (
444
+ dangerousPerms.includes(change.permission) &&
445
+ change.newState === "ALLOW"
446
+ ) {
447
+ console.warn(`⚠️ Dangerous permission granted!`, {
448
+ channel: payload.channel.name,
449
+ target: payload.target.name,
450
+ permission: change.permission,
451
+ grantedBy: payload.audit?.executorTag || "Unknown",
452
+ });
453
+ }
454
+ }
455
+ },
456
+ });
457
+
458
+ // Track role escalations
459
+ runtime.registerEvent({
460
+ name: DiscordEventTypes.MEMBER_ROLES_CHANGED,
461
+ handler: async (payload) => {
462
+ const adminRoles = payload.added.filter((r) =>
463
+ r.permissions.includes("Administrator"),
464
+ );
465
+
466
+ if (adminRoles.length > 0) {
467
+ console.warn(`⚠️ Admin role granted to ${payload.member.tag}`, {
468
+ roles: adminRoles.map((r) => r.name),
469
+ grantedBy: payload.audit?.executorTag || "Unknown",
470
+ });
471
+ }
472
+ },
473
+ });
474
+
475
+ // Log all role creations
476
+ runtime.registerEvent({
477
+ name: DiscordEventTypes.ROLE_CREATED,
478
+ handler: async (payload) => {
479
+ console.log(`New role created: ${payload.role.name}`, {
480
+ permissions: payload.role.permissions,
481
+ createdBy: payload.audit?.executorTag || "Unknown",
482
+ });
483
+ },
484
+ });
485
+ ```
486
+
487
+ #### Bot Self-Protection
488
+
489
+ Monitor when the bot's own permissions change:
490
+
491
+ ```typescript
492
+ runtime.registerEvent({
493
+ name: DiscordEventTypes.MEMBER_ROLES_CHANGED,
494
+ handler: async (payload) => {
495
+ const botId = runtime.getSetting("DISCORD_APPLICATION_ID");
496
+
497
+ if (payload.member.id === botId && payload.removed.length > 0) {
498
+ console.error(`🚨 Bot roles removed!`, {
499
+ removed: payload.removed.map((r) => r.name),
500
+ by: payload.audit?.executorTag || "Unknown",
501
+ });
502
+ // Could trigger alerts, notifications, etc.
503
+ }
504
+ },
505
+ });
506
+ ```
507
+
508
+ ## Cross-Core Compatibility
509
+
510
+ This plugin includes a compatibility layer (`compat.ts`) that allows it to work with both old and new versions of `@elizaos/core`. The compatibility layer:
511
+
512
+ - Automatically handles `serverId` vs `messageServerId` differences
513
+ - Uses a runtime proxy to intercept and adapt API calls
514
+ - Requires no changes to existing code
515
+
516
+ When migrating to a new core version, see the comments in `compat.ts` for removal instructions.
517
+
518
+ ## Testing
519
+
520
+ The plugin includes a test suite for validating functionality:
521
+
522
+ ```bash
523
+ bun run test
524
+ ```
525
+
526
+ ## Notes
527
+
528
+ - Ensure that your `.env` file includes the required `DISCORD_API_TOKEN`
529
+ - The bot requires appropriate Discord permissions (send messages, connect to voice, etc.)
530
+ - If no token is provided, the plugin will load but remain non-functional with appropriate warnings
531
+ - The plugin uses Discord.js v14.18.0 with comprehensive intent support
532
+ - Slash commands and modal/component interactions bypass channel whitelists
@@ -0,0 +1,35 @@
1
+ import type { Client as DiscordJsClient } from "discord.js";
2
+ import { type ResolvedDiscordAccount } from "./accounts";
3
+ import type { ChannelDebouncer, MessageDebouncer } from "./debouncer";
4
+ import type { MessageManager } from "./messages";
5
+ import type { DiscordSettings } from "./types";
6
+ import type { VoiceManager } from "./voice";
7
+ export interface DiscordAccountClientState {
8
+ accountId: string;
9
+ account: ResolvedDiscordAccount;
10
+ client: DiscordJsClient | null;
11
+ settings: DiscordSettings;
12
+ allowedChannelIds?: string[];
13
+ listenChannelIds?: string[];
14
+ dynamicChannelIds: Set<string>;
15
+ clientReadyPromise: Promise<void> | null;
16
+ loginFailed: boolean;
17
+ messageManager?: MessageManager;
18
+ voiceManager?: VoiceManager;
19
+ messageDebouncer?: MessageDebouncer;
20
+ channelDebouncer?: ChannelDebouncer;
21
+ }
22
+ export declare class DiscordAccountClientPool {
23
+ private defaultAccountId;
24
+ private readonly clients;
25
+ constructor(defaultAccountId?: string);
26
+ setDefaultAccountId(accountId: string): void;
27
+ getDefaultAccountId(): string;
28
+ set(state: DiscordAccountClientState): void;
29
+ get(accountId?: string | null): DiscordAccountClientState | null;
30
+ getDefault(): DiscordAccountClientState | null;
31
+ list(): DiscordAccountClientState[];
32
+ listAccountIds(): string[];
33
+ clear(): void;
34
+ }
35
+ //# sourceMappingURL=account-client-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-client-pool.d.ts","sourceRoot":"","sources":["../account-client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAGN,KAAK,sBAAsB,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,yBAAyB;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,sBAAsB,CAAC;IAChC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,wBAAwB;IACpC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;gBAE5D,gBAAgB,SAAqB;IAIjD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI5C,mBAAmB,IAAI,MAAM;IAI7B,GAAG,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAM3C,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,yBAAyB,GAAG,IAAI;IAKhE,UAAU,IAAI,yBAAyB,GAAG,IAAI;IAI9C,IAAI,IAAI,yBAAyB,EAAE;IAInC,cAAc,IAAI,MAAM,EAAE;IAI1B,KAAK,IAAI,IAAI;CAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;IAChD,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB;IACvB,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wCAAwC;IACxC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,0CAA0C;IAC1C,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACnC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC/B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iCAAiC;IACjC,qBAAqB,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;IAC5D,gCAAgC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAG7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,yBAAyB,CAUvF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,CActE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAM7E;AA4ED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GACvC,sBAAsB,CA+BxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,sBAAsB,CAmBxB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,aAAa,GAAG,sBAAsB,EAAE,CAI3F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAGrE"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ActionResult } from "@elizaos/core";
2
+ type ActionResultData = NonNullable<ActionResult["data"]>;
3
+ export declare const terminalActionInteractionSemantics: {
4
+ readonly suppressPostActionContinuation: true;
5
+ readonly suppressActionResultClipboard: true;
6
+ };
7
+ export declare function terminalActionResultData(data?: ActionResultData): ActionResultData;
8
+ export {};
9
+ //# sourceMappingURL=actionResultSemantics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionResultSemantics.d.ts","sourceRoot":"","sources":["../../actions/actionResultSemantics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,KAAK,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAE1D,eAAO,MAAM,kCAAkC;;;CAGrC,CAAC;AAEX,wBAAgB,wBAAwB,CACvC,IAAI,GAAE,gBAAqB,GACzB,gBAAgB,CAMlB"}
@@ -0,0 +1,25 @@
1
+ import { type Action } from "@elizaos/core";
2
+ export interface CredentialPreset {
3
+ name: string;
4
+ displayName: string;
5
+ fields: CredentialField[];
6
+ helpUrl: string;
7
+ helpText: string;
8
+ validate: (credentials: Record<string, string>) => Promise<{
9
+ valid: boolean;
10
+ identity?: string;
11
+ error?: string;
12
+ }>;
13
+ }
14
+ export interface CredentialField {
15
+ key: string;
16
+ label: string;
17
+ secret: boolean;
18
+ }
19
+ export declare function registerPreset(preset: CredentialPreset): void;
20
+ export declare function getPreset(name: string): CredentialPreset | undefined;
21
+ export declare function listPresets(): string[];
22
+ export declare function loadCredentials(service: string): Record<string, string> | null;
23
+ export declare const setupCredentials: Action;
24
+ export default setupCredentials;
25
+ //# sourceMappingURL=setup-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-credentials.d.ts","sourceRoot":"","sources":["../../actions/setup-credentials.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,MAAM,EASX,MAAM,eAAe,CAAC;AASvB,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CACT,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/B,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CAChB;AA4CD,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAQ7D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEpE;AAED,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC;AA8PD,wBAAgB,eAAe,CAC9B,OAAO,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAa/B;AAuID,eAAO,MAAM,gBAAgB,EAAE,MAoY9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Discord-native addressing helper.
3
+ *
4
+ * A bot can be mentioned as the subject of a message addressed to someone else.
5
+ * Connector routing should only treat the bot as directly addressed when the
6
+ * platform facts say so: the message replies to the bot, or the first user
7
+ * mention in the raw Discord content is the bot.
8
+ */
9
+ export declare function isDiscordUserAddressed({ text, userId, hasMessageReference, repliedUserId, }: {
10
+ text?: string | null;
11
+ userId?: string | null;
12
+ hasMessageReference?: boolean;
13
+ repliedUserId?: string | null;
14
+ }): boolean;
15
+ //# sourceMappingURL=addressing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressing.d.ts","sourceRoot":"","sources":["../addressing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAyBH,wBAAgB,sBAAsB,CAAC,EACtC,IAAI,EACJ,MAAM,EACN,mBAA2B,EAC3B,aAAa,GACb,EAAE;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAKV"}