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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign-role.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/assign-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclD,eAAO,MAAM,UAAU,EAAE,cA2BxB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { toolResultJson } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ guild_id: snowflakeId.describe("Guild ID"),
7
+ user_id: snowflakeId.describe("User ID to assign/remove role"),
8
+ role_id: snowflakeId.describe("Role ID to assign or remove"),
9
+ action: z.enum(["add", "remove"]).default("add").describe("Whether to add or remove the role"),
10
+ reason,
11
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
12
+ });
13
+ export const assignRole = {
14
+ name: "assign_role",
15
+ description: "Add or remove a role from a guild member. Requires ManageRoles permission.",
16
+ category: "roles",
17
+ inputSchema,
18
+ permissions: ["ManageRoles"],
19
+ requiresGuild: true,
20
+ handle: async (input, ctx) => {
21
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
22
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
23
+ const member = await guild.members.fetch(input.user_id);
24
+ if (input.action === "add") {
25
+ await member.roles.add(input.role_id, input.reason);
26
+ }
27
+ else {
28
+ await member.roles.remove(input.role_id, input.reason);
29
+ }
30
+ return toolResultJson({
31
+ action: input.action === "add" ? "role_added" : "role_removed",
32
+ guild_id: input.guild_id,
33
+ user_id: input.user_id,
34
+ user_tag: member.user?.tag ?? input.user_id,
35
+ role_id: input.role_id,
36
+ reason: input.reason ?? null,
37
+ });
38
+ },
39
+ };
40
+ //# sourceMappingURL=assign-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign-role.js","sourceRoot":"","sources":["../../../src/tools/roles/assign-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC9D,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC5D,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC9F,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,4EAA4E;IACzF,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,cAAc,CAAC;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc;YAC9D,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,OAAO;YAC3C,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const createRole: ToolDefinition;
3
+ //# sourceMappingURL=create-role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-role.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/create-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsBlD,eAAO,MAAM,UAAU,EAAE,cA8BxB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { toolResultJson } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ guild_id: snowflakeId.describe("Guild ID"),
7
+ name: z.string().min(1).max(100).describe("Role name"),
8
+ color: z
9
+ .string()
10
+ .regex(/^#[0-9a-fA-F]{6}$/, "Must be a hex color like #ff0000")
11
+ .optional()
12
+ .describe("Hex color (e.g. '#ff0000')"),
13
+ mentionable: z.boolean().optional().describe("Whether the role can be mentioned by everyone"),
14
+ hoist: z
15
+ .boolean()
16
+ .optional()
17
+ .describe("Whether the role should be displayed separately in the sidebar"),
18
+ reason,
19
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
20
+ });
21
+ export const createRole = {
22
+ name: "create_role",
23
+ description: "Create a new role in a guild. Requires ManageRoles permission.",
24
+ category: "roles",
25
+ inputSchema,
26
+ permissions: ["ManageRoles"],
27
+ requiresGuild: true,
28
+ handle: async (input, ctx) => {
29
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
30
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
31
+ const role = await guild.roles.create({
32
+ name: input.name,
33
+ color: input.color,
34
+ mentionable: input.mentionable,
35
+ hoist: input.hoist,
36
+ reason: input.reason,
37
+ });
38
+ return toolResultJson({
39
+ id: role.id,
40
+ name: role.name,
41
+ color: role.hexColor,
42
+ position: role.position,
43
+ mentionable: role.mentionable,
44
+ hoist: role.hoist,
45
+ managed: role.managed,
46
+ guild_id: input.guild_id,
47
+ });
48
+ },
49
+ };
50
+ //# sourceMappingURL=create-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-role.js","sourceRoot":"","sources":["../../../src/tools/roles/create-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACtD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC9D,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC7F,KAAK,EAAE,CAAC;SACL,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,gEAAgE;IAC7E,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEhE,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const deleteRole: ToolDefinition;
3
+ //# sourceMappingURL=delete-role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-role.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/delete-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,eAAO,MAAM,UAAU,EAAE,cAuBxB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ guild_id: snowflakeId.describe("Guild ID"),
7
+ role_id: snowflakeId.describe("Role ID to delete"),
8
+ reason,
9
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
10
+ });
11
+ export const deleteRole = {
12
+ name: "delete_role",
13
+ description: "Delete a role from a guild. This is irreversible. Requires ManageRoles permission.",
14
+ category: "roles",
15
+ inputSchema,
16
+ permissions: ["ManageRoles"],
17
+ destructive: true,
18
+ requiresGuild: true,
19
+ handle: async (input, ctx) => {
20
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
21
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
22
+ const roles = await guild.roles.fetch();
23
+ const role = roles.get(input.role_id);
24
+ if (!role) {
25
+ return toolResult(`Role ${input.role_id} not found`, true);
26
+ }
27
+ const roleName = role.name;
28
+ await role.delete(input.reason);
29
+ return toolResult(`Deleted role "${roleName}" (${input.role_id}) from guild ${input.guild_id}`);
30
+ },
31
+ };
32
+ //# sourceMappingURL=delete-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-role.js","sourceRoot":"","sources":["../../../src/tools/roles/delete-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAClD,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,oFAAoF;IACjG,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhC,OAAO,UAAU,CAAC,iBAAiB,QAAQ,MAAM,KAAK,CAAC,OAAO,gBAAgB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const editRole: ToolDefinition;
3
+ //# sourceMappingURL=edit-role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-role.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/edit-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoBlD,eAAO,MAAM,QAAQ,EAAE,cAmCtB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ import { toolResult, toolResultJson } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ guild_id: snowflakeId.describe("Guild ID"),
7
+ role_id: snowflakeId.describe("Role ID to edit"),
8
+ name: z.string().min(1).max(100).optional().describe("New role name"),
9
+ color: z
10
+ .string()
11
+ .regex(/^#[0-9a-fA-F]{6}$/, "Must be a hex color like #ff0000")
12
+ .optional()
13
+ .describe("New hex color (e.g. '#ff0000')"),
14
+ mentionable: z.boolean().optional().describe("Whether the role can be mentioned"),
15
+ hoist: z.boolean().optional().describe("Whether the role displays separately in sidebar"),
16
+ reason,
17
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
18
+ });
19
+ export const editRole = {
20
+ name: "edit_role",
21
+ description: "Edit an existing role in a guild. Requires ManageRoles permission.",
22
+ category: "roles",
23
+ inputSchema,
24
+ permissions: ["ManageRoles"],
25
+ requiresGuild: true,
26
+ handle: async (input, ctx) => {
27
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
28
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
29
+ const roles = await guild.roles.fetch();
30
+ const role = roles.get(input.role_id);
31
+ if (!role) {
32
+ return toolResult(`Role ${input.role_id} not found`, true);
33
+ }
34
+ const updated = await role.edit({
35
+ name: input.name,
36
+ color: input.color,
37
+ mentionable: input.mentionable,
38
+ hoist: input.hoist,
39
+ reason: input.reason,
40
+ });
41
+ return toolResultJson({
42
+ id: updated.id,
43
+ name: updated.name,
44
+ color: updated.hexColor,
45
+ position: updated.position,
46
+ mentionable: updated.mentionable,
47
+ hoist: updated.hoist,
48
+ guild_id: input.guild_id,
49
+ });
50
+ },
51
+ };
52
+ //# sourceMappingURL=edit-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-role.js","sourceRoot":"","sources":["../../../src/tools/roles/edit-role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC1C,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACrE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC9D,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACjF,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACzF,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,oEAAoE;IACjF,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,UAAU,CAAC,QAAQ,KAAK,CAAC,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1,2 +1,6 @@
1
1
  export { listRoles } from "./list-roles.js";
2
+ export { createRole } from "./create-role.js";
3
+ export { editRole } from "./edit-role.js";
4
+ export { deleteRole } from "./delete-role.js";
5
+ export { assignRole } from "./assign-role.js";
2
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,2 +1,6 @@
1
1
  export { listRoles } from "./list-roles.js";
2
+ export { createRole } from "./create-role.js";
3
+ export { editRole } from "./edit-role.js";
4
+ export { deleteRole } from "./delete-role.js";
5
+ export { assignRole } from "./assign-role.js";
2
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/roles/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/roles/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-roles.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/list-roles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,eAAO,MAAM,SAAS,EAAE,cA2BvB,CAAC"}
1
+ {"version":3,"file":"list-roles.d.ts","sourceRoot":"","sources":["../../../src/tools/roles/list-roles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,eAAO,MAAM,SAAS,EAAE,cA4BvB,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { toolResultJson } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
3
5
  const inputSchema = z.object({
4
- guild_id: z.string().describe("Guild ID to list roles from"),
6
+ guild_id: snowflakeId.describe("Guild ID to list roles from"),
7
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
5
8
  });
6
9
  export const listRoles = {
7
10
  name: "list_roles",
@@ -10,7 +13,8 @@ export const listRoles = {
10
13
  inputSchema,
11
14
  requiresGuild: true,
12
15
  handle: async (input, ctx) => {
13
- const guild = await ctx.discord.getGuild(input.guild_id);
16
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
17
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
14
18
  const roles = await guild.roles.fetch();
15
19
  const result = roles.map((role) => ({
16
20
  id: role.id,
@@ -1 +1 @@
1
- {"version":3,"file":"list-roles.js","sourceRoot":"","sources":["../../../src/tools/roles/list-roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,4BAA4B;IACzC,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;SACxC,CAAC,CAAC,CAAC;QAEJ,OAAO,cAAc,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"list-roles.js","sourceRoot":"","sources":["../../../src/tools/roles/list-roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC7D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,4BAA4B;IACzC,QAAQ,EAAE,OAAO;IACjB,WAAW;IACX,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;SACxC,CAAC,CAAC,CAAC;QAEJ,OAAO,cAAc,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Shared Zod schemas for Discord tool inputs.
4
+ */
5
+ /** Discord snowflake ID — 17-20 digit numeric string */
6
+ export declare const snowflakeId: z.ZodString;
7
+ /** Audit log / moderation reason — max 512 chars per Discord API */
8
+ export declare const reason: z.ZodOptional<z.ZodString>;
9
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,wDAAwD;AACxD,eAAO,MAAM,WAAW,aAA0E,CAAC;AAEnG,oEAAoE;AACpE,eAAO,MAAM,MAAM,4BAIuC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Shared Zod schemas for Discord tool inputs.
4
+ */
5
+ /** Discord snowflake ID — 17-20 digit numeric string */
6
+ export const snowflakeId = z.string().regex(/^\d{17,20}$/, "Must be a valid Discord snowflake ID");
7
+ /** Audit log / moderation reason — max 512 chars per Discord API */
8
+ export const reason = z
9
+ .string()
10
+ .max(512)
11
+ .optional()
12
+ .describe("Reason (logged in audit log, max 512 chars)");
13
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,sCAAsC,CAAC,CAAC;AAEnG,oEAAoE;AACpE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC;KACpB,MAAM,EAAE;KACR,GAAG,CAAC,GAAG,CAAC;KACR,QAAQ,EAAE;KACV,QAAQ,CAAC,6CAA6C,CAAC,CAAC"}
@@ -23,7 +23,7 @@ export const createThread = {
23
23
  if ("error" in target) {
24
24
  return { content: [{ type: "text", text: target.error }], isError: true };
25
25
  }
26
- const channel = await ctx.discord.getChannel(target.channelId);
26
+ const channel = await ctx.discord.getChannel(target.channelId, target.token);
27
27
  const thread = input.message_id
28
28
  ? await channel.threads.create({
29
29
  name: input.name,
@@ -1 +1 @@
1
- {"version":3,"file":"create-thread.js","sourceRoot":"","sources":["../../../src/tools/threads/create-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACvE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC9E,qBAAqB,EAAE,CAAC;SACrB,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SACrC,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,oEAAoE;IACjF,QAAQ,EAAE,SAAS;IACnB,WAAW;IACX,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU;YAC7B,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,YAAY,EAAE,KAAK,CAAC,UAAU;gBAC9B,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAA6B;aACrF,CAAC;YACJ,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAA6B;aACrF,CAAC,CAAC;QAEP,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;SAClD,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"create-thread.js","sourceRoot":"","sources":["../../../src/tools/threads/create-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACvE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC9E,qBAAqB,EAAE,CAAC;SACrB,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SACrC,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,oEAAoE;IACjF,QAAQ,EAAE,SAAS;IACnB,WAAW;IACX,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU;YAC7B,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,YAAY,EAAE,KAAK,CAAC,UAAU;gBAC9B,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAA6B;aACrF,CAAC;YACJ,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,mBAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAA6B;aACrF,CAAC,CAAC;QAEP,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;SAClD,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-threads.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/list-threads.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,eAAO,MAAM,WAAW,EAAE,cA2BzB,CAAC"}
1
+ {"version":3,"file":"list-threads.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/list-threads.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,eAAO,MAAM,WAAW,EAAE,cA4BzB,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { z } from "zod";
2
2
  import { toolResultJson } from "../types.js";
3
+ import { getTokenForProject } from "../../config/index.js";
3
4
  const inputSchema = z.object({
4
5
  guild_id: z.string().describe("Guild ID to list threads from"),
6
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
5
7
  archived: z.boolean().default(false).describe("Include archived threads"),
6
8
  });
7
9
  export const listThreads = {
@@ -11,7 +13,8 @@ export const listThreads = {
11
13
  inputSchema,
12
14
  requiresGuild: true,
13
15
  handle: async (input, ctx) => {
14
- const guild = await ctx.discord.getGuild(input.guild_id);
16
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
17
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
15
18
  const active = await guild.channels.fetchActiveThreads();
16
19
  const threads = active.threads.map((thread) => ({
17
20
  id: thread.id,
@@ -1 +1 @@
1
- {"version":3,"file":"list-threads.js","sourceRoot":"","sources":["../../../src/tools/threads/list-threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC9D,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,2DAA2D;IACxE,QAAQ,EAAE,SAAS;IACnB,WAAW;IACX,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAEzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,YAAY;YAClC,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE;SAC5C,CAAC,CAAC,CAAC;QAEJ,OAAO,cAAc,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"list-threads.js","sourceRoot":"","sources":["../../../src/tools/threads/list-threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC9D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACjG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,2DAA2D;IACxE,QAAQ,EAAE,SAAS;IACnB,WAAW;IACX,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAEzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,YAAY;YAClC,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE;SAC5C,CAAC,CAAC,CAAC;QAEJ,OAAO,cAAc,CAAC;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const createWebhook: ToolDefinition;
3
+ //# sourceMappingURL=create-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-webhook.d.ts","sourceRoot":"","sources":["../../../src/tools/webhooks/create-webhook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,eAAO,MAAM,aAAa,EAAE,cA6B3B,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { toolResult, toolResultJson } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ channel_id: snowflakeId.describe("Channel ID to create the webhook in"),
7
+ name: z.string().min(1).max(80).describe("Webhook name"),
8
+ reason,
9
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
10
+ });
11
+ export const createWebhook = {
12
+ name: "create_webhook",
13
+ description: "Create a webhook for a channel. Requires ManageWebhooks permission.",
14
+ category: "webhooks",
15
+ inputSchema,
16
+ permissions: ["ManageWebhooks"],
17
+ handle: async (input, ctx) => {
18
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
19
+ const channel = await ctx.discord.getChannel(input.channel_id, token);
20
+ if (!("createWebhook" in channel)) {
21
+ return toolResult("Channel does not support webhooks", true);
22
+ }
23
+ const webhook = await channel.createWebhook({
24
+ name: input.name,
25
+ reason: input.reason,
26
+ });
27
+ return toolResultJson({
28
+ id: webhook.id,
29
+ name: webhook.name,
30
+ channel_id: webhook.channelId,
31
+ guild_id: webhook.guildId,
32
+ token: webhook.token ? "[PRESENT]" : null,
33
+ url: webhook.url ? "[PRESENT]" : null,
34
+ created_at: webhook.createdAt?.toISOString(),
35
+ });
36
+ },
37
+ };
38
+ //# sourceMappingURL=create-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-webhook.js","sourceRoot":"","sources":["../../../src/tools/webhooks/create-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACvE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;IACxD,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,qEAAqE;IAClF,QAAQ,EAAE,UAAU;IACpB,WAAW;IACX,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAEtE,IAAI,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,UAAU,CAAC,mCAAmC,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,MAAO,OAAe,CAAC,aAAa,CAAC;YACnD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;YACzC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;YACrC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE;SAC7C,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const deleteWebhook: ToolDefinition;
3
+ //# sourceMappingURL=delete-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-webhook.d.ts","sourceRoot":"","sources":["../../../src/tools/webhooks/delete-webhook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,eAAO,MAAM,aAAa,EAAE,cAiB3B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ webhook_id: snowflakeId.describe("Webhook ID to delete"),
7
+ guild_id: snowflakeId.describe("Guild ID (needed for bot token resolution)"),
8
+ reason,
9
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
10
+ });
11
+ export const deleteWebhook = {
12
+ name: "delete_webhook",
13
+ description: "Delete a webhook. This is irreversible. Requires ManageWebhooks permission.",
14
+ category: "webhooks",
15
+ inputSchema,
16
+ permissions: ["ManageWebhooks"],
17
+ destructive: true,
18
+ handle: async (input, ctx) => {
19
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
20
+ const client = await ctx.discord.getClient(token);
21
+ const webhook = await client.fetchWebhook(input.webhook_id);
22
+ const webhookName = webhook.name;
23
+ await webhook.delete(input.reason);
24
+ return toolResult(`Deleted webhook "${webhookName}" (${input.webhook_id})`);
25
+ },
26
+ };
27
+ //# sourceMappingURL=delete-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-webhook.js","sourceRoot":"","sources":["../../../src/tools/webhooks/delete-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACxD,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC5E,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,6EAA6E;IAC1F,QAAQ,EAAE,UAAU;IACpB,WAAW;IACX,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE5D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,OAAO,UAAU,CAAC,oBAAoB,WAAW,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const editWebhook: ToolDefinition;
3
+ //# sourceMappingURL=edit-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-webhook.d.ts","sourceRoot":"","sources":["../../../src/tools/webhooks/edit-webhook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclD,eAAO,MAAM,WAAW,EAAE,cAwBzB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import { toolResultJson } from "../types.js";
3
+ import { snowflakeId, reason } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ webhook_id: snowflakeId.describe("Webhook ID to edit"),
7
+ guild_id: snowflakeId.describe("Guild ID (needed for bot token resolution)"),
8
+ name: z.string().min(1).max(80).optional().describe("New webhook name"),
9
+ channel_id: snowflakeId.optional().describe("Move webhook to a different channel"),
10
+ reason,
11
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
12
+ });
13
+ export const editWebhook = {
14
+ name: "edit_webhook",
15
+ description: "Edit a webhook's name or channel. Requires ManageWebhooks permission.",
16
+ category: "webhooks",
17
+ inputSchema,
18
+ permissions: ["ManageWebhooks"],
19
+ handle: async (input, ctx) => {
20
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
21
+ const client = await ctx.discord.getClient(token);
22
+ const webhook = await client.fetchWebhook(input.webhook_id);
23
+ const updated = await webhook.edit({
24
+ name: input.name,
25
+ channel: input.channel_id,
26
+ reason: input.reason,
27
+ });
28
+ return toolResultJson({
29
+ id: updated.id,
30
+ name: updated.name,
31
+ channel_id: updated.channelId,
32
+ guild_id: updated.guildId,
33
+ });
34
+ },
35
+ };
36
+ //# sourceMappingURL=edit-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-webhook.js","sourceRoot":"","sources":["../../../src/tools/webhooks/edit-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACtD,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC5E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACvE,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAClF,MAAM;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,uEAAuE;IACpF,QAAQ,EAAE,UAAU;IACpB,WAAW;IACX,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;YACpB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,QAAQ,EAAE,OAAO,CAAC,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const executeWebhook: ToolDefinition;
3
+ //# sourceMappingURL=execute-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-webhook.d.ts","sourceRoot":"","sources":["../../../src/tools/webhooks/execute-webhook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoClD,eAAO,MAAM,cAAc,EAAE,cAuC5B,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { toolResult, toolResultJson } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ webhook_id: snowflakeId.describe("Webhook ID to execute"),
7
+ guild_id: snowflakeId.describe("Guild ID (needed for bot token resolution)"),
8
+ content: z.string().max(2000).optional().describe("Message content"),
9
+ username: z.string().max(80).optional().describe("Override the webhook's display name"),
10
+ avatar_url: z.string().url().optional().describe("Override the webhook's avatar URL"),
11
+ embeds: z
12
+ .array(z.object({
13
+ title: z.string().optional(),
14
+ description: z.string().optional(),
15
+ color: z.number().optional(),
16
+ url: z.string().url().optional(),
17
+ footer: z.object({ text: z.string() }).optional(),
18
+ timestamp: z.string().optional(),
19
+ fields: z
20
+ .array(z.object({
21
+ name: z.string(),
22
+ value: z.string(),
23
+ inline: z.boolean().optional(),
24
+ }))
25
+ .optional(),
26
+ }))
27
+ .optional()
28
+ .describe("Array of embed objects"),
29
+ project: z.string().optional().describe("Project name (resolves bot token for multi-bot setups)"),
30
+ });
31
+ export const executeWebhook = {
32
+ name: "execute_webhook",
33
+ description: "Send a message through a webhook. Supports content, embeds, and username/avatar overrides. Great for CI/CD notifications.",
34
+ category: "webhooks",
35
+ inputSchema,
36
+ permissions: ["ManageWebhooks"],
37
+ destructive: true,
38
+ handle: async (input, ctx) => {
39
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
40
+ const client = await ctx.discord.getClient(token);
41
+ const webhook = await client.fetchWebhook(input.webhook_id);
42
+ if (!webhook.token) {
43
+ return toolResult("Webhook has no token — cannot execute (bot-created webhooks without tokens need the webhook token)", true);
44
+ }
45
+ if (!input.content && (!input.embeds || input.embeds.length === 0)) {
46
+ return toolResult("At least content or embeds must be provided", true);
47
+ }
48
+ const message = await webhook.send({
49
+ content: input.content,
50
+ username: input.username,
51
+ avatarURL: input.avatar_url,
52
+ embeds: input.embeds,
53
+ });
54
+ return toolResultJson({
55
+ id: message.id,
56
+ channel_id: message.channelId,
57
+ webhook_id: input.webhook_id,
58
+ content: message.content,
59
+ timestamp: message.createdAt?.toISOString(),
60
+ });
61
+ },
62
+ };
63
+ //# sourceMappingURL=execute-webhook.js.map