discord-ops 0.2.0 → 0.4.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 (72) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +198 -70
  3. package/dist/cli/index.js +45 -5
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/setup.d.ts +7 -0
  6. package/dist/cli/setup.d.ts.map +1 -0
  7. package/dist/cli/setup.js +397 -0
  8. package/dist/cli/setup.js.map +1 -0
  9. package/dist/client.d.ts +2 -2
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +8 -3
  12. package/dist/client.js.map +1 -1
  13. package/dist/config/index.d.ts +1 -1
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/index.js +21 -5
  16. package/dist/config/index.js.map +1 -1
  17. package/dist/config/schema.d.ts +9 -3
  18. package/dist/config/schema.d.ts.map +1 -1
  19. package/dist/config/schema.js +3 -1
  20. package/dist/config/schema.js.map +1 -1
  21. package/dist/server.d.ts +4 -1
  22. package/dist/server.d.ts.map +1 -1
  23. package/dist/server.js +30 -1
  24. package/dist/server.js.map +1 -1
  25. package/dist/tools/channels/index.d.ts +1 -0
  26. package/dist/tools/channels/index.d.ts.map +1 -1
  27. package/dist/tools/channels/index.js +1 -0
  28. package/dist/tools/channels/index.js.map +1 -1
  29. package/dist/tools/channels/permissions.d.ts +3 -0
  30. package/dist/tools/channels/permissions.d.ts.map +1 -0
  31. package/dist/tools/channels/permissions.js +34 -0
  32. package/dist/tools/channels/permissions.js.map +1 -0
  33. package/dist/tools/guilds/index.d.ts +1 -0
  34. package/dist/tools/guilds/index.d.ts.map +1 -1
  35. package/dist/tools/guilds/index.js +1 -0
  36. package/dist/tools/guilds/index.js.map +1 -1
  37. package/dist/tools/guilds/invites.d.ts +4 -0
  38. package/dist/tools/guilds/invites.d.ts.map +1 -0
  39. package/dist/tools/guilds/invites.js +93 -0
  40. package/dist/tools/guilds/invites.js.map +1 -0
  41. package/dist/tools/index.d.ts.map +1 -1
  42. package/dist/tools/index.js +14 -0
  43. package/dist/tools/index.js.map +1 -1
  44. package/dist/tools/messaging/index.d.ts +3 -0
  45. package/dist/tools/messaging/index.d.ts.map +1 -1
  46. package/dist/tools/messaging/index.js +3 -0
  47. package/dist/tools/messaging/index.js.map +1 -1
  48. package/dist/tools/messaging/pin.d.ts +3 -0
  49. package/dist/tools/messaging/pin.d.ts.map +1 -0
  50. package/dist/tools/messaging/pin.js +24 -0
  51. package/dist/tools/messaging/pin.js.map +1 -0
  52. package/dist/tools/messaging/search.d.ts +3 -0
  53. package/dist/tools/messaging/search.d.ts.map +1 -0
  54. package/dist/tools/messaging/search.js +61 -0
  55. package/dist/tools/messaging/search.js.map +1 -0
  56. package/dist/tools/messaging/unpin.d.ts +3 -0
  57. package/dist/tools/messaging/unpin.d.ts.map +1 -0
  58. package/dist/tools/messaging/unpin.js +24 -0
  59. package/dist/tools/messaging/unpin.js.map +1 -0
  60. package/dist/tools/threads/archive.d.ts +3 -0
  61. package/dist/tools/threads/archive.d.ts.map +1 -0
  62. package/dist/tools/threads/archive.js +33 -0
  63. package/dist/tools/threads/archive.js.map +1 -0
  64. package/dist/tools/threads/index.d.ts +1 -0
  65. package/dist/tools/threads/index.d.ts.map +1 -1
  66. package/dist/tools/threads/index.js +1 -0
  67. package/dist/tools/threads/index.js.map +1 -1
  68. package/dist/transport/http.d.ts +6 -0
  69. package/dist/transport/http.d.ts.map +1 -0
  70. package/dist/transport/http.js +81 -0
  71. package/dist/transport/http.js.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1,397 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { resolve, join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { stdin, stdout } from "node:process";
6
+ import { Client, GatewayIntentBits, ChannelType } from "discord.js";
7
+ import { logger } from "../utils/logger.js";
8
+ const GLOBAL_CONFIG_PATH = resolve(homedir(), ".discord-ops.json");
9
+ const NOTIFICATION_TYPES = [
10
+ "ci_build",
11
+ "deploy",
12
+ "release",
13
+ "error",
14
+ "announcement",
15
+ "dev",
16
+ ];
17
+ const SUGGESTED_ALIASES = [
18
+ "dev",
19
+ "builds",
20
+ "alerts",
21
+ "releases",
22
+ "general",
23
+ "announcements",
24
+ "errors",
25
+ "deploys",
26
+ ];
27
+ /**
28
+ * Interactive setup wizard for discord-ops configuration.
29
+ * Walks users through bot token verification, guild selection,
30
+ * channel aliasing, and notification routing.
31
+ */
32
+ export async function runSetup() {
33
+ const rl = createInterface({ input: stdin, output: stdout });
34
+ console.log("\n discord-ops setup wizard\n");
35
+ console.log(" This wizard will help you configure discord-ops");
36
+ console.log(" by connecting to your Discord bot and mapping");
37
+ console.log(" guilds and channels to project aliases.\n");
38
+ try {
39
+ // Step 1: Check for existing config
40
+ const existingConfig = await checkExistingConfig(rl);
41
+ // Step 2: Obtain Discord token
42
+ const token = await obtainToken(rl);
43
+ // Step 3: Connect to Discord and verify token
44
+ console.log("\n Connecting to Discord...");
45
+ const client = await connectBot(token);
46
+ console.log(` Connected as: ${client.user?.tag}`);
47
+ // Step 4: List available guilds
48
+ const guilds = await listGuilds(client);
49
+ if (guilds.length === 0) {
50
+ console.log("\n Bot is not a member of any guilds.");
51
+ console.log(" Invite the bot to at least one server first.");
52
+ await cleanup(client, rl);
53
+ process.exit(1);
54
+ }
55
+ console.log(`\n Available guilds (${guilds.length}):`);
56
+ for (let i = 0; i < guilds.length; i++) {
57
+ console.log(` [${i + 1}] ${guilds[i].name} (${guilds[i].id})`);
58
+ }
59
+ // Step 5: Select guilds to configure as projects
60
+ const selectedGuilds = await selectGuilds(rl, guilds);
61
+ // Step 6: Configure each guild — channels and aliases
62
+ const projects = {};
63
+ if (existingConfig?.projects) {
64
+ Object.assign(projects, existingConfig.projects);
65
+ }
66
+ for (const guild of selectedGuilds) {
67
+ const projectName = await askQuestion(rl, `\n Project name for "${guild.name}" [${slugify(guild.name)}]: `);
68
+ const name = projectName.trim() || slugify(guild.name);
69
+ const channels = await listChannels(client, guild.id);
70
+ if (channels.length === 0) {
71
+ console.log(` No text channels found in ${guild.name}, skipping.`);
72
+ continue;
73
+ }
74
+ console.log(`\n Text channels in ${guild.name}:`);
75
+ for (let i = 0; i < channels.length; i++) {
76
+ console.log(` [${i + 1}] #${channels[i].name} (${channels[i].id})`);
77
+ }
78
+ const channelMap = await assignChannelAliases(rl, channels);
79
+ const defaultChannel = await selectDefaultChannel(rl, channelMap);
80
+ projects[name] = {
81
+ guild_id: guild.id,
82
+ channels: channelMap,
83
+ default_channel: defaultChannel,
84
+ };
85
+ }
86
+ // Step 7: Set default project
87
+ const projectNames = Object.keys(projects);
88
+ let defaultProject;
89
+ if (projectNames.length === 1) {
90
+ defaultProject = projectNames[0];
91
+ console.log(`\n Default project: ${defaultProject} (only project)`);
92
+ }
93
+ else if (projectNames.length > 1) {
94
+ console.log("\n Configured projects:");
95
+ for (let i = 0; i < projectNames.length; i++) {
96
+ console.log(` [${i + 1}] ${projectNames[i]}`);
97
+ }
98
+ const choice = await askQuestion(rl, ` Default project [1]: `);
99
+ const idx = parseInt(choice.trim() || "1", 10) - 1;
100
+ if (idx >= 0 && idx < projectNames.length) {
101
+ defaultProject = projectNames[idx];
102
+ }
103
+ }
104
+ // Step 8: Configure notification routing
105
+ const notificationRouting = await configureNotificationRouting(rl, projects, defaultProject);
106
+ // Step 9: Build and write global config
107
+ const config = {
108
+ projects,
109
+ default_project: defaultProject,
110
+ notification_routing: Object.keys(notificationRouting).length > 0 ? notificationRouting : undefined,
111
+ };
112
+ writeFileSync(GLOBAL_CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
113
+ console.log(`\n Global config written to: ${GLOBAL_CONFIG_PATH}`);
114
+ // Step 10: Optionally generate per-project config
115
+ await maybeGeneratePerProjectConfig(rl, config);
116
+ console.log("\n Setup complete. Run `discord-ops health` to verify.\n");
117
+ await cleanup(client, rl);
118
+ }
119
+ catch (err) {
120
+ const message = err instanceof Error ? err.message : String(err);
121
+ logger.error("Setup wizard failed", { error: message });
122
+ console.error(`\n Setup failed: ${message}\n`);
123
+ rl.close();
124
+ process.exit(1);
125
+ }
126
+ }
127
+ async function checkExistingConfig(rl) {
128
+ if (!existsSync(GLOBAL_CONFIG_PATH)) {
129
+ console.log(" No existing config found. Starting fresh.\n");
130
+ return null;
131
+ }
132
+ console.log(` Found existing config: ${GLOBAL_CONFIG_PATH}\n`);
133
+ try {
134
+ const raw = JSON.parse(readFileSync(GLOBAL_CONFIG_PATH, "utf-8"));
135
+ const projectCount = Object.keys(raw.projects ?? {}).length;
136
+ console.log(` Current config has ${projectCount} project(s).`);
137
+ const action = await askQuestion(rl, " [u]pdate existing / [o]verwrite / [q]uit? [u]: ");
138
+ const choice = action.trim().toLowerCase() || "u";
139
+ if (choice === "q") {
140
+ console.log(" Setup cancelled.");
141
+ rl.close();
142
+ process.exit(0);
143
+ }
144
+ if (choice === "o") {
145
+ console.log(" Starting fresh (existing config will be overwritten).\n");
146
+ return null;
147
+ }
148
+ console.log(" Updating existing config.\n");
149
+ return raw;
150
+ }
151
+ catch {
152
+ console.log(" Existing config is invalid. Starting fresh.\n");
153
+ return null;
154
+ }
155
+ }
156
+ async function obtainToken(rl) {
157
+ const envToken = process.env.DISCORD_TOKEN;
158
+ if (envToken) {
159
+ console.log(" DISCORD_TOKEN environment variable detected.");
160
+ const useEnv = await askQuestion(rl, " Use this token? [Y/n]: ");
161
+ if (useEnv.trim().toLowerCase() !== "n") {
162
+ return envToken;
163
+ }
164
+ }
165
+ const token = await askQuestion(rl, " Enter Discord bot token: ");
166
+ const trimmed = token.trim();
167
+ if (!trimmed) {
168
+ throw new Error("No token provided. Set DISCORD_TOKEN or enter one manually.");
169
+ }
170
+ if (trimmed.length < 50) {
171
+ throw new Error("Token appears too short. Discord bot tokens are at least 50 characters.");
172
+ }
173
+ return trimmed;
174
+ }
175
+ async function connectBot(token) {
176
+ const client = new Client({
177
+ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
178
+ });
179
+ await client.login(token);
180
+ await new Promise((resolve, reject) => {
181
+ const timeout = setTimeout(() => {
182
+ reject(new Error("Timed out waiting for Discord connection (10s)"));
183
+ }, 10_000);
184
+ if (client.isReady()) {
185
+ clearTimeout(timeout);
186
+ resolve();
187
+ }
188
+ else {
189
+ client.once("ready", () => {
190
+ clearTimeout(timeout);
191
+ resolve();
192
+ });
193
+ }
194
+ });
195
+ return client;
196
+ }
197
+ async function listGuilds(client) {
198
+ const guilds = [];
199
+ for (const [id, guild] of client.guilds.cache) {
200
+ guilds.push({ id, name: guild.name });
201
+ }
202
+ return guilds.sort((a, b) => a.name.localeCompare(b.name));
203
+ }
204
+ async function selectGuilds(rl, guilds) {
205
+ if (guilds.length === 1) {
206
+ const confirm = await askQuestion(rl, `\n Configure "${guilds[0].name}"? [Y/n]: `);
207
+ if (confirm.trim().toLowerCase() === "n") {
208
+ throw new Error("No guilds selected. Nothing to configure.");
209
+ }
210
+ return guilds;
211
+ }
212
+ const input = await askQuestion(rl, `\n Select guilds to configure (comma-separated numbers, or 'all') [all]: `);
213
+ const choice = input.trim().toLowerCase() || "all";
214
+ if (choice === "all") {
215
+ return guilds;
216
+ }
217
+ const indices = choice
218
+ .split(",")
219
+ .map((s) => parseInt(s.trim(), 10) - 1)
220
+ .filter((i) => i >= 0 && i < guilds.length);
221
+ if (indices.length === 0) {
222
+ throw new Error("No valid guilds selected.");
223
+ }
224
+ return indices.map((i) => guilds[i]);
225
+ }
226
+ async function listChannels(client, guildId) {
227
+ const guild = await client.guilds.fetch(guildId);
228
+ const allChannels = await guild.channels.fetch();
229
+ const textChannels = [];
230
+ for (const [, channel] of allChannels) {
231
+ if (channel && channel.type === ChannelType.GuildText) {
232
+ textChannels.push({
233
+ id: channel.id,
234
+ name: channel.name,
235
+ type: channel.type,
236
+ });
237
+ }
238
+ }
239
+ return textChannels.sort((a, b) => a.name.localeCompare(b.name));
240
+ }
241
+ async function assignChannelAliases(rl, channels) {
242
+ console.log(`\n Assign aliases to channels. Suggested: ${SUGGESTED_ALIASES.join(", ")}`);
243
+ console.log(" Enter channel number and alias, or press Enter to skip.");
244
+ console.log(' Format: <number>=<alias> (e.g., "1=dev" or "3=alerts")');
245
+ console.log(' Type "done" when finished.\n');
246
+ const channelMap = {};
247
+ // Auto-suggest aliases based on channel names
248
+ const autoMatched = [];
249
+ for (const ch of channels) {
250
+ const matchedAlias = SUGGESTED_ALIASES.find((alias) => ch.name.includes(alias) || alias.includes(ch.name));
251
+ if (matchedAlias && !Object.values(channelMap).includes(matchedAlias)) {
252
+ channelMap[matchedAlias] = ch.id;
253
+ autoMatched.push(`${matchedAlias} -> #${ch.name}`);
254
+ }
255
+ }
256
+ if (autoMatched.length > 0) {
257
+ console.log(" Auto-matched channels:");
258
+ for (const m of autoMatched) {
259
+ console.log(` ${m}`);
260
+ }
261
+ const keepAuto = await askQuestion(rl, "\n Keep auto-matched aliases? [Y/n]: ");
262
+ if (keepAuto.trim().toLowerCase() === "n") {
263
+ for (const key of Object.keys(channelMap)) {
264
+ delete channelMap[key];
265
+ }
266
+ }
267
+ }
268
+ // Manual assignment loop
269
+ while (true) {
270
+ const input = await askQuestion(rl, " Assign (number=alias or 'done'): ");
271
+ const trimmed = input.trim().toLowerCase();
272
+ if (trimmed === "done" || trimmed === "") {
273
+ if (Object.keys(channelMap).length === 0) {
274
+ console.log(" Warning: No channels aliased. At least one is recommended.");
275
+ const cont = await askQuestion(rl, " Continue anyway? [y/N]: ");
276
+ if (cont.trim().toLowerCase() !== "y")
277
+ continue;
278
+ }
279
+ break;
280
+ }
281
+ const match = trimmed.match(/^(\d+)\s*=\s*(.+)$/);
282
+ if (!match) {
283
+ console.log(' Invalid format. Use "number=alias" (e.g., "1=dev").');
284
+ continue;
285
+ }
286
+ const idx = parseInt(match[1], 10) - 1;
287
+ const alias = match[2].trim();
288
+ if (idx < 0 || idx >= channels.length) {
289
+ console.log(` Invalid channel number. Choose 1-${channels.length}.`);
290
+ continue;
291
+ }
292
+ channelMap[alias] = channels[idx].id;
293
+ console.log(` ${alias} -> #${channels[idx].name}`);
294
+ }
295
+ return channelMap;
296
+ }
297
+ async function selectDefaultChannel(rl, channelMap) {
298
+ const aliases = Object.keys(channelMap);
299
+ if (aliases.length === 0)
300
+ return undefined;
301
+ if (aliases.length === 1) {
302
+ console.log(` Default channel: ${aliases[0]} (only channel)`);
303
+ return aliases[0];
304
+ }
305
+ console.log("\n Available aliases:");
306
+ for (let i = 0; i < aliases.length; i++) {
307
+ console.log(` [${i + 1}] ${aliases[i]}`);
308
+ }
309
+ const choice = await askQuestion(rl, ` Default channel [1]: `);
310
+ const idx = parseInt(choice.trim() || "1", 10) - 1;
311
+ if (idx >= 0 && idx < aliases.length) {
312
+ return aliases[idx];
313
+ }
314
+ return aliases[0];
315
+ }
316
+ async function configureNotificationRouting(rl, projects, defaultProject) {
317
+ const routing = {};
318
+ const wantRouting = await askQuestion(rl, "\n Configure notification routing? [y/N]: ");
319
+ if (wantRouting.trim().toLowerCase() !== "y") {
320
+ return routing;
321
+ }
322
+ // Collect all available channel aliases across projects
323
+ const projectName = defaultProject ?? Object.keys(projects)[0];
324
+ const project = projectName ? projects[projectName] : undefined;
325
+ if (!project) {
326
+ console.log(" No project available for routing. Skipping.");
327
+ return routing;
328
+ }
329
+ const aliases = Object.keys(project.channels);
330
+ if (aliases.length === 0) {
331
+ console.log(" No channel aliases configured. Skipping routing.");
332
+ return routing;
333
+ }
334
+ console.log(`\n Route notification types to channels in "${projectName}":`);
335
+ console.log(` Available aliases: ${aliases.join(", ")}`);
336
+ console.log(" Press Enter to skip a type.\n");
337
+ for (const type of NOTIFICATION_TYPES) {
338
+ const suggestion = aliases.find((a) => (type === "ci_build" && (a === "builds" || a === "dev")) ||
339
+ (type === "deploy" && (a === "deploys" || a === "releases")) ||
340
+ (type === "release" && (a === "releases" || a === "announcements")) ||
341
+ (type === "error" && (a === "errors" || a === "alerts")) ||
342
+ (type === "announcement" && (a === "announcements" || a === "general")) ||
343
+ (type === "dev" && a === "dev"));
344
+ const hint = suggestion ? ` [${suggestion}]` : "";
345
+ const answer = await askQuestion(rl, ` ${type}${hint}: `);
346
+ const alias = answer.trim() || suggestion;
347
+ if (alias && aliases.includes(alias)) {
348
+ routing[type] = alias;
349
+ }
350
+ else if (alias) {
351
+ console.log(` "${alias}" is not a known alias, skipping.`);
352
+ }
353
+ }
354
+ return routing;
355
+ }
356
+ async function maybeGeneratePerProjectConfig(rl, config) {
357
+ const projectNames = Object.keys(config.projects);
358
+ if (projectNames.length === 0)
359
+ return;
360
+ const wantLocal = await askQuestion(rl, " Generate .discord-ops.json in current directory? [y/N]: ");
361
+ if (wantLocal.trim().toLowerCase() !== "y")
362
+ return;
363
+ let projectName;
364
+ if (projectNames.length === 1) {
365
+ projectName = projectNames[0];
366
+ }
367
+ else {
368
+ console.log("\n Which project for this directory?");
369
+ for (let i = 0; i < projectNames.length; i++) {
370
+ console.log(` [${i + 1}] ${projectNames[i]}`);
371
+ }
372
+ const choice = await askQuestion(rl, ` Select [1]: `);
373
+ const idx = parseInt(choice.trim() || "1", 10) - 1;
374
+ projectName = projectNames[idx >= 0 && idx < projectNames.length ? idx : 0];
375
+ }
376
+ const perProject = {
377
+ project: projectName,
378
+ notification_routing: config.notification_routing,
379
+ };
380
+ const localPath = join(process.cwd(), ".discord-ops.json");
381
+ writeFileSync(localPath, JSON.stringify(perProject, null, 2) + "\n", "utf-8");
382
+ console.log(` Per-project config written to: ${localPath}`);
383
+ }
384
+ function slugify(name) {
385
+ return name
386
+ .toLowerCase()
387
+ .replace(/[^a-z0-9]+/g, "-")
388
+ .replace(/^-|-$/g, "");
389
+ }
390
+ async function askQuestion(rl, question) {
391
+ return rl.question(question);
392
+ }
393
+ async function cleanup(client, rl) {
394
+ client.destroy();
395
+ rl.close();
396
+ }
397
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -7,9 +7,9 @@ import { Client, type Guild, type TextChannel } from "discord.js";
7
7
  */
8
8
  export declare class DiscordClient {
9
9
  private connections;
10
- private defaultToken;
10
+ private defaultToken?;
11
11
  private guildCache;
12
- constructor(defaultToken: string);
12
+ constructor(defaultToken?: string);
13
13
  private getConnection;
14
14
  /**
15
15
  * Returns the underlying discord.js Client for the given token.
@@ -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;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"}
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,CAAC,CAAS;IAC9B,OAAO,CAAC,UAAU,CAA4B;gBAElC,YAAY,CAAC,EAAE,MAAM;IAUjC,OAAO,CAAC,aAAa;IAqBrB;;;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
@@ -67,14 +67,19 @@ export class DiscordClient {
67
67
  defaultToken;
68
68
  guildCache = new TTLCache(300);
69
69
  constructor(defaultToken) {
70
- const validation = validateTokenFormat(defaultToken);
71
- if (!validation.valid) {
72
- throw new Error(`Invalid Discord token: ${validation.reason}`);
70
+ if (defaultToken) {
71
+ const validation = validateTokenFormat(defaultToken);
72
+ if (!validation.valid) {
73
+ throw new Error(`Invalid Discord token: ${validation.reason}`);
74
+ }
73
75
  }
74
76
  this.defaultToken = defaultToken;
75
77
  }
76
78
  getConnection(token) {
77
79
  const t = token ?? this.defaultToken;
80
+ if (!t) {
81
+ throw new Error("No Discord token available. Set DISCORD_TOKEN, DISCORD_OPS_TOKEN_ENV, or use per-project token_env.");
82
+ }
78
83
  let conn = this.connections.get(t);
79
84
  if (!conn) {
80
85
  if (t !== this.defaultToken) {
@@ -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":"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;;GAEG;AACH,MAAM,aAAa;IACT,MAAM,GAAkB,IAAI,CAAC;IAC7B,UAAU,GAA2B,IAAI,CAAC;IAC1C,KAAK,CAAS;IAEtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC/C,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,OAAO,EAAE;gBACP,iBAAiB,CAAC,MAAM;gBACxB,iBAAiB,CAAC,aAAa;gBAC/B,iBAAiB,CAAC,YAAY;gBAC9B,iBAAiB,CAAC,cAAc;aACjC;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG;YACtB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAChB,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC/C,YAAY,CAAU;IACtB,UAAU,GAAG,IAAI,QAAQ,CAAQ,GAAG,CAAC,CAAC;IAE9C,YAAY,YAAqB;QAC/B,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YACD,IAAI,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,KAAc;QAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,KAAc;QAC5C,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,KAAc;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,kCAAkC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,OAAsB,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;IACtC,CAAC;CACF"}
@@ -2,7 +2,7 @@ import { type GlobalConfig, type PerProjectConfig } from "./schema.js";
2
2
  export interface LoadedConfig {
3
3
  global: GlobalConfig;
4
4
  perProject?: PerProjectConfig;
5
- defaultToken: string;
5
+ defaultToken?: string;
6
6
  }
7
7
  /**
8
8
  * Resolves the token for a given project.
@@ -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,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"}
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,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAepF;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAkCzC;AAyCD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -14,7 +14,10 @@ export function getTokenForProject(projectName, config) {
14
14
  const token = process.env[project.token_env];
15
15
  if (token)
16
16
  return token;
17
- logger.warn(`token_env "${project.token_env}" for project "${projectName}" is not set, falling back to DISCORD_TOKEN`);
17
+ logger.warn(`token_env "${project.token_env}" for project "${projectName}" is not set, falling back to default token`);
18
+ }
19
+ if (!config.defaultToken) {
20
+ throw new Error(`No token available for project "${projectName}": token_env is not set or empty, and no default token configured`);
18
21
  }
19
22
  return config.defaultToken;
20
23
  }
@@ -27,12 +30,25 @@ export function getTokenForProject(projectName, config) {
27
30
  * 3. Direct params always work regardless
28
31
  */
29
32
  export function loadConfig() {
30
- const defaultToken = process.env.DISCORD_TOKEN;
31
- if (!defaultToken) {
32
- throw new Error("DISCORD_TOKEN environment variable is required");
33
- }
33
+ // Option A: DISCORD_OPS_TOKEN_ENV lets callers specify which env var holds the default token
34
+ const tokenEnvName = process.env.DISCORD_OPS_TOKEN_ENV ?? "DISCORD_TOKEN";
35
+ const defaultToken = process.env[tokenEnvName] || undefined;
34
36
  const global = loadGlobalConfig();
35
37
  const perProject = loadPerProjectConfig();
38
+ // Option B: if no default token, validate that all projects have their own token_env
39
+ if (!defaultToken) {
40
+ const projectEntries = Object.entries(global.projects);
41
+ if (projectEntries.length === 0) {
42
+ throw new Error(`${tokenEnvName} environment variable is required (no projects with token_env configured)`);
43
+ }
44
+ const missing = projectEntries
45
+ .filter(([, p]) => !p.token_env || !process.env[p.token_env])
46
+ .map(([name]) => name);
47
+ if (missing.length > 0) {
48
+ throw new Error(`${tokenEnvName} is not set, and these projects lack a valid token_env: ${missing.join(", ")}`);
49
+ }
50
+ logger.info(`No default token set — all ${projectEntries.length} project(s) use per-project token_env`);
51
+ }
36
52
  return { global, perProject, defaultToken };
37
53
  }
38
54
  function loadGlobalConfig() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -69,16 +69,22 @@ export declare const PerProjectConfigSchema: z.ZodObject<{
69
69
  }>;
70
70
  export type PerProjectConfig = z.infer<typeof PerProjectConfigSchema>;
71
71
  export declare const EnvConfigSchema: z.ZodObject<{
72
- DISCORD_TOKEN: z.ZodString;
72
+ DISCORD_TOKEN: z.ZodOptional<z.ZodString>;
73
+ DISCORD_OPS_TOKEN_ENV: z.ZodOptional<z.ZodString>;
73
74
  DISCORD_OPS_CONFIG: z.ZodOptional<z.ZodString>;
74
75
  DISCORD_OPS_LOG_LEVEL: z.ZodOptional<z.ZodEnum<["debug", "info", "warn", "error"]>>;
76
+ DISCORD_OPS_DRY_RUN: z.ZodOptional<z.ZodString>;
75
77
  }, "strip", z.ZodTypeAny, {
76
- DISCORD_TOKEN: string;
77
78
  DISCORD_OPS_LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
79
+ DISCORD_TOKEN?: string | undefined;
80
+ DISCORD_OPS_TOKEN_ENV?: string | undefined;
78
81
  DISCORD_OPS_CONFIG?: string | undefined;
82
+ DISCORD_OPS_DRY_RUN?: string | undefined;
79
83
  }, {
80
- DISCORD_TOKEN: string;
81
84
  DISCORD_OPS_LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
85
+ DISCORD_TOKEN?: string | undefined;
86
+ DISCORD_OPS_TOKEN_ENV?: string | undefined;
82
87
  DISCORD_OPS_CONFIG?: string | undefined;
88
+ DISCORD_OPS_DRY_RUN?: string | undefined;
83
89
  }>;
84
90
  //# sourceMappingURL=schema.d.ts.map
@@ -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;;;;;;;;;;;;;;;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"}
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;;;;;;;;;;;;;;;;;;EAM1B,CAAC"}
@@ -23,8 +23,10 @@ export const PerProjectConfigSchema = z.object({
23
23
  notification_routing: z.record(NotificationType, z.string()).optional(),
24
24
  });
25
25
  export const EnvConfigSchema = z.object({
26
- DISCORD_TOKEN: z.string().min(50),
26
+ DISCORD_TOKEN: z.string().min(50).optional(),
27
+ DISCORD_OPS_TOKEN_ENV: z.string().optional(),
27
28
  DISCORD_OPS_CONFIG: z.string().optional(),
28
29
  DISCORD_OPS_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).optional(),
30
+ DISCORD_OPS_DRY_RUN: z.string().optional(),
29
31
  });
30
32
  //# sourceMappingURL=schema.js.map
@@ -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;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
+ {"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,CAAC,QAAQ,EAAE;IAC5C,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,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;IAC5E,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { ToolContext } from "./tools/types.js";
3
- export declare function createServer(ctx: ToolContext): McpServer;
3
+ export interface ServerOptions {
4
+ dryRun?: boolean;
5
+ }
6
+ export declare function createServer(ctx: ToolContext, options?: ServerOptions): McpServer;
4
7
  //# sourceMappingURL=server.d.ts.map
@@ -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;AAuBpD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CA+FxD"}
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,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CA4HjF"}