google-services-mcp 0.1.0-beta.100

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +303 -0
  3. package/dist/auth/config.d.ts +43 -0
  4. package/dist/auth/config.d.ts.map +1 -0
  5. package/dist/auth/config.js +112 -0
  6. package/dist/auth/config.js.map +1 -0
  7. package/dist/auth/manager.d.ts +50 -0
  8. package/dist/auth/manager.d.ts.map +1 -0
  9. package/dist/auth/manager.js +141 -0
  10. package/dist/auth/manager.js.map +1 -0
  11. package/dist/auth/oauth.d.ts +57 -0
  12. package/dist/auth/oauth.d.ts.map +1 -0
  13. package/dist/auth/oauth.js +223 -0
  14. package/dist/auth/oauth.js.map +1 -0
  15. package/dist/auth/store.d.ts +18 -0
  16. package/dist/auth/store.d.ts.map +1 -0
  17. package/dist/auth/store.js +50 -0
  18. package/dist/auth/store.js.map +1 -0
  19. package/dist/cli.d.ts +7 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +137 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/main.d.ts +3 -0
  24. package/dist/main.d.ts.map +1 -0
  25. package/dist/main.js +21 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/server.d.ts +3 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +28 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/services/calendar.d.ts +77 -0
  32. package/dist/services/calendar.d.ts.map +1 -0
  33. package/dist/services/calendar.js +141 -0
  34. package/dist/services/calendar.js.map +1 -0
  35. package/dist/services/contacts-tasks.d.ts +61 -0
  36. package/dist/services/contacts-tasks.d.ts.map +1 -0
  37. package/dist/services/contacts-tasks.js +106 -0
  38. package/dist/services/contacts-tasks.js.map +1 -0
  39. package/dist/services/docs.d.ts +32 -0
  40. package/dist/services/docs.d.ts.map +1 -0
  41. package/dist/services/docs.js +58 -0
  42. package/dist/services/docs.js.map +1 -0
  43. package/dist/services/drive.d.ts +72 -0
  44. package/dist/services/drive.d.ts.map +1 -0
  45. package/dist/services/drive.js +131 -0
  46. package/dist/services/drive.js.map +1 -0
  47. package/dist/services/forms.d.ts +30 -0
  48. package/dist/services/forms.d.ts.map +1 -0
  49. package/dist/services/forms.js +54 -0
  50. package/dist/services/forms.js.map +1 -0
  51. package/dist/services/gmail.d.ts +159 -0
  52. package/dist/services/gmail.d.ts.map +1 -0
  53. package/dist/services/gmail.js +499 -0
  54. package/dist/services/gmail.js.map +1 -0
  55. package/dist/services/sheets.d.ts +44 -0
  56. package/dist/services/sheets.d.ts.map +1 -0
  57. package/dist/services/sheets.js +53 -0
  58. package/dist/services/sheets.js.map +1 -0
  59. package/dist/services/slides.d.ts +30 -0
  60. package/dist/services/slides.d.ts.map +1 -0
  61. package/dist/services/slides.js +52 -0
  62. package/dist/services/slides.js.map +1 -0
  63. package/dist/services/youtube.d.ts +45 -0
  64. package/dist/services/youtube.d.ts.map +1 -0
  65. package/dist/services/youtube.js +97 -0
  66. package/dist/services/youtube.js.map +1 -0
  67. package/dist/tools/index.d.ts +3 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +953 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/util/result.d.ts +29 -0
  72. package/dist/util/result.d.ts.map +1 -0
  73. package/dist/util/result.js +21 -0
  74. package/dist/util/result.js.map +1 -0
  75. package/package.json +60 -0
@@ -0,0 +1,499 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { basename } from "node:path";
4
+ import { google } from "googleapis";
5
+ const CRLF = "\r\n";
6
+ /** Gmail rejects messages over this size (raw RFC2822 bytes). */
7
+ const GMAIL_MESSAGE_LIMIT_BYTES = 25 * 1024 * 1024;
8
+ /** A per-attachment cap so a single huge file fails with a clear error. */
9
+ const MAX_ATTACHMENT_BYTES = 18 * 1024 * 1024;
10
+ const MIME_TYPE_RE = /^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+$/;
11
+ function headerValue(headers, name) {
12
+ const h = headers?.find((x) => x.name?.toLowerCase() === name.toLowerCase());
13
+ return h?.value ? h.value : "";
14
+ }
15
+ function joinRecipients(r) {
16
+ if (!r)
17
+ return "";
18
+ return Array.isArray(r) ? r.join(", ") : r;
19
+ }
20
+ /** Build a raw RFC2822 message. Not base64-encoded yet. */
21
+ export function buildRawMessage(opts) {
22
+ const to = joinRecipients(opts.to);
23
+ if (!to)
24
+ throw new Error("A recipient is required (to).");
25
+ if (!opts.subject.trim() && !opts.body.trim()) {
26
+ throw new Error("A subject or a body is required.");
27
+ }
28
+ const lines = [];
29
+ lines.push(`To: ${to}`);
30
+ const cc = joinRecipients(opts.cc);
31
+ if (cc)
32
+ lines.push(`Cc: ${cc}`);
33
+ const bcc = joinRecipients(opts.bcc);
34
+ if (bcc)
35
+ lines.push(`Bcc: ${bcc}`);
36
+ lines.push(`Subject: ${opts.subject.replace(/[\r\n]+/g, " ")}`);
37
+ lines.push("MIME-Version: 1.0");
38
+ const contentType = opts.bodyType === "html" ? "text/html" : "text/plain";
39
+ lines.push(`Content-Type: ${contentType}; charset=UTF-8`);
40
+ lines.push("Content-Transfer-Encoding: quoted-printable");
41
+ lines.push("");
42
+ lines.push(quotedPrintableEncode(opts.body));
43
+ return lines.join(CRLF);
44
+ }
45
+ /** RFC 2045 quoted-printable encoding with 76-char soft line breaks. */
46
+ function quotedPrintableEncode(input) {
47
+ const MAX_LINE = 76;
48
+ const out = [];
49
+ let line = "";
50
+ const flush = () => {
51
+ out.push(line);
52
+ line = "";
53
+ };
54
+ for (let i = 0; i < input.length; i++) {
55
+ const code = input.charCodeAt(i);
56
+ if (code === 0x0d)
57
+ continue; // normalize CRLF to LF below
58
+ if (code === 0x0a) {
59
+ flush();
60
+ continue;
61
+ }
62
+ let enc;
63
+ if (code === 0x3d) {
64
+ enc = "=3D";
65
+ }
66
+ else if (code >= 33 && code <= 126) {
67
+ enc = input[i];
68
+ }
69
+ else if (code === 32) {
70
+ enc = " "; // trailing spaces are trimmed by flush
71
+ }
72
+ else {
73
+ enc = `=${code.toString(16).toUpperCase().padStart(2, "0")}`;
74
+ }
75
+ if (line.length + enc.length > MAX_LINE - 1) {
76
+ line += "="; // soft break
77
+ flush();
78
+ }
79
+ line += enc;
80
+ }
81
+ flush();
82
+ // Trailing space would be stripped by receivers; encode it.
83
+ return out.map((l) => (l.endsWith(" ") ? `${l.slice(0, -1)}=20` : l)).join(CRLF);
84
+ }
85
+ function sanitizeFilename(name) {
86
+ return name.replace(/["\r\n]/g, "").trim() || "attachment";
87
+ }
88
+ /** Reject CR/LF and other control characters that would break headers. */
89
+ function sanitizeMimeType(mimeType) {
90
+ return MIME_TYPE_RE.test(mimeType) ? mimeType : "";
91
+ }
92
+ /** Best-effort MIME type guess by extension; binary fallback when unknown. */
93
+ function guessMimeType(filename) {
94
+ const ext = filename.split(".").pop()?.toLowerCase() ?? "";
95
+ const table = {
96
+ txt: "text/plain",
97
+ md: "text/markdown",
98
+ csv: "text/csv",
99
+ html: "text/html",
100
+ htm: "text/html",
101
+ json: "application/json",
102
+ xml: "application/xml",
103
+ yaml: "application/yaml",
104
+ yml: "application/yaml",
105
+ pdf: "application/pdf",
106
+ zip: "application/zip",
107
+ gz: "application/gzip",
108
+ tar: "application/x-tar",
109
+ doc: "application/msword",
110
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
111
+ xls: "application/vnd.ms-excel",
112
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
113
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
114
+ png: "image/png",
115
+ jpg: "image/jpeg",
116
+ jpeg: "image/jpeg",
117
+ gif: "image/gif",
118
+ svg: "image/svg+xml",
119
+ webp: "image/webp",
120
+ mp3: "audio/mpeg",
121
+ mp4: "video/mp4",
122
+ mov: "video/quicktime",
123
+ };
124
+ return table[ext] ?? "application/octet-stream";
125
+ }
126
+ function generateBoundary() {
127
+ return `----=_Part_${randomBytes(12).toString("hex")}`;
128
+ }
129
+ /** RFC 2045: base64 bodies are wrapped at 76 columns with CRLF. */
130
+ function foldBase64(b64) {
131
+ const chunks = [];
132
+ for (let i = 0; i < b64.length; i += 76) {
133
+ chunks.push(b64.slice(i, i + 76));
134
+ }
135
+ return chunks.join(CRLF);
136
+ }
137
+ async function readAttachment(path) {
138
+ try {
139
+ return await readFile(path);
140
+ }
141
+ catch {
142
+ throw new Error(`Attachment not found or unreadable: ${path}`);
143
+ }
144
+ }
145
+ /**
146
+ * Build a raw RFC2822 message, emitting multipart/mixed when attachments are
147
+ * present and the exact same single-part layout as `buildRawMessage` when not.
148
+ * `extraHeaders` (raw header lines) are inserted between Subject and MIME-Version
149
+ * (used by replies for In-Reply-To/References). `skipValidation` lets the reply
150
+ * path reuse this without changing its previous behavior.
151
+ */
152
+ async function buildRawEmail(opts, extraHeaders, skipValidation = false) {
153
+ const to = joinRecipients(opts.to);
154
+ if (!skipValidation) {
155
+ if (!to)
156
+ throw new Error("A recipient is required (to).");
157
+ if (!opts.subject.trim() && !opts.body.trim()) {
158
+ throw new Error("A subject or a body is required.");
159
+ }
160
+ }
161
+ const lines = [];
162
+ lines.push(`To: ${to}`);
163
+ const cc = joinRecipients(opts.cc);
164
+ if (cc)
165
+ lines.push(`Cc: ${cc}`);
166
+ const bcc = joinRecipients(opts.bcc);
167
+ if (bcc)
168
+ lines.push(`Bcc: ${bcc}`);
169
+ lines.push(`Subject: ${opts.subject.replace(/[\r\n]+/g, " ")}`);
170
+ if (extraHeaders?.length)
171
+ lines.push(...extraHeaders);
172
+ const attachments = opts.attachments ?? [];
173
+ const contentType = opts.bodyType === "html" ? "text/html" : "text/plain";
174
+ if (attachments.length === 0) {
175
+ lines.push("MIME-Version: 1.0");
176
+ lines.push(`Content-Type: ${contentType}; charset=UTF-8`);
177
+ lines.push("Content-Transfer-Encoding: quoted-printable");
178
+ lines.push("");
179
+ lines.push(quotedPrintableEncode(opts.body));
180
+ return lines.join(CRLF);
181
+ }
182
+ const boundary = generateBoundary();
183
+ lines.push("MIME-Version: 1.0");
184
+ lines.push(`Content-Type: multipart/mixed; boundary="${boundary}"`);
185
+ lines.push("");
186
+ // Body part
187
+ lines.push(`--${boundary}`);
188
+ lines.push(`Content-Type: ${contentType}; charset=UTF-8`);
189
+ lines.push("Content-Transfer-Encoding: quoted-printable");
190
+ lines.push("");
191
+ lines.push(quotedPrintableEncode(opts.body));
192
+ // Attachment parts (base64 always — safe for text and binary)
193
+ for (const att of attachments) {
194
+ const buf = await readAttachment(att.path);
195
+ if (buf.length > MAX_ATTACHMENT_BYTES) {
196
+ throw new Error(`Attachment too large: ${att.path} (${buf.length} bytes); Gmail limit is ${GMAIL_MESSAGE_LIMIT_BYTES} bytes total`);
197
+ }
198
+ const filename = sanitizeFilename(att.filename ?? basename(att.path));
199
+ const mimeType = sanitizeMimeType(att.mimeType || guessMimeType(filename)) || guessMimeType(filename);
200
+ lines.push(`--${boundary}`);
201
+ lines.push(`Content-Type: ${mimeType}; name="${filename}"`);
202
+ lines.push(`Content-Disposition: attachment; filename="${filename}"`);
203
+ lines.push("Content-Transfer-Encoding: base64");
204
+ lines.push("");
205
+ lines.push(foldBase64(buf.toString("base64")));
206
+ }
207
+ lines.push(`--${boundary}--`);
208
+ return lines.join(CRLF);
209
+ }
210
+ function toBase64Url(raw) {
211
+ return Buffer.from(raw, "utf8").toString("base64url");
212
+ }
213
+ /** Extract the best body (prefer text/plain) from a Gmail payload tree. */
214
+ function extractBody(payload) {
215
+ if (!payload)
216
+ return "";
217
+ if (payload.body?.data) {
218
+ return Buffer.from(payload.body.data, "base64url").toString("utf8");
219
+ }
220
+ if (Array.isArray(payload.parts)) {
221
+ const plain = payload.parts.find((p) => p.mimeType === "text/plain");
222
+ const chosen = plain ?? payload.parts[0];
223
+ return extractBody(chosen);
224
+ }
225
+ return "";
226
+ }
227
+ function parseHeaders(headers) {
228
+ return {
229
+ from: headerValue(headers, "From"),
230
+ to: headerValue(headers, "To"),
231
+ subject: headerValue(headers, "Subject"),
232
+ date: headerValue(headers, "Date"),
233
+ messageId: headerValue(headers, "Message-ID"),
234
+ references: headerValue(headers, "References"),
235
+ };
236
+ }
237
+ /** Send an email. Returns { id, threadId }. */
238
+ export async function sendGmail(client, opts) {
239
+ const raw = toBase64Url(await buildRawEmail(opts));
240
+ const gmail = google.gmail({ version: "v1", auth: client });
241
+ const res = await gmail.users.messages.send({ userId: "me", requestBody: { raw } });
242
+ return res.data;
243
+ }
244
+ /** List messages, newest first, optionally filtered by a Gmail query. */
245
+ export async function listGmailMessages(client, opts) {
246
+ const gmail = google.gmail({ version: "v1", auth: client });
247
+ const res = await gmail.users.messages.list({
248
+ userId: "me",
249
+ q: opts.query || undefined,
250
+ maxResults: opts.maxResults ?? 25,
251
+ });
252
+ return (res.data.messages ?? []).map((m) => ({
253
+ id: m.id,
254
+ threadId: m.threadId,
255
+ snippet: m.snippet,
256
+ }));
257
+ }
258
+ /** Get a single message with parsed headers, body and attachment flags. */
259
+ export async function getGmailMessage(client, opts) {
260
+ const gmail = google.gmail({ version: "v1", auth: client });
261
+ const res = await gmail.users.messages.get({
262
+ userId: "me",
263
+ id: opts.id,
264
+ format: opts.format ?? "full",
265
+ });
266
+ const msg = res.data;
267
+ const payload = msg.payload ?? {};
268
+ const headers = payload.headers ?? [];
269
+ const parsed = parseHeaders(headers);
270
+ const hasAttachments = Array.isArray(payload.parts) &&
271
+ payload.parts.some((p) => p.filename && p.filename.length > 0);
272
+ return {
273
+ id: msg.id ?? "",
274
+ threadId: msg.threadId ?? undefined,
275
+ labelIds: msg.labelIds ?? [],
276
+ snippet: msg.snippet ?? undefined,
277
+ from: parsed.from,
278
+ to: parsed.to,
279
+ subject: parsed.subject,
280
+ date: parsed.date,
281
+ body: extractBody(payload),
282
+ hasAttachments,
283
+ };
284
+ }
285
+ /** Add/remove labels on a message. Returns the updated labelIds. */
286
+ export async function modifyGmailMessage(client, opts) {
287
+ const gmail = google.gmail({ version: "v1", auth: client });
288
+ const res = await gmail.users.messages.modify({
289
+ userId: "me",
290
+ id: opts.id,
291
+ requestBody: {
292
+ addLabelIds: opts.addLabels ?? [],
293
+ removeLabelIds: opts.removeLabels ?? [],
294
+ },
295
+ });
296
+ return res.data;
297
+ }
298
+ /** Reply to an existing message inside its thread, using proper In-Reply-To/References. */
299
+ export async function replyGmail(client, opts) {
300
+ const gmail = google.gmail({ version: "v1", auth: client });
301
+ const orig = (await gmail.users.messages.get({ userId: "me", id: opts.messageId })).data;
302
+ const headers = orig.payload?.headers ?? [];
303
+ const parsed = parseHeaders(headers);
304
+ const subject = (parsed.subject.startsWith("Re:") ? parsed.subject : `Re: ${parsed.subject}`).replace(/[\r\n]+/g, " ");
305
+ const raw = toBase64Url(await buildRawEmail({
306
+ to: parsed.from,
307
+ subject,
308
+ body: opts.body,
309
+ bodyType: opts.bodyType,
310
+ attachments: opts.attachments,
311
+ }, [
312
+ `In-Reply-To: ${parsed.messageId}`,
313
+ `References: ${[parsed.references, parsed.messageId].filter(Boolean).join(" ")}`,
314
+ ], true));
315
+ const res = await gmail.users.messages.send({
316
+ userId: "me",
317
+ requestBody: { raw, threadId: opts.threadId },
318
+ });
319
+ return res.data;
320
+ }
321
+ /** Walk a Gmail payload tree collecting attachment parts. */
322
+ function collectAttachments(payload) {
323
+ const out = [];
324
+ const walk = (p) => {
325
+ if (!p)
326
+ return;
327
+ if (p.filename && p.body?.attachmentId) {
328
+ out.push({
329
+ id: p.body.attachmentId,
330
+ partId: p.partId,
331
+ filename: p.filename,
332
+ mimeType: p.mimeType ?? "application/octet-stream",
333
+ size: p.body.size,
334
+ });
335
+ }
336
+ if (Array.isArray(p.parts))
337
+ p.parts.forEach(walk);
338
+ };
339
+ walk(payload);
340
+ return out;
341
+ }
342
+ function isTextMime(mime) {
343
+ return (mime.startsWith("text/") ||
344
+ /(json|xml|csv|javascript|yaml|markdown|rtf)$/i.test(mime) ||
345
+ mime.endsWith("+json") ||
346
+ mime.endsWith("+xml"));
347
+ }
348
+ /** List attachments on a message (metadata only, no bytes). */
349
+ export async function listGmailAttachments(client, opts) {
350
+ const gmail = google.gmail({ version: "v1", auth: client });
351
+ const res = await gmail.users.messages.get({ userId: "me", id: opts.id, format: "full" });
352
+ return collectAttachments(res.data.payload);
353
+ }
354
+ /** Download a single attachment by messageId + attachmentId (or stable partId). */
355
+ export async function getGmailAttachment(client, opts) {
356
+ const gmail = google.gmail({ version: "v1", auth: client });
357
+ const msg = (await gmail.users.messages.get({ userId: "me", id: opts.id, format: "full" })).data;
358
+ const atts = collectAttachments(msg.payload);
359
+ // Gmail rotates body.attachmentId on every messages.get call, so a caller's
360
+ // stored attachmentId may no longer match. Match by the stable partId first,
361
+ // then fall back to attachmentId for backward compatibility.
362
+ const part = (opts.partId ? atts.find((a) => a.partId === opts.partId) : undefined) ??
363
+ atts.find((a) => a.id === opts.attachmentId);
364
+ // Always download with the FRESH attachmentId from this fetch (stale IDs
365
+ // also work for the bytes call, but the fresh one is guaranteed valid).
366
+ const attachmentId = part?.id ?? opts.attachmentId;
367
+ const res = await gmail.users.messages.attachments.get({
368
+ userId: "me",
369
+ messageId: opts.id,
370
+ id: attachmentId,
371
+ });
372
+ const dataBase64 = (res.data.data ?? "");
373
+ const mimeType = part?.mimeType ?? "application/octet-stream";
374
+ const out = {
375
+ id: attachmentId,
376
+ partId: part?.partId,
377
+ filename: part?.filename ?? "attachment",
378
+ mimeType,
379
+ size: part?.size ?? res.data.size ?? 0,
380
+ dataBase64,
381
+ };
382
+ if (isTextMime(mimeType)) {
383
+ out.text = Buffer.from(dataBase64, "base64url").toString("utf8");
384
+ }
385
+ return out;
386
+ }
387
+ /** Create a draft (same options as send, but nothing is delivered). */
388
+ export async function createGmailDraft(client, opts) {
389
+ const raw = toBase64Url(await buildRawEmail(opts));
390
+ const gmail = google.gmail({ version: "v1", auth: client });
391
+ const res = await gmail.users.drafts.create({
392
+ userId: "me",
393
+ requestBody: { message: { raw } },
394
+ });
395
+ return {
396
+ id: res.data.id,
397
+ messageId: res.data.message?.id,
398
+ threadId: res.data.message?.threadId,
399
+ };
400
+ }
401
+ /** List drafts, newest first. */
402
+ export async function listGmailDrafts(client, opts) {
403
+ const gmail = google.gmail({ version: "v1", auth: client });
404
+ const res = await gmail.users.drafts.list({ userId: "me", maxResults: opts.maxResults ?? 25 });
405
+ return (res.data.drafts ?? []).map((d) => ({
406
+ id: d.id,
407
+ messageId: d.message?.id,
408
+ threadId: d.message?.threadId,
409
+ snippet: d.message?.snippet,
410
+ }));
411
+ }
412
+ /** Get a single draft with parsed headers and body. */
413
+ export async function getGmailDraft(client, opts) {
414
+ const gmail = google.gmail({ version: "v1", auth: client });
415
+ const res = await gmail.users.drafts.get({ userId: "me", id: opts.id, format: "full" });
416
+ const draft = res.data;
417
+ const msg = draft.message ?? {};
418
+ const payload = msg.payload ?? {};
419
+ const headers = payload.headers ?? [];
420
+ const parsed = parseHeaders(headers);
421
+ const hasAttachments = Array.isArray(payload.parts) &&
422
+ payload.parts.some((p) => p.filename && p.filename.length > 0);
423
+ return {
424
+ draftId: draft.id ?? "",
425
+ id: msg.id ?? "",
426
+ threadId: msg.threadId ?? undefined,
427
+ labelIds: msg.labelIds ?? [],
428
+ snippet: msg.snippet ?? undefined,
429
+ from: parsed.from,
430
+ to: parsed.to,
431
+ subject: parsed.subject,
432
+ date: parsed.date,
433
+ body: extractBody(payload),
434
+ hasAttachments,
435
+ };
436
+ }
437
+ /** Send an existing draft. */
438
+ export async function sendGmailDraft(client, opts) {
439
+ const gmail = google.gmail({ version: "v1", auth: client });
440
+ const res = await gmail.users.drafts.send({ userId: "me", requestBody: { id: opts.id } });
441
+ return res.data;
442
+ }
443
+ /** Delete a draft. */
444
+ export async function deleteGmailDraft(client, opts) {
445
+ const gmail = google.gmail({ version: "v1", auth: client });
446
+ await gmail.users.drafts.delete({ userId: "me", id: opts.id });
447
+ return { deleted: true, id: opts.id };
448
+ }
449
+ /** List all labels. */
450
+ export async function listGmailLabels(client) {
451
+ const gmail = google.gmail({ version: "v1", auth: client });
452
+ const res = await gmail.users.labels.list({ userId: "me" });
453
+ return (res.data.labels ?? []).map((l) => ({
454
+ id: l.id,
455
+ name: l.name,
456
+ type: l.type,
457
+ messageListVisibility: l.messageListVisibility,
458
+ labelListVisibility: l.labelListVisibility,
459
+ }));
460
+ }
461
+ /** Create a custom label. */
462
+ export async function createGmailLabel(client, opts) {
463
+ const gmail = google.gmail({ version: "v1", auth: client });
464
+ const res = await gmail.users.labels.create({
465
+ userId: "me",
466
+ requestBody: {
467
+ name: opts.name,
468
+ messageListVisibility: opts.messageListVisibility,
469
+ labelListVisibility: opts.labelListVisibility,
470
+ },
471
+ });
472
+ return res.data;
473
+ }
474
+ /** Delete a label. */
475
+ export async function deleteGmailLabel(client, opts) {
476
+ const gmail = google.gmail({ version: "v1", auth: client });
477
+ await gmail.users.labels.delete({ userId: "me", id: opts.id });
478
+ return { deleted: true, id: opts.id };
479
+ }
480
+ // ---- Trash / delete -------------------------------------------------------
481
+ /** Move a message to trash. */
482
+ export async function trashGmailMessage(client, opts) {
483
+ const gmail = google.gmail({ version: "v1", auth: client });
484
+ const res = await gmail.users.messages.trash({ userId: "me", id: opts.id });
485
+ return res.data;
486
+ }
487
+ /** Restore a message from trash. */
488
+ export async function untrashGmailMessage(client, opts) {
489
+ const gmail = google.gmail({ version: "v1", auth: client });
490
+ const res = await gmail.users.messages.untrash({ userId: "me", id: opts.id });
491
+ return res.data;
492
+ }
493
+ /** Permanently delete a message. */
494
+ export async function deleteGmailMessage(client, opts) {
495
+ const gmail = google.gmail({ version: "v1", auth: client });
496
+ await gmail.users.messages.delete({ userId: "me", id: opts.id });
497
+ return { deleted: true, id: opts.id };
498
+ }
499
+ //# sourceMappingURL=gmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/services/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA8DpC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,iEAAiE;AACjE,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,YAAY,GAAG,gDAAgD,CAAC;AAEtE,SAAS,WAAW,CAClB,OAA2E,EAC3E,IAAY;IAEZ,MAAM,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,cAAc,CAAC,CAAgC;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,iBAAiB,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,wEAAwE;AACxE,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS,CAAC,6BAA6B;QAC1D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,KAAK,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;aAAM,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YACrC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACvB,GAAG,GAAG,GAAG,CAAC,CAAC,uCAAuC;QACpD,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,GAAG,CAAC,CAAC,aAAa;YAC1B,KAAK,EAAE,CAAC;QACV,CAAC;QACD,IAAI,IAAI,GAAG,CAAC;IACd,CAAC;IACD,KAAK,EAAE,CAAC;IACR,4DAA4D;IAC5D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC;AAC7D,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,KAAK,GAA2B;QACpC,GAAG,EAAE,YAAY;QACjB,EAAE,EAAE,eAAe;QACnB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,iBAAiB;QACtB,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE,kBAAkB;QACvB,GAAG,EAAE,iBAAiB;QACtB,GAAG,EAAE,iBAAiB;QACtB,EAAE,EAAE,kBAAkB;QACtB,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,oBAAoB;QACzB,IAAI,EAAE,yEAAyE;QAC/E,GAAG,EAAE,0BAA0B;QAC/B,IAAI,EAAE,mEAAmE;QACzE,IAAI,EAAE,2EAA2E;QACjF,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,iBAAiB;KACvB,CAAC;IACF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,cAAc,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,mEAAmE;AACnE,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAsB,EACtB,YAAuB,EACvB,cAAc,GAAG,KAAK;IAEtB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,IAAI,YAAY,EAAE,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAE1E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,iBAAiB,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,4CAA4C,QAAQ,GAAG,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,YAAY;IACZ,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,iBAAiB,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,8DAA8D;IAC9D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,yBAAyB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,2BAA2B,yBAAyB,cAAc,CACnH,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GACZ,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,WAAW,QAAQ,GAAG,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,8CAA8C,QAAQ,GAAG,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAAC,OAAuD;IAC1E,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAC9B,CAAC,CAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAChE,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,OAA2E;IAC/F,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QAClC,EAAE,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC;QAC9B,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC;QACxC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QAClC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC;QAC7C,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAyB,EAAE,IAAsB;IAC/E,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,IAAyC,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyB,EACzB,IAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;KAClC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;QACpE,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,QAAQ,EAAE,CAAC,CAAC,QAA8B;QAC1C,OAAO,EAAE,CAAC,CAAC,OAA6B;KACzC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAyB,EACzB,IAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACzC,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;KAC9B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;IACrB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAK,EAAkC,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC;QAC1B,cAAc;KACf,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAyB,EAAE,IAAwB;IAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE;YACX,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;YACjC,cAAc,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;SACxC;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAA0C,CAAC;AACxD,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAyB,EAAE,IAAuB;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,CACd,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAC5E,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,WAAW,CACrB,MAAM,aAAa,CACjB;QACE,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EACD;QACE,gBAAgB,MAAM,CAAC,SAAS,EAAE;QAClC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;KACjF,EACD,IAAI,CACL,CACF,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAyC,CAAC;AACvD,CAAC;AAoBD,6DAA6D;AAC7D,SAAS,kBAAkB,CACzB,OAAuD;IAEvD,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,CAAiD,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;gBACvB,MAAM,EAAE,CAAC,CAAC,MAA4B;gBACtC,QAAQ,EAAE,CAAC,CAAC,QAAkB;gBAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,0BAA0B;gBAClD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAA0B;aACxC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,CAAC;IACd,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAyB,EACzB,IAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1F,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAyB,EACzB,IAAiE;IAEjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,4EAA4E;IAC5E,6EAA6E;IAC7E,6DAA6D;IAC7D,MAAM,IAAI,GACR,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/C,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,YAAY,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC;QACrD,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,CAAC,EAAE;QAClB,EAAE,EAAE,YAAY;KACjB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAW,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,0BAA0B,CAAC;IAC9D,MAAM,GAAG,GAAwB;QAC/B,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY;QACxC,QAAQ;QACR,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACtC,UAAU;KACX,CAAC;IACF,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAeD,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,IAAsB;IAEtB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE;KAClC,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAY;QACzB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAwB;QACrD,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,QAA8B;KAC3D,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAyB,EACzB,IAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAwB,EAAE,EAAE,CAAC,CAAC;QAChE,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,EAAwB;QAC9C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,QAA8B;QACnD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAA6B;KAClD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,IAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAK,EAA8B,CAAC;IAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAK,EAAkC,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;QACvB,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC;QAC1B,cAAc;KACf,CAAC;AACJ,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAyB,EAAE,IAAqB;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC,IAAyC,CAAC;AACvD,CAAC;AAED,sBAAsB;AACtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAyB,EAAE,IAAqB;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC;AAkBD,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAyB;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAwB,EAAE,EAAE,CAAC,CAAC;QAChE,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,IAAI,EAAE,CAAC,CAAC,IAA0B;QAClC,qBAAqB,EAAE,CAAC,CAAC,qBAA2C;QACpE,mBAAmB,EAAE,CAAC,CAAC,mBAAyC;KACjE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,IAA6B;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAkB,CAAC;AAChC,CAAC;AAED,sBAAsB;AACtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAyB,EAAE,IAAqB;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAE9E,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB,EAAE,IAAqB;IACtF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC,IAA0C,CAAC;AACxD,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAyB,EAAE,IAAqB;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,GAAG,CAAC,IAA0C,CAAC;AACxD,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAyB,EAAE,IAAqB;IACvF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Auth, sheets_v4 } from "googleapis";
2
+ export interface GetSpreadsheetArgs {
3
+ spreadsheetId: string;
4
+ /** Optional A1 range to also read values from (e.g. "Sheet1!A1:B5"). */
5
+ range?: string;
6
+ }
7
+ export interface ReadRangeArgs {
8
+ spreadsheetId: string;
9
+ /** A1 notation, e.g. "Sheet1!A1:C10" or "Sheet1!A:C". */
10
+ range: string;
11
+ majorDimension?: "ROWS" | "COLUMNS";
12
+ }
13
+ export interface WriteRangeArgs {
14
+ spreadsheetId: string;
15
+ /** A1 notation of the top-left cell, e.g. "Sheet1!A1". */
16
+ range: string;
17
+ /** Rows of values. */
18
+ values: string[][];
19
+ valueInputOption?: "RAW" | "USER_ENTERED";
20
+ }
21
+ export interface AppendRangeArgs {
22
+ spreadsheetId: string;
23
+ /** A1 range; rows are appended below the existing data. */
24
+ range: string;
25
+ values: string[][];
26
+ valueInputOption?: "RAW" | "USER_ENTERED";
27
+ }
28
+ export interface CreateSpreadsheetArgs {
29
+ title: string;
30
+ /** Optional sheet titles to pre-create. */
31
+ sheets?: string[];
32
+ }
33
+ export interface BatchUpdateArgs {
34
+ spreadsheetId: string;
35
+ /** Sheets batch update requests. */
36
+ requests: sheets_v4.Schema$Request[];
37
+ }
38
+ export declare function getSpreadsheet(client: Auth.OAuth2Client, { spreadsheetId, range }: GetSpreadsheetArgs): Promise<sheets_v4.Schema$Spreadsheet>;
39
+ export declare function readSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, majorDimension }: ReadRangeArgs): Promise<string[][]>;
40
+ export declare function writeSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, values, valueInputOption }: WriteRangeArgs): Promise<sheets_v4.Schema$UpdateValuesResponse>;
41
+ export declare function appendSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, values, valueInputOption }: AppendRangeArgs): Promise<sheets_v4.Schema$AppendValuesResponse>;
42
+ export declare function createSpreadsheet(client: Auth.OAuth2Client, { title, sheets }: CreateSpreadsheetArgs): Promise<sheets_v4.Schema$Spreadsheet>;
43
+ export declare function batchUpdateSheet(client: Auth.OAuth2Client, { spreadsheetId, requests }: BatchUpdateArgs): Promise<sheets_v4.Schema$BatchUpdateSpreadsheetResponse>;
44
+ //# sourceMappingURL=sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../src/services/sheets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;CACtC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAC3C,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAWvC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,cAAgC,EAAE,EAAE,aAAa,GACxE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAIrB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAA0C,EAAE,EAAE,cAAc,GAC3F,OAAO,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAShD;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAA0C,EAAE,EAAE,eAAe,GAC5F,OAAO,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAShD;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,qBAAqB,GACvC,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAQvC;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,eAAe,GAC3C,OAAO,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAI1D"}
@@ -0,0 +1,53 @@
1
+ import { google } from "googleapis";
2
+ export async function getSpreadsheet(client, { spreadsheetId, range }) {
3
+ const sheets = google.sheets({ version: "v4", auth: client });
4
+ const meta = await sheets.spreadsheets.get({ spreadsheetId, includeGridData: false });
5
+ const result = meta.data;
6
+ if (range) {
7
+ const values = await sheets.spreadsheets.values.get({ spreadsheetId, range });
8
+ if (values.data?.values) {
9
+ result.values = values.data.values;
10
+ }
11
+ }
12
+ return result;
13
+ }
14
+ export async function readSheetRange(client, { spreadsheetId, range, majorDimension = "ROWS" }) {
15
+ const sheets = google.sheets({ version: "v4", auth: client });
16
+ const res = await sheets.spreadsheets.values.get({ spreadsheetId, range, majorDimension });
17
+ return res.data.values ?? [];
18
+ }
19
+ export async function writeSheetRange(client, { spreadsheetId, range, values, valueInputOption = "USER_ENTERED" }) {
20
+ const sheets = google.sheets({ version: "v4", auth: client });
21
+ const res = await sheets.spreadsheets.values.update({
22
+ spreadsheetId,
23
+ range,
24
+ valueInputOption,
25
+ requestBody: { values },
26
+ });
27
+ return res.data;
28
+ }
29
+ export async function appendSheetRange(client, { spreadsheetId, range, values, valueInputOption = "USER_ENTERED" }) {
30
+ const sheets = google.sheets({ version: "v4", auth: client });
31
+ const res = await sheets.spreadsheets.values.append({
32
+ spreadsheetId,
33
+ range,
34
+ valueInputOption,
35
+ requestBody: { values },
36
+ });
37
+ return res.data;
38
+ }
39
+ export async function createSpreadsheet(client, { title, sheets }) {
40
+ const api = google.sheets({ version: "v4", auth: client });
41
+ const requestBody = { properties: { title } };
42
+ if (sheets?.length) {
43
+ requestBody.sheets = sheets.map((t) => ({ properties: { title: t } }));
44
+ }
45
+ const res = await api.spreadsheets.create({ requestBody });
46
+ return res.data;
47
+ }
48
+ export async function batchUpdateSheet(client, { spreadsheetId, requests }) {
49
+ const sheets = google.sheets({ version: "v4", auth: client });
50
+ const res = await sheets.spreadsheets.batchUpdate({ spreadsheetId, requestBody: { requests } });
51
+ return res.data;
52
+ }
53
+ //# sourceMappingURL=sheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../src/services/sheets.ts"],"names":[],"mappings":"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"}