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.
- package/CHANGELOG.md +6 -0
- package/README.md +59 -5
- package/dist/cli/index.js +31 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.ts +13 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -25
- package/dist/client.js.map +1 -1
- package/dist/config/index.d.ts +7 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +18 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +8 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/routing/resolver.d.ts +2 -1
- package/dist/routing/resolver.d.ts.map +1 -1
- package/dist/routing/resolver.js +2 -0
- package/dist/routing/resolver.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +46 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/audit/index.d.ts +2 -0
- package/dist/tools/audit/index.d.ts.map +1 -0
- package/dist/tools/audit/index.js +2 -0
- package/dist/tools/audit/index.js.map +1 -0
- package/dist/tools/audit/query-audit-log.d.ts +3 -0
- package/dist/tools/audit/query-audit-log.d.ts.map +1 -0
- package/dist/tools/audit/query-audit-log.js +60 -0
- package/dist/tools/audit/query-audit-log.js.map +1 -0
- package/dist/tools/channels/create-channel.d.ts.map +1 -1
- package/dist/tools/channels/create-channel.js +4 -1
- package/dist/tools/channels/create-channel.js.map +1 -1
- package/dist/tools/channels/delete-channel.d.ts.map +1 -1
- package/dist/tools/channels/delete-channel.js +4 -1
- package/dist/tools/channels/delete-channel.js.map +1 -1
- package/dist/tools/channels/edit-channel.d.ts.map +1 -1
- package/dist/tools/channels/edit-channel.js +4 -1
- package/dist/tools/channels/edit-channel.js.map +1 -1
- package/dist/tools/channels/get-channel.d.ts.map +1 -1
- package/dist/tools/channels/get-channel.js +4 -1
- package/dist/tools/channels/get-channel.js.map +1 -1
- package/dist/tools/channels/index.d.ts +2 -0
- package/dist/tools/channels/index.d.ts.map +1 -1
- package/dist/tools/channels/index.js +2 -0
- package/dist/tools/channels/index.js.map +1 -1
- package/dist/tools/channels/list-channels.d.ts.map +1 -1
- package/dist/tools/channels/list-channels.js +4 -1
- package/dist/tools/channels/list-channels.js.map +1 -1
- package/dist/tools/channels/purge-messages.d.ts +3 -0
- package/dist/tools/channels/purge-messages.d.ts.map +1 -0
- package/dist/tools/channels/purge-messages.js +41 -0
- package/dist/tools/channels/purge-messages.js.map +1 -0
- package/dist/tools/channels/set-slowmode.d.ts +3 -0
- package/dist/tools/channels/set-slowmode.d.ts.map +1 -0
- package/dist/tools/channels/set-slowmode.js +36 -0
- package/dist/tools/channels/set-slowmode.js.map +1 -0
- package/dist/tools/guilds/get-guild.d.ts.map +1 -1
- package/dist/tools/guilds/get-guild.js +4 -1
- package/dist/tools/guilds/get-guild.js.map +1 -1
- package/dist/tools/guilds/list-guilds.d.ts.map +1 -1
- package/dist/tools/guilds/list-guilds.js +11 -4
- package/dist/tools/guilds/list-guilds.js.map +1 -1
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +15 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +47 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/members/get-member.d.ts.map +1 -1
- package/dist/tools/members/get-member.js +4 -1
- package/dist/tools/members/get-member.js.map +1 -1
- package/dist/tools/members/list-members.d.ts.map +1 -1
- package/dist/tools/members/list-members.js +4 -1
- package/dist/tools/members/list-members.js.map +1 -1
- package/dist/tools/messaging/add-reaction.js +1 -1
- package/dist/tools/messaging/add-reaction.js.map +1 -1
- package/dist/tools/messaging/delete-message.d.ts.map +1 -1
- package/dist/tools/messaging/delete-message.js +1 -1
- package/dist/tools/messaging/delete-message.js.map +1 -1
- package/dist/tools/messaging/edit-message.js +1 -1
- package/dist/tools/messaging/edit-message.js.map +1 -1
- package/dist/tools/messaging/get-messages.js +1 -1
- package/dist/tools/messaging/get-messages.js.map +1 -1
- package/dist/tools/messaging/send-message.d.ts.map +1 -1
- package/dist/tools/messaging/send-message.js +2 -4
- package/dist/tools/messaging/send-message.js.map +1 -1
- package/dist/tools/moderation/ban-member.d.ts +3 -0
- package/dist/tools/moderation/ban-member.d.ts.map +1 -0
- package/dist/tools/moderation/ban-member.js +48 -0
- package/dist/tools/moderation/ban-member.js.map +1 -0
- package/dist/tools/moderation/index.d.ts +5 -0
- package/dist/tools/moderation/index.d.ts.map +1 -0
- package/dist/tools/moderation/index.js +5 -0
- package/dist/tools/moderation/index.js.map +1 -0
- package/dist/tools/moderation/kick-member.d.ts +3 -0
- package/dist/tools/moderation/kick-member.d.ts.map +1 -0
- package/dist/tools/moderation/kick-member.js +40 -0
- package/dist/tools/moderation/kick-member.js.map +1 -0
- package/dist/tools/moderation/timeout-member.d.ts +3 -0
- package/dist/tools/moderation/timeout-member.d.ts.map +1 -0
- package/dist/tools/moderation/timeout-member.js +47 -0
- package/dist/tools/moderation/timeout-member.js.map +1 -0
- package/dist/tools/moderation/unban-member.d.ts +3 -0
- package/dist/tools/moderation/unban-member.d.ts.map +1 -0
- package/dist/tools/moderation/unban-member.js +30 -0
- package/dist/tools/moderation/unban-member.js.map +1 -0
- package/dist/tools/roles/assign-role.d.ts +3 -0
- package/dist/tools/roles/assign-role.d.ts.map +1 -0
- package/dist/tools/roles/assign-role.js +40 -0
- package/dist/tools/roles/assign-role.js.map +1 -0
- package/dist/tools/roles/create-role.d.ts +3 -0
- package/dist/tools/roles/create-role.d.ts.map +1 -0
- package/dist/tools/roles/create-role.js +50 -0
- package/dist/tools/roles/create-role.js.map +1 -0
- package/dist/tools/roles/delete-role.d.ts +3 -0
- package/dist/tools/roles/delete-role.d.ts.map +1 -0
- package/dist/tools/roles/delete-role.js +32 -0
- package/dist/tools/roles/delete-role.js.map +1 -0
- package/dist/tools/roles/edit-role.d.ts +3 -0
- package/dist/tools/roles/edit-role.d.ts.map +1 -0
- package/dist/tools/roles/edit-role.js +52 -0
- package/dist/tools/roles/edit-role.js.map +1 -0
- package/dist/tools/roles/index.d.ts +4 -0
- package/dist/tools/roles/index.d.ts.map +1 -1
- package/dist/tools/roles/index.js +4 -0
- package/dist/tools/roles/index.js.map +1 -1
- package/dist/tools/roles/list-roles.d.ts.map +1 -1
- package/dist/tools/roles/list-roles.js +6 -2
- package/dist/tools/roles/list-roles.js.map +1 -1
- package/dist/tools/schema.d.ts +9 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +13 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/threads/create-thread.js +1 -1
- package/dist/tools/threads/create-thread.js.map +1 -1
- package/dist/tools/threads/list-threads.d.ts.map +1 -1
- package/dist/tools/threads/list-threads.js +4 -1
- package/dist/tools/threads/list-threads.js.map +1 -1
- package/dist/tools/webhooks/create-webhook.d.ts +3 -0
- package/dist/tools/webhooks/create-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/create-webhook.js +38 -0
- package/dist/tools/webhooks/create-webhook.js.map +1 -0
- package/dist/tools/webhooks/delete-webhook.d.ts +3 -0
- package/dist/tools/webhooks/delete-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/delete-webhook.js +27 -0
- package/dist/tools/webhooks/delete-webhook.js.map +1 -0
- package/dist/tools/webhooks/edit-webhook.d.ts +3 -0
- package/dist/tools/webhooks/edit-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/edit-webhook.js +36 -0
- package/dist/tools/webhooks/edit-webhook.js.map +1 -0
- package/dist/tools/webhooks/execute-webhook.d.ts +3 -0
- package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/execute-webhook.js +63 -0
- package/dist/tools/webhooks/execute-webhook.js.map +1 -0
- package/dist/tools/webhooks/get-webhook.d.ts +3 -0
- package/dist/tools/webhooks/get-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/get-webhook.js +33 -0
- package/dist/tools/webhooks/get-webhook.js.map +1 -0
- package/dist/tools/webhooks/index.d.ts +7 -0
- package/dist/tools/webhooks/index.d.ts.map +1 -0
- package/dist/tools/webhooks/index.js +7 -0
- package/dist/tools/webhooks/index.js.map +1 -0
- package/dist/tools/webhooks/list-webhooks.d.ts +3 -0
- package/dist/tools/webhooks/list-webhooks.d.ts.map +1 -0
- package/dist/tools/webhooks/list-webhooks.js +47 -0
- package/dist/tools/webhooks/list-webhooks.js.map +1 -0
- 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
|
-
- **
|
|
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
|
|
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.
|
|
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.
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGzD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,gBAAgB;IAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAA6C,CAAC;IAC3E,IAAI,QAAQ;QAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,oDAAoD;IACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,
|
|
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
|
-
*
|
|
4
|
-
*
|
|
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
|
|
8
|
-
private
|
|
9
|
-
private connecting;
|
|
9
|
+
private connections;
|
|
10
|
+
private defaultToken;
|
|
10
11
|
private guildCache;
|
|
11
|
-
constructor(
|
|
12
|
+
constructor(defaultToken: string);
|
|
13
|
+
private getConnection;
|
|
12
14
|
/**
|
|
13
|
-
* Returns the underlying discord.js Client
|
|
15
|
+
* Returns the underlying discord.js Client for the given token.
|
|
16
|
+
* Connects lazily on first call.
|
|
14
17
|
*/
|
|
15
|
-
getClient(): Promise<Client>;
|
|
16
|
-
|
|
17
|
-
|
|
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
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
*
|
|
7
|
-
* First tool call triggers login + cache warmup.
|
|
6
|
+
* Single Discord bot connection — lazy login on first use.
|
|
8
7
|
*/
|
|
9
|
-
|
|
8
|
+
class BotConnection {
|
|
10
9
|
client = null;
|
|
11
|
-
token;
|
|
12
10
|
connecting = null;
|
|
13
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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(
|
|
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
|
-
|
|
78
|
-
|
|
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.
|
|
124
|
+
return this.getConnection().isReady;
|
|
85
125
|
}
|
|
86
126
|
}
|
|
87
127
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAgC,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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"}
|
package/dist/config/index.js
CHANGED
|
@@ -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
|
|
16
|
-
if (!
|
|
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,
|
|
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");
|
package/dist/config/index.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/config/schema.js
CHANGED
|
@@ -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;
|
|
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
|
|
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,
|
|
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"}
|
package/dist/routing/resolver.js
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|