@opentabs-dev/opentabs-plugin-discord 0.0.74

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 (121) hide show
  1. package/README.md +138 -0
  2. package/dist/adapter.iife.js +15389 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/discord-api.d.ts +16 -0
  5. package/dist/discord-api.d.ts.map +1 -0
  6. package/dist/discord-api.js +232 -0
  7. package/dist/discord-api.js.map +1 -0
  8. package/dist/index.d.ts +14 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +78 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/tools/add-reaction.d.ts +7 -0
  13. package/dist/tools/add-reaction.d.ts.map +1 -0
  14. package/dist/tools/add-reaction.js +28 -0
  15. package/dist/tools/add-reaction.js.map +1 -0
  16. package/dist/tools/create-channel.d.ts +21 -0
  17. package/dist/tools/create-channel.d.ts.map +1 -0
  18. package/dist/tools/create-channel.js +40 -0
  19. package/dist/tools/create-channel.js.map +1 -0
  20. package/dist/tools/create-thread.d.ts +19 -0
  21. package/dist/tools/create-thread.d.ts.map +1 -0
  22. package/dist/tools/create-thread.js +47 -0
  23. package/dist/tools/create-thread.js.map +1 -0
  24. package/dist/tools/delete-channel.d.ts +16 -0
  25. package/dist/tools/delete-channel.d.ts.map +1 -0
  26. package/dist/tools/delete-channel.js +25 -0
  27. package/dist/tools/delete-channel.js.map +1 -0
  28. package/dist/tools/delete-message.d.ts +6 -0
  29. package/dist/tools/delete-message.d.ts.map +1 -0
  30. package/dist/tools/delete-message.js +23 -0
  31. package/dist/tools/delete-message.js.map +1 -0
  32. package/dist/tools/edit-channel.d.ts +20 -0
  33. package/dist/tools/edit-channel.d.ts.map +1 -0
  34. package/dist/tools/edit-channel.js +39 -0
  35. package/dist/tools/edit-channel.js.map +1 -0
  36. package/dist/tools/edit-message.d.ts +23 -0
  37. package/dist/tools/edit-message.d.ts.map +1 -0
  38. package/dist/tools/edit-message.js +25 -0
  39. package/dist/tools/edit-message.js.map +1 -0
  40. package/dist/tools/get-channel-info.d.ts +16 -0
  41. package/dist/tools/get-channel-info.d.ts.map +1 -0
  42. package/dist/tools/get-channel-info.js +23 -0
  43. package/dist/tools/get-channel-info.js.map +1 -0
  44. package/dist/tools/get-guild-info.d.ts +18 -0
  45. package/dist/tools/get-guild-info.d.ts.map +1 -0
  46. package/dist/tools/get-guild-info.js +48 -0
  47. package/dist/tools/get-guild-info.js.map +1 -0
  48. package/dist/tools/get-message.d.ts +22 -0
  49. package/dist/tools/get-message.d.ts.map +1 -0
  50. package/dist/tools/get-message.js +33 -0
  51. package/dist/tools/get-message.js.map +1 -0
  52. package/dist/tools/get-user-profile.d.ts +19 -0
  53. package/dist/tools/get-user-profile.d.ts.map +1 -0
  54. package/dist/tools/get-user-profile.js +49 -0
  55. package/dist/tools/get-user-profile.js.map +1 -0
  56. package/dist/tools/list-channels.d.ts +16 -0
  57. package/dist/tools/list-channels.d.ts.map +1 -0
  58. package/dist/tools/list-channels.js +24 -0
  59. package/dist/tools/list-channels.js.map +1 -0
  60. package/dist/tools/list-dms.d.ts +16 -0
  61. package/dist/tools/list-dms.d.ts.map +1 -0
  62. package/dist/tools/list-dms.js +36 -0
  63. package/dist/tools/list-dms.js.map +1 -0
  64. package/dist/tools/list-guilds.d.ts +16 -0
  65. package/dist/tools/list-guilds.d.ts.map +1 -0
  66. package/dist/tools/list-guilds.js +34 -0
  67. package/dist/tools/list-guilds.js.map +1 -0
  68. package/dist/tools/list-members.d.ts +20 -0
  69. package/dist/tools/list-members.d.ts.map +1 -0
  70. package/dist/tools/list-members.js +45 -0
  71. package/dist/tools/list-members.js.map +1 -0
  72. package/dist/tools/list-pinned-messages.d.ts +21 -0
  73. package/dist/tools/list-pinned-messages.d.ts.map +1 -0
  74. package/dist/tools/list-pinned-messages.js +24 -0
  75. package/dist/tools/list-pinned-messages.js.map +1 -0
  76. package/dist/tools/list-roles.d.ts +15 -0
  77. package/dist/tools/list-roles.d.ts.map +1 -0
  78. package/dist/tools/list-roles.js +41 -0
  79. package/dist/tools/list-roles.js.map +1 -0
  80. package/dist/tools/open-dm.d.ts +15 -0
  81. package/dist/tools/open-dm.d.ts.map +1 -0
  82. package/dist/tools/open-dm.js +35 -0
  83. package/dist/tools/open-dm.js.map +1 -0
  84. package/dist/tools/pin-message.d.ts +6 -0
  85. package/dist/tools/pin-message.d.ts.map +1 -0
  86. package/dist/tools/pin-message.js +23 -0
  87. package/dist/tools/pin-message.js.map +1 -0
  88. package/dist/tools/read-messages.d.ts +25 -0
  89. package/dist/tools/read-messages.d.ts.map +1 -0
  90. package/dist/tools/read-messages.js +37 -0
  91. package/dist/tools/read-messages.js.map +1 -0
  92. package/dist/tools/read-thread.d.ts +24 -0
  93. package/dist/tools/read-thread.d.ts.map +1 -0
  94. package/dist/tools/read-thread.js +34 -0
  95. package/dist/tools/read-thread.js.map +1 -0
  96. package/dist/tools/remove-reaction.d.ts +7 -0
  97. package/dist/tools/remove-reaction.d.ts.map +1 -0
  98. package/dist/tools/remove-reaction.js +28 -0
  99. package/dist/tools/remove-reaction.js.map +1 -0
  100. package/dist/tools/schemas.d.ts +89 -0
  101. package/dist/tools/schemas.d.ts.map +1 -0
  102. package/dist/tools/schemas.js +72 -0
  103. package/dist/tools/schemas.js.map +1 -0
  104. package/dist/tools/search-messages.d.ts +28 -0
  105. package/dist/tools/search-messages.d.ts.map +1 -0
  106. package/dist/tools/search-messages.js +46 -0
  107. package/dist/tools/search-messages.js.map +1 -0
  108. package/dist/tools/send-message.d.ts +23 -0
  109. package/dist/tools/send-message.d.ts.map +1 -0
  110. package/dist/tools/send-message.js +32 -0
  111. package/dist/tools/send-message.js.map +1 -0
  112. package/dist/tools/unpin-message.d.ts +6 -0
  113. package/dist/tools/unpin-message.d.ts.map +1 -0
  114. package/dist/tools/unpin-message.js +23 -0
  115. package/dist/tools/unpin-message.js.map +1 -0
  116. package/dist/tools/upload-file.d.ts +25 -0
  117. package/dist/tools/upload-file.d.ts.map +1 -0
  118. package/dist/tools/upload-file.js +53 -0
  119. package/dist/tools/upload-file.js.map +1 -0
  120. package/dist/tools.json +2681 -0
  121. package/package.json +55 -0
@@ -0,0 +1,16 @@
1
+ export declare const isDiscordAuthenticated: () => boolean;
2
+ /**
3
+ * Wait for Discord's SPA to hydrate and populate its internal token manager.
4
+ * Polls at 500ms intervals for up to 10 seconds.
5
+ */
6
+ export declare const waitForDiscordAuth: () => Promise<boolean>;
7
+ /**
8
+ * Make an authenticated request to the Discord API (v9).
9
+ * Automatically extracts the token and handles error classification.
10
+ */
11
+ export declare const discordApi: <T extends Record<string, unknown>>(endpoint: string, options?: {
12
+ method?: string;
13
+ body?: Record<string, unknown> | FormData;
14
+ query?: Record<string, string | number | boolean | undefined>;
15
+ }) => Promise<T>;
16
+ //# sourceMappingURL=discord-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-api.d.ts","sourceRoot":"","sources":["../src/discord-api.ts"],"names":[],"mappings":"AAuEA,eAAO,MAAM,sBAAsB,QAAO,OAA6B,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,OAAO,CAO1D,CAAC;AAgCF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,UAAU,MAAM,EAChB,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC1D,KACL,OAAO,CAAC,CAAC,CA0IX,CAAC"}
@@ -0,0 +1,232 @@
1
+ import { clearAuthCache, getAuthCache, parseRetryAfterMs, setAuthCache, ToolError, waitUntil, } from '@opentabs-dev/plugin-sdk';
2
+ /**
3
+ * Extract the auth token from Discord's webpack module registry.
4
+ * Discord keeps the token in an internal module that exposes a `getToken()`
5
+ * method. We push a one-shot chunk into `webpackChunkdiscord_app` to walk
6
+ * the module cache and find it. Many i18n modules also have `getToken()`
7
+ * (returning `{locale, ast}`), so we filter by return type — only a string
8
+ * result is the auth token.
9
+ */
10
+ const getTokenFromWebpack = () => {
11
+ try {
12
+ const chunks = globalThis.webpackChunkdiscord_app;
13
+ if (!chunks)
14
+ return null;
15
+ let token = null;
16
+ chunks.push([
17
+ [Symbol()],
18
+ {},
19
+ (require) => {
20
+ for (const mod of Object.values(require.c)) {
21
+ const exports = mod?.exports;
22
+ if (!exports)
23
+ continue;
24
+ const def = (exports.default ?? exports);
25
+ if (typeof def?.getToken !== 'function')
26
+ continue;
27
+ const result = def.getToken();
28
+ if (typeof result === 'string' && result.length > 0) {
29
+ token = result;
30
+ break;
31
+ }
32
+ }
33
+ },
34
+ ]);
35
+ return token;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ };
41
+ /**
42
+ * Extract auth token from Discord. Checks two sources in order:
43
+ * 1. Persisted cache on globalThis (survives adapter re-injection)
44
+ * 2. Discord's internal webpack module registry via `getToken()`
45
+ *
46
+ * Once extracted, the token is cached on globalThis so subsequent calls
47
+ * avoid the webpack walk.
48
+ */
49
+ const getAuth = () => {
50
+ const persisted = getAuthCache('discord');
51
+ if (persisted)
52
+ return { token: persisted };
53
+ const token = getTokenFromWebpack();
54
+ if (!token)
55
+ return null;
56
+ setAuthCache('discord', token);
57
+ return { token };
58
+ };
59
+ export const isDiscordAuthenticated = () => getAuth() !== null;
60
+ /**
61
+ * Wait for Discord's SPA to hydrate and populate its internal token manager.
62
+ * Polls at 500ms intervals for up to 10 seconds.
63
+ */
64
+ export const waitForDiscordAuth = async () => {
65
+ try {
66
+ await waitUntil(() => isDiscordAuthenticated(), { interval: 500, timeout: 10_000 });
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ };
73
+ // Discord API error codes that map to specific error categories
74
+ const AUTH_ERRORS = new Set([
75
+ 0, // General auth failure
76
+ 40001, // Unauthorized
77
+ 40002, // Verification required
78
+ 50014, // Invalid authentication token
79
+ ]);
80
+ const NOT_FOUND_ERRORS = new Set([
81
+ 10003, // Unknown Channel
82
+ 10004, // Unknown Guild
83
+ 10006, // Unknown Invite
84
+ 10008, // Unknown Message
85
+ 10013, // Unknown User
86
+ 10011, // Unknown Role
87
+ 10014, // Unknown Emoji
88
+ 10015, // Unknown Webhook
89
+ ]);
90
+ const VALIDATION_ERRORS = new Set([
91
+ 50001, // Missing Access
92
+ 50003, // Cannot execute on DM channel
93
+ 50006, // Cannot send empty message
94
+ 50007, // Cannot send messages to this user
95
+ 50008, // Cannot edit message by another user
96
+ 50013, // Missing Permissions
97
+ 50035, // Invalid Form Body
98
+ 50109, // Request body contains invalid JSON
99
+ ]);
100
+ /**
101
+ * Make an authenticated request to the Discord API (v9).
102
+ * Automatically extracts the token and handles error classification.
103
+ */
104
+ export const discordApi = async (endpoint, options = {}) => {
105
+ const auth = getAuth();
106
+ if (!auth) {
107
+ throw ToolError.auth('Not authenticated — no Discord token found. Please log in to Discord.');
108
+ }
109
+ const { method = 'GET', body, query } = options;
110
+ let url = `https://discord.com/api/v9${endpoint}`;
111
+ if (query) {
112
+ const params = new URLSearchParams();
113
+ for (const [key, value] of Object.entries(query)) {
114
+ if (value !== undefined) {
115
+ params.append(key, String(value));
116
+ }
117
+ }
118
+ const qs = params.toString();
119
+ if (qs)
120
+ url += `?${qs}`;
121
+ }
122
+ const headers = {
123
+ Authorization: auth.token,
124
+ };
125
+ let fetchBody;
126
+ if (body instanceof FormData) {
127
+ fetchBody = body;
128
+ // Do not set Content-Type for FormData — browser sets multipart boundary
129
+ }
130
+ else if (body) {
131
+ headers['Content-Type'] = 'application/json';
132
+ fetchBody = JSON.stringify(body);
133
+ }
134
+ let response;
135
+ try {
136
+ response = await fetch(url, {
137
+ method,
138
+ headers,
139
+ body: fetchBody,
140
+ credentials: 'include',
141
+ signal: AbortSignal.timeout(30_000),
142
+ });
143
+ }
144
+ catch (err) {
145
+ if (err instanceof DOMException && err.name === 'TimeoutError') {
146
+ throw ToolError.timeout(`Discord API request timed out: ${method} ${endpoint}`);
147
+ }
148
+ if (err instanceof DOMException && err.name === 'AbortError') {
149
+ throw new ToolError('Request was aborted', 'aborted');
150
+ }
151
+ throw new ToolError(`Network error calling Discord API: ${err instanceof Error ? err.message : String(err)}`, 'network_error', { category: 'internal', retryable: true });
152
+ }
153
+ // Handle HTTP-level errors
154
+ if (!response.ok) {
155
+ const retryAfterHeader = response.headers.get('Retry-After');
156
+ const retryMs = retryAfterHeader !== null ? parseRetryAfterMs(retryAfterHeader) : undefined;
157
+ const errorText = await response.text().catch(() => '');
158
+ const errorBody = errorText.substring(0, 512);
159
+ if (response.status === 429) {
160
+ let retryAfterMs = retryMs;
161
+ try {
162
+ const parsed = JSON.parse(errorText);
163
+ if (typeof parsed.retry_after === 'number') {
164
+ retryAfterMs = parsed.retry_after * 1000;
165
+ }
166
+ }
167
+ catch {
168
+ // Use header value
169
+ }
170
+ throw ToolError.rateLimited(`Discord API rate limited: ${method} ${endpoint} — ${errorBody}`, retryAfterMs);
171
+ }
172
+ // Parse error body for Discord-specific error codes before classifying by HTTP status.
173
+ // Discord uses 403 for both "unauthorized" and "missing permissions" — the error code
174
+ // in the response body distinguishes them.
175
+ let discordCode;
176
+ let discordMessage;
177
+ try {
178
+ const parsed = JSON.parse(errorText);
179
+ discordCode = parsed.code;
180
+ discordMessage = parsed.message;
181
+ }
182
+ catch {
183
+ // Not JSON — classify by HTTP status only
184
+ }
185
+ if (discordCode !== undefined) {
186
+ if (VALIDATION_ERRORS.has(discordCode)) {
187
+ throw ToolError.validation(`Discord API error: ${discordMessage ?? errorBody} (code ${String(discordCode)})`);
188
+ }
189
+ if (NOT_FOUND_ERRORS.has(discordCode)) {
190
+ throw ToolError.notFound(`Discord API error: ${discordMessage ?? errorBody} (code ${String(discordCode)})`);
191
+ }
192
+ if (AUTH_ERRORS.has(discordCode)) {
193
+ clearAuthCache('discord');
194
+ throw ToolError.auth(`Discord API error: ${discordMessage ?? errorBody} (code ${String(discordCode)})`);
195
+ }
196
+ }
197
+ if (response.status === 401 || response.status === 403) {
198
+ clearAuthCache('discord');
199
+ throw ToolError.auth(`Discord API auth error (${String(response.status)}): ${errorBody}`);
200
+ }
201
+ if (response.status === 404) {
202
+ throw ToolError.notFound(`Discord API not found: ${method} ${endpoint} — ${errorBody}`);
203
+ }
204
+ throw ToolError.internal(`Discord API error (${String(response.status)}): ${method} ${endpoint} — ${errorBody}`);
205
+ }
206
+ // 204 No Content
207
+ if (response.status === 204) {
208
+ return {};
209
+ }
210
+ let data;
211
+ try {
212
+ data = await response.json();
213
+ }
214
+ catch {
215
+ throw ToolError.internal(`Discord API returned invalid JSON: ${method} ${endpoint}`);
216
+ }
217
+ // Discord API-level errors (some endpoints return 200 with error codes in body)
218
+ if (typeof data === 'object' && data !== null && 'code' in data && 'message' in data) {
219
+ const record = data;
220
+ if (AUTH_ERRORS.has(record.code)) {
221
+ throw ToolError.auth(`Discord API error: ${record.message} (code ${String(record.code)})`);
222
+ }
223
+ if (NOT_FOUND_ERRORS.has(record.code)) {
224
+ throw ToolError.notFound(`Discord API error: ${record.message} (code ${String(record.code)})`);
225
+ }
226
+ if (VALIDATION_ERRORS.has(record.code)) {
227
+ throw ToolError.validation(`Discord API error: ${record.message} (code ${String(record.code)})`);
228
+ }
229
+ }
230
+ return data;
231
+ };
232
+ //# sourceMappingURL=discord-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-api.js","sourceRoot":"","sources":["../src/discord-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
3
+ declare class DiscordPlugin extends OpenTabsPlugin {
4
+ readonly name = "discord";
5
+ readonly description = "OpenTabs plugin for Discord";
6
+ readonly displayName = "Discord";
7
+ readonly urlPatterns: string[];
8
+ readonly homepage = "https://discord.com/channels/@me";
9
+ readonly tools: ToolDefinition[];
10
+ isReady(): Promise<boolean>;
11
+ }
12
+ declare const _default: DiscordPlugin;
13
+ export default _default;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA6B/D,cAAM,aAAc,SAAQ,cAAc;IACxC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,iCAAiC;IACrD,SAAkB,WAAW,aAAa;IAC1C,QAAQ,CAAC,WAAW,WAAyB;IAC7C,SAAkB,QAAQ,sCAAsC;IAChE,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAmC9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAmC"}
package/dist/index.js ADDED
@@ -0,0 +1,78 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import { isDiscordAuthenticated, waitForDiscordAuth } from './discord-api.js';
3
+ import { sendMessage } from './tools/send-message.js';
4
+ import { editMessage } from './tools/edit-message.js';
5
+ import { deleteMessage } from './tools/delete-message.js';
6
+ import { readMessages } from './tools/read-messages.js';
7
+ import { readThread } from './tools/read-thread.js';
8
+ import { searchMessages } from './tools/search-messages.js';
9
+ import { getMessage } from './tools/get-message.js';
10
+ import { listPinnedMessages } from './tools/list-pinned-messages.js';
11
+ import { listGuilds } from './tools/list-guilds.js';
12
+ import { getGuildInfo } from './tools/get-guild-info.js';
13
+ import { listChannels } from './tools/list-channels.js';
14
+ import { getChannelInfo } from './tools/get-channel-info.js';
15
+ import { createChannel } from './tools/create-channel.js';
16
+ import { editChannel } from './tools/edit-channel.js';
17
+ import { deleteChannel } from './tools/delete-channel.js';
18
+ import { listMembers } from './tools/list-members.js';
19
+ import { listRoles } from './tools/list-roles.js';
20
+ import { getUserProfile } from './tools/get-user-profile.js';
21
+ import { listDms } from './tools/list-dms.js';
22
+ import { openDm } from './tools/open-dm.js';
23
+ import { addReaction } from './tools/add-reaction.js';
24
+ import { removeReaction } from './tools/remove-reaction.js';
25
+ import { pinMessage } from './tools/pin-message.js';
26
+ import { unpinMessage } from './tools/unpin-message.js';
27
+ import { createThread } from './tools/create-thread.js';
28
+ import { uploadFile } from './tools/upload-file.js';
29
+ class DiscordPlugin extends OpenTabsPlugin {
30
+ name = 'discord';
31
+ description = 'OpenTabs plugin for Discord';
32
+ displayName = 'Discord';
33
+ urlPatterns = ['*://discord.com/*'];
34
+ homepage = 'https://discord.com/channels/@me';
35
+ tools = [
36
+ // Messages
37
+ sendMessage,
38
+ editMessage,
39
+ deleteMessage,
40
+ readMessages,
41
+ readThread,
42
+ searchMessages,
43
+ getMessage,
44
+ listPinnedMessages,
45
+ // Servers
46
+ listGuilds,
47
+ getGuildInfo,
48
+ // Channels
49
+ listChannels,
50
+ getChannelInfo,
51
+ createChannel,
52
+ editChannel,
53
+ deleteChannel,
54
+ // Members & Roles
55
+ listMembers,
56
+ listRoles,
57
+ getUserProfile,
58
+ // DMs
59
+ listDms,
60
+ openDm,
61
+ // Reactions & Pins
62
+ addReaction,
63
+ removeReaction,
64
+ pinMessage,
65
+ unpinMessage,
66
+ // Threads
67
+ createThread,
68
+ // Files
69
+ uploadFile,
70
+ ];
71
+ async isReady() {
72
+ if (isDiscordAuthenticated())
73
+ return true;
74
+ return waitForDiscordAuth();
75
+ }
76
+ }
77
+ export default new DiscordPlugin();
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,aAAc,SAAQ,cAAc;IAC/B,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,6BAA6B,CAAC;IACnC,WAAW,GAAG,SAAS,CAAC;IACjC,WAAW,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC3B,QAAQ,GAAG,kCAAkC,CAAC;IACvD,KAAK,GAAqB;QACjC,WAAW;QACX,WAAW;QACX,WAAW;QACX,aAAa;QACb,YAAY;QACZ,UAAU;QACV,cAAc;QACd,UAAU;QACV,kBAAkB;QAClB,UAAU;QACV,UAAU;QACV,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,cAAc;QACd,aAAa;QACb,WAAW;QACX,aAAa;QACb,kBAAkB;QAClB,WAAW;QACX,SAAS;QACT,cAAc;QACd,MAAM;QACN,OAAO;QACP,MAAM;QACN,mBAAmB;QACnB,WAAW;QACX,cAAc;QACd,UAAU;QACV,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,UAAU;KACX,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,sBAAsB,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ export declare const addReaction: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ channel: z.ZodString;
4
+ message_id: z.ZodString;
5
+ emoji: z.ZodString;
6
+ }, z.core.$strip>, z.ZodObject<{}, z.core.$strip>>;
7
+ //# sourceMappingURL=add-reaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-reaction.d.ts","sourceRoot":"","sources":["../../src/tools/add-reaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,WAAW;;;;kDAuBtB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { discordApi } from '../discord-api.js';
4
+ export const addReaction = defineTool({
5
+ name: 'add_reaction',
6
+ displayName: 'Add Reaction',
7
+ description: 'Add an emoji reaction to a message',
8
+ summary: 'Add an emoji reaction to a message',
9
+ icon: 'smile-plus',
10
+ group: 'Reactions',
11
+ input: z.object({
12
+ channel: z.string().min(1).describe('Channel ID where the message is located'),
13
+ message_id: z.string().min(1).describe('Message ID to react to'),
14
+ emoji: z
15
+ .string()
16
+ .min(1)
17
+ .describe('Emoji to react with — use Unicode emoji (e.g., "👍") or custom emoji format "name:id"'),
18
+ }),
19
+ output: z.object({}),
20
+ handle: async (params) => {
21
+ const emoji = encodeURIComponent(params.emoji);
22
+ await discordApi(`/channels/${params.channel}/messages/${params.message_id}/reactions/${emoji}/@me`, {
23
+ method: 'PUT',
24
+ });
25
+ return {};
26
+ },
27
+ });
28
+ //# sourceMappingURL=add-reaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-reaction.js","sourceRoot":"","sources":["../../src/tools/add-reaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,oCAAoC;IAC7C,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAChE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,uFAAuF,CAAC;KACrG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,CAAC,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,UAAU,cAAc,KAAK,MAAM,EAAE;YACnG,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const createChannel: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ guild_id: z.ZodString;
4
+ name: z.ZodString;
5
+ type: z.ZodOptional<z.ZodNumber>;
6
+ topic: z.ZodOptional<z.ZodString>;
7
+ parent_id: z.ZodOptional<z.ZodString>;
8
+ nsfw: z.ZodOptional<z.ZodBoolean>;
9
+ }, z.core.$strip>, z.ZodObject<{
10
+ channel: z.ZodObject<{
11
+ id: z.ZodString;
12
+ type: z.ZodNumber;
13
+ guild_id: z.ZodString;
14
+ name: z.ZodString;
15
+ topic: z.ZodNullable<z.ZodString>;
16
+ position: z.ZodNumber;
17
+ parent_id: z.ZodNullable<z.ZodString>;
18
+ nsfw: z.ZodBoolean;
19
+ }, z.core.$strip>;
20
+ }, z.core.$strip>>;
21
+ //# sourceMappingURL=create-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-channel.d.ts","sourceRoot":"","sources":["../../src/tools/create-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;kBA+BxB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { discordApi } from '../discord-api.js';
4
+ import { channelSchema, mapChannel } from './schemas.js';
5
+ export const createChannel = defineTool({
6
+ name: 'create_channel',
7
+ displayName: 'Create Channel',
8
+ description: 'Create a new channel in a Discord guild (server). Requires Manage Channels permission.',
9
+ summary: 'Create a new channel in a server',
10
+ icon: 'plus-circle',
11
+ group: 'Channels',
12
+ input: z.object({
13
+ guild_id: z.string().min(1).describe('Guild (server) ID to create the channel in'),
14
+ name: z.string().min(1).describe('Channel name (lowercase, hyphens, max 100 chars)'),
15
+ type: z.number().int().optional().describe('Channel type: 0=text (default), 2=voice, 4=category, 5=announcement'),
16
+ topic: z.string().optional().describe('Channel topic (max 1024 chars for text channels)'),
17
+ parent_id: z.string().optional().describe('Parent category ID to nest the channel under'),
18
+ nsfw: z.boolean().optional().describe('Whether the channel is NSFW'),
19
+ }),
20
+ output: z.object({
21
+ channel: channelSchema.describe('The created channel'),
22
+ }),
23
+ handle: async (params) => {
24
+ const body = { name: params.name };
25
+ if (params.type !== undefined)
26
+ body.type = params.type;
27
+ if (params.topic)
28
+ body.topic = params.topic;
29
+ if (params.parent_id)
30
+ body.parent_id = params.parent_id;
31
+ if (params.nsfw !== undefined)
32
+ body.nsfw = params.nsfw;
33
+ const data = await discordApi(`/guilds/${params.guild_id}/channels`, {
34
+ method: 'POST',
35
+ body,
36
+ });
37
+ return { channel: mapChannel(data) };
38
+ },
39
+ });
40
+ //# sourceMappingURL=create-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-channel.js","sourceRoot":"","sources":["../../src/tools/create-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,wFAAwF;IACrG,OAAO,EAAE,kCAAkC;IAC3C,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAClF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;QACjH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACzF,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KACrE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACvD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACvD,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5C,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,UAAU,CAA0B,WAAW,MAAM,CAAC,QAAQ,WAAW,EAAE;YAC5F,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACvC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ export declare const createThread: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ channel: z.ZodString;
4
+ name: z.ZodString;
5
+ message_id: z.ZodOptional<z.ZodString>;
6
+ auto_archive_duration: z.ZodOptional<z.ZodNumber>;
7
+ }, z.core.$strip>, z.ZodObject<{
8
+ thread: z.ZodObject<{
9
+ id: z.ZodString;
10
+ type: z.ZodNumber;
11
+ guild_id: z.ZodString;
12
+ name: z.ZodString;
13
+ topic: z.ZodNullable<z.ZodString>;
14
+ position: z.ZodNumber;
15
+ parent_id: z.ZodNullable<z.ZodString>;
16
+ nsfw: z.ZodBoolean;
17
+ }, z.core.$strip>;
18
+ }, z.core.$strip>>;
19
+ //# sourceMappingURL=create-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-thread.d.ts","sourceRoot":"","sources":["../../src/tools/create-thread.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;kBA2CvB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { discordApi } from '../discord-api.js';
4
+ import { channelSchema, mapChannel } from './schemas.js';
5
+ export const createThread = defineTool({
6
+ name: 'create_thread',
7
+ displayName: 'Create Thread',
8
+ description: 'Create a new thread from a message, or a standalone thread in a channel. Threads are temporary sub-channels for focused conversation.',
9
+ summary: 'Create a new thread',
10
+ icon: 'git-branch',
11
+ group: 'Channels',
12
+ input: z.object({
13
+ channel: z.string().min(1).describe('Channel ID to create the thread in'),
14
+ name: z.string().min(1).describe('Thread name (max 100 chars)'),
15
+ message_id: z.string().optional().describe('Message ID to start a thread from (omit for a standalone thread)'),
16
+ auto_archive_duration: z
17
+ .number()
18
+ .int()
19
+ .optional()
20
+ .describe('Minutes of inactivity before auto-archiving: 60, 1440, 4320, or 10080'),
21
+ }),
22
+ output: z.object({
23
+ thread: channelSchema.describe('The created thread channel'),
24
+ }),
25
+ handle: async (params) => {
26
+ const body = { name: params.name };
27
+ if (params.auto_archive_duration) {
28
+ body.auto_archive_duration = params.auto_archive_duration;
29
+ }
30
+ let endpoint;
31
+ if (params.message_id) {
32
+ // Create thread from a message
33
+ endpoint = `/channels/${params.channel}/messages/${params.message_id}/threads`;
34
+ }
35
+ else {
36
+ // Create standalone thread (requires type)
37
+ endpoint = `/channels/${params.channel}/threads`;
38
+ body.type = 11; // PUBLIC_THREAD
39
+ }
40
+ const data = await discordApi(endpoint, {
41
+ method: 'POST',
42
+ body,
43
+ });
44
+ return { thread: mapChannel(data) };
45
+ },
46
+ });
47
+ //# sourceMappingURL=create-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-thread.js","sourceRoot":"","sources":["../../src/tools/create-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EACT,uIAAuI;IACzI,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACzE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAC9G,qBAAqB,EAAE,CAAC;aACrB,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,uEAAuE,CAAC;KACrF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KAC7D,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;QAC5D,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,+BAA+B;YAC/B,QAAQ,GAAG,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,UAAU,UAAU,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,QAAQ,GAAG,aAAa,MAAM,CAAC,OAAO,UAAU,CAAC;YACjD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,gBAAgB;QAClC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,UAAU,CAA0B,QAAQ,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,IAAI;SACL,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const deleteChannel: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ channel: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ channel: z.ZodObject<{
6
+ id: z.ZodString;
7
+ type: z.ZodNumber;
8
+ guild_id: z.ZodString;
9
+ name: z.ZodString;
10
+ topic: z.ZodNullable<z.ZodString>;
11
+ position: z.ZodNumber;
12
+ parent_id: z.ZodNullable<z.ZodString>;
13
+ nsfw: z.ZodBoolean;
14
+ }, z.core.$strip>;
15
+ }, z.core.$strip>>;
16
+ //# sourceMappingURL=delete-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-channel.d.ts","sourceRoot":"","sources":["../../src/tools/delete-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;kBAmBxB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { discordApi } from '../discord-api.js';
4
+ import { channelSchema, mapChannel } from './schemas.js';
5
+ export const deleteChannel = defineTool({
6
+ name: 'delete_channel',
7
+ displayName: 'Delete Channel',
8
+ description: 'Delete a Discord channel. This action is permanent and cannot be undone.',
9
+ summary: 'Delete a channel permanently',
10
+ icon: 'trash-2',
11
+ group: 'Channels',
12
+ input: z.object({
13
+ channel: z.string().min(1).describe('Channel ID to delete'),
14
+ }),
15
+ output: z.object({
16
+ channel: channelSchema.describe('The deleted channel'),
17
+ }),
18
+ handle: async (params) => {
19
+ const data = await discordApi(`/channels/${params.channel}`, {
20
+ method: 'DELETE',
21
+ });
22
+ return { channel: mapChannel(data) };
23
+ },
24
+ });
25
+ //# sourceMappingURL=delete-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-channel.js","sourceRoot":"","sources":["../../src/tools/delete-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,0EAA0E;IACvF,OAAO,EAAE,8BAA8B;IACvC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC5D,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACvD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,UAAU,CAA0B,aAAa,MAAM,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACvC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export declare const deleteMessage: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ channel: z.ZodString;
4
+ message_id: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{}, z.core.$strip>>;
6
+ //# sourceMappingURL=delete-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-message.d.ts","sourceRoot":"","sources":["../../src/tools/delete-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;kDAkBxB,CAAC"}