@smcllns/gmail 0.1.1
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 +164 -0
- package/dist/account-storage.d.ts +22 -0
- package/dist/account-storage.d.ts.map +1 -0
- package/dist/account-storage.js +87 -0
- package/dist/account-storage.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +539 -0
- package/dist/cli.js.map +1 -0
- package/dist/gmail-oauth-flow.d.ts +13 -0
- package/dist/gmail-oauth-flow.d.ts.map +1 -0
- package/dist/gmail-oauth-flow.js +142 -0
- package/dist/gmail-oauth-flow.js.map +1 -0
- package/dist/gmail-service.d.ts +101 -0
- package/dist/gmail-service.d.ts.map +1 -0
- package/dist/gmail-service.js +477 -0
- package/dist/gmail-service.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import { parseArgs } from "util";
|
|
4
|
+
import { GmailService } from "./gmail-service.js";
|
|
5
|
+
const service = new GmailService();
|
|
6
|
+
// Custom error class for restricted operations
|
|
7
|
+
class RestrictedOperationError extends Error {
|
|
8
|
+
constructor(operation, guidance) {
|
|
9
|
+
super(`RESTRICTED: ${operation}\n\n${guidance}`);
|
|
10
|
+
this.name = "RestrictedOperationError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function usage() {
|
|
14
|
+
console.log(`gmail - Gmail CLI for Claude Code agents
|
|
15
|
+
|
|
16
|
+
USAGE
|
|
17
|
+
|
|
18
|
+
gmail accounts <action> Account management
|
|
19
|
+
gmail config <action> Configuration management
|
|
20
|
+
gmail <command> [options] Gmail operations (uses default account)
|
|
21
|
+
gmail --account <email> <command> Gmail operations with specific account
|
|
22
|
+
|
|
23
|
+
ACCOUNT COMMANDS
|
|
24
|
+
|
|
25
|
+
gmail accounts credentials <file.json> Set OAuth credentials (once)
|
|
26
|
+
gmail accounts list List configured accounts
|
|
27
|
+
gmail accounts add <email> [--manual] Add account (--manual for browserless OAuth)
|
|
28
|
+
gmail accounts remove <email> Remove account
|
|
29
|
+
|
|
30
|
+
CONFIG COMMANDS
|
|
31
|
+
|
|
32
|
+
gmail config default <email> Set default account for all commands
|
|
33
|
+
gmail config show Show current configuration
|
|
34
|
+
|
|
35
|
+
GMAIL COMMANDS
|
|
36
|
+
|
|
37
|
+
gmail search <query> [--max N] [--page TOKEN]
|
|
38
|
+
Search threads using Gmail query syntax.
|
|
39
|
+
Returns: thread ID, date, sender, subject, labels.
|
|
40
|
+
|
|
41
|
+
Query examples:
|
|
42
|
+
in:inbox, in:sent, in:drafts, in:trash
|
|
43
|
+
is:unread, is:starred, is:important
|
|
44
|
+
from:sender@example.com, to:recipient@example.com
|
|
45
|
+
subject:keyword, has:attachment, filename:pdf
|
|
46
|
+
after:2024/01/01, before:2024/12/31
|
|
47
|
+
label:Work, label:UNREAD
|
|
48
|
+
Combine: "in:inbox is:unread from:boss@company.com"
|
|
49
|
+
|
|
50
|
+
gmail thread <threadId> [--download]
|
|
51
|
+
Get thread with all messages.
|
|
52
|
+
Shows: Message-ID, headers, body, attachments.
|
|
53
|
+
--download saves attachments to ~/.gmail-cli/attachments/
|
|
54
|
+
|
|
55
|
+
gmail labels list
|
|
56
|
+
List all labels with ID, name, and type.
|
|
57
|
+
|
|
58
|
+
gmail labels <threadIds...> [--add L] [--remove L]
|
|
59
|
+
Modify labels on threads (comma-separated for multiple).
|
|
60
|
+
Accepts label names or IDs (names are case-insensitive).
|
|
61
|
+
System labels: INBOX, UNREAD, STARRED, IMPORTANT, TRASH, SPAM
|
|
62
|
+
|
|
63
|
+
gmail drafts list
|
|
64
|
+
List all drafts. Returns: draft ID, message ID.
|
|
65
|
+
|
|
66
|
+
gmail drafts get <draftId> [--download]
|
|
67
|
+
View draft with attachments.
|
|
68
|
+
--download saves attachments to ~/.gmail-cli/attachments/
|
|
69
|
+
|
|
70
|
+
gmail url <threadIds...>
|
|
71
|
+
Generate Gmail web URLs for threads.
|
|
72
|
+
Uses canonical URL format with email parameter.
|
|
73
|
+
|
|
74
|
+
RESTRICTED OPERATIONS (will return guidance instead of executing)
|
|
75
|
+
|
|
76
|
+
gmail drafts create - Not permitted: drafts should be created manually
|
|
77
|
+
gmail drafts send - Not permitted: sending requires human review
|
|
78
|
+
gmail drafts delete - Not permitted: deletion requires human confirmation
|
|
79
|
+
gmail send - Not permitted: sending requires human review
|
|
80
|
+
|
|
81
|
+
EXAMPLES
|
|
82
|
+
|
|
83
|
+
gmail config default you@gmail.com
|
|
84
|
+
gmail search "in:inbox is:unread"
|
|
85
|
+
gmail search "from:boss@company.com" --max 50
|
|
86
|
+
gmail thread 19aea1f2f3532db5
|
|
87
|
+
gmail thread 19aea1f2f3532db5 --download
|
|
88
|
+
gmail labels list
|
|
89
|
+
gmail labels abc123 --add Work --remove UNREAD
|
|
90
|
+
gmail url 19aea1f2f3532db5 19aea1f2f3532db6
|
|
91
|
+
|
|
92
|
+
DATA STORAGE
|
|
93
|
+
|
|
94
|
+
~/.gmail-cli/credentials.json OAuth client credentials
|
|
95
|
+
~/.gmail-cli/accounts.json Account tokens
|
|
96
|
+
~/.gmail-cli/config.json CLI configuration (default account)
|
|
97
|
+
~/.gmail-cli/attachments/ Downloaded attachments`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
function error(msg) {
|
|
101
|
+
console.error("Error:", msg);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
function getAccount(args) {
|
|
105
|
+
// Check for --account flag
|
|
106
|
+
const accountIndex = args.indexOf("--account");
|
|
107
|
+
if (accountIndex !== -1 && args[accountIndex + 1]) {
|
|
108
|
+
const account = args[accountIndex + 1];
|
|
109
|
+
const remainingArgs = [...args.slice(0, accountIndex), ...args.slice(accountIndex + 2)];
|
|
110
|
+
return { account, remainingArgs };
|
|
111
|
+
}
|
|
112
|
+
// Use default account
|
|
113
|
+
const defaultAccount = service.getDefaultAccount();
|
|
114
|
+
if (!defaultAccount) {
|
|
115
|
+
error("No default account configured. Run: gmail config default <email>");
|
|
116
|
+
}
|
|
117
|
+
return { account: defaultAccount, remainingArgs: args };
|
|
118
|
+
}
|
|
119
|
+
async function main() {
|
|
120
|
+
const args = process.argv.slice(2);
|
|
121
|
+
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
122
|
+
usage();
|
|
123
|
+
}
|
|
124
|
+
const first = args[0];
|
|
125
|
+
const rest = args.slice(1);
|
|
126
|
+
try {
|
|
127
|
+
// Handle 'accounts' command separately (no email required)
|
|
128
|
+
if (first === "accounts") {
|
|
129
|
+
await handleAccounts(rest);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Handle 'config' command
|
|
133
|
+
if (first === "config") {
|
|
134
|
+
await handleConfig(rest);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// All other commands use account resolution
|
|
138
|
+
const { account, remainingArgs } = getAccount(args);
|
|
139
|
+
const command = remainingArgs[0];
|
|
140
|
+
const commandArgs = remainingArgs.slice(1);
|
|
141
|
+
if (!command) {
|
|
142
|
+
error("Missing command. Use --help for usage.");
|
|
143
|
+
}
|
|
144
|
+
switch (command) {
|
|
145
|
+
case "search":
|
|
146
|
+
await handleSearch(account, commandArgs);
|
|
147
|
+
break;
|
|
148
|
+
case "thread":
|
|
149
|
+
await handleThread(account, commandArgs);
|
|
150
|
+
break;
|
|
151
|
+
case "labels":
|
|
152
|
+
await handleLabels(account, commandArgs);
|
|
153
|
+
break;
|
|
154
|
+
case "drafts":
|
|
155
|
+
await handleDrafts(account, commandArgs);
|
|
156
|
+
break;
|
|
157
|
+
case "send":
|
|
158
|
+
handleRestrictedSend();
|
|
159
|
+
break;
|
|
160
|
+
case "url":
|
|
161
|
+
handleUrl(account, commandArgs);
|
|
162
|
+
break;
|
|
163
|
+
default:
|
|
164
|
+
error(`Unknown command: ${command}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
if (e instanceof RestrictedOperationError) {
|
|
169
|
+
console.error(e.message);
|
|
170
|
+
process.exit(2);
|
|
171
|
+
}
|
|
172
|
+
error(e instanceof Error ? e.message : String(e));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function handleConfig(args) {
|
|
176
|
+
const action = args[0];
|
|
177
|
+
if (!action)
|
|
178
|
+
error("Missing action: default|show");
|
|
179
|
+
switch (action) {
|
|
180
|
+
case "default": {
|
|
181
|
+
const email = args[1];
|
|
182
|
+
if (!email)
|
|
183
|
+
error("Usage: gmail config default <email>");
|
|
184
|
+
// Verify the account exists
|
|
185
|
+
const accounts = service.listAccounts();
|
|
186
|
+
const exists = accounts.some((a) => a.email === email);
|
|
187
|
+
if (!exists) {
|
|
188
|
+
error(`Account '${email}' not found. Add it first with: gmail accounts add ${email}`);
|
|
189
|
+
}
|
|
190
|
+
service.setDefaultAccount(email);
|
|
191
|
+
console.log(`Default account set to: ${email}`);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
case "show": {
|
|
195
|
+
const defaultAccount = service.getDefaultAccount();
|
|
196
|
+
console.log("Configuration:");
|
|
197
|
+
console.log(` Default account: ${defaultAccount || "(not set)"}`);
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
default:
|
|
201
|
+
error(`Unknown action: ${action}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function handleAccounts(args) {
|
|
205
|
+
const action = args[0];
|
|
206
|
+
if (!action)
|
|
207
|
+
error("Missing action: list|add|remove|credentials");
|
|
208
|
+
switch (action) {
|
|
209
|
+
case "list": {
|
|
210
|
+
const accounts = service.listAccounts();
|
|
211
|
+
const defaultAccount = service.getDefaultAccount();
|
|
212
|
+
if (accounts.length === 0) {
|
|
213
|
+
console.log("No accounts configured");
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
for (const a of accounts) {
|
|
217
|
+
const isDefault = a.email === defaultAccount ? " (default)" : "";
|
|
218
|
+
console.log(`${a.email}${isDefault}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case "credentials": {
|
|
224
|
+
const credFile = args[1];
|
|
225
|
+
if (!credFile)
|
|
226
|
+
error("Usage: gmail accounts credentials <credentials.json>");
|
|
227
|
+
const creds = JSON.parse(fs.readFileSync(credFile, "utf8"));
|
|
228
|
+
const installed = creds.installed || creds.web;
|
|
229
|
+
if (!installed)
|
|
230
|
+
error("Invalid credentials file");
|
|
231
|
+
service.setCredentials(installed.client_id, installed.client_secret);
|
|
232
|
+
console.log("Credentials saved");
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case "add": {
|
|
236
|
+
const manual = args.includes("--manual");
|
|
237
|
+
const filtered = args.slice(1).filter((a) => a !== "--manual");
|
|
238
|
+
const email = filtered[0];
|
|
239
|
+
if (!email)
|
|
240
|
+
error("Usage: gmail accounts add <email> [--manual]");
|
|
241
|
+
const creds = service.getCredentials();
|
|
242
|
+
if (!creds)
|
|
243
|
+
error("No credentials configured. Run: gmail accounts credentials <credentials.json>");
|
|
244
|
+
await service.addGmailAccount(email, creds.clientId, creds.clientSecret, manual);
|
|
245
|
+
console.log(`Account '${email}' added`);
|
|
246
|
+
// Set as default if it's the first account
|
|
247
|
+
const accounts = service.listAccounts();
|
|
248
|
+
if (accounts.length === 1) {
|
|
249
|
+
service.setDefaultAccount(email);
|
|
250
|
+
console.log(`Set as default account`);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
case "remove": {
|
|
255
|
+
const email = args[1];
|
|
256
|
+
if (!email)
|
|
257
|
+
error("Usage: gmail accounts remove <email>");
|
|
258
|
+
const deleted = service.deleteAccount(email);
|
|
259
|
+
console.log(deleted ? `Removed '${email}'` : `Not found: ${email}`);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
default:
|
|
263
|
+
error(`Unknown action: ${action}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async function handleSearch(account, args) {
|
|
267
|
+
const { values, positionals } = parseArgs({
|
|
268
|
+
args,
|
|
269
|
+
options: {
|
|
270
|
+
max: { type: "string", short: "m" },
|
|
271
|
+
page: { type: "string", short: "p" },
|
|
272
|
+
},
|
|
273
|
+
allowPositionals: true,
|
|
274
|
+
});
|
|
275
|
+
const query = positionals.join(" ");
|
|
276
|
+
if (!query)
|
|
277
|
+
error("Usage: gmail search <query>");
|
|
278
|
+
const results = await service.searchThreads(account, query, Number(values.max) || 10, values.page);
|
|
279
|
+
const { idToName } = await service.getLabelMap(account);
|
|
280
|
+
if (results.threads.length === 0) {
|
|
281
|
+
console.log("No results");
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log("ID\tDATE\tFROM\tSUBJECT\tLABELS");
|
|
285
|
+
for (const t of results.threads) {
|
|
286
|
+
const msg = t.messages[0];
|
|
287
|
+
const date = msg?.date ? new Date(msg.date).toISOString().slice(0, 16).replace("T", " ") : "";
|
|
288
|
+
const from = msg?.from?.replace(/\t/g, " ") || "";
|
|
289
|
+
const subject = msg?.subject?.replace(/\t/g, " ") || "(no subject)";
|
|
290
|
+
const labels = msg?.labelIds?.map((id) => idToName.get(id) || id).join(",") || "";
|
|
291
|
+
console.log(`${t.id}\t${date}\t${from}\t${subject}\t${labels}`);
|
|
292
|
+
}
|
|
293
|
+
if (results.nextPageToken) {
|
|
294
|
+
console.log(`\n# Next page: --page ${results.nextPageToken}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async function handleThread(account, args) {
|
|
299
|
+
const download = args.includes("--download");
|
|
300
|
+
const filtered = args.filter((a) => a !== "--download");
|
|
301
|
+
const threadId = filtered[0];
|
|
302
|
+
if (!threadId)
|
|
303
|
+
error("Usage: gmail thread <threadId>");
|
|
304
|
+
const result = await service.getThread(account, threadId, download);
|
|
305
|
+
if (download) {
|
|
306
|
+
const attachments = result;
|
|
307
|
+
if (attachments.length === 0) {
|
|
308
|
+
console.log("No attachments");
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
console.log("FILENAME\tPATH\tSIZE");
|
|
312
|
+
for (const a of attachments) {
|
|
313
|
+
console.log(`${a.filename}\t${a.path}\t${a.size}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
const thread = result;
|
|
319
|
+
for (const msg of thread.messages || []) {
|
|
320
|
+
const headers = msg.payload?.headers || [];
|
|
321
|
+
const getHeader = (name) => headers.find((h) => h.name?.toLowerCase() === name.toLowerCase())?.value || "";
|
|
322
|
+
console.log(`Message-ID: ${msg.id}`);
|
|
323
|
+
console.log(`From: ${getHeader("from")}`);
|
|
324
|
+
console.log(`To: ${getHeader("to")}`);
|
|
325
|
+
console.log(`Date: ${getHeader("date")}`);
|
|
326
|
+
console.log(`Subject: ${getHeader("subject")}`);
|
|
327
|
+
console.log("");
|
|
328
|
+
console.log(decodeBody(msg.payload));
|
|
329
|
+
console.log("");
|
|
330
|
+
const attachments = getAttachments(msg.payload);
|
|
331
|
+
if (attachments.length > 0) {
|
|
332
|
+
console.log("Attachments:");
|
|
333
|
+
for (const att of attachments) {
|
|
334
|
+
console.log(` - ${att.filename} (${formatSize(att.size)}, ${att.mimeType})`);
|
|
335
|
+
}
|
|
336
|
+
console.log("");
|
|
337
|
+
}
|
|
338
|
+
console.log("---");
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
function formatSize(bytes) {
|
|
343
|
+
if (bytes === 0)
|
|
344
|
+
return "0 B";
|
|
345
|
+
const units = ["B", "KB", "MB", "GB"];
|
|
346
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
347
|
+
return `${(bytes / 1024 ** i).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
|
|
348
|
+
}
|
|
349
|
+
function decodeBody(payload) {
|
|
350
|
+
if (!payload)
|
|
351
|
+
return "";
|
|
352
|
+
if (payload.body?.data) {
|
|
353
|
+
return Buffer.from(payload.body.data, "base64url").toString();
|
|
354
|
+
}
|
|
355
|
+
if (payload.parts) {
|
|
356
|
+
for (const part of payload.parts) {
|
|
357
|
+
if (part.mimeType === "text/plain" && part.body?.data) {
|
|
358
|
+
return Buffer.from(part.body.data, "base64url").toString();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
for (const part of payload.parts) {
|
|
362
|
+
const nested = decodeBody(part);
|
|
363
|
+
if (nested)
|
|
364
|
+
return nested;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return "";
|
|
368
|
+
}
|
|
369
|
+
function getAttachments(payload) {
|
|
370
|
+
const attachments = [];
|
|
371
|
+
if (!payload?.parts)
|
|
372
|
+
return attachments;
|
|
373
|
+
for (const part of payload.parts) {
|
|
374
|
+
if (part.filename && part.body?.attachmentId) {
|
|
375
|
+
attachments.push({
|
|
376
|
+
filename: part.filename,
|
|
377
|
+
size: part.body.size || 0,
|
|
378
|
+
mimeType: part.mimeType || "application/octet-stream",
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
attachments.push(...getAttachments(part));
|
|
382
|
+
}
|
|
383
|
+
return attachments;
|
|
384
|
+
}
|
|
385
|
+
async function handleLabels(account, args) {
|
|
386
|
+
const { values, positionals } = parseArgs({
|
|
387
|
+
args,
|
|
388
|
+
options: {
|
|
389
|
+
add: { type: "string", short: "a" },
|
|
390
|
+
remove: { type: "string", short: "r" },
|
|
391
|
+
},
|
|
392
|
+
allowPositionals: true,
|
|
393
|
+
});
|
|
394
|
+
if (positionals.length === 0) {
|
|
395
|
+
error("Usage: gmail labels list | gmail labels <threadIds...> [--add L] [--remove L]");
|
|
396
|
+
}
|
|
397
|
+
// labels list
|
|
398
|
+
if (positionals[0] === "list") {
|
|
399
|
+
const labels = await service.listLabels(account);
|
|
400
|
+
console.log("ID\tNAME\tTYPE");
|
|
401
|
+
for (const l of labels) {
|
|
402
|
+
console.log(`${l.id}\t${l.name}\t${l.type}`);
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// labels <threadIds...> [--add] [--remove]
|
|
407
|
+
const threadIds = positionals;
|
|
408
|
+
const { nameToId } = await service.getLabelMap(account);
|
|
409
|
+
const addLabels = values.add ? service.resolveLabelIds(values.add.split(","), nameToId) : [];
|
|
410
|
+
const removeLabels = values.remove ? service.resolveLabelIds(values.remove.split(","), nameToId) : [];
|
|
411
|
+
const results = await service.modifyLabels(account, threadIds, addLabels, removeLabels);
|
|
412
|
+
for (const r of results) {
|
|
413
|
+
console.log(`${r.threadId}: ${r.success ? "ok" : r.error}`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// Restricted operation handlers with clear guidance
|
|
417
|
+
function handleRestrictedSend() {
|
|
418
|
+
throw new RestrictedOperationError("Sending emails is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
|
|
419
|
+
|
|
420
|
+
To send an email, you should:
|
|
421
|
+
1. Open the thread in Gmail using: gmail url <threadId>
|
|
422
|
+
2. Compose and send the email manually in the Gmail web interface
|
|
423
|
+
|
|
424
|
+
This restriction ensures human review before any outbound communication.`);
|
|
425
|
+
}
|
|
426
|
+
function handleRestrictedDraftCreate() {
|
|
427
|
+
throw new RestrictedOperationError("Creating drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
|
|
428
|
+
|
|
429
|
+
To create a draft:
|
|
430
|
+
1. Open Gmail directly in your browser
|
|
431
|
+
2. Compose the draft manually
|
|
432
|
+
|
|
433
|
+
Drafts created programmatically bypass human review of the content.`);
|
|
434
|
+
}
|
|
435
|
+
function handleRestrictedDraftSend() {
|
|
436
|
+
throw new RestrictedOperationError("Sending drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
|
|
437
|
+
|
|
438
|
+
To send a draft:
|
|
439
|
+
1. Open Gmail directly in your browser
|
|
440
|
+
2. Review the draft content
|
|
441
|
+
3. Send it manually after verification
|
|
442
|
+
|
|
443
|
+
This restriction ensures human review before any outbound communication.`);
|
|
444
|
+
}
|
|
445
|
+
function handleRestrictedDraftDelete() {
|
|
446
|
+
throw new RestrictedOperationError("Deleting drafts is not permitted via this CLI.", `This CLI is configured for read-only email access with label management only.
|
|
447
|
+
|
|
448
|
+
To delete a draft:
|
|
449
|
+
1. Open Gmail directly in your browser
|
|
450
|
+
2. Navigate to Drafts
|
|
451
|
+
3. Delete the draft manually after confirmation
|
|
452
|
+
|
|
453
|
+
This restriction prevents accidental data loss.`);
|
|
454
|
+
}
|
|
455
|
+
async function handleDrafts(account, args) {
|
|
456
|
+
const action = args[0];
|
|
457
|
+
const rest = args.slice(1);
|
|
458
|
+
if (!action)
|
|
459
|
+
error("Usage: gmail drafts <action>");
|
|
460
|
+
switch (action) {
|
|
461
|
+
case "list": {
|
|
462
|
+
const drafts = await service.listDrafts(account);
|
|
463
|
+
if (drafts.length === 0) {
|
|
464
|
+
console.log("No drafts");
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
console.log("ID\tMESSAGE_ID");
|
|
468
|
+
for (const d of drafts) {
|
|
469
|
+
console.log(`${d.id}\t${d.message?.id || ""}`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
case "get": {
|
|
475
|
+
const download = rest.includes("--download");
|
|
476
|
+
const filtered = rest.filter((a) => a !== "--download");
|
|
477
|
+
const draftId = filtered[0];
|
|
478
|
+
if (!draftId)
|
|
479
|
+
error("Usage: gmail drafts get <draftId> [--download]");
|
|
480
|
+
const draft = await service.getDraft(account, draftId);
|
|
481
|
+
const msg = draft.message;
|
|
482
|
+
if (msg) {
|
|
483
|
+
if (download) {
|
|
484
|
+
const downloaded = await service.downloadMessageAttachments(account, msg.id);
|
|
485
|
+
if (downloaded.length === 0) {
|
|
486
|
+
console.log("No attachments");
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
console.log("FILENAME\tPATH\tSIZE");
|
|
490
|
+
for (const a of downloaded) {
|
|
491
|
+
console.log(`${a.filename}\t${a.path}\t${a.size}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
const headers = msg.payload?.headers || [];
|
|
497
|
+
const getHeader = (name) => headers.find((h) => h.name?.toLowerCase() === name.toLowerCase())?.value || "";
|
|
498
|
+
console.log(`Draft-ID: ${draft.id}`);
|
|
499
|
+
console.log(`To: ${getHeader("to")}`);
|
|
500
|
+
console.log(`Cc: ${getHeader("cc")}`);
|
|
501
|
+
console.log(`Subject: ${getHeader("subject")}`);
|
|
502
|
+
console.log("");
|
|
503
|
+
console.log(decodeBody(msg.payload));
|
|
504
|
+
console.log("");
|
|
505
|
+
const attachments = getAttachments(msg.payload);
|
|
506
|
+
if (attachments.length > 0) {
|
|
507
|
+
console.log("Attachments:");
|
|
508
|
+
for (const att of attachments) {
|
|
509
|
+
console.log(` - ${att.filename} (${formatSize(att.size)}, ${att.mimeType})`);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
break;
|
|
515
|
+
}
|
|
516
|
+
case "delete":
|
|
517
|
+
handleRestrictedDraftDelete();
|
|
518
|
+
break;
|
|
519
|
+
case "send":
|
|
520
|
+
handleRestrictedDraftSend();
|
|
521
|
+
break;
|
|
522
|
+
case "create":
|
|
523
|
+
handleRestrictedDraftCreate();
|
|
524
|
+
break;
|
|
525
|
+
default:
|
|
526
|
+
error(`Unknown action: ${action}`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function handleUrl(account, args) {
|
|
530
|
+
if (args.length === 0) {
|
|
531
|
+
error("Usage: gmail url <threadIds...>");
|
|
532
|
+
}
|
|
533
|
+
for (const id of args) {
|
|
534
|
+
const url = `https://mail.google.com/mail/?authuser=${encodeURIComponent(account)}#all/${id}`;
|
|
535
|
+
console.log(`${id}\t${url}`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
main();
|
|
539
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;AAEnC,+CAA+C;AAC/C,MAAM,wBAAyB,SAAQ,KAAK;IAC3C,YAAY,SAAiB,EAAE,QAAgB;QAC9C,KAAK,CAAC,eAAe,SAAS,OAAO,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACxC,CAAC;CACD;AAED,SAAS,KAAK;IACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAmF4C,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IACjC,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QACxF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;IAED,sBAAsB;IACtB,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,KAAK,EAAE,CAAC;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC;QACJ,2DAA2D;QAC3D,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACR,CAAC;QAED,0BAA0B;QAC1B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO;QACR,CAAC;QAED,4CAA4C;QAC5C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACjD,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACZ,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,QAAQ;gBACZ,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,QAAQ;gBACZ,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,QAAQ;gBACZ,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,MAAM;gBACV,oBAAoB,EAAE,CAAC;gBACvB,MAAM;YACP,KAAK,KAAK;gBACT,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAChC,MAAM;YACP;gBACC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,wBAAwB,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAEnD,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,SAAS,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,KAAK,CAAC,YAAY,KAAK,sDAAsD,KAAK,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YAChD,MAAM;QACP,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,cAAc,IAAI,WAAW,EAAE,CAAC,CAAC;YACnE,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAElE,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACP,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC,CAAC;gBACvC,CAAC;YACF,CAAC;YACD,MAAM;QACP,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,SAAS;gBAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAClD,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,MAAM;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACnG,MAAM,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;YAExC,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACvC,CAAC;YACD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAc;IAC1D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACzC,IAAI;QACJ,OAAO,EAAE;YACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACnC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;SACpC;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACnG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAExD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,cAAc,CAAC;YACpE,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAc;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,QAAQ;QAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpE,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,WAAW,GAAG,MAAe,CAAC;QACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;QACF,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,MAAM,GAAG,MAAa,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAC/E,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,OAAY;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;gBACvD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5D,CAAC;QACF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAQD,SAAS,cAAc,CAAC,OAAY;IACnC,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,KAAK;QAAE,OAAO,WAAW,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;YAC9C,WAAW,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,0BAA0B;aACrD,CAAC,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAc;IAC1D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACzC,IAAI;QACJ,OAAO,EAAE;YACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACnC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACxF,CAAC;IAED,cAAc;IACd,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO;IACR,CAAC;IAED,2CAA2C;IAC3C,MAAM,SAAS,GAAG,WAAW,CAAC;IAE9B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtG,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAExF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,oDAAoD;AACpD,SAAS,oBAAoB;IAC5B,MAAM,IAAI,wBAAwB,CACjC,+CAA+C,EAC/C;;;;;;yEAMuE,CACvE,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B;IACnC,MAAM,IAAI,wBAAwB,CACjC,gDAAgD,EAChD;;;;;;oEAMkE,CAClE,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB;IACjC,MAAM,IAAI,wBAAwB,CACjC,+CAA+C,EAC/C;;;;;;;yEAOuE,CACvE,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B;IACnC,MAAM,IAAI,wBAAwB,CACjC,gDAAgD,EAChD;;;;;;;gDAO8C,CAC9C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAc;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAEnD,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBAChD,CAAC;YACF,CAAC;YACD,MAAM;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACT,IAAI,QAAQ,EAAE,CAAC;oBACd,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC;oBAC9E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;wBACpC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;4BAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBACpD,CAAC;oBACF,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;oBACrF,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;wBAC5B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;4BAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;wBAC/E,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;YACD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ;YACZ,2BAA2B,EAAE,CAAC;YAC9B,MAAM;QACP,KAAK,MAAM;YACV,yBAAyB,EAAE,CAAC;YAC5B,MAAM;QACP,KAAK,QAAQ;YACZ,2BAA2B,EAAE,CAAC;YAC9B,MAAM;QACP;YACC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,IAAc;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,0CAA0C,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class GmailOAuthFlow {
|
|
2
|
+
private oauth2Client;
|
|
3
|
+
private server;
|
|
4
|
+
private timeoutId;
|
|
5
|
+
constructor(clientId: string, clientSecret: string);
|
|
6
|
+
authorize(manual?: boolean): Promise<string>;
|
|
7
|
+
private startManualFlow;
|
|
8
|
+
private startAuthFlow;
|
|
9
|
+
private handleCallback;
|
|
10
|
+
private cleanup;
|
|
11
|
+
private openBrowser;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=gmail-oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-oauth-flow.d.ts","sourceRoot":"","sources":["../src/gmail-oauth-flow.ts"],"names":[],"mappings":"AAoBA,qBAAa,cAAc;IAC1B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAA+B;gBAEpC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAI5C,SAAS,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;YAWlC,eAAe;IAqC7B,OAAO,CAAC,aAAa;YA8CP,cAAc;IAmC5B,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,WAAW;CAInB"}
|