flow-agent-bridge 0.37.5 → 0.37.8

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.
@@ -0,0 +1,245 @@
1
+ import type { FlowApi } from './api.js';
2
+ /** The data of a `mail.received` event (packages/edge/src/imap/object.ts `publishReceived`), on the mailbox's account alone. */
3
+ export interface MailReceivedEventData {
4
+ accountId: string;
5
+ folder: string;
6
+ uid: number;
7
+ from: {
8
+ name: string;
9
+ address: string;
10
+ } | null;
11
+ subject: string;
12
+ date: string;
13
+ }
14
+ /** The longest body read_mail returns, in characters (the /mcp tools' MAX_BODY_CHARS). */
15
+ export declare const MAX_BODY_CHARS = 50000;
16
+ export declare const NO_MAILBOX = "This agent has no mailbox yet: its organization has not set one up (hosted mail), or it is still being set up.";
17
+ export declare const MAIL_TOOLS: ({
18
+ name: string;
19
+ description: string;
20
+ inputSchema: {
21
+ type: string;
22
+ properties: {
23
+ folder: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ limit: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ unread_only: {
32
+ type: string;
33
+ description: string;
34
+ };
35
+ query?: never;
36
+ to?: never;
37
+ cc?: never;
38
+ subject?: never;
39
+ body?: never;
40
+ reply_to_id?: never;
41
+ to_folder?: never;
42
+ ids?: never;
43
+ read?: never;
44
+ starred?: never;
45
+ };
46
+ required?: never;
47
+ };
48
+ } | {
49
+ name: string;
50
+ description: string;
51
+ inputSchema: {
52
+ type: string;
53
+ properties: {
54
+ unread_only?: never;
55
+ query: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ folder: {
60
+ type: string;
61
+ description: string;
62
+ };
63
+ limit: {
64
+ type: string;
65
+ description: string;
66
+ };
67
+ to?: never;
68
+ cc?: never;
69
+ subject?: never;
70
+ body?: never;
71
+ reply_to_id?: never;
72
+ to_folder?: never;
73
+ ids?: never;
74
+ read?: never;
75
+ starred?: never;
76
+ };
77
+ required: string[];
78
+ };
79
+ } | {
80
+ name: string;
81
+ description: string;
82
+ inputSchema: {
83
+ type: string;
84
+ properties: {
85
+ unread_only?: never;
86
+ query?: never;
87
+ folder?: never;
88
+ limit?: never;
89
+ ids: {
90
+ type: string;
91
+ items: {
92
+ type: string;
93
+ };
94
+ maxItems: number;
95
+ description: string;
96
+ };
97
+ to?: never;
98
+ cc?: never;
99
+ subject?: never;
100
+ body?: never;
101
+ reply_to_id?: never;
102
+ to_folder?: never;
103
+ read?: never;
104
+ starred?: never;
105
+ };
106
+ required: string[];
107
+ };
108
+ } | {
109
+ name: string;
110
+ description: string;
111
+ inputSchema: {
112
+ type: string;
113
+ properties: {
114
+ unread_only?: never;
115
+ query?: never;
116
+ folder?: never;
117
+ limit?: never;
118
+ to: {
119
+ type: string;
120
+ items: {
121
+ type: string;
122
+ };
123
+ description: string;
124
+ };
125
+ cc: {
126
+ type: string;
127
+ items: {
128
+ type: string;
129
+ };
130
+ description: string;
131
+ };
132
+ subject: {
133
+ type: string;
134
+ description: string;
135
+ };
136
+ body: {
137
+ type: string;
138
+ description: string;
139
+ };
140
+ reply_to_id: {
141
+ type: string;
142
+ description: string;
143
+ };
144
+ to_folder?: never;
145
+ ids?: never;
146
+ read?: never;
147
+ starred?: never;
148
+ };
149
+ required: string[];
150
+ };
151
+ } | {
152
+ name: string;
153
+ description: string;
154
+ inputSchema: {
155
+ type: string;
156
+ properties: {
157
+ unread_only?: never;
158
+ query?: never;
159
+ folder?: never;
160
+ limit?: never;
161
+ to?: never;
162
+ cc?: never;
163
+ subject?: never;
164
+ body?: never;
165
+ reply_to_id?: never;
166
+ ids: {
167
+ type: string;
168
+ items: {
169
+ type: string;
170
+ };
171
+ maxItems: number;
172
+ description: string;
173
+ };
174
+ to_folder: {
175
+ type: string;
176
+ description: string;
177
+ };
178
+ read?: never;
179
+ starred?: never;
180
+ };
181
+ required: string[];
182
+ };
183
+ } | {
184
+ name: string;
185
+ description: string;
186
+ inputSchema: {
187
+ type: string;
188
+ properties: {
189
+ unread_only?: never;
190
+ query?: never;
191
+ folder?: never;
192
+ limit?: never;
193
+ to?: never;
194
+ cc?: never;
195
+ subject?: never;
196
+ body?: never;
197
+ reply_to_id?: never;
198
+ to_folder?: never;
199
+ ids: {
200
+ type: string;
201
+ items: {
202
+ type: string;
203
+ };
204
+ maxItems: number;
205
+ description: string;
206
+ };
207
+ read: {
208
+ type: string;
209
+ description: string;
210
+ };
211
+ starred: {
212
+ type: string;
213
+ description: string;
214
+ };
215
+ };
216
+ required: string[];
217
+ };
218
+ })[];
219
+ export declare const MAIL_TOOL_NAMES: Set<string>;
220
+ /** What the agent is asked when mail comes from a member (the turn in the DM with them, or with the sponsor). */
221
+ export declare function mailPrompt(d: MailReceivedEventData, id: string, name: string | null): string;
222
+ /**
223
+ * A body written in Markdown as a message's HTML, as the Mail tools on /mcp send it (mailText.ts `markdownToHtml`, with
224
+ * marked: GFM, line breaks kept): headings, paragraphs, lists, quotes, code blocks and the inline marks. Raw HTML in it is
225
+ * shown as text, never passed through. Small on purpose: the bridge carries no Markdown library.
226
+ */
227
+ export declare function markdownToHtml(markdown: string): string;
228
+ /** A message's HTML as text, roughly as a reader sees it: no markup, scripts or styles; a link as `text (address)`. */
229
+ export declare function htmlToText(html: string): string;
230
+ export type MailApi = Pick<FlowApi, 'mail'>;
231
+ /** A message id's parts (`<account>:<folder>:<uid>`: the account has no colon, the uid is last), or null. */
232
+ export declare function parseMessageId(id: string): {
233
+ account: string;
234
+ folder: string;
235
+ uid: number;
236
+ } | null;
237
+ /**
238
+ * One of MAIL_TOOLS, as the agent, on its hosted mailbox in its organization: the text for the agent, and whether it is
239
+ * an error. No mailbox is an answer, not an error, so the turn goes on. The /mcp tools' argument names; `id`, `q`, `seen`,
240
+ * `flagged`, `to` (for move_mail), `unread` and `in_reply_to` are taken for theirs too.
241
+ */
242
+ export declare function mailTool(api: MailApi, workspaceId: string, name: string, args: Record<string, unknown>): Promise<{
243
+ text: string;
244
+ isError: boolean;
245
+ }>;
@@ -0,0 +1,351 @@
1
+ /** The longest body read_mail returns, in characters (the /mcp tools' MAX_BODY_CHARS). */
2
+ export const MAX_BODY_CHARS = 50_000;
3
+ export const NO_MAILBOX = 'This agent has no mailbox yet: its organization has not set one up (hosted mail), or it is still being set up.';
4
+ const ID_TEXT = 'A message id as list_mail and search_mail return it ("<account>:<folder>:<uid>"). Copy it exactly.';
5
+ const ids = (max) => ({ type: 'array', items: { type: 'string' }, maxItems: max, description: `Message ids (from list_mail or search_mail), at most ${max}.` });
6
+ const recipients = (what) => ({ type: 'array', items: { type: 'string' }, description: `${what}: email addresses, each "name@example.com" or "Name <name@example.com>".` });
7
+ export const MAIL_TOOLS = [
8
+ {
9
+ name: 'list_mail',
10
+ description: 'List the newest messages in your own mailbox (at your address in this organization), newest first: id, date, sender, subject, and whether it is unread. Use read_mail with an id to read one.',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ folder: { type: 'string', description: 'The folder path. Defaults to INBOX; Sent, Drafts, Trash and Archive are the usual others.' },
15
+ limit: { type: 'number', description: 'How many, at most 50. Defaults to 20.' },
16
+ unread_only: { type: 'boolean', description: 'Only unread messages.' },
17
+ },
18
+ },
19
+ },
20
+ {
21
+ name: 'search_mail',
22
+ description: 'Find messages in one folder of your mailbox whose text, sender or subject has the words, newest first, as list_mail shows them.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ query: { type: 'string', description: 'What to look for: words in the text, sender or subject.' },
27
+ folder: { type: 'string', description: 'The folder path. Defaults to INBOX.' },
28
+ limit: { type: 'number', description: 'How many, at most 50. Defaults to 20.' },
29
+ },
30
+ required: ['query'],
31
+ },
32
+ },
33
+ {
34
+ name: 'read_mail',
35
+ description: `Read messages by id, up to 20 at once: from, to, cc, subject, date, Message-ID and the body as plain text (cut at ${MAX_BODY_CHARS} characters), and the attachments' names. Reading does not mark a message read (mark_mail does).`,
36
+ inputSchema: { type: 'object', properties: { ids: ids(20) }, required: ['ids'] },
37
+ },
38
+ {
39
+ name: 'send_mail',
40
+ description: 'Send an email from your own address. The body is Markdown, sent as formatted HTML with a plain-text copy. With reply_to_id it answers that message: To defaults to its sender, the subject to "Re: …", it is threaded, and the original is quoted below your text. Say what you sent.',
41
+ inputSchema: {
42
+ type: 'object',
43
+ properties: {
44
+ to: recipients('To'),
45
+ cc: recipients('Cc'),
46
+ subject: { type: 'string', description: 'The subject. Optional for a reply, which defaults to "Re: " and the original\'s.' },
47
+ body: { type: 'string', description: 'The message, in Markdown (bold, lists, links). Only what you write: a reply quotes the original for you.' },
48
+ reply_to_id: { type: 'string', description: `Reply to this message. ${ID_TEXT}` },
49
+ },
50
+ required: ['body'],
51
+ },
52
+ },
53
+ {
54
+ name: 'move_mail',
55
+ description: 'Move messages to another folder of your mailbox (e.g. Archive or Trash). Their ids change: list the folder again to find them there.',
56
+ inputSchema: {
57
+ type: 'object',
58
+ properties: { ids: ids(100), to_folder: { type: 'string', description: 'The folder path to move them to.' } },
59
+ required: ['ids', 'to_folder'],
60
+ },
61
+ },
62
+ {
63
+ name: 'mark_mail',
64
+ description: 'Mark messages read or unread, and/or starred (flagged) or not. Give read, starred or both.',
65
+ inputSchema: {
66
+ type: 'object',
67
+ properties: { ids: ids(100), read: { type: 'boolean', description: 'true: mark read; false: mark unread.' }, starred: { type: 'boolean', description: 'true: star; false: unstar.' } },
68
+ required: ['ids'],
69
+ },
70
+ },
71
+ ];
72
+ export const MAIL_TOOL_NAMES = new Set(MAIL_TOOLS.map((t) => t.name));
73
+ /** What the agent is asked when mail comes from a member (the turn in the DM with them, or with the sponsor). */
74
+ export function mailPrompt(d, id, name) {
75
+ const address = d.from?.address ?? 'an unknown sender';
76
+ const from = name ? `${name} <${address}>` : address;
77
+ return `You received an email from ${from}: "${d.subject || '(no subject)'}". Read it with \`read_mail\` (id ${id}) and act on it; ` +
78
+ 'reply by email with `send_mail` (reply_to_id) if a reply is wanted, or answer here.';
79
+ }
80
+ // ---- Markdown, as the message's HTML ---------------------------------------------------------------------------------
81
+ const escapeHtml = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
82
+ /** One line's inline Markdown: `code`, **bold**, *italic* / _italic_, ~~strike~~, [text](http… or mailto:), on escaped text. */
83
+ function inline(s) {
84
+ const codes = [];
85
+ let out = escapeHtml(s).replace(/`([^`]+)`/g, (_m, c) => `\u0000${codes.push(`<code>${c}</code>`) - 1}\u0000`);
86
+ out = out
87
+ .replace(/\[([^\]]+)\]\(((?:https?:|mailto:)[^)\s]+)\)/g, (_m, t, href) => `<a href="${href}">${t}</a>`)
88
+ .replace(/\*\*([^*]+)\*\*|__([^_]+)__/g, (_m, a, b) => `<strong>${a ?? b}</strong>`)
89
+ .replace(/(^|[^*\w])\*([^*\s][^*]*?)\*(?!\w)/g, '$1<em>$2</em>')
90
+ .replace(/(^|[^_\w])_([^_\s][^_]*?)_(?!\w)/g, '$1<em>$2</em>')
91
+ .replace(/~~([^~]+)~~/g, '<del>$1</del>');
92
+ return out.replace(/\u0000(\d+)\u0000/g, (_m, i) => codes[Number(i)]);
93
+ }
94
+ /**
95
+ * A body written in Markdown as a message's HTML, as the Mail tools on /mcp send it (mailText.ts `markdownToHtml`, with
96
+ * marked: GFM, line breaks kept): headings, paragraphs, lists, quotes, code blocks and the inline marks. Raw HTML in it is
97
+ * shown as text, never passed through. Small on purpose: the bridge carries no Markdown library.
98
+ */
99
+ export function markdownToHtml(markdown) {
100
+ const lines = markdown.replace(/\r\n?/g, '\n').split('\n');
101
+ const out = [];
102
+ let para = [];
103
+ const flush = () => {
104
+ if (para.length)
105
+ out.push(`<p>${para.map(inline).join('<br>')}</p>`);
106
+ para = [];
107
+ };
108
+ for (let i = 0; i < lines.length; i++) {
109
+ const line = lines[i];
110
+ if (/^\s*```/.test(line)) {
111
+ flush();
112
+ const code = [];
113
+ for (i++; i < lines.length && !/^\s*```/.test(lines[i]); i++)
114
+ code.push(lines[i]);
115
+ out.push(`<pre><code>${escapeHtml(code.join('\n'))}</code></pre>`);
116
+ continue;
117
+ }
118
+ const h = /^(#{1,6})\s+(.*)$/.exec(line);
119
+ if (h) {
120
+ flush();
121
+ out.push(`<h${h[1].length}>${inline(h[2].trim())}</h${h[1].length}>`);
122
+ continue;
123
+ }
124
+ if (/^\s*([-*_])(\s*\1){2,}\s*$/.test(line)) {
125
+ flush();
126
+ out.push('<hr>');
127
+ continue;
128
+ }
129
+ const list = /^\s*([-*+]|\d+[.)])\s+/.exec(line);
130
+ if (list) {
131
+ flush();
132
+ const ordered = /\d/.test(list[1]);
133
+ const items = [];
134
+ for (; i < lines.length; i++) {
135
+ const m = /^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(lines[i]);
136
+ if (!m || /\d/.test(m[1]) !== ordered)
137
+ break;
138
+ items.push(`<li>${inline(m[2])}</li>`);
139
+ }
140
+ i--;
141
+ out.push(`<${ordered ? 'ol' : 'ul'}>${items.join('')}</${ordered ? 'ol' : 'ul'}>`);
142
+ continue;
143
+ }
144
+ if (/^\s*>/.test(line)) {
145
+ flush();
146
+ const quoted = [];
147
+ for (; i < lines.length && /^\s*>/.test(lines[i]); i++)
148
+ quoted.push(lines[i].replace(/^\s*>\s?/, ''));
149
+ i--;
150
+ out.push(`<blockquote>${markdownToHtml(quoted.join('\n'))}</blockquote>`);
151
+ continue;
152
+ }
153
+ if (!line.trim()) {
154
+ flush();
155
+ continue;
156
+ }
157
+ para.push(line.trim());
158
+ }
159
+ flush();
160
+ return out.join('');
161
+ }
162
+ // ---- reading -------------------------------------------------------------------------------------------------------
163
+ const ENTITIES = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ' };
164
+ /** A message's HTML as text, roughly as a reader sees it: no markup, scripts or styles; a link as `text (address)`. */
165
+ export function htmlToText(html) {
166
+ return html
167
+ .replace(/<!--[\s\S]*?-->/g, '')
168
+ .replace(/<(script|style|head|title)\b[\s\S]*?<\/\1\s*>/gi, '')
169
+ .replace(/<a\b[^>]*href\s*=\s*["']((?:https?:|mailto:)[^"']*)["'][^>]*>([\s\S]*?)<\/a\s*>/gi, (_m, href, t) => {
170
+ const text = t.replace(/<[^>]+>/g, '').trim();
171
+ const shown = href.replace(/^mailto:/i, '');
172
+ return !text || text === href || text === shown ? shown : `${text} (${shown})`;
173
+ })
174
+ .replace(/<li\b[^>]*>/gi, '\n- ')
175
+ .replace(/<br\b[^>]*>/gi, '\n')
176
+ .replace(/<\/?(p|div|h[1-6]|ul|ol|table|tr|blockquote|pre|hr)\b[^>]*>/gi, '\n\n')
177
+ .replace(/<[^>]+>/g, '')
178
+ .replace(/&(#\d+|#x[0-9a-f]+|[a-z]+);/gi, (m, e) => {
179
+ if (e[0] === '#') {
180
+ const c = e[1] === 'x' || e[1] === 'X' ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10);
181
+ return c > 0 && c <= 0x10ffff ? String.fromCodePoint(c) : m;
182
+ }
183
+ return ENTITIES[e.toLowerCase()] ?? m;
184
+ })
185
+ .split('\n').map((l) => l.replace(/[ \t ]+/g, ' ').trim()).join('\n')
186
+ .replace(/\n{3,}/g, '\n\n')
187
+ .trim();
188
+ }
189
+ const fmt = (a) => (a.name ? `${a.name} <${a.address}>` : a.address);
190
+ const EMAIL = /^[^\s@<>(),;:"]+@[^\s@<>(),;:"]+\.[^\s@<>(),;:"]+$/;
191
+ /** "Name <a@b.c>" or "a@b.c" as the API's address, or null. */
192
+ function parseAddress(input) {
193
+ const s = String(input).trim();
194
+ const angled = /^(.*?)<\s*([^<>\s]+)\s*>$/.exec(s);
195
+ if (angled)
196
+ return EMAIL.test(angled[2]) ? { name: angled[1].trim().replace(/^"(.*)"$/, '$1'), address: angled[2] } : null;
197
+ const bare = s.replace(/^mailto:/i, '');
198
+ return EMAIL.test(bare) ? { name: '', address: bare } : null;
199
+ }
200
+ /** A message id's parts (`<account>:<folder>:<uid>`: the account has no colon, the uid is last), or null. */
201
+ export function parseMessageId(id) {
202
+ const s = typeof id === 'string' ? id.trim() : '';
203
+ const first = s.indexOf(':'), last = s.lastIndexOf(':');
204
+ if (first <= 0 || last <= first + 1 || !/^\d+$/.test(s.slice(last + 1)) || Number(s.slice(last + 1)) < 1)
205
+ return null;
206
+ return { account: s.slice(0, first), folder: s.slice(first + 1, last), uid: Number(s.slice(last + 1)) };
207
+ }
208
+ class ToolError extends Error {
209
+ }
210
+ const listOf = (v) => (Array.isArray(v) ? v.map(String) : typeof v === 'string' && v.trim() ? [v] : []);
211
+ const line = (account, m) => `${account}:${m.folder}:${m.uid} ${m.date} ${m.from ? fmt(m.from) : '(no sender)'} ${m.subject || '(no subject)'}${m.seen ? '' : ' [unread]'}${m.flagged ? ' [starred]' : ''}${m.hasAttachments ? ' [attachments]' : ''}`;
212
+ /**
213
+ * One of MAIL_TOOLS, as the agent, on its hosted mailbox in its organization: the text for the agent, and whether it is
214
+ * an error. No mailbox is an answer, not an error, so the turn goes on. The /mcp tools' argument names; `id`, `q`, `seen`,
215
+ * `flagged`, `to` (for move_mail), `unread` and `in_reply_to` are taken for theirs too.
216
+ */
217
+ export async function mailTool(api, workspaceId, name, args) {
218
+ if (!workspaceId)
219
+ return { text: `${name} needs a workspace (FLOW_WORKSPACE_ID is not set)`, isError: true };
220
+ try {
221
+ const { accounts } = await api.mail('GET', 'accounts', workspaceId);
222
+ const box = accounts.find((a) => a.kind === 'hosted');
223
+ if (!box)
224
+ return { text: NO_MAILBOX, isError: false };
225
+ const P = `accounts/${encodeURIComponent(box.id)}`;
226
+ /** The ids given, each in the agent's own mailbox. */
227
+ const refs = (max, given = listOf(args.ids ?? args.id)) => {
228
+ if (!given.length)
229
+ throw new ToolError(`${name} needs ids (from list_mail or search_mail)`);
230
+ if (given.length > max)
231
+ throw new ToolError(`${name} takes at most ${max} ids at once`);
232
+ return given.map((g) => {
233
+ const r = parseMessageId(g);
234
+ if (!r)
235
+ throw new ToolError(`"${g.slice(0, 100)}" is not a message id; use the ids list_mail returns, as they are`);
236
+ if (r.account !== box.id)
237
+ throw new ToolError(`${g.slice(0, 100)} is not in your mailbox (${box.email})`);
238
+ return { id: g, ...r };
239
+ });
240
+ };
241
+ /** The ids by folder, one request each. */
242
+ const byFolder = (rs) => {
243
+ const m = new Map();
244
+ for (const r of rs)
245
+ m.set(r.folder, [...(m.get(r.folder) ?? []), r.uid]);
246
+ return [...m];
247
+ };
248
+ const page = async (folder, limit, extra) => {
249
+ const q = new URLSearchParams({ folder, limit: String(Math.min(50, Math.max(1, Math.floor(limit) || 20))), ...extra });
250
+ const r = await api.mail('GET', `${P}/messages?${q}`, workspaceId);
251
+ return r.messages.length ? r.messages.map((m) => line(box.id, m)).join('\n') : `no messages${extra.q ? ' match' : ''} in ${folder}`;
252
+ };
253
+ const folderArg = () => (typeof args.folder === 'string' && args.folder.trim() ? args.folder.trim() : 'INBOX');
254
+ switch (name) {
255
+ case 'list_mail':
256
+ return { text: `${box.email}, ${folderArg()}:\n${await page(folderArg(), Number(args.limit ?? 20), args.unread_only === true || args.unread === true ? { unread: '1' } : {})}`, isError: false };
257
+ case 'search_mail': {
258
+ const query = String(args.query ?? args.q ?? '').trim();
259
+ if (!query)
260
+ return { text: 'search_mail needs a query', isError: true };
261
+ return { text: await page(folderArg(), Number(args.limit ?? 20), { q: query }), isError: false };
262
+ }
263
+ case 'read_mail': {
264
+ const out = [];
265
+ for (const r of refs(20)) {
266
+ try {
267
+ const { message: m } = await api.mail('GET', `${P}/messages/${r.uid}?${new URLSearchParams({ folder: r.folder })}`, workspaceId);
268
+ const body = m.html?.trim() ? htmlToText(m.html) : (m.text ?? '').replace(/\r\n/g, '\n').trim();
269
+ const cut = body.length > MAX_BODY_CHARS;
270
+ out.push([
271
+ `id: ${r.id}`,
272
+ `from: ${m.from ? fmt(m.from) : '(none)'}`,
273
+ `to: ${m.to.map(fmt).join(', ')}`,
274
+ ...(m.cc?.length ? [`cc: ${m.cc.map(fmt).join(', ')}`] : []),
275
+ ...(m.replyTo?.length ? [`reply-to: ${m.replyTo.map(fmt).join(', ')}`] : []),
276
+ `subject: ${m.subject}`,
277
+ `date: ${m.date}`,
278
+ ...(m.messageId ? [`message-id: ${m.messageId}`] : []),
279
+ ...(m.attachments?.filter((a) => !a.inline).length ? [`attachments: ${m.attachments.filter((a) => !a.inline).map((a) => `${a.filename} (${a.mimeType}, ${a.size} bytes)`).join(', ')}`] : []),
280
+ '',
281
+ cut ? `${body.slice(0, MAX_BODY_CHARS)}\n[the body was cut at ${MAX_BODY_CHARS} characters]` : body,
282
+ ].join('\n'));
283
+ }
284
+ catch (err) {
285
+ out.push(`id: ${r.id}\nnot read: ${err.message}`);
286
+ }
287
+ }
288
+ return { text: out.join('\n\n---\n\n'), isError: false };
289
+ }
290
+ case 'send_mail': {
291
+ const body = typeof args.body === 'string' ? args.body : '';
292
+ if (!body.trim())
293
+ return { text: 'send_mail needs a body (Markdown)', isError: true };
294
+ const bad = [...listOf(args.to), ...listOf(args.cc)].filter((a) => !parseAddress(a));
295
+ if (bad.length)
296
+ return { text: `not an email address: ${bad.slice(0, 3).join(', ')} — write "name@example.com" or "Name <name@example.com>"`, isError: true };
297
+ let to = listOf(args.to).map((a) => parseAddress(a)), cc = listOf(args.cc).map((a) => parseAddress(a));
298
+ let subject = typeof args.subject === 'string' ? args.subject.trim() : '';
299
+ let html = markdownToHtml(body), text = body;
300
+ const extra = {};
301
+ const replyId = String(args.reply_to_id ?? args.in_reply_to ?? '').trim();
302
+ if (replyId) {
303
+ const [r] = refs(1, [replyId]);
304
+ const { message: m } = await api.mail('GET', `${P}/messages/${r.uid}?${new URLSearchParams({ folder: r.folder })}`, workspaceId);
305
+ if (!to.length)
306
+ to = m.replyTo?.length ? m.replyTo : m.from ? [m.from] : [];
307
+ if (!subject)
308
+ subject = /^re\s*:/i.test(m.subject.trim()) ? m.subject.trim() : `Re: ${m.subject.trim()}`;
309
+ if (m.messageId)
310
+ Object.assign(extra, { inReplyTo: m.messageId, references: [...(m.references ?? []), m.messageId].filter((x, i, all) => all.indexOf(x) === i) });
311
+ const original = m.html?.trim() ? htmlToText(m.html) : (m.text ?? '').trim();
312
+ const intro = `On ${m.date}, ${m.from ? fmt(m.from) : 'someone'} wrote:`;
313
+ html = `${html}<br><p>${escapeHtml(intro)}</p><blockquote>${original.split(/\n{2,}/).map((p) => `<p>${escapeHtml(p).replace(/\n/g, '<br>')}</p>`).join('')}</blockquote>`;
314
+ text = `${text}\n\n${intro}\n${original.split('\n').map((l) => (l ? `> ${l}` : '>')).join('\n')}`;
315
+ }
316
+ if (!to.length)
317
+ return { text: 'send_mail needs to (or reply_to_id)', isError: true };
318
+ if (!subject)
319
+ return { text: 'send_mail needs a subject', isError: true };
320
+ const r = await api.mail('POST', `${P}/send`, workspaceId, { to, ...(cc.length ? { cc } : {}), subject, html, text, ...extra });
321
+ return { text: `sent "${subject}" from ${box.email} to ${[...to, ...cc].map(fmt).join(', ')}${r.messageId ? ` (Message-ID ${r.messageId})` : ''}`, isError: false };
322
+ }
323
+ case 'move_mail': {
324
+ const dest = String(args.to_folder ?? args.to ?? '').trim();
325
+ if (!dest)
326
+ return { text: 'move_mail needs to_folder', isError: true };
327
+ const rs = refs(100);
328
+ for (const [folder, uids] of byFolder(rs))
329
+ await api.mail('POST', `${P}/messages/move`, workspaceId, { folder, uids, to: dest });
330
+ return { text: `moved ${rs.length} message${rs.length === 1 ? '' : 's'} to ${dest}; their ids changed (list ${dest} to find them)`, isError: false };
331
+ }
332
+ case 'mark_mail': {
333
+ const read = typeof args.read === 'boolean' ? args.read : typeof args.seen === 'boolean' ? args.seen : undefined;
334
+ const starred = typeof args.starred === 'boolean' ? args.starred : typeof args.flagged === 'boolean' ? args.flagged : undefined;
335
+ if (read === undefined && starred === undefined)
336
+ return { text: 'mark_mail needs read, starred or both', isError: true };
337
+ const rs = refs(100);
338
+ for (const [folder, uids] of byFolder(rs))
339
+ await api.mail('PATCH', `${P}/messages`, workspaceId, { folder, uids, ...(read !== undefined ? { seen: read } : {}), ...(starred !== undefined ? { flagged: starred } : {}) });
340
+ const what = [...(read !== undefined ? [read ? 'read' : 'unread'] : []), ...(starred !== undefined ? [starred ? 'starred' : 'not starred'] : [])].join(' and ');
341
+ return { text: `marked ${rs.length} message${rs.length === 1 ? '' : 's'} ${what}`, isError: false };
342
+ }
343
+ default:
344
+ return { text: `unknown tool: ${name}`, isError: true };
345
+ }
346
+ }
347
+ catch (err) {
348
+ return { text: err instanceof ToolError ? err.message : `${name} failed: ${err.message}`, isError: true };
349
+ }
350
+ }
351
+ //# sourceMappingURL=mail-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-tools.js","sourceRoot":"","sources":["../src/mail-tools.ts"],"names":[],"mappings":"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"}