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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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;
|
|
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:
|
|
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
|
|
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;
|
|
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;
|
|
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;
|
|
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
|
|
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;
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|