@cogitator-ai/channels 0.16.0 → 0.18.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/README.md +78 -14
- package/dist/approvals.d.ts +3 -0
- package/dist/approvals.d.ts.map +1 -1
- package/dist/approvals.js +1 -0
- package/dist/approvals.js.map +1 -1
- package/dist/assistant-config.d.ts +60 -0
- package/dist/assistant-config.d.ts.map +1 -1
- package/dist/assistant-config.js +102 -0
- package/dist/assistant-config.js.map +1 -1
- package/dist/channels/email/address.d.ts +44 -0
- package/dist/channels/email/address.d.ts.map +1 -0
- package/dist/channels/email/address.js +211 -0
- package/dist/channels/email/address.js.map +1 -0
- package/dist/channels/email/auth.d.ts +59 -0
- package/dist/channels/email/auth.d.ts.map +1 -0
- package/dist/channels/email/auth.js +212 -0
- package/dist/channels/email/auth.js.map +1 -0
- package/dist/channels/email/channel.d.ts +256 -0
- package/dist/channels/email/channel.d.ts.map +1 -0
- package/dist/channels/email/channel.js +701 -0
- package/dist/channels/email/channel.js.map +1 -0
- package/dist/channels/email/errors.d.ts +11 -0
- package/dist/channels/email/errors.d.ts.map +1 -0
- package/dist/channels/email/errors.js +13 -0
- package/dist/channels/email/errors.js.map +1 -0
- package/dist/channels/email/imap.d.ts +125 -0
- package/dist/channels/email/imap.d.ts.map +1 -0
- package/dist/channels/email/imap.js +309 -0
- package/dist/channels/email/imap.js.map +1 -0
- package/dist/channels/email/index.d.ts +7 -0
- package/dist/channels/email/index.d.ts.map +1 -0
- package/dist/channels/email/index.js +3 -0
- package/dist/channels/email/index.js.map +1 -0
- package/dist/channels/email/mime.d.ts +71 -0
- package/dist/channels/email/mime.d.ts.map +1 -0
- package/dist/channels/email/mime.js +83 -0
- package/dist/channels/email/mime.js.map +1 -0
- package/dist/channels/email/multipart.d.ts +28 -0
- package/dist/channels/email/multipart.d.ts.map +1 -0
- package/dist/channels/email/multipart.js +102 -0
- package/dist/channels/email/multipart.js.map +1 -0
- package/dist/channels/email/providers.d.ts +49 -0
- package/dist/channels/email/providers.d.ts.map +1 -0
- package/dist/channels/email/providers.js +292 -0
- package/dist/channels/email/providers.js.map +1 -0
- package/dist/channels/email/reply.d.ts +9 -0
- package/dist/channels/email/reply.d.ts.map +1 -0
- package/dist/channels/email/reply.js +122 -0
- package/dist/channels/email/reply.js.map +1 -0
- package/dist/channels/teams/activity.d.ts +108 -0
- package/dist/channels/teams/activity.d.ts.map +1 -0
- package/dist/channels/teams/activity.js +206 -0
- package/dist/channels/teams/activity.js.map +1 -0
- package/dist/channels/teams/auth.d.ts +65 -0
- package/dist/channels/teams/auth.d.ts.map +1 -0
- package/dist/channels/teams/auth.js +213 -0
- package/dist/channels/teams/auth.js.map +1 -0
- package/dist/channels/teams/cards.d.ts +23 -0
- package/dist/channels/teams/cards.d.ts.map +1 -0
- package/dist/channels/teams/cards.js +97 -0
- package/dist/channels/teams/cards.js.map +1 -0
- package/dist/channels/teams/channel.d.ts +303 -0
- package/dist/channels/teams/channel.d.ts.map +1 -0
- package/dist/channels/teams/channel.js +1071 -0
- package/dist/channels/teams/channel.js.map +1 -0
- package/dist/channels/teams/client.d.ts +72 -0
- package/dist/channels/teams/client.d.ts.map +1 -0
- package/dist/channels/teams/client.js +161 -0
- package/dist/channels/teams/client.js.map +1 -0
- package/dist/channels/teams/index.d.ts +7 -0
- package/dist/channels/teams/index.d.ts.map +1 -0
- package/dist/channels/teams/index.js +6 -0
- package/dist/channels/teams/index.js.map +1 -0
- package/dist/channels/teams/pacer.d.ts +47 -0
- package/dist/channels/teams/pacer.d.ts.map +1 -0
- package/dist/channels/teams/pacer.js +174 -0
- package/dist/channels/teams/pacer.js.map +1 -0
- package/dist/channels/teams/token.d.ts +47 -0
- package/dist/channels/teams/token.d.ts.map +1 -0
- package/dist/channels/teams/token.js +107 -0
- package/dist/channels/teams/token.js.map +1 -0
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +3 -0
- package/dist/channels/telegram.js.map +1 -1
- package/dist/formatters/html.d.ts +16 -0
- package/dist/formatters/html.d.ts.map +1 -0
- package/dist/formatters/html.js +535 -0
- package/dist/formatters/html.js.map +1 -0
- package/dist/formatters/markdown-images.d.ts +8 -0
- package/dist/formatters/markdown-images.d.ts.map +1 -0
- package/dist/formatters/markdown-images.js +181 -0
- package/dist/formatters/markdown-images.js.map +1 -0
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +22 -3
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/gateway.d.ts +23 -1
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +113 -16
- package/dist/gateway.js.map +1 -1
- package/dist/inbound-debounce.d.ts +4 -1
- package/dist/inbound-debounce.d.ts.map +1 -1
- package/dist/inbound-debounce.js +4 -2
- package/dist/inbound-debounce.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/runtime-builder.d.ts +9 -0
- package/dist/runtime-builder.d.ts.map +1 -1
- package/dist/runtime-builder.js +145 -1
- package/dist/runtime-builder.js.map +1 -1
- package/package.json +25 -8
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { type RequestListener } from 'node:http';
|
|
2
|
+
import type { Attachment, Channel, ChannelMessage, SendOptions } from '@cogitator-ai/types';
|
|
3
|
+
import { type EmailImapConfig } from './imap.js';
|
|
4
|
+
import { type InboundEmail } from './mime.js';
|
|
5
|
+
import { type EmailWebhookRequest, type EmailWebhookResponse } from './providers.js';
|
|
6
|
+
/** The header the channel puts on every mail it sends, and skips mail that carries it. */
|
|
7
|
+
export declare const EMAIL_LOOP_HEADER = "X-Cogitator";
|
|
8
|
+
/** The largest webhook body the channel's own server takes by default, in bytes. */
|
|
9
|
+
export declare const EMAIL_DEFAULT_MAX_BODY: number;
|
|
10
|
+
/** The largest attachment handed to the agent by default, in bytes. */
|
|
11
|
+
export declare const EMAIL_DEFAULT_MAX_ATTACHMENT: number;
|
|
12
|
+
/** How old a Mailgun signature may be by default, in seconds. */
|
|
13
|
+
export declare const MAILGUN_DEFAULT_MAX_AGE = 300;
|
|
14
|
+
/** Credentials for HTTP basic authentication of a webhook. */
|
|
15
|
+
export interface EmailBasicAuth {
|
|
16
|
+
username: string;
|
|
17
|
+
password: string;
|
|
18
|
+
}
|
|
19
|
+
/** Mailgun signs each request of a route with the webhook signing key. */
|
|
20
|
+
export interface MailgunWebhookConfig {
|
|
21
|
+
provider: 'mailgun';
|
|
22
|
+
/** The HTTP webhook signing key of the Mailgun account (Settings, Webhooks) */
|
|
23
|
+
signingKey: string;
|
|
24
|
+
/** How old a signature may be, in seconds (default 300). Older requests are refused as replays */
|
|
25
|
+
maxAge?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Postmark and SendGrid do not sign inbound mail, so the webhook URL carries a secret: basic
|
|
29
|
+
* authentication (`https://user:password@host/path`) or a `token` query parameter (also taken
|
|
30
|
+
* from an `X-Webhook-Token` header). At least one is required.
|
|
31
|
+
*/
|
|
32
|
+
export interface SecretWebhookConfig {
|
|
33
|
+
provider: 'postmark' | 'sendgrid';
|
|
34
|
+
basicAuth?: EmailBasicAuth;
|
|
35
|
+
token?: string;
|
|
36
|
+
}
|
|
37
|
+
export type EmailWebhookConfig = (MailgunWebhookConfig | SecretWebhookConfig) & {
|
|
38
|
+
/**
|
|
39
|
+
* Run an HTTP server of the channel's own on this port. Without it, mount `handleWebhook` or
|
|
40
|
+
* `webhookListener()` in a server of yours.
|
|
41
|
+
*/
|
|
42
|
+
port?: number;
|
|
43
|
+
/** The path of the channel's own server (default `/email/webhook`) */
|
|
44
|
+
path?: string;
|
|
45
|
+
host?: string;
|
|
46
|
+
/** The largest body taken, in bytes (default 10 MB), larger ones get `413` */
|
|
47
|
+
maxBody?: number;
|
|
48
|
+
};
|
|
49
|
+
/** A mail as the channel hands it to the transport, in the shape nodemailer takes. */
|
|
50
|
+
export interface OutgoingEmail {
|
|
51
|
+
from: string | {
|
|
52
|
+
name: string;
|
|
53
|
+
address: string;
|
|
54
|
+
};
|
|
55
|
+
to: string;
|
|
56
|
+
subject: string;
|
|
57
|
+
text: string;
|
|
58
|
+
html?: string;
|
|
59
|
+
messageId: string;
|
|
60
|
+
inReplyTo?: string;
|
|
61
|
+
references?: string[];
|
|
62
|
+
headers: Record<string, string>;
|
|
63
|
+
attachments?: {
|
|
64
|
+
filename?: string;
|
|
65
|
+
content?: Buffer;
|
|
66
|
+
href?: string;
|
|
67
|
+
contentType?: string;
|
|
68
|
+
}[];
|
|
69
|
+
}
|
|
70
|
+
/** Anything that sends mail: a nodemailer transporter (SMTP, SES, ...) or one of your own. */
|
|
71
|
+
export interface EmailTransport {
|
|
72
|
+
sendMail(mail: OutgoingEmail): Promise<unknown>;
|
|
73
|
+
close?(): void;
|
|
74
|
+
}
|
|
75
|
+
/** An SMTP server the channel sends through with nodemailer. */
|
|
76
|
+
export interface EmailSmtpServer {
|
|
77
|
+
host: string;
|
|
78
|
+
/** Default 587, or 465 when `secure` */
|
|
79
|
+
port?: number;
|
|
80
|
+
/** TLS from the start, as on port 465 (default: true on port 465). Otherwise STARTTLS */
|
|
81
|
+
secure?: boolean;
|
|
82
|
+
auth?: {
|
|
83
|
+
user: string;
|
|
84
|
+
pass: string;
|
|
85
|
+
};
|
|
86
|
+
/** Further nodemailer SMTP options */
|
|
87
|
+
options?: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
export type EmailSmtpConfig = EmailSmtpServer | {
|
|
90
|
+
transport: EmailTransport;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* How mail is checked against the sender authentication results the receiving side reports
|
|
94
|
+
* (DKIM, SPF, DMARC): `when-reported` (default) drops mail whose results fail for the `From`
|
|
95
|
+
* domain and takes mail without results, `required` also drops mail without results, `off`
|
|
96
|
+
* does not look.
|
|
97
|
+
*/
|
|
98
|
+
export type EmailSenderAuthPolicy = 'required' | 'when-reported' | 'off';
|
|
99
|
+
export interface EmailChannelConfig {
|
|
100
|
+
/** The bot's address: mail is sent from it, and mail from it is never answered */
|
|
101
|
+
address: string;
|
|
102
|
+
/** The display name of the mail it sends */
|
|
103
|
+
name?: string;
|
|
104
|
+
/** Other addresses of the bot, also never answered */
|
|
105
|
+
aliases?: string[];
|
|
106
|
+
/** How mail is sent */
|
|
107
|
+
smtp: EmailSmtpConfig;
|
|
108
|
+
/** Read mail from a mailbox over IMAP */
|
|
109
|
+
imap?: EmailImapConfig;
|
|
110
|
+
/** Take mail from a provider's inbound webhook: Mailgun, Postmark or SendGrid */
|
|
111
|
+
webhook?: EmailWebhookConfig;
|
|
112
|
+
/**
|
|
113
|
+
* Who the bot answers: addresses (`ann@example.com`), domains (`example.com`), subdomain
|
|
114
|
+
* wildcards (`*.example.com`) or `*` for everyone. Default: nobody, which `start()` warns
|
|
115
|
+
* about, since anyone can send mail and the `From` address can be forged.
|
|
116
|
+
*/
|
|
117
|
+
allowFrom?: string[];
|
|
118
|
+
/**
|
|
119
|
+
* Addresses the gateway gives owner rights, also answered whatever `allowFrom` says. A `From`
|
|
120
|
+
* can be forged, so their mail reaches the agent only when the sender authentication passes
|
|
121
|
+
* for their domain, unless `senderAuth` is `off`.
|
|
122
|
+
*/
|
|
123
|
+
owners?: string[];
|
|
124
|
+
/** See {@link EmailSenderAuthPolicy}. Default `when-reported` */
|
|
125
|
+
senderAuth?: EmailSenderAuthPolicy;
|
|
126
|
+
/**
|
|
127
|
+
* The authserv-ids (the first word of `Authentication-Results`, such as `mx.google.com`) of
|
|
128
|
+
* the servers that receive the mail, whose results count over IMAP and Postmark. A sender can
|
|
129
|
+
* add any header, so without them IMAP mail has no sender authentication at all.
|
|
130
|
+
*/
|
|
131
|
+
trustedAuthservIds?: string[];
|
|
132
|
+
/** Start the text of a conversation's first mail with its subject (default true) */
|
|
133
|
+
includeSubject?: boolean;
|
|
134
|
+
/** The subject of mail that starts a conversation, such as a reminder (default `Message from <name>`) */
|
|
135
|
+
subject?: string;
|
|
136
|
+
/** The largest attachment handed to the agent, in bytes (default 10 MB), larger ones are skipped */
|
|
137
|
+
maxAttachmentBytes?: number;
|
|
138
|
+
}
|
|
139
|
+
/** `subject` as a reply's subject: with one `Re: `, whatever prefix it had. */
|
|
140
|
+
export declare function replySubject(subject: string): string;
|
|
141
|
+
/** Whether the mail is an automatic one: an auto-reply, a bounce, a list or bulk mailing. */
|
|
142
|
+
export declare function isAutomatedEmail(email: InboundEmail): boolean;
|
|
143
|
+
/**
|
|
144
|
+
* An email channel: an agent answers mail, in the thread of each mail. Mail comes from a mailbox
|
|
145
|
+
* over IMAP (`imapflow` and `postal-mime`), or from the inbound webhook of Mailgun, Postmark or
|
|
146
|
+
* SendGrid, and answers go out over SMTP (`nodemailer`) or any transport given, with
|
|
147
|
+
* `In-Reply-To` and `References` set, so mail clients keep them in the thread.
|
|
148
|
+
*
|
|
149
|
+
* A sender is a conversation partner: `channelId` and `userId` are the sender's address in lower
|
|
150
|
+
* case, and `topicId` is the thread's first `Message-ID`, so each email thread is a conversation
|
|
151
|
+
* of its own. Answers are Markdown, sent as HTML with a plain text alternative, and cannot be
|
|
152
|
+
* edited. Mail from the bot itself, mail that carries the `X-Cogitator` header the channel puts
|
|
153
|
+
* on what it sends, auto-replies, bounces and bulk mail are never answered.
|
|
154
|
+
*/
|
|
155
|
+
export declare class EmailChannel implements Channel {
|
|
156
|
+
readonly type = "email";
|
|
157
|
+
readonly editable = false;
|
|
158
|
+
readonly nativeMarkdown = true;
|
|
159
|
+
readonly maxMessageChars: number;
|
|
160
|
+
private readonly config;
|
|
161
|
+
private readonly address;
|
|
162
|
+
private readonly ownAddresses;
|
|
163
|
+
private readonly owners;
|
|
164
|
+
private handler;
|
|
165
|
+
/** Mail handed to the gateway whose handler has not resolved yet, by `Message-ID` */
|
|
166
|
+
private readonly inFlight;
|
|
167
|
+
/** Mail of `inFlight` the gateway handed back while it was being taken */
|
|
168
|
+
private readonly refused;
|
|
169
|
+
private readonly handled;
|
|
170
|
+
/** Mailgun signatures seen, with their timestamps, against replays */
|
|
171
|
+
private readonly signatures;
|
|
172
|
+
/** The IMAP UID of each mail taken from the mailbox, by `Message-ID`, to mark it unread again */
|
|
173
|
+
private readonly uids;
|
|
174
|
+
private readonly threads;
|
|
175
|
+
/** The latest mail of each thread, by `address|root` */
|
|
176
|
+
private readonly latest;
|
|
177
|
+
private transport?;
|
|
178
|
+
private inbox?;
|
|
179
|
+
private server?;
|
|
180
|
+
private running;
|
|
181
|
+
private stopped;
|
|
182
|
+
constructor(config: EmailChannelConfig);
|
|
183
|
+
onMessage(handler: (msg: ChannelMessage) => Promise<void>): void;
|
|
184
|
+
start(): Promise<void>;
|
|
185
|
+
stop(): Promise<void>;
|
|
186
|
+
/** Looks for unread mail over IMAP now, besides IDLE and the poll timer. */
|
|
187
|
+
poll(): Promise<void>;
|
|
188
|
+
/**
|
|
189
|
+
* Takes back a mail the gateway does not answer because it stops. One it refuses while it is
|
|
190
|
+
* being handed over stays unread in the mailbox, and its webhook request is answered `503`, so
|
|
191
|
+
* the provider sends it again. One it dropped after taking it is marked unread again, so the
|
|
192
|
+
* next start reads it once more, or, when a webhook brought it, only logged.
|
|
193
|
+
*/
|
|
194
|
+
redeliver(msg: ChannelMessage): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* Answers a provider's inbound webhook request: checks its signature or secret, reads the
|
|
197
|
+
* mail, answers at once and hands the mail to the agent after. Mount it in any HTTP server
|
|
198
|
+
* with the raw body unparsed. It works before `start()` too and answers `503` once stopped.
|
|
199
|
+
*/
|
|
200
|
+
handleWebhook(request: EmailWebhookRequest): Promise<EmailWebhookResponse>;
|
|
201
|
+
/**
|
|
202
|
+
* A Node request listener that answers webhook requests on any path it is mounted at. Bodies
|
|
203
|
+
* over `webhook.maxBody` (10 MB by default) are refused with `413`.
|
|
204
|
+
*/
|
|
205
|
+
webhookListener(): RequestListener;
|
|
206
|
+
/**
|
|
207
|
+
* Sends `text` to the address `channelId`. With a `replyTo` of a mail the channel saw, or the
|
|
208
|
+
* `topicId` of a thread, it answers in that thread (`Re:` subject, `In-Reply-To`,
|
|
209
|
+
* `References`), and otherwise it starts a new one. Resolves with the new mail's `Message-ID`.
|
|
210
|
+
*/
|
|
211
|
+
sendText(channelId: string, text: string, options?: SendOptions): Promise<string>;
|
|
212
|
+
editText(): Promise<void>;
|
|
213
|
+
/**
|
|
214
|
+
* Sends a file as an attachment, its caption as the text, in the thread as `sendText` does.
|
|
215
|
+
* A file needs a `buffer` or an `http(s)` url, which nodemailer downloads.
|
|
216
|
+
*/
|
|
217
|
+
sendFile(channelId: string, file: Attachment, options?: SendOptions): Promise<string>;
|
|
218
|
+
sendTyping(): Promise<void>;
|
|
219
|
+
private parseOptions;
|
|
220
|
+
private authorized;
|
|
221
|
+
/**
|
|
222
|
+
* Checks a Mailgun request's signature, age and token, and reads its mail. The signature is
|
|
223
|
+
* checked before the mail is read: a form is only split into its fields first, where the
|
|
224
|
+
* signature is.
|
|
225
|
+
*/
|
|
226
|
+
private mailgunEmail;
|
|
227
|
+
/**
|
|
228
|
+
* Remembers a signature for as long as its timestamp is within the replay window: older ones
|
|
229
|
+
* are refused as stale anyway. Past `MAX_SIGNATURES` the oldest are forgotten.
|
|
230
|
+
*/
|
|
231
|
+
private rememberSignature;
|
|
232
|
+
/** Whether the mail may reach the agent: by its sender, its kind and its authentication. */
|
|
233
|
+
private admits;
|
|
234
|
+
/**
|
|
235
|
+
* The text the agent reads: the new text of the mail, starting with the subject on a thread's
|
|
236
|
+
* first mail. A command (`/status`) stays first, so the gateway still sees it, and a mail
|
|
237
|
+
* with only a command as its subject is that command.
|
|
238
|
+
*/
|
|
239
|
+
private textOf;
|
|
240
|
+
/**
|
|
241
|
+
* Hands an inbound mail to the agent when it is one to answer. Resolves `refused` when the
|
|
242
|
+
* gateway did not take it, so it may come again.
|
|
243
|
+
*/
|
|
244
|
+
private accept;
|
|
245
|
+
private fallbackId;
|
|
246
|
+
private remember;
|
|
247
|
+
/** The thread a mail to `to` goes in: the mail it answers, or the latest of its topic. */
|
|
248
|
+
private threadOf;
|
|
249
|
+
private bodies;
|
|
250
|
+
private send;
|
|
251
|
+
private transportOf;
|
|
252
|
+
private listen;
|
|
253
|
+
}
|
|
254
|
+
/** An email channel that answers mail in its thread. */
|
|
255
|
+
export declare function emailChannel(config: EmailChannelConfig): EmailChannel;
|
|
256
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../src/channels/email/channel.ts"],"names":[],"mappings":"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"}
|