@decaf-ts/integrations 0.12.0 → 0.14.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/dist/integrations.cjs +1 -1
- package/lib/cjs/calendar/environment.cjs +48 -0
- package/lib/cjs/calendar/environment.cjs.map +1 -0
- package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs +338 -0
- package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs.map +1 -0
- package/lib/cjs/calendar/google-calendar/index.cjs +20 -0
- package/lib/cjs/calendar/google-calendar/index.cjs.map +1 -0
- package/lib/cjs/comms/discord/DiscordService.cjs +318 -0
- package/lib/cjs/comms/discord/DiscordService.cjs.map +1 -0
- package/lib/cjs/comms/discord/index.cjs +19 -0
- package/lib/cjs/comms/discord/index.cjs.map +1 -0
- package/lib/cjs/comms/environment.cjs +16 -0
- package/lib/cjs/comms/environment.cjs.map +1 -1
- package/lib/cjs/comms/index.cjs +3 -0
- package/lib/cjs/comms/index.cjs.map +1 -1
- package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs +325 -0
- package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs.map +1 -0
- package/lib/cjs/comms/outlook/index.cjs +19 -0
- package/lib/cjs/comms/outlook/index.cjs.map +1 -0
- package/lib/cjs/comms/whatsapp/WhatsAppService.cjs +274 -0
- package/lib/cjs/comms/whatsapp/WhatsAppService.cjs.map +1 -0
- package/lib/cjs/comms/whatsapp/index.cjs +19 -0
- package/lib/cjs/comms/whatsapp/index.cjs.map +1 -0
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/io/confluence/ConfluenceService.cjs +317 -0
- package/lib/cjs/io/confluence/ConfluenceService.cjs.map +1 -0
- package/lib/cjs/io/confluence/index.cjs +19 -0
- package/lib/cjs/io/confluence/index.cjs.map +1 -0
- package/lib/cjs/io/environment.cjs +28 -0
- package/lib/cjs/io/environment.cjs.map +1 -1
- package/lib/cjs/io/google-docs/GoogleDocsService.cjs +275 -0
- package/lib/cjs/io/google-docs/GoogleDocsService.cjs.map +1 -0
- package/lib/cjs/io/google-docs/index.cjs +19 -0
- package/lib/cjs/io/google-docs/index.cjs.map +1 -0
- package/lib/cjs/io/index.cjs +5 -0
- package/lib/cjs/io/index.cjs.map +1 -1
- package/lib/cjs/io/jira/JiraService.cjs +354 -0
- package/lib/cjs/io/jira/JiraService.cjs.map +1 -0
- package/lib/cjs/io/jira/index.cjs +19 -0
- package/lib/cjs/io/jira/index.cjs.map +1 -0
- package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs +253 -0
- package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs.map +1 -0
- package/lib/cjs/io/microsoft-excel/index.cjs +19 -0
- package/lib/cjs/io/microsoft-excel/index.cjs.map +1 -0
- package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs +261 -0
- package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs.map +1 -0
- package/lib/cjs/io/microsoft-sharepoint/index.cjs +19 -0
- package/lib/cjs/io/microsoft-sharepoint/index.cjs.map +1 -0
- package/lib/esm/calendar/environment.js +44 -0
- package/lib/esm/calendar/environment.js.map +1 -0
- package/lib/esm/calendar/google-calendar/GoogleCalendarService.js +333 -0
- package/lib/esm/calendar/google-calendar/GoogleCalendarService.js.map +1 -0
- package/lib/esm/calendar/google-calendar/index.js +3 -0
- package/lib/esm/calendar/google-calendar/index.js.map +1 -0
- package/lib/esm/comms/discord/DiscordService.js +313 -0
- package/lib/esm/comms/discord/DiscordService.js.map +1 -0
- package/lib/esm/comms/discord/index.js +2 -0
- package/lib/esm/comms/discord/index.js.map +1 -0
- package/lib/esm/comms/environment.js +16 -0
- package/lib/esm/comms/environment.js.map +1 -1
- package/lib/esm/comms/index.js +3 -0
- package/lib/esm/comms/index.js.map +1 -1
- package/lib/esm/comms/outlook/MicrosoftOutlookService.js +320 -0
- package/lib/esm/comms/outlook/MicrosoftOutlookService.js.map +1 -0
- package/lib/esm/comms/outlook/index.js +2 -0
- package/lib/esm/comms/outlook/index.js.map +1 -0
- package/lib/esm/comms/whatsapp/WhatsAppService.js +269 -0
- package/lib/esm/comms/whatsapp/WhatsAppService.js.map +1 -0
- package/lib/esm/comms/whatsapp/index.js +2 -0
- package/lib/esm/comms/whatsapp/index.js.map +1 -0
- package/lib/esm/index.js +3 -3
- package/lib/esm/io/confluence/ConfluenceService.js +312 -0
- package/lib/esm/io/confluence/ConfluenceService.js.map +1 -0
- package/lib/esm/io/confluence/index.js +2 -0
- package/lib/esm/io/confluence/index.js.map +1 -0
- package/lib/esm/io/environment.js +28 -0
- package/lib/esm/io/environment.js.map +1 -1
- package/lib/esm/io/google-docs/GoogleDocsService.js +270 -0
- package/lib/esm/io/google-docs/GoogleDocsService.js.map +1 -0
- package/lib/esm/io/google-docs/index.js +2 -0
- package/lib/esm/io/google-docs/index.js.map +1 -0
- package/lib/esm/io/index.js +5 -0
- package/lib/esm/io/index.js.map +1 -1
- package/lib/esm/io/jira/JiraService.js +349 -0
- package/lib/esm/io/jira/JiraService.js.map +1 -0
- package/lib/esm/io/jira/index.js +2 -0
- package/lib/esm/io/jira/index.js.map +1 -0
- package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js +248 -0
- package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js.map +1 -0
- package/lib/esm/io/microsoft-excel/index.js +2 -0
- package/lib/esm/io/microsoft-excel/index.js.map +1 -0
- package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js +256 -0
- package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js.map +1 -0
- package/lib/esm/io/microsoft-sharepoint/index.js +2 -0
- package/lib/esm/io/microsoft-sharepoint/index.js.map +1 -0
- package/lib/types/calendar/environment.d.cts +48 -0
- package/lib/types/calendar/environment.d.mts +48 -0
- package/lib/types/calendar/google-calendar/GoogleCalendarService.d.cts +316 -0
- package/lib/types/calendar/google-calendar/GoogleCalendarService.d.mts +316 -0
- package/lib/types/calendar/google-calendar/index.d.cts +2 -0
- package/lib/types/calendar/google-calendar/index.d.mts +2 -0
- package/lib/types/comms/discord/DiscordService.d.cts +285 -0
- package/lib/types/comms/discord/DiscordService.d.mts +285 -0
- package/lib/types/comms/discord/index.d.cts +1 -0
- package/lib/types/comms/discord/index.d.mts +1 -0
- package/lib/types/comms/environment.d.cts +34 -8
- package/lib/types/comms/environment.d.mts +34 -8
- package/lib/types/comms/index.d.cts +3 -0
- package/lib/types/comms/index.d.mts +3 -0
- package/lib/types/comms/outlook/MicrosoftOutlookService.d.cts +282 -0
- package/lib/types/comms/outlook/MicrosoftOutlookService.d.mts +282 -0
- package/lib/types/comms/outlook/index.d.cts +1 -0
- package/lib/types/comms/outlook/index.d.mts +1 -0
- package/lib/types/comms/whatsapp/WhatsAppService.d.cts +258 -0
- package/lib/types/comms/whatsapp/WhatsAppService.d.mts +258 -0
- package/lib/types/comms/whatsapp/index.d.cts +1 -0
- package/lib/types/comms/whatsapp/index.d.mts +1 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/io/confluence/ConfluenceService.d.cts +250 -0
- package/lib/types/io/confluence/ConfluenceService.d.mts +250 -0
- package/lib/types/io/confluence/index.d.cts +1 -0
- package/lib/types/io/confluence/index.d.mts +1 -0
- package/lib/types/io/environment.d.cts +52 -12
- package/lib/types/io/environment.d.mts +52 -12
- package/lib/types/io/google-docs/GoogleDocsService.d.cts +188 -0
- package/lib/types/io/google-docs/GoogleDocsService.d.mts +188 -0
- package/lib/types/io/google-docs/index.d.cts +1 -0
- package/lib/types/io/google-docs/index.d.mts +1 -0
- package/lib/types/io/index.d.cts +5 -0
- package/lib/types/io/index.d.mts +5 -0
- package/lib/types/io/jira/JiraService.d.cts +300 -0
- package/lib/types/io/jira/JiraService.d.mts +300 -0
- package/lib/types/io/jira/index.d.cts +1 -0
- package/lib/types/io/jira/index.d.mts +1 -0
- package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.cts +230 -0
- package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.mts +230 -0
- package/lib/types/io/microsoft-excel/index.d.cts +1 -0
- package/lib/types/io/microsoft-excel/index.d.mts +1 -0
- package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.cts +226 -0
- package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.mts +226 -0
- package/lib/types/io/microsoft-sharepoint/index.d.cts +1 -0
- package/lib/types/io/microsoft-sharepoint/index.d.mts +1 -0
- package/package.json +101 -5
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { HttpApiService, type HttpApiServiceConfig } from "../../shared/http/index.d.cts";
|
|
2
|
+
/**
|
|
3
|
+
* @description Configuration for the Discord service
|
|
4
|
+
* @summary Extends {@link HttpApiServiceConfig} with the Discord bot token
|
|
5
|
+
* sent as `Authorization: Bot <token>`. When omitted, the `comms.discord`
|
|
6
|
+
* environment slice supplies `token` (plus optional `baseUrl`/`timeout`).
|
|
7
|
+
* The token is a credential reference read from configuration, never a value
|
|
8
|
+
* to hard-code in source.
|
|
9
|
+
* @category Comms
|
|
10
|
+
* @memberOf module:integrations/comms/discord/service
|
|
11
|
+
*/
|
|
12
|
+
export interface DiscordServiceConfig extends HttpApiServiceConfig {
|
|
13
|
+
/**
|
|
14
|
+
* @description Discord bot token
|
|
15
|
+
* @summary Sent as `Authorization: Bot <token>` with every API call.
|
|
16
|
+
*/
|
|
17
|
+
token?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @description Input for sending a Discord channel message
|
|
21
|
+
* @summary Carries the destination `channelId`, the message `content`, the
|
|
22
|
+
* optional text-to-speech flag, and optional rich `embeds`.
|
|
23
|
+
* @category Comms
|
|
24
|
+
* @memberOf module:integrations/comms/discord/service
|
|
25
|
+
*/
|
|
26
|
+
export interface DiscordMessageInput {
|
|
27
|
+
/**
|
|
28
|
+
* @description ID of the channel that receives the message
|
|
29
|
+
*/
|
|
30
|
+
channelId: string;
|
|
31
|
+
/**
|
|
32
|
+
* @description Plain-text message body
|
|
33
|
+
*/
|
|
34
|
+
content: string;
|
|
35
|
+
/**
|
|
36
|
+
* @description Whether Discord reads the message with text-to-speech
|
|
37
|
+
*/
|
|
38
|
+
tts?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* @description Rich embed payloads attached to the message
|
|
41
|
+
*/
|
|
42
|
+
embeds?: unknown[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @description Input for listing a Discord channel's messages
|
|
46
|
+
* @summary Carries the `channelId` plus optional page size and a `before`
|
|
47
|
+
* message ID cursor for fetching older messages.
|
|
48
|
+
* @category Comms
|
|
49
|
+
* @memberOf module:integrations/comms/discord/service
|
|
50
|
+
*/
|
|
51
|
+
export interface DiscordMessageListInput {
|
|
52
|
+
/**
|
|
53
|
+
* @description ID of the channel to list messages from
|
|
54
|
+
*/
|
|
55
|
+
channelId: string;
|
|
56
|
+
/**
|
|
57
|
+
* @description Maximum number of messages to return
|
|
58
|
+
*/
|
|
59
|
+
limit?: number;
|
|
60
|
+
/**
|
|
61
|
+
* @description Message ID cursor; only older messages are returned
|
|
62
|
+
*/
|
|
63
|
+
before?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @description Input for creating a Discord guild channel
|
|
67
|
+
* @summary Carries the target `guildId`, the new channel `name`, and the
|
|
68
|
+
* optional channel `type` (Discord numeric type, default `0` for text),
|
|
69
|
+
* `topic`, and `parentId` (category).
|
|
70
|
+
* @category Comms
|
|
71
|
+
* @memberOf module:integrations/comms/discord/service
|
|
72
|
+
*/
|
|
73
|
+
export interface DiscordChannelInput {
|
|
74
|
+
/**
|
|
75
|
+
* @description ID of the guild that owns the new channel
|
|
76
|
+
*/
|
|
77
|
+
guildId: string;
|
|
78
|
+
/**
|
|
79
|
+
* @description Name of the new channel
|
|
80
|
+
*/
|
|
81
|
+
name: string;
|
|
82
|
+
/**
|
|
83
|
+
* @description Discord numeric channel type (default `0`, text channel)
|
|
84
|
+
*/
|
|
85
|
+
type?: number;
|
|
86
|
+
/**
|
|
87
|
+
* @description Optional channel topic
|
|
88
|
+
*/
|
|
89
|
+
topic?: string;
|
|
90
|
+
/**
|
|
91
|
+
* @description Optional parent category ID
|
|
92
|
+
*/
|
|
93
|
+
parentId?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @description Input for adding a reaction to a Discord message
|
|
97
|
+
* @summary Identifies the `channelId`, the target `messageId`, and the
|
|
98
|
+
* `emoji` to add as the bot user.
|
|
99
|
+
* @category Comms
|
|
100
|
+
* @memberOf module:integrations/comms/discord/service
|
|
101
|
+
*/
|
|
102
|
+
export interface DiscordReactionInput {
|
|
103
|
+
/**
|
|
104
|
+
* @description ID of the channel containing the message
|
|
105
|
+
*/
|
|
106
|
+
channelId: string;
|
|
107
|
+
/**
|
|
108
|
+
* @description ID of the message to react to
|
|
109
|
+
*/
|
|
110
|
+
messageId: string;
|
|
111
|
+
/**
|
|
112
|
+
* @description Emoji to add (Unicode character or `name:id` custom emoji)
|
|
113
|
+
*/
|
|
114
|
+
emoji: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @description Discord Bot API integration service
|
|
118
|
+
* @summary An undecorated HTTP service for channel messages
|
|
119
|
+
* (`sendMessage`, `getMessage`, `listMessages`), channels (`getChannel`,
|
|
120
|
+
* `listChannels`, `createChannel`, `deleteChannel`), and reactions
|
|
121
|
+
* (`addReaction`). Every operation requires a bot token and throws
|
|
122
|
+
* `InternalError` when it is missing or a required identifier is empty;
|
|
123
|
+
* transport failures are mapped to decaf errors via {@link httpError}. This is
|
|
124
|
+
* the callable comms surface (`core.comms.discord`), not the mastra agent
|
|
125
|
+
* trigger/response kinds.
|
|
126
|
+
* @class DiscordService
|
|
127
|
+
* @extends HttpApiService
|
|
128
|
+
* @category Comms
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* import { DiscordService } from "@decaf-ts/integrations/comms/discord";
|
|
132
|
+
*
|
|
133
|
+
* const discord = new DiscordService();
|
|
134
|
+
* await discord.initialize({ token: process.env.GRAPH_CREDENTIAL_DISCORD_TOKEN });
|
|
135
|
+
* await discord.sendMessage({
|
|
136
|
+
* channelId: process.env.DISCORD_CHANNEL_ID ?? "",
|
|
137
|
+
* content: "Deployment finished",
|
|
138
|
+
* });
|
|
139
|
+
* ```
|
|
140
|
+
* @mermaid
|
|
141
|
+
* sequenceDiagram
|
|
142
|
+
* autonumber
|
|
143
|
+
* participant Caller
|
|
144
|
+
* participant Service as DiscordService
|
|
145
|
+
* participant Discord as Discord Bot API
|
|
146
|
+
* Caller->>Service: sendMessage(input)
|
|
147
|
+
* activate Service
|
|
148
|
+
* Service->>Service: requireBotToken()
|
|
149
|
+
* Service->>Discord: POST /channels/{id}/messages
|
|
150
|
+
* activate Discord
|
|
151
|
+
* Discord-->>Service: message payload
|
|
152
|
+
* deactivate Discord
|
|
153
|
+
* Service-->>Caller: message payload
|
|
154
|
+
* deactivate Service
|
|
155
|
+
* @memberOf module:integrations/comms/discord/service
|
|
156
|
+
*/
|
|
157
|
+
export declare class DiscordService extends HttpApiService<DiscordServiceConfig> {
|
|
158
|
+
/**
|
|
159
|
+
* @description The provider name used in error messages
|
|
160
|
+
*/
|
|
161
|
+
protected readonly serviceName = "Discord";
|
|
162
|
+
/**
|
|
163
|
+
* @description The Discord Bot API base URL
|
|
164
|
+
* @summary Used when the resolved config carries no `baseUrl`.
|
|
165
|
+
* @returns {string} `"https://discord.com/api/v10"`.
|
|
166
|
+
*/
|
|
167
|
+
protected defaultBaseUrl(): string;
|
|
168
|
+
/**
|
|
169
|
+
* @description Builds the Discord bot authorization header
|
|
170
|
+
* @summary Returns `Authorization: Bot <token>` when the config carries a
|
|
171
|
+
* token, and no headers otherwise.
|
|
172
|
+
* @param {DiscordServiceConfig} config - The resolved service configuration.
|
|
173
|
+
* @returns {Record<string, string>} The authorization headers (empty without a token).
|
|
174
|
+
*/
|
|
175
|
+
protected authHeaders(config: DiscordServiceConfig): Record<string, string>;
|
|
176
|
+
/**
|
|
177
|
+
* @description Reads the Discord credentials and defaults from the environment
|
|
178
|
+
* @summary Reads the `comms.discord` environment slice and returns a partial
|
|
179
|
+
* config when a bot token is configured, `undefined` otherwise. Values pass
|
|
180
|
+
* through `envString`/`envNumber` to reject unset-leaf proxies.
|
|
181
|
+
* @returns {Partial<DiscordServiceConfig> | undefined} A partial config, or `undefined` when no Discord token is configured.
|
|
182
|
+
*/
|
|
183
|
+
protected configFromEnvironment(): Partial<DiscordServiceConfig> | undefined;
|
|
184
|
+
/**
|
|
185
|
+
* @description Asserts that a Discord bot token is configured
|
|
186
|
+
* @summary Called by every operation before it touches the network.
|
|
187
|
+
* @returns {void}
|
|
188
|
+
* @throws {InternalError} When the resolved config has no `token`.
|
|
189
|
+
*/
|
|
190
|
+
protected requireBotToken(): void;
|
|
191
|
+
/**
|
|
192
|
+
* @description Builds the encoded path for a channel resource
|
|
193
|
+
* @summary Validates the channel ID and URL-encodes it into `/channels/<id>`.
|
|
194
|
+
* @param {string} channelId - The Discord channel ID.
|
|
195
|
+
* @returns {string} The channel API path.
|
|
196
|
+
* @throws {InternalError} When `channelId` is empty.
|
|
197
|
+
*/
|
|
198
|
+
private channelPath;
|
|
199
|
+
/**
|
|
200
|
+
* @description Sends a message to a Discord channel
|
|
201
|
+
* @summary `POST`s the content (and optional `tts`/`embeds`) to the channel
|
|
202
|
+
* messages endpoint and returns Discord's message payload.
|
|
203
|
+
* @param {DiscordMessageInput} input - The destination channel and message content.
|
|
204
|
+
* @returns {Promise<unknown>} The created message payload.
|
|
205
|
+
* @throws {InternalError} When no bot token is configured.
|
|
206
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* await discord.sendMessage({ channelId: "1234567890", content: "Hello" });
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
sendMessage(input: DiscordMessageInput): Promise<unknown>;
|
|
213
|
+
/**
|
|
214
|
+
* @description Fetches a single Discord message
|
|
215
|
+
* @summary `GET`s the message by channel and message ID and returns the
|
|
216
|
+
* message payload.
|
|
217
|
+
* @param {string} channelId - The channel containing the message.
|
|
218
|
+
* @param {string} messageId - The message ID to fetch.
|
|
219
|
+
* @returns {Promise<unknown>} The message payload.
|
|
220
|
+
* @throws {InternalError} When no bot token is configured or the message ID is empty.
|
|
221
|
+
* @throws {NotFoundError} When the message does not exist (HTTP 404).
|
|
222
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
223
|
+
*/
|
|
224
|
+
getMessage(channelId: string, messageId: string): Promise<unknown>;
|
|
225
|
+
/**
|
|
226
|
+
* @description Lists messages in a Discord channel
|
|
227
|
+
* @summary `GET`s the channel messages with the optional `limit` and
|
|
228
|
+
* `before` cursor and returns Discord's message page.
|
|
229
|
+
* @param {DiscordMessageListInput} input - The channel and paging options.
|
|
230
|
+
* @returns {Promise<unknown>} The message page payload.
|
|
231
|
+
* @throws {InternalError} When no bot token is configured.
|
|
232
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
233
|
+
*/
|
|
234
|
+
listMessages(input: DiscordMessageListInput): Promise<unknown>;
|
|
235
|
+
/**
|
|
236
|
+
* @description Fetches a Discord channel
|
|
237
|
+
* @summary `GET`s the channel by ID and returns its payload.
|
|
238
|
+
* @param {string} channelId - The channel ID to fetch.
|
|
239
|
+
* @returns {Promise<unknown>} The channel payload.
|
|
240
|
+
* @throws {InternalError} When no bot token is configured or the channel ID is empty.
|
|
241
|
+
* @throws {NotFoundError} When the channel does not exist (HTTP 404).
|
|
242
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
243
|
+
*/
|
|
244
|
+
getChannel(channelId: string): Promise<unknown>;
|
|
245
|
+
/**
|
|
246
|
+
* @description Lists every channel in a Discord guild
|
|
247
|
+
* @summary `GET`s `/guilds/<id>/channels` and returns the channel list.
|
|
248
|
+
* @param {string} guildId - The guild whose channels are listed.
|
|
249
|
+
* @returns {Promise<unknown>} The guild channel list payload.
|
|
250
|
+
* @throws {InternalError} When no bot token is configured or the guild ID is empty.
|
|
251
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
252
|
+
*/
|
|
253
|
+
listChannels(guildId: string): Promise<unknown>;
|
|
254
|
+
/**
|
|
255
|
+
* @description Creates a channel in a Discord guild
|
|
256
|
+
* @summary `POST`s the channel `name`, numeric `type` (default text), and
|
|
257
|
+
* optional `topic`/`parentId` to the guild channels endpoint.
|
|
258
|
+
* @param {DiscordChannelInput} input - The guild and new channel definition.
|
|
259
|
+
* @returns {Promise<unknown>} The created channel payload.
|
|
260
|
+
* @throws {InternalError} When no bot token is configured.
|
|
261
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
262
|
+
*/
|
|
263
|
+
createChannel(input: DiscordChannelInput): Promise<unknown>;
|
|
264
|
+
/**
|
|
265
|
+
* @description Deletes a Discord channel
|
|
266
|
+
* @summary `DELETE`s the channel and returns the response payload, falling
|
|
267
|
+
* back to `{ deleted: true, channelId }` when Discord returns no body.
|
|
268
|
+
* @param {string} channelId - The channel ID to delete.
|
|
269
|
+
* @returns {Promise<unknown>} The deletion payload.
|
|
270
|
+
* @throws {InternalError} When no bot token is configured or the channel ID is empty.
|
|
271
|
+
* @throws {NotFoundError} When the channel does not exist (HTTP 404).
|
|
272
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
273
|
+
*/
|
|
274
|
+
deleteChannel(channelId: string): Promise<unknown>;
|
|
275
|
+
/**
|
|
276
|
+
* @description Adds a reaction to a Discord message as the bot
|
|
277
|
+
* @summary `PUT`s the emoji to the message's `@me` reaction endpoint and
|
|
278
|
+
* echoes the channel and message IDs on success.
|
|
279
|
+
* @param {DiscordReactionInput} input - The channel, message, and emoji.
|
|
280
|
+
* @returns {Promise<unknown>} `{ channelId, messageId }` on success.
|
|
281
|
+
* @throws {InternalError} When no bot token is configured, or the message ID or emoji is empty.
|
|
282
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
283
|
+
*/
|
|
284
|
+
addReaction(input: DiscordReactionInput): Promise<unknown>;
|
|
285
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { HttpApiService, type HttpApiServiceConfig } from "../../shared/http/index.d.mts";
|
|
2
|
+
/**
|
|
3
|
+
* @description Configuration for the Discord service
|
|
4
|
+
* @summary Extends {@link HttpApiServiceConfig} with the Discord bot token
|
|
5
|
+
* sent as `Authorization: Bot <token>`. When omitted, the `comms.discord`
|
|
6
|
+
* environment slice supplies `token` (plus optional `baseUrl`/`timeout`).
|
|
7
|
+
* The token is a credential reference read from configuration, never a value
|
|
8
|
+
* to hard-code in source.
|
|
9
|
+
* @category Comms
|
|
10
|
+
* @memberOf module:integrations/comms/discord/service
|
|
11
|
+
*/
|
|
12
|
+
export interface DiscordServiceConfig extends HttpApiServiceConfig {
|
|
13
|
+
/**
|
|
14
|
+
* @description Discord bot token
|
|
15
|
+
* @summary Sent as `Authorization: Bot <token>` with every API call.
|
|
16
|
+
*/
|
|
17
|
+
token?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @description Input for sending a Discord channel message
|
|
21
|
+
* @summary Carries the destination `channelId`, the message `content`, the
|
|
22
|
+
* optional text-to-speech flag, and optional rich `embeds`.
|
|
23
|
+
* @category Comms
|
|
24
|
+
* @memberOf module:integrations/comms/discord/service
|
|
25
|
+
*/
|
|
26
|
+
export interface DiscordMessageInput {
|
|
27
|
+
/**
|
|
28
|
+
* @description ID of the channel that receives the message
|
|
29
|
+
*/
|
|
30
|
+
channelId: string;
|
|
31
|
+
/**
|
|
32
|
+
* @description Plain-text message body
|
|
33
|
+
*/
|
|
34
|
+
content: string;
|
|
35
|
+
/**
|
|
36
|
+
* @description Whether Discord reads the message with text-to-speech
|
|
37
|
+
*/
|
|
38
|
+
tts?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* @description Rich embed payloads attached to the message
|
|
41
|
+
*/
|
|
42
|
+
embeds?: unknown[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @description Input for listing a Discord channel's messages
|
|
46
|
+
* @summary Carries the `channelId` plus optional page size and a `before`
|
|
47
|
+
* message ID cursor for fetching older messages.
|
|
48
|
+
* @category Comms
|
|
49
|
+
* @memberOf module:integrations/comms/discord/service
|
|
50
|
+
*/
|
|
51
|
+
export interface DiscordMessageListInput {
|
|
52
|
+
/**
|
|
53
|
+
* @description ID of the channel to list messages from
|
|
54
|
+
*/
|
|
55
|
+
channelId: string;
|
|
56
|
+
/**
|
|
57
|
+
* @description Maximum number of messages to return
|
|
58
|
+
*/
|
|
59
|
+
limit?: number;
|
|
60
|
+
/**
|
|
61
|
+
* @description Message ID cursor; only older messages are returned
|
|
62
|
+
*/
|
|
63
|
+
before?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @description Input for creating a Discord guild channel
|
|
67
|
+
* @summary Carries the target `guildId`, the new channel `name`, and the
|
|
68
|
+
* optional channel `type` (Discord numeric type, default `0` for text),
|
|
69
|
+
* `topic`, and `parentId` (category).
|
|
70
|
+
* @category Comms
|
|
71
|
+
* @memberOf module:integrations/comms/discord/service
|
|
72
|
+
*/
|
|
73
|
+
export interface DiscordChannelInput {
|
|
74
|
+
/**
|
|
75
|
+
* @description ID of the guild that owns the new channel
|
|
76
|
+
*/
|
|
77
|
+
guildId: string;
|
|
78
|
+
/**
|
|
79
|
+
* @description Name of the new channel
|
|
80
|
+
*/
|
|
81
|
+
name: string;
|
|
82
|
+
/**
|
|
83
|
+
* @description Discord numeric channel type (default `0`, text channel)
|
|
84
|
+
*/
|
|
85
|
+
type?: number;
|
|
86
|
+
/**
|
|
87
|
+
* @description Optional channel topic
|
|
88
|
+
*/
|
|
89
|
+
topic?: string;
|
|
90
|
+
/**
|
|
91
|
+
* @description Optional parent category ID
|
|
92
|
+
*/
|
|
93
|
+
parentId?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @description Input for adding a reaction to a Discord message
|
|
97
|
+
* @summary Identifies the `channelId`, the target `messageId`, and the
|
|
98
|
+
* `emoji` to add as the bot user.
|
|
99
|
+
* @category Comms
|
|
100
|
+
* @memberOf module:integrations/comms/discord/service
|
|
101
|
+
*/
|
|
102
|
+
export interface DiscordReactionInput {
|
|
103
|
+
/**
|
|
104
|
+
* @description ID of the channel containing the message
|
|
105
|
+
*/
|
|
106
|
+
channelId: string;
|
|
107
|
+
/**
|
|
108
|
+
* @description ID of the message to react to
|
|
109
|
+
*/
|
|
110
|
+
messageId: string;
|
|
111
|
+
/**
|
|
112
|
+
* @description Emoji to add (Unicode character or `name:id` custom emoji)
|
|
113
|
+
*/
|
|
114
|
+
emoji: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @description Discord Bot API integration service
|
|
118
|
+
* @summary An undecorated HTTP service for channel messages
|
|
119
|
+
* (`sendMessage`, `getMessage`, `listMessages`), channels (`getChannel`,
|
|
120
|
+
* `listChannels`, `createChannel`, `deleteChannel`), and reactions
|
|
121
|
+
* (`addReaction`). Every operation requires a bot token and throws
|
|
122
|
+
* `InternalError` when it is missing or a required identifier is empty;
|
|
123
|
+
* transport failures are mapped to decaf errors via {@link httpError}. This is
|
|
124
|
+
* the callable comms surface (`core.comms.discord`), not the mastra agent
|
|
125
|
+
* trigger/response kinds.
|
|
126
|
+
* @class DiscordService
|
|
127
|
+
* @extends HttpApiService
|
|
128
|
+
* @category Comms
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* import { DiscordService } from "@decaf-ts/integrations/comms/discord";
|
|
132
|
+
*
|
|
133
|
+
* const discord = new DiscordService();
|
|
134
|
+
* await discord.initialize({ token: process.env.GRAPH_CREDENTIAL_DISCORD_TOKEN });
|
|
135
|
+
* await discord.sendMessage({
|
|
136
|
+
* channelId: process.env.DISCORD_CHANNEL_ID ?? "",
|
|
137
|
+
* content: "Deployment finished",
|
|
138
|
+
* });
|
|
139
|
+
* ```
|
|
140
|
+
* @mermaid
|
|
141
|
+
* sequenceDiagram
|
|
142
|
+
* autonumber
|
|
143
|
+
* participant Caller
|
|
144
|
+
* participant Service as DiscordService
|
|
145
|
+
* participant Discord as Discord Bot API
|
|
146
|
+
* Caller->>Service: sendMessage(input)
|
|
147
|
+
* activate Service
|
|
148
|
+
* Service->>Service: requireBotToken()
|
|
149
|
+
* Service->>Discord: POST /channels/{id}/messages
|
|
150
|
+
* activate Discord
|
|
151
|
+
* Discord-->>Service: message payload
|
|
152
|
+
* deactivate Discord
|
|
153
|
+
* Service-->>Caller: message payload
|
|
154
|
+
* deactivate Service
|
|
155
|
+
* @memberOf module:integrations/comms/discord/service
|
|
156
|
+
*/
|
|
157
|
+
export declare class DiscordService extends HttpApiService<DiscordServiceConfig> {
|
|
158
|
+
/**
|
|
159
|
+
* @description The provider name used in error messages
|
|
160
|
+
*/
|
|
161
|
+
protected readonly serviceName = "Discord";
|
|
162
|
+
/**
|
|
163
|
+
* @description The Discord Bot API base URL
|
|
164
|
+
* @summary Used when the resolved config carries no `baseUrl`.
|
|
165
|
+
* @returns {string} `"https://discord.com/api/v10"`.
|
|
166
|
+
*/
|
|
167
|
+
protected defaultBaseUrl(): string;
|
|
168
|
+
/**
|
|
169
|
+
* @description Builds the Discord bot authorization header
|
|
170
|
+
* @summary Returns `Authorization: Bot <token>` when the config carries a
|
|
171
|
+
* token, and no headers otherwise.
|
|
172
|
+
* @param {DiscordServiceConfig} config - The resolved service configuration.
|
|
173
|
+
* @returns {Record<string, string>} The authorization headers (empty without a token).
|
|
174
|
+
*/
|
|
175
|
+
protected authHeaders(config: DiscordServiceConfig): Record<string, string>;
|
|
176
|
+
/**
|
|
177
|
+
* @description Reads the Discord credentials and defaults from the environment
|
|
178
|
+
* @summary Reads the `comms.discord` environment slice and returns a partial
|
|
179
|
+
* config when a bot token is configured, `undefined` otherwise. Values pass
|
|
180
|
+
* through `envString`/`envNumber` to reject unset-leaf proxies.
|
|
181
|
+
* @returns {Partial<DiscordServiceConfig> | undefined} A partial config, or `undefined` when no Discord token is configured.
|
|
182
|
+
*/
|
|
183
|
+
protected configFromEnvironment(): Partial<DiscordServiceConfig> | undefined;
|
|
184
|
+
/**
|
|
185
|
+
* @description Asserts that a Discord bot token is configured
|
|
186
|
+
* @summary Called by every operation before it touches the network.
|
|
187
|
+
* @returns {void}
|
|
188
|
+
* @throws {InternalError} When the resolved config has no `token`.
|
|
189
|
+
*/
|
|
190
|
+
protected requireBotToken(): void;
|
|
191
|
+
/**
|
|
192
|
+
* @description Builds the encoded path for a channel resource
|
|
193
|
+
* @summary Validates the channel ID and URL-encodes it into `/channels/<id>`.
|
|
194
|
+
* @param {string} channelId - The Discord channel ID.
|
|
195
|
+
* @returns {string} The channel API path.
|
|
196
|
+
* @throws {InternalError} When `channelId` is empty.
|
|
197
|
+
*/
|
|
198
|
+
private channelPath;
|
|
199
|
+
/**
|
|
200
|
+
* @description Sends a message to a Discord channel
|
|
201
|
+
* @summary `POST`s the content (and optional `tts`/`embeds`) to the channel
|
|
202
|
+
* messages endpoint and returns Discord's message payload.
|
|
203
|
+
* @param {DiscordMessageInput} input - The destination channel and message content.
|
|
204
|
+
* @returns {Promise<unknown>} The created message payload.
|
|
205
|
+
* @throws {InternalError} When no bot token is configured.
|
|
206
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* await discord.sendMessage({ channelId: "1234567890", content: "Hello" });
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
sendMessage(input: DiscordMessageInput): Promise<unknown>;
|
|
213
|
+
/**
|
|
214
|
+
* @description Fetches a single Discord message
|
|
215
|
+
* @summary `GET`s the message by channel and message ID and returns the
|
|
216
|
+
* message payload.
|
|
217
|
+
* @param {string} channelId - The channel containing the message.
|
|
218
|
+
* @param {string} messageId - The message ID to fetch.
|
|
219
|
+
* @returns {Promise<unknown>} The message payload.
|
|
220
|
+
* @throws {InternalError} When no bot token is configured or the message ID is empty.
|
|
221
|
+
* @throws {NotFoundError} When the message does not exist (HTTP 404).
|
|
222
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
223
|
+
*/
|
|
224
|
+
getMessage(channelId: string, messageId: string): Promise<unknown>;
|
|
225
|
+
/**
|
|
226
|
+
* @description Lists messages in a Discord channel
|
|
227
|
+
* @summary `GET`s the channel messages with the optional `limit` and
|
|
228
|
+
* `before` cursor and returns Discord's message page.
|
|
229
|
+
* @param {DiscordMessageListInput} input - The channel and paging options.
|
|
230
|
+
* @returns {Promise<unknown>} The message page payload.
|
|
231
|
+
* @throws {InternalError} When no bot token is configured.
|
|
232
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
233
|
+
*/
|
|
234
|
+
listMessages(input: DiscordMessageListInput): Promise<unknown>;
|
|
235
|
+
/**
|
|
236
|
+
* @description Fetches a Discord channel
|
|
237
|
+
* @summary `GET`s the channel by ID and returns its payload.
|
|
238
|
+
* @param {string} channelId - The channel ID to fetch.
|
|
239
|
+
* @returns {Promise<unknown>} The channel payload.
|
|
240
|
+
* @throws {InternalError} When no bot token is configured or the channel ID is empty.
|
|
241
|
+
* @throws {NotFoundError} When the channel does not exist (HTTP 404).
|
|
242
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
243
|
+
*/
|
|
244
|
+
getChannel(channelId: string): Promise<unknown>;
|
|
245
|
+
/**
|
|
246
|
+
* @description Lists every channel in a Discord guild
|
|
247
|
+
* @summary `GET`s `/guilds/<id>/channels` and returns the channel list.
|
|
248
|
+
* @param {string} guildId - The guild whose channels are listed.
|
|
249
|
+
* @returns {Promise<unknown>} The guild channel list payload.
|
|
250
|
+
* @throws {InternalError} When no bot token is configured or the guild ID is empty.
|
|
251
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
252
|
+
*/
|
|
253
|
+
listChannels(guildId: string): Promise<unknown>;
|
|
254
|
+
/**
|
|
255
|
+
* @description Creates a channel in a Discord guild
|
|
256
|
+
* @summary `POST`s the channel `name`, numeric `type` (default text), and
|
|
257
|
+
* optional `topic`/`parentId` to the guild channels endpoint.
|
|
258
|
+
* @param {DiscordChannelInput} input - The guild and new channel definition.
|
|
259
|
+
* @returns {Promise<unknown>} The created channel payload.
|
|
260
|
+
* @throws {InternalError} When no bot token is configured.
|
|
261
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
262
|
+
*/
|
|
263
|
+
createChannel(input: DiscordChannelInput): Promise<unknown>;
|
|
264
|
+
/**
|
|
265
|
+
* @description Deletes a Discord channel
|
|
266
|
+
* @summary `DELETE`s the channel and returns the response payload, falling
|
|
267
|
+
* back to `{ deleted: true, channelId }` when Discord returns no body.
|
|
268
|
+
* @param {string} channelId - The channel ID to delete.
|
|
269
|
+
* @returns {Promise<unknown>} The deletion payload.
|
|
270
|
+
* @throws {InternalError} When no bot token is configured or the channel ID is empty.
|
|
271
|
+
* @throws {NotFoundError} When the channel does not exist (HTTP 404).
|
|
272
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
273
|
+
*/
|
|
274
|
+
deleteChannel(channelId: string): Promise<unknown>;
|
|
275
|
+
/**
|
|
276
|
+
* @description Adds a reaction to a Discord message as the bot
|
|
277
|
+
* @summary `PUT`s the emoji to the message's `@me` reaction endpoint and
|
|
278
|
+
* echoes the channel and message IDs on success.
|
|
279
|
+
* @param {DiscordReactionInput} input - The channel, message, and emoji.
|
|
280
|
+
* @returns {Promise<unknown>} `{ channelId, messageId }` on success.
|
|
281
|
+
* @throws {InternalError} When no bot token is configured, or the message ID or emoji is empty.
|
|
282
|
+
* @throws {BadRequestError} When Discord rejects the request.
|
|
283
|
+
*/
|
|
284
|
+
addReaction(input: DiscordReactionInput): Promise<unknown>;
|
|
285
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./DiscordService.d.cts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./DiscordService.d.mts";
|
|
@@ -2,20 +2,27 @@
|
|
|
2
2
|
* @module integrations/comms/environment
|
|
3
3
|
* @summary Environment contract and accumulated environment for the comms integration services.
|
|
4
4
|
* @description Declares the `CommsEnvironmentShape` consumed by the Slack,
|
|
5
|
-
* Telegram, Teams,
|
|
6
|
-
* `
|
|
7
|
-
*
|
|
8
|
-
* `comms.<provider>` slice, using
|
|
9
|
-
* `shared/environmentValue` to reject
|
|
5
|
+
* Telegram, Teams, Gmail, Discord, WhatsApp, and Outlook services'
|
|
6
|
+
* `configFromEnvironment()` implementations and the `CommsEnvironment`
|
|
7
|
+
* singleton created via `LoggedEnvironment.accumulate`. Services read their
|
|
8
|
+
* credentials and defaults from the matching `comms.<provider>` slice, using
|
|
9
|
+
* the `envString`/`envNumber` helpers from `shared/environmentValue` to reject
|
|
10
|
+
* unset-leaf proxies. The matching public subpath exports are
|
|
11
|
+
* `@decaf-ts/integrations/comms/discord`,
|
|
12
|
+
* `@decaf-ts/integrations/comms/whatsapp`, and
|
|
13
|
+
* `@decaf-ts/integrations/comms/outlook`.
|
|
10
14
|
*/
|
|
11
15
|
/**
|
|
12
16
|
* @description Environment shape for the comms integration services
|
|
13
17
|
* @summary Defines the `comms` root with one slice per provider (`slack`,
|
|
14
|
-
* `telegram`, `teams`, `email`, `gmail`).
|
|
15
|
-
* required credentials (e.g. `token`,
|
|
16
|
-
*
|
|
18
|
+
* `telegram`, `teams`, `email`, `gmail`, `discord`, `whatsApp`, `outlook`).
|
|
19
|
+
* Each slice carries the provider's required credentials (e.g. `token`,
|
|
20
|
+
* `webhookUrl`, `phoneNumberId`) plus optional `baseUrl` override and
|
|
21
|
+
* `timeout`. Fields are typed as required here so
|
|
17
22
|
* `LoggedEnvironment.accumulate` registers them; absent values resolve to
|
|
18
23
|
* proxy placeholders at runtime and must pass through `envString`/`envNumber`.
|
|
24
|
+
* Values are credential references supplied by the environment, never literals
|
|
25
|
+
* embedded in source.
|
|
19
26
|
* @memberOf module:integrations/comms/environment
|
|
20
27
|
*/
|
|
21
28
|
export interface CommsEnvironmentShape {
|
|
@@ -56,6 +63,25 @@ export interface CommsEnvironmentShape {
|
|
|
56
63
|
baseUrl: string;
|
|
57
64
|
timeout?: number;
|
|
58
65
|
};
|
|
66
|
+
/** Discord bot token and optional API overrides (`comms/discord`). */
|
|
67
|
+
discord: {
|
|
68
|
+
token: string;
|
|
69
|
+
baseUrl: string;
|
|
70
|
+
timeout?: number;
|
|
71
|
+
};
|
|
72
|
+
/** WhatsApp Cloud API token and sender phone number ID (`comms/whatsapp`). */
|
|
73
|
+
whatsApp: {
|
|
74
|
+
token: string;
|
|
75
|
+
phoneNumberId: string;
|
|
76
|
+
baseUrl: string;
|
|
77
|
+
timeout?: number;
|
|
78
|
+
};
|
|
79
|
+
/** Microsoft Graph access token for Outlook mail/calendar (`comms/outlook`). */
|
|
80
|
+
outlook: {
|
|
81
|
+
token: string;
|
|
82
|
+
baseUrl: string;
|
|
83
|
+
timeout?: number;
|
|
84
|
+
};
|
|
59
85
|
};
|
|
60
86
|
}
|
|
61
87
|
/**
|