discord-ops 0.1.0 → 0.2.0

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 (169) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +59 -5
  3. package/dist/cli/index.js +31 -13
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/client.d.ts +13 -11
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +65 -25
  8. package/dist/client.js.map +1 -1
  9. package/dist/config/index.d.ts +7 -1
  10. package/dist/config/index.d.ts.map +1 -1
  11. package/dist/config/index.js +18 -3
  12. package/dist/config/index.js.map +1 -1
  13. package/dist/config/schema.d.ts +8 -0
  14. package/dist/config/schema.d.ts.map +1 -1
  15. package/dist/config/schema.js +1 -0
  16. package/dist/config/schema.js.map +1 -1
  17. package/dist/routing/resolver.d.ts +2 -1
  18. package/dist/routing/resolver.d.ts.map +1 -1
  19. package/dist/routing/resolver.js +2 -0
  20. package/dist/routing/resolver.js.map +1 -1
  21. package/dist/server.d.ts.map +1 -1
  22. package/dist/server.js +46 -1
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/audit/index.d.ts +2 -0
  25. package/dist/tools/audit/index.d.ts.map +1 -0
  26. package/dist/tools/audit/index.js +2 -0
  27. package/dist/tools/audit/index.js.map +1 -0
  28. package/dist/tools/audit/query-audit-log.d.ts +3 -0
  29. package/dist/tools/audit/query-audit-log.d.ts.map +1 -0
  30. package/dist/tools/audit/query-audit-log.js +60 -0
  31. package/dist/tools/audit/query-audit-log.js.map +1 -0
  32. package/dist/tools/channels/create-channel.d.ts.map +1 -1
  33. package/dist/tools/channels/create-channel.js +4 -1
  34. package/dist/tools/channels/create-channel.js.map +1 -1
  35. package/dist/tools/channels/delete-channel.d.ts.map +1 -1
  36. package/dist/tools/channels/delete-channel.js +4 -1
  37. package/dist/tools/channels/delete-channel.js.map +1 -1
  38. package/dist/tools/channels/edit-channel.d.ts.map +1 -1
  39. package/dist/tools/channels/edit-channel.js +4 -1
  40. package/dist/tools/channels/edit-channel.js.map +1 -1
  41. package/dist/tools/channels/get-channel.d.ts.map +1 -1
  42. package/dist/tools/channels/get-channel.js +4 -1
  43. package/dist/tools/channels/get-channel.js.map +1 -1
  44. package/dist/tools/channels/index.d.ts +2 -0
  45. package/dist/tools/channels/index.d.ts.map +1 -1
  46. package/dist/tools/channels/index.js +2 -0
  47. package/dist/tools/channels/index.js.map +1 -1
  48. package/dist/tools/channels/list-channels.d.ts.map +1 -1
  49. package/dist/tools/channels/list-channels.js +4 -1
  50. package/dist/tools/channels/list-channels.js.map +1 -1
  51. package/dist/tools/channels/purge-messages.d.ts +3 -0
  52. package/dist/tools/channels/purge-messages.d.ts.map +1 -0
  53. package/dist/tools/channels/purge-messages.js +41 -0
  54. package/dist/tools/channels/purge-messages.js.map +1 -0
  55. package/dist/tools/channels/set-slowmode.d.ts +3 -0
  56. package/dist/tools/channels/set-slowmode.d.ts.map +1 -0
  57. package/dist/tools/channels/set-slowmode.js +36 -0
  58. package/dist/tools/channels/set-slowmode.js.map +1 -0
  59. package/dist/tools/guilds/get-guild.d.ts.map +1 -1
  60. package/dist/tools/guilds/get-guild.js +4 -1
  61. package/dist/tools/guilds/get-guild.js.map +1 -1
  62. package/dist/tools/guilds/list-guilds.d.ts.map +1 -1
  63. package/dist/tools/guilds/list-guilds.js +11 -4
  64. package/dist/tools/guilds/list-guilds.js.map +1 -1
  65. package/dist/tools/health-check.d.ts.map +1 -1
  66. package/dist/tools/health-check.js +15 -2
  67. package/dist/tools/health-check.js.map +1 -1
  68. package/dist/tools/index.d.ts.map +1 -1
  69. package/dist/tools/index.js +47 -0
  70. package/dist/tools/index.js.map +1 -1
  71. package/dist/tools/members/get-member.d.ts.map +1 -1
  72. package/dist/tools/members/get-member.js +4 -1
  73. package/dist/tools/members/get-member.js.map +1 -1
  74. package/dist/tools/members/list-members.d.ts.map +1 -1
  75. package/dist/tools/members/list-members.js +4 -1
  76. package/dist/tools/members/list-members.js.map +1 -1
  77. package/dist/tools/messaging/add-reaction.js +1 -1
  78. package/dist/tools/messaging/add-reaction.js.map +1 -1
  79. package/dist/tools/messaging/delete-message.d.ts.map +1 -1
  80. package/dist/tools/messaging/delete-message.js +1 -1
  81. package/dist/tools/messaging/delete-message.js.map +1 -1
  82. package/dist/tools/messaging/edit-message.js +1 -1
  83. package/dist/tools/messaging/edit-message.js.map +1 -1
  84. package/dist/tools/messaging/get-messages.js +1 -1
  85. package/dist/tools/messaging/get-messages.js.map +1 -1
  86. package/dist/tools/messaging/send-message.d.ts.map +1 -1
  87. package/dist/tools/messaging/send-message.js +2 -4
  88. package/dist/tools/messaging/send-message.js.map +1 -1
  89. package/dist/tools/moderation/ban-member.d.ts +3 -0
  90. package/dist/tools/moderation/ban-member.d.ts.map +1 -0
  91. package/dist/tools/moderation/ban-member.js +48 -0
  92. package/dist/tools/moderation/ban-member.js.map +1 -0
  93. package/dist/tools/moderation/index.d.ts +5 -0
  94. package/dist/tools/moderation/index.d.ts.map +1 -0
  95. package/dist/tools/moderation/index.js +5 -0
  96. package/dist/tools/moderation/index.js.map +1 -0
  97. package/dist/tools/moderation/kick-member.d.ts +3 -0
  98. package/dist/tools/moderation/kick-member.d.ts.map +1 -0
  99. package/dist/tools/moderation/kick-member.js +40 -0
  100. package/dist/tools/moderation/kick-member.js.map +1 -0
  101. package/dist/tools/moderation/timeout-member.d.ts +3 -0
  102. package/dist/tools/moderation/timeout-member.d.ts.map +1 -0
  103. package/dist/tools/moderation/timeout-member.js +47 -0
  104. package/dist/tools/moderation/timeout-member.js.map +1 -0
  105. package/dist/tools/moderation/unban-member.d.ts +3 -0
  106. package/dist/tools/moderation/unban-member.d.ts.map +1 -0
  107. package/dist/tools/moderation/unban-member.js +30 -0
  108. package/dist/tools/moderation/unban-member.js.map +1 -0
  109. package/dist/tools/roles/assign-role.d.ts +3 -0
  110. package/dist/tools/roles/assign-role.d.ts.map +1 -0
  111. package/dist/tools/roles/assign-role.js +40 -0
  112. package/dist/tools/roles/assign-role.js.map +1 -0
  113. package/dist/tools/roles/create-role.d.ts +3 -0
  114. package/dist/tools/roles/create-role.d.ts.map +1 -0
  115. package/dist/tools/roles/create-role.js +50 -0
  116. package/dist/tools/roles/create-role.js.map +1 -0
  117. package/dist/tools/roles/delete-role.d.ts +3 -0
  118. package/dist/tools/roles/delete-role.d.ts.map +1 -0
  119. package/dist/tools/roles/delete-role.js +32 -0
  120. package/dist/tools/roles/delete-role.js.map +1 -0
  121. package/dist/tools/roles/edit-role.d.ts +3 -0
  122. package/dist/tools/roles/edit-role.d.ts.map +1 -0
  123. package/dist/tools/roles/edit-role.js +52 -0
  124. package/dist/tools/roles/edit-role.js.map +1 -0
  125. package/dist/tools/roles/index.d.ts +4 -0
  126. package/dist/tools/roles/index.d.ts.map +1 -1
  127. package/dist/tools/roles/index.js +4 -0
  128. package/dist/tools/roles/index.js.map +1 -1
  129. package/dist/tools/roles/list-roles.d.ts.map +1 -1
  130. package/dist/tools/roles/list-roles.js +6 -2
  131. package/dist/tools/roles/list-roles.js.map +1 -1
  132. package/dist/tools/schema.d.ts +9 -0
  133. package/dist/tools/schema.d.ts.map +1 -0
  134. package/dist/tools/schema.js +13 -0
  135. package/dist/tools/schema.js.map +1 -0
  136. package/dist/tools/threads/create-thread.js +1 -1
  137. package/dist/tools/threads/create-thread.js.map +1 -1
  138. package/dist/tools/threads/list-threads.d.ts.map +1 -1
  139. package/dist/tools/threads/list-threads.js +4 -1
  140. package/dist/tools/threads/list-threads.js.map +1 -1
  141. package/dist/tools/webhooks/create-webhook.d.ts +3 -0
  142. package/dist/tools/webhooks/create-webhook.d.ts.map +1 -0
  143. package/dist/tools/webhooks/create-webhook.js +38 -0
  144. package/dist/tools/webhooks/create-webhook.js.map +1 -0
  145. package/dist/tools/webhooks/delete-webhook.d.ts +3 -0
  146. package/dist/tools/webhooks/delete-webhook.d.ts.map +1 -0
  147. package/dist/tools/webhooks/delete-webhook.js +27 -0
  148. package/dist/tools/webhooks/delete-webhook.js.map +1 -0
  149. package/dist/tools/webhooks/edit-webhook.d.ts +3 -0
  150. package/dist/tools/webhooks/edit-webhook.d.ts.map +1 -0
  151. package/dist/tools/webhooks/edit-webhook.js +36 -0
  152. package/dist/tools/webhooks/edit-webhook.js.map +1 -0
  153. package/dist/tools/webhooks/execute-webhook.d.ts +3 -0
  154. package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -0
  155. package/dist/tools/webhooks/execute-webhook.js +63 -0
  156. package/dist/tools/webhooks/execute-webhook.js.map +1 -0
  157. package/dist/tools/webhooks/get-webhook.d.ts +3 -0
  158. package/dist/tools/webhooks/get-webhook.d.ts.map +1 -0
  159. package/dist/tools/webhooks/get-webhook.js +33 -0
  160. package/dist/tools/webhooks/get-webhook.js.map +1 -0
  161. package/dist/tools/webhooks/index.d.ts +7 -0
  162. package/dist/tools/webhooks/index.d.ts.map +1 -0
  163. package/dist/tools/webhooks/index.js +7 -0
  164. package/dist/tools/webhooks/index.js.map +1 -0
  165. package/dist/tools/webhooks/list-webhooks.d.ts +3 -0
  166. package/dist/tools/webhooks/list-webhooks.d.ts.map +1 -0
  167. package/dist/tools/webhooks/list-webhooks.js +47 -0
  168. package/dist/tools/webhooks/list-webhooks.js.map +1 -0
  169. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # discord-ops
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d2c052b: Add 17 new tools (moderation, role CRUD, webhook CRUD+execute, audit log, channel moderation), security hardening (rate limiting, permission pre-flight, snowflake validation, self-protection guards), and local CI infrastructure.
8
+
3
9
  ## 0.1.0
4
10
 
5
11
  ### Features
package/README.md CHANGED
@@ -8,9 +8,11 @@ Agency-grade Discord MCP server with multi-guild project routing.
8
8
 
9
9
  ## Features
10
10
 
11
- - **18 MCP tools** — messaging, channels, guilds, members, roles, threads, health check
11
+ - **35 MCP tools** — messaging, channels, moderation, roles, webhooks, audit log, threads, guilds, health check
12
12
  - **Multi-guild project routing** — `send_message({ project: "my-app", channel: "builds" })` instead of raw channel IDs
13
13
  - **Notification routing** — map notification types (ci_build, deploy, error) to channels per project
14
+ - **Multi-bot support** — manage multiple Discord bots from a single MCP server
15
+ - **Security hardening** — rate limiting, permission pre-flight checks, snowflake ID validation, self-protection guards
14
16
  - **Lazy login** — tools enumerate before Discord connects; first tool call triggers login
15
17
  - **Zod validation** — all inputs validated before execution
16
18
  - **Error sanitization** — tokens, webhook URLs, and snowflake IDs stripped from error output
@@ -104,25 +106,74 @@ send_message({ notification_type: "ci_build", content: "CI green" })
104
106
  send_message({ channel_id: "123456789", content: "Hello" })
105
107
  ```
106
108
 
107
- ## Tools (v0.1.0)
109
+ ## Tools
110
+
111
+ ### Messaging
108
112
 
109
113
  | Tool | Description |
110
- |------|-------------|
114
+ | --- | --- |
111
115
  | `send_message` | Send a message with project routing |
112
116
  | `get_messages` | Fetch recent messages |
113
117
  | `edit_message` | Edit a bot message |
114
118
  | `delete_message` | Delete a message |
115
119
  | `add_reaction` | React to a message |
120
+
121
+ ### Channels
122
+
123
+ | Tool | Description |
124
+ | --- | --- |
116
125
  | `list_channels` | List guild channels |
117
126
  | `get_channel` | Get channel details |
118
127
  | `create_channel` | Create a channel |
119
128
  | `edit_channel` | Edit channel properties |
120
129
  | `delete_channel` | Delete a channel |
130
+ | `purge_messages` | Bulk-delete messages (max 100, < 14 days old) |
131
+ | `set_slowmode` | Set or disable slowmode |
132
+
133
+ ### Moderation
134
+
135
+ | Tool | Description |
136
+ | --- | --- |
137
+ | `kick_member` | Kick a member from a guild |
138
+ | `ban_member` | Ban a user from a guild |
139
+ | `unban_member` | Unban a user |
140
+ | `timeout_member` | Timeout (mute) a member |
141
+
142
+ ### Roles
143
+
144
+ | Tool | Description |
145
+ | --- | --- |
146
+ | `list_roles` | List guild roles |
147
+ | `create_role` | Create a new role |
148
+ | `edit_role` | Edit role properties |
149
+ | `delete_role` | Delete a role |
150
+ | `assign_role` | Add or remove a role from a member |
151
+
152
+ ### Webhooks
153
+
154
+ | Tool | Description |
155
+ | --- | --- |
156
+ | `create_webhook` | Create a webhook on a channel |
157
+ | `get_webhook` | Get webhook details |
158
+ | `list_webhooks` | List webhooks for a guild or channel |
159
+ | `edit_webhook` | Edit webhook properties |
160
+ | `delete_webhook` | Delete a webhook |
161
+ | `execute_webhook` | Send a message via webhook |
162
+
163
+ ### Audit
164
+
165
+ | Tool | Description |
166
+ | --- | --- |
167
+ | `query_audit_log` | Query guild audit log with filters |
168
+
169
+ ### Other
170
+
171
+ | Tool | Description |
172
+ | --- | --- |
121
173
  | `list_guilds` | List bot's guilds |
122
174
  | `get_guild` | Get guild details |
123
175
  | `list_members` | List guild members |
124
176
  | `get_member` | Get member details |
125
- | `list_roles` | List guild roles |
126
177
  | `create_thread` | Create a thread |
127
178
  | `list_threads` | List active threads |
128
179
  | `health_check` | Bot status + permissions |
@@ -130,7 +181,7 @@ send_message({ channel_id: "123456789", content: "Hello" })
130
181
  ## Environment Variables
131
182
 
132
183
  | Variable | Required | Description |
133
- |----------|----------|-------------|
184
+ | --- | --- | --- |
134
185
  | `DISCORD_TOKEN` | Yes | Discord bot token |
135
186
  | `DISCORD_OPS_CONFIG` | No | Path to global config (default: `~/.discord-ops.json`) |
136
187
  | `DISCORD_OPS_LOG_LEVEL` | No | `debug`, `info`, `warn`, `error` (default: `info`) |
@@ -143,6 +194,9 @@ cd discord-ops
143
194
  npm install
144
195
  npm run build
145
196
  npm test
197
+
198
+ # Local CI
199
+ ./scripts/act-ci.sh --local
146
200
  ```
147
201
 
148
202
  ## License
package/dist/cli/index.js CHANGED
@@ -28,7 +28,7 @@ async function main() {
28
28
  // Load config (does NOT require Discord connection)
29
29
  const config = loadConfig();
30
30
  // Create lazy Discord client
31
- const discord = new DiscordClient(config.token);
31
+ const discord = new DiscordClient(config.defaultToken);
32
32
  // Create MCP server with tool context
33
33
  const server = createServer({ discord, config });
34
34
  // Start stdio transport
@@ -45,20 +45,37 @@ async function main() {
45
45
  async function runHealthCheck() {
46
46
  try {
47
47
  const config = loadConfig();
48
- const discord = new DiscordClient(config.token);
49
- console.log("Connecting to Discord...");
50
- const client = await discord.getClient();
51
- console.log(`\nBot: ${client.user?.tag}`);
52
- console.log(`Guilds: ${client.guilds.cache.size}`);
53
- for (const [id, guild] of client.guilds.cache) {
54
- const me = await guild.members.fetchMe();
55
- console.log(`\n ${guild.name} (${id})`);
56
- console.log(` Members: ${guild.memberCount}`);
57
- console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
48
+ const discord = new DiscordClient(config.defaultToken);
49
+ // Collect unique tokens: default + any project-specific ones
50
+ const tokens = new Map(); // token → project names
51
+ tokens.set(config.defaultToken, ["(default)"]);
52
+ for (const [name, project] of Object.entries(config.global.projects)) {
53
+ if (project.token_env) {
54
+ const t = process.env[project.token_env];
55
+ if (t && t !== config.defaultToken) {
56
+ const names = tokens.get(t) ?? [];
57
+ names.push(name);
58
+ tokens.set(t, names);
59
+ }
60
+ }
61
+ }
62
+ console.log(`Bots configured: ${tokens.size}`);
63
+ for (const [token, projects] of tokens) {
64
+ console.log(`\nConnecting bot for: ${projects.join(", ")}...`);
65
+ const client = await discord.getClient(token);
66
+ console.log(` Bot: ${client.user?.tag}`);
67
+ console.log(` Guilds: ${client.guilds.cache.size}`);
68
+ for (const [id, guild] of client.guilds.cache) {
69
+ const me = await guild.members.fetchMe();
70
+ console.log(`\n ${guild.name} (${id})`);
71
+ console.log(` Members: ${guild.memberCount}`);
72
+ console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
73
+ }
58
74
  }
59
75
  console.log(`\nProjects configured: ${Object.keys(config.global.projects).length}`);
60
76
  for (const [name, project] of Object.entries(config.global.projects)) {
61
- console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}`);
77
+ const tokenInfo = project.token_env ? ` [${project.token_env}]` : "";
78
+ console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}`);
62
79
  }
63
80
  console.log("\nHealth check passed.");
64
81
  await discord.destroy();
@@ -79,7 +96,8 @@ USAGE:
79
96
  discord-ops --version Show version
80
97
 
81
98
  ENVIRONMENT:
82
- DISCORD_TOKEN Discord bot token (required)
99
+ DISCORD_TOKEN Default Discord bot token (required)
100
+ <PROJECT>_TOKEN Per-project bot tokens (configured via token_env in config)
83
101
  DISCORD_OPS_CONFIG Path to global config file (default: ~/.discord-ops.json)
84
102
  DISCORD_OPS_LOG_LEVEL Log level: debug, info, warn, error (default: info)
85
103
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,21 +1,23 @@
1
1
  import { Client, type Guild, type TextChannel } from "discord.js";
2
2
  /**
3
- * Lazy Discord client — tools enumerate before Discord connects.
4
- * First tool call triggers login + cache warmup.
3
+ * Multi-bot Discord client manager.
4
+ * Manages one lazy connection per unique token.
5
+ * Tools call getChannel/getGuild with an optional token override
6
+ * to route to the correct bot.
5
7
  */
6
8
  export declare class DiscordClient {
7
- private client;
8
- private token;
9
- private connecting;
9
+ private connections;
10
+ private defaultToken;
10
11
  private guildCache;
11
- constructor(token: string);
12
+ constructor(defaultToken: string);
13
+ private getConnection;
12
14
  /**
13
- * Returns the underlying discord.js Client, connecting lazily on first call.
15
+ * Returns the underlying discord.js Client for the given token.
16
+ * Connects lazily on first call.
14
17
  */
15
- getClient(): Promise<Client>;
16
- private connect;
17
- getGuild(guildId: string): Promise<Guild>;
18
- getChannel(channelId: string): Promise<TextChannel>;
18
+ getClient(token?: string): Promise<Client>;
19
+ getGuild(guildId: string, token?: string): Promise<Guild>;
20
+ getChannel(channelId: string, token?: string): Promise<TextChannel>;
19
21
  destroy(): Promise<void>;
20
22
  get isConnected(): boolean;
21
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAKrF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,UAAU,CAA4B;gBAElC,KAAK,EAAE,MAAM;IAQzB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;YASpB,OAAO;IAgCf,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAUzC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IASnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAkErF;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAA4B;gBAElC,YAAY,EAAE,MAAM;IAQhC,OAAO,CAAC,aAAa;IAgBrB;;;OAGG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAWzD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IASnE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF"}
package/dist/client.js CHANGED
@@ -3,24 +3,15 @@ import { logger } from "./utils/logger.js";
3
3
  import { validateTokenFormat } from "./security/token-validator.js";
4
4
  import { TTLCache } from "./utils/cache.js";
5
5
  /**
6
- * Lazy Discord clienttools enumerate before Discord connects.
7
- * First tool call triggers login + cache warmup.
6
+ * Single Discord bot connection lazy login on first use.
8
7
  */
9
- export class DiscordClient {
8
+ class BotConnection {
10
9
  client = null;
11
- token;
12
10
  connecting = null;
13
- guildCache = new TTLCache(300);
11
+ token;
14
12
  constructor(token) {
15
- const validation = validateTokenFormat(token);
16
- if (!validation.valid) {
17
- throw new Error(`Invalid Discord token: ${validation.reason}`);
18
- }
19
13
  this.token = token;
20
14
  }
21
- /**
22
- * Returns the underlying discord.js Client, connecting lazily on first call.
23
- */
24
15
  async getClient() {
25
16
  if (this.client?.isReady())
26
17
  return this.client;
@@ -30,7 +21,6 @@ export class DiscordClient {
30
21
  return this.connecting;
31
22
  }
32
23
  async connect() {
33
- logger.info("Connecting to Discord...");
34
24
  const client = new Client({
35
25
  intents: [
36
26
  GatewayIntentBits.Guilds,
@@ -48,7 +38,7 @@ export class DiscordClient {
48
38
  client.once("ready", () => resolve());
49
39
  }
50
40
  });
51
- logger.info("Discord connected", {
41
+ logger.info("Discord bot connected", {
52
42
  user: client.user?.tag,
53
43
  guilds: client.guilds.cache.size,
54
44
  });
@@ -56,17 +46,67 @@ export class DiscordClient {
56
46
  this.connecting = null;
57
47
  return client;
58
48
  }
59
- async getGuild(guildId) {
60
- const cached = this.guildCache.get(guildId);
49
+ get isReady() {
50
+ return this.client?.isReady() ?? false;
51
+ }
52
+ async destroy() {
53
+ if (this.client) {
54
+ this.client.destroy();
55
+ this.client = null;
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Multi-bot Discord client manager.
61
+ * Manages one lazy connection per unique token.
62
+ * Tools call getChannel/getGuild with an optional token override
63
+ * to route to the correct bot.
64
+ */
65
+ export class DiscordClient {
66
+ connections = new Map();
67
+ defaultToken;
68
+ guildCache = new TTLCache(300);
69
+ constructor(defaultToken) {
70
+ const validation = validateTokenFormat(defaultToken);
71
+ if (!validation.valid) {
72
+ throw new Error(`Invalid Discord token: ${validation.reason}`);
73
+ }
74
+ this.defaultToken = defaultToken;
75
+ }
76
+ getConnection(token) {
77
+ const t = token ?? this.defaultToken;
78
+ let conn = this.connections.get(t);
79
+ if (!conn) {
80
+ if (t !== this.defaultToken) {
81
+ const validation = validateTokenFormat(t);
82
+ if (!validation.valid) {
83
+ throw new Error(`Invalid Discord token for project: ${validation.reason}`);
84
+ }
85
+ }
86
+ conn = new BotConnection(t);
87
+ this.connections.set(t, conn);
88
+ }
89
+ return conn;
90
+ }
91
+ /**
92
+ * Returns the underlying discord.js Client for the given token.
93
+ * Connects lazily on first call.
94
+ */
95
+ async getClient(token) {
96
+ return this.getConnection(token).getClient();
97
+ }
98
+ async getGuild(guildId, token) {
99
+ const cacheKey = `${token ?? "default"}:${guildId}`;
100
+ const cached = this.guildCache.get(cacheKey);
61
101
  if (cached)
62
102
  return cached;
63
- const client = await this.getClient();
103
+ const client = await this.getClient(token);
64
104
  const guild = await client.guilds.fetch(guildId);
65
- this.guildCache.set(guildId, guild);
105
+ this.guildCache.set(cacheKey, guild);
66
106
  return guild;
67
107
  }
68
- async getChannel(channelId) {
69
- const client = await this.getClient();
108
+ async getChannel(channelId, token) {
109
+ const client = await this.getClient(token);
70
110
  const channel = await client.channels.fetch(channelId);
71
111
  if (!channel || !channel.isTextBased()) {
72
112
  throw new Error(`Channel ${channelId} not found or not a text channel`);
@@ -74,14 +114,14 @@ export class DiscordClient {
74
114
  return channel;
75
115
  }
76
116
  async destroy() {
77
- if (this.client) {
78
- this.client.destroy();
79
- this.client = null;
80
- logger.info("Discord client destroyed");
117
+ for (const conn of this.connections.values()) {
118
+ await conn.destroy();
81
119
  }
120
+ this.connections.clear();
121
+ logger.info("All Discord connections destroyed");
82
122
  }
83
123
  get isConnected() {
84
- return this.client?.isReady() ?? false;
124
+ return this.getConnection().isReady;
85
125
  }
86
126
  }
87
127
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,14 @@ import { type GlobalConfig, type PerProjectConfig } from "./schema.js";
2
2
  export interface LoadedConfig {
3
3
  global: GlobalConfig;
4
4
  perProject?: PerProjectConfig;
5
- token: string;
5
+ defaultToken: string;
6
6
  }
7
+ /**
8
+ * Resolves the token for a given project.
9
+ * If the project has `token_env`, reads that env var.
10
+ * Otherwise falls back to the default DISCORD_TOKEN.
11
+ */
12
+ export declare function getTokenForProject(projectName: string, config: LoadedConfig): string;
7
13
  /**
8
14
  * Loads config from environment + files.
9
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAUzC;AA0CD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAUpF;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAUzC;AAyCD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -3,6 +3,21 @@ import { resolve, join } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { GlobalConfigSchema, PerProjectConfigSchema, } from "./schema.js";
6
+ /**
7
+ * Resolves the token for a given project.
8
+ * If the project has `token_env`, reads that env var.
9
+ * Otherwise falls back to the default DISCORD_TOKEN.
10
+ */
11
+ export function getTokenForProject(projectName, config) {
12
+ const project = config.global.projects[projectName];
13
+ if (project?.token_env) {
14
+ const token = process.env[project.token_env];
15
+ if (token)
16
+ return token;
17
+ logger.warn(`token_env "${project.token_env}" for project "${projectName}" is not set, falling back to DISCORD_TOKEN`);
18
+ }
19
+ return config.defaultToken;
20
+ }
6
21
  /**
7
22
  * Loads config from environment + files.
8
23
  *
@@ -12,13 +27,13 @@ import { GlobalConfigSchema, PerProjectConfigSchema, } from "./schema.js";
12
27
  * 3. Direct params always work regardless
13
28
  */
14
29
  export function loadConfig() {
15
- const token = process.env.DISCORD_TOKEN;
16
- if (!token) {
30
+ const defaultToken = process.env.DISCORD_TOKEN;
31
+ if (!defaultToken) {
17
32
  throw new Error("DISCORD_TOKEN environment variable is required");
18
33
  }
19
34
  const global = loadGlobalConfig();
20
35
  const perProject = loadPerProjectConfig();
21
- return { global, perProject, token };
36
+ return { global, perProject, defaultToken };
22
37
  }
23
38
  function loadGlobalConfig() {
24
39
  const configPath = process.env.DISCORD_OPS_CONFIG ?? resolve(homedir(), ".discord-ops.json");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GAGvB,MAAM,aAAa,CAAC;AAQrB;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAE1C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAE5E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;YAC/D,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;YAChD,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,17 @@ export declare const ProjectConfigSchema: z.ZodObject<{
5
5
  guild_id: z.ZodString;
6
6
  channels: z.ZodRecord<z.ZodString, z.ZodString>;
7
7
  default_channel: z.ZodOptional<z.ZodString>;
8
+ token_env: z.ZodOptional<z.ZodString>;
8
9
  }, "strip", z.ZodTypeAny, {
9
10
  guild_id: string;
10
11
  channels: Record<string, string>;
11
12
  default_channel?: string | undefined;
13
+ token_env?: string | undefined;
12
14
  }, {
13
15
  guild_id: string;
14
16
  channels: Record<string, string>;
15
17
  default_channel?: string | undefined;
18
+ token_env?: string | undefined;
16
19
  }>;
17
20
  export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
18
21
  export declare const GlobalConfigSchema: z.ZodObject<{
@@ -20,14 +23,17 @@ export declare const GlobalConfigSchema: z.ZodObject<{
20
23
  guild_id: z.ZodString;
21
24
  channels: z.ZodRecord<z.ZodString, z.ZodString>;
22
25
  default_channel: z.ZodOptional<z.ZodString>;
26
+ token_env: z.ZodOptional<z.ZodString>;
23
27
  }, "strip", z.ZodTypeAny, {
24
28
  guild_id: string;
25
29
  channels: Record<string, string>;
26
30
  default_channel?: string | undefined;
31
+ token_env?: string | undefined;
27
32
  }, {
28
33
  guild_id: string;
29
34
  channels: Record<string, string>;
30
35
  default_channel?: string | undefined;
36
+ token_env?: string | undefined;
31
37
  }>>;
32
38
  default_project: z.ZodOptional<z.ZodString>;
33
39
  notification_routing: z.ZodOptional<z.ZodRecord<z.ZodEnum<["ci_build", "deploy", "release", "error", "announcement", "dev"]>, z.ZodString>>;
@@ -36,6 +42,7 @@ export declare const GlobalConfigSchema: z.ZodObject<{
36
42
  guild_id: string;
37
43
  channels: Record<string, string>;
38
44
  default_channel?: string | undefined;
45
+ token_env?: string | undefined;
39
46
  }>;
40
47
  default_project?: string | undefined;
41
48
  notification_routing?: Partial<Record<"error" | "ci_build" | "deploy" | "release" | "announcement" | "dev", string>> | undefined;
@@ -44,6 +51,7 @@ export declare const GlobalConfigSchema: z.ZodObject<{
44
51
  guild_id: string;
45
52
  channels: Record<string, string>;
46
53
  default_channel?: string | undefined;
54
+ token_env?: string | undefined;
47
55
  }>;
48
56
  default_project?: string | undefined;
49
57
  notification_routing?: Partial<Record<"error" | "ci_build" | "deploy" | "release" | "announcement" | "dev", string>> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,8EAO3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,8EAO3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC"}
@@ -11,6 +11,7 @@ export const ProjectConfigSchema = z.object({
11
11
  guild_id: z.string().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake ID"),
12
12
  channels: z.record(z.string(), z.string().regex(/^\d{17,20}$/)),
13
13
  default_channel: z.string().optional(),
14
+ token_env: z.string().optional(),
14
15
  });
15
16
  export const GlobalConfigSchema = z.object({
16
17
  projects: z.record(z.string(), ProjectConfigSchema),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,cAAc;IACd,KAAK;CACN,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,sCAAsC,CAAC;IACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC;IACnD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7E,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,UAAU;IACV,QAAQ;IACR,SAAS;IACT,OAAO;IACP,cAAc;IACd,KAAK;CACN,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,sCAAsC,CAAC;IACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC;IACnD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7E,CAAC,CAAC"}
@@ -1,8 +1,9 @@
1
- import type { LoadedConfig } from "../config/index.js";
1
+ import { type LoadedConfig } from "../config/index.js";
2
2
  export interface ResolvedTarget {
3
3
  guildId: string;
4
4
  channelId: string;
5
5
  project?: string;
6
+ token?: string;
6
7
  }
7
8
  export interface ResolveParams {
8
9
  /** Direct channel ID — highest priority */
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/routing/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GACnB,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAoCpC"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/routing/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAI3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GACnB,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAoCpC"}
@@ -1,3 +1,4 @@
1
+ import { getTokenForProject } from "../config/index.js";
1
2
  import { resolveProject, getDefaultProjectName } from "../config/profiles.js";
2
3
  /**
3
4
  * Resolves a target guild + channel from flexible input params.
@@ -37,6 +38,7 @@ export function resolveTarget(params, config) {
37
38
  guildId: project.guildId,
38
39
  channelId,
39
40
  project: projectName,
41
+ token: getTokenForProject(projectName, config),
40
42
  };
41
43
  }
42
44
  function resolveChannel(params, project) {
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/routing/resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AAsBpG;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAoB;IAEpB,wBAAwB;IACxB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC9B,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GACf,MAAM,CAAC,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAE5E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,YAAY,WAAW,uBAAuB,EAAE,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,uCAAuC,WAAW,+DAA+D;SACzH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS;QACT,OAAO,EAAE,WAAW;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,MAAqB,EACrB,OAAwB;IAExB,yBAAyB;IACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,iDAAiD;IACjD,IAAI,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,iBAAqC,CAAC,CAAC;QAC/F,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/routing/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AAuBpG;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAoB;IAEpB,wBAAwB;IACxB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC9B,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAE9F,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,YAAY,WAAW,uBAAuB,EAAE,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,uCAAuC,WAAW,+DAA+D;SACzH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS;QACT,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAqB,EAAE,OAAwB;IACrE,yBAAyB;IACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,iDAAiD;IACjD,IAAI,MAAM,CAAC,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,iBAAqC,CAAC,CAAC;QAC/F,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAiBpD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAqDxD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAuBpD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CA+FxD"}