@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.
@@ -0,0 +1,477 @@
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ import { OAuth2Client } from "google-auth-library";
5
+ import { google } from "googleapis";
6
+ import { AccountStorage } from "./account-storage.js";
7
+ import { GmailOAuthFlow } from "./gmail-oauth-flow.js";
8
+ export class GmailService {
9
+ accountStorage = new AccountStorage();
10
+ gmailClients = new Map();
11
+ async addGmailAccount(email, clientId, clientSecret, manual = false) {
12
+ if (this.accountStorage.hasAccount(email)) {
13
+ throw new Error(`Account '${email}' already exists`);
14
+ }
15
+ const oauthFlow = new GmailOAuthFlow(clientId, clientSecret);
16
+ const refreshToken = await oauthFlow.authorize(manual);
17
+ const account = {
18
+ email,
19
+ oauth2: { clientId, clientSecret, refreshToken },
20
+ };
21
+ this.accountStorage.addAccount(account);
22
+ }
23
+ deleteAccount(email) {
24
+ this.gmailClients.delete(email);
25
+ return this.accountStorage.deleteAccount(email);
26
+ }
27
+ listAccounts() {
28
+ return this.accountStorage.getAllAccounts();
29
+ }
30
+ setCredentials(clientId, clientSecret) {
31
+ this.accountStorage.setCredentials(clientId, clientSecret);
32
+ }
33
+ getCredentials() {
34
+ return this.accountStorage.getCredentials();
35
+ }
36
+ setDefaultAccount(email) {
37
+ this.accountStorage.setDefaultAccount(email);
38
+ }
39
+ getDefaultAccount() {
40
+ return this.accountStorage.getDefaultAccount();
41
+ }
42
+ getGmailClient(email) {
43
+ if (!this.gmailClients.has(email)) {
44
+ const account = this.accountStorage.getAccount(email);
45
+ if (!account) {
46
+ throw new Error(`Account '${email}' not found`);
47
+ }
48
+ const oauth2Client = new OAuth2Client(account.oauth2.clientId, account.oauth2.clientSecret, "http://localhost");
49
+ oauth2Client.setCredentials({
50
+ refresh_token: account.oauth2.refreshToken,
51
+ access_token: account.oauth2.accessToken,
52
+ });
53
+ const gmail = google.gmail({ version: "v1", auth: oauth2Client });
54
+ this.gmailClients.set(email, gmail);
55
+ }
56
+ return this.gmailClients.get(email);
57
+ }
58
+ async searchThreads(email, query, maxResults = 10, pageToken) {
59
+ const gmail = this.getGmailClient(email);
60
+ const response = await gmail.users.threads.list({
61
+ userId: "me",
62
+ q: query,
63
+ maxResults,
64
+ pageToken,
65
+ });
66
+ const threads = response.data.threads || [];
67
+ const detailedThreads = [];
68
+ for (const thread of threads) {
69
+ const detail = (await this.getThread(email, thread.id, false));
70
+ detailedThreads.push(detail);
71
+ }
72
+ return {
73
+ threads: detailedThreads.map((thread) => ({
74
+ id: thread.id || "",
75
+ historyId: thread.historyId || "",
76
+ messages: (thread.messages || []).map((msg) => ({
77
+ id: msg.id || "",
78
+ threadId: msg.threadId || "",
79
+ labelIds: msg.labelIds || [],
80
+ snippet: msg.snippet || "",
81
+ historyId: msg.historyId || "",
82
+ internalDate: msg.internalDate || "",
83
+ from: this.getHeaderValue(msg, "from"),
84
+ to: this.getHeaderValue(msg, "to"),
85
+ subject: this.getHeaderValue(msg, "subject"),
86
+ date: this.getHeaderValue(msg, "date"),
87
+ hasAttachments: msg.payload?.parts?.some((part) => part.filename && part.filename.length > 0) || false,
88
+ })),
89
+ })),
90
+ nextPageToken: response.data.nextPageToken,
91
+ };
92
+ }
93
+ async getThread(email, threadId, downloadAttachments = false) {
94
+ const gmail = this.getGmailClient(email);
95
+ const response = await gmail.users.threads.get({
96
+ userId: "me",
97
+ id: threadId,
98
+ });
99
+ const thread = response.data;
100
+ if (!downloadAttachments) {
101
+ return thread;
102
+ }
103
+ const attachmentsToDownload = [];
104
+ for (const message of thread.messages || []) {
105
+ if (message.payload?.parts) {
106
+ for (const part of message.payload.parts) {
107
+ if (part.body?.attachmentId && part.filename) {
108
+ attachmentsToDownload.push({
109
+ messageId: message.id,
110
+ attachmentId: part.body.attachmentId,
111
+ filename: part.filename,
112
+ size: part.body.size || 0,
113
+ mimeType: part.mimeType || "application/octet-stream",
114
+ });
115
+ }
116
+ }
117
+ }
118
+ }
119
+ const downloadResults = await this.downloadAttachments(email, attachmentsToDownload.map((att) => ({
120
+ messageId: att.messageId,
121
+ attachmentId: att.attachmentId,
122
+ filename: att.filename,
123
+ })));
124
+ const downloadedAttachments = [];
125
+ for (let i = 0; i < attachmentsToDownload.length; i++) {
126
+ const attachment = attachmentsToDownload[i];
127
+ const result = downloadResults[i];
128
+ if (result.success && result.path) {
129
+ downloadedAttachments.push({
130
+ messageId: attachment.messageId,
131
+ filename: attachment.filename,
132
+ path: result.path,
133
+ size: attachment.size,
134
+ mimeType: attachment.mimeType,
135
+ cached: result.cached || false,
136
+ });
137
+ }
138
+ }
139
+ return downloadedAttachments;
140
+ }
141
+ async downloadAttachments(email, attachments) {
142
+ const gmail = this.getGmailClient(email);
143
+ const results = [];
144
+ const attachmentDir = path.join(os.homedir(), ".gmail-cli", "attachments");
145
+ if (!fs.existsSync(attachmentDir)) {
146
+ fs.mkdirSync(attachmentDir, { recursive: true });
147
+ }
148
+ for (const attachment of attachments) {
149
+ try {
150
+ const shortAttachmentId = attachment.attachmentId.substring(0, 8);
151
+ const filename = `${attachment.messageId}_${shortAttachmentId}_${attachment.filename}`;
152
+ const filePath = path.join(attachmentDir, filename);
153
+ if (fs.existsSync(filePath)) {
154
+ const existingSize = fs.statSync(filePath).size;
155
+ const attachmentInfo = await gmail.users.messages.attachments.get({
156
+ userId: "me",
157
+ messageId: attachment.messageId,
158
+ id: attachment.attachmentId,
159
+ });
160
+ if (existingSize === attachmentInfo.data.size) {
161
+ results.push({ success: true, filename: attachment.filename, path: filePath, cached: true });
162
+ continue;
163
+ }
164
+ }
165
+ const response = await gmail.users.messages.attachments.get({
166
+ userId: "me",
167
+ messageId: attachment.messageId,
168
+ id: attachment.attachmentId,
169
+ });
170
+ const data = Buffer.from(response.data.data, "base64url");
171
+ fs.writeFileSync(filePath, data);
172
+ results.push({ success: true, filename: attachment.filename, path: filePath, cached: false });
173
+ }
174
+ catch (e) {
175
+ results.push({
176
+ success: false,
177
+ filename: attachment.filename,
178
+ error: e instanceof Error ? e.message : String(e),
179
+ });
180
+ }
181
+ }
182
+ return results;
183
+ }
184
+ async modifyLabels(email, threadIds, addLabels = [], removeLabels = []) {
185
+ const gmail = this.getGmailClient(email);
186
+ const results = [];
187
+ for (const threadId of threadIds) {
188
+ try {
189
+ if (addLabels.length > 0) {
190
+ await gmail.users.threads.modify({
191
+ userId: "me",
192
+ id: threadId,
193
+ requestBody: { addLabelIds: addLabels },
194
+ });
195
+ }
196
+ if (removeLabels.length > 0) {
197
+ await gmail.users.threads.modify({
198
+ userId: "me",
199
+ id: threadId,
200
+ requestBody: { removeLabelIds: removeLabels },
201
+ });
202
+ }
203
+ results.push({ threadId, success: true });
204
+ }
205
+ catch (e) {
206
+ results.push({ threadId, success: false, error: e instanceof Error ? e.message : String(e) });
207
+ }
208
+ }
209
+ return results;
210
+ }
211
+ async listDrafts(email) {
212
+ const gmail = this.getGmailClient(email);
213
+ const response = await gmail.users.drafts.list({ userId: "me" });
214
+ return response.data.drafts || [];
215
+ }
216
+ async listLabels(email) {
217
+ const gmail = this.getGmailClient(email);
218
+ const response = await gmail.users.labels.list({ userId: "me" });
219
+ return (response.data.labels || []).map((l) => ({
220
+ id: l.id || "",
221
+ name: l.name || "",
222
+ type: l.type || "",
223
+ }));
224
+ }
225
+ async getLabelMap(email) {
226
+ const labels = await this.listLabels(email);
227
+ const idToName = new Map();
228
+ const nameToId = new Map();
229
+ for (const l of labels) {
230
+ idToName.set(l.id, l.name);
231
+ nameToId.set(l.name.toLowerCase(), l.id);
232
+ }
233
+ return { idToName, nameToId };
234
+ }
235
+ resolveLabelIds(labels, nameToId) {
236
+ return labels.map((l) => nameToId.get(l.toLowerCase()) || l);
237
+ }
238
+ async createDraft(email, to, subject, body, options = {}) {
239
+ const gmail = this.getGmailClient(email);
240
+ let inReplyTo;
241
+ let references;
242
+ let threadId = options.threadId;
243
+ // If replying to a specific message, fetch its headers
244
+ if (options.replyToMessageId) {
245
+ const msg = await gmail.users.messages.get({
246
+ userId: "me",
247
+ id: options.replyToMessageId,
248
+ format: "metadata",
249
+ metadataHeaders: ["Message-ID", "References"],
250
+ });
251
+ const headers = msg.data.payload?.headers || [];
252
+ const messageId = headers.find((h) => h.name === "Message-ID")?.value;
253
+ const existingRefs = headers.find((h) => h.name === "References")?.value;
254
+ if (messageId) {
255
+ inReplyTo = messageId;
256
+ references = existingRefs ? `${existingRefs} ${messageId}` : messageId;
257
+ }
258
+ threadId = threadId || msg.data.threadId;
259
+ }
260
+ const hasAttachments = options.attachments && options.attachments.length > 0;
261
+ const boundary = `boundary_${Date.now()}_${Math.random().toString(36).slice(2)}`;
262
+ const headers = [
263
+ `From: ${email}`,
264
+ `To: ${to.join(", ")}`,
265
+ options.cc?.length ? `Cc: ${options.cc.join(", ")}` : "",
266
+ options.bcc?.length ? `Bcc: ${options.bcc.join(", ")}` : "",
267
+ `Subject: ${subject}`,
268
+ inReplyTo ? `In-Reply-To: ${inReplyTo}` : "",
269
+ references ? `References: ${references}` : "",
270
+ "MIME-Version: 1.0",
271
+ hasAttachments
272
+ ? `Content-Type: multipart/mixed; boundary="${boundary}"`
273
+ : "Content-Type: text/plain; charset=UTF-8",
274
+ ].filter(Boolean);
275
+ let emailContent;
276
+ if (hasAttachments) {
277
+ const parts = [];
278
+ // Text body part
279
+ parts.push(`--${boundary}\r\n` + "Content-Type: text/plain; charset=UTF-8\r\n\r\n" + body);
280
+ // Attachment parts
281
+ for (const filePath of options.attachments) {
282
+ const filename = path.basename(filePath);
283
+ const fileContent = fs.readFileSync(filePath);
284
+ const base64Content = fileContent.toString("base64");
285
+ const mimeType = this.getMimeType(filename);
286
+ parts.push(`--${boundary}\r\n` +
287
+ `Content-Type: ${mimeType}\r\n` +
288
+ "Content-Transfer-Encoding: base64\r\n" +
289
+ `Content-Disposition: attachment; filename="${filename}"\r\n\r\n` +
290
+ base64Content);
291
+ }
292
+ emailContent = headers.join("\r\n") + "\r\n\r\n" + parts.join("\r\n") + `\r\n--${boundary}--`;
293
+ }
294
+ else {
295
+ emailContent = headers.join("\r\n") + "\r\n\r\n" + body;
296
+ }
297
+ const encodedEmail = Buffer.from(emailContent).toString("base64url");
298
+ const response = await gmail.users.drafts.create({
299
+ userId: "me",
300
+ requestBody: {
301
+ message: { raw: encodedEmail, threadId },
302
+ },
303
+ });
304
+ return response.data;
305
+ }
306
+ getMimeType(filename) {
307
+ const ext = path.extname(filename).toLowerCase();
308
+ const mimeTypes = {
309
+ ".pdf": "application/pdf",
310
+ ".doc": "application/msword",
311
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
312
+ ".xls": "application/vnd.ms-excel",
313
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
314
+ ".png": "image/png",
315
+ ".jpg": "image/jpeg",
316
+ ".jpeg": "image/jpeg",
317
+ ".gif": "image/gif",
318
+ ".txt": "text/plain",
319
+ ".html": "text/html",
320
+ ".zip": "application/zip",
321
+ ".json": "application/json",
322
+ };
323
+ return mimeTypes[ext] || "application/octet-stream";
324
+ }
325
+ async updateDraft(email, draftId, body) {
326
+ const gmail = this.getGmailClient(email);
327
+ const draft = await this.getDraft(email, draftId);
328
+ const message = draft.message;
329
+ if (!message)
330
+ throw new Error("Draft message not found");
331
+ const existingRaw = message.raw ? Buffer.from(message.raw, "base64url").toString() : "";
332
+ const headerEnd = existingRaw.indexOf("\n\n");
333
+ const headers = headerEnd > 0 ? existingRaw.substring(0, headerEnd) : "";
334
+ const updatedEmail = `${headers}\n\n${body}`;
335
+ const encodedEmail = Buffer.from(updatedEmail).toString("base64url");
336
+ const response = await gmail.users.drafts.update({
337
+ userId: "me",
338
+ id: draftId,
339
+ requestBody: {
340
+ message: { raw: encodedEmail, threadId: message.threadId },
341
+ },
342
+ });
343
+ return response.data;
344
+ }
345
+ async getDraft(email, draftId) {
346
+ const gmail = this.getGmailClient(email);
347
+ const response = await gmail.users.drafts.get({ userId: "me", id: draftId });
348
+ return response.data;
349
+ }
350
+ async deleteDraft(email, draftId) {
351
+ const gmail = this.getGmailClient(email);
352
+ await gmail.users.drafts.delete({ userId: "me", id: draftId });
353
+ }
354
+ async sendDraft(email, draftId) {
355
+ const gmail = this.getGmailClient(email);
356
+ const response = await gmail.users.drafts.send({
357
+ userId: "me",
358
+ requestBody: { id: draftId },
359
+ });
360
+ return response.data.message;
361
+ }
362
+ async sendMessage(email, to, subject, body, options = {}) {
363
+ const gmail = this.getGmailClient(email);
364
+ let inReplyTo;
365
+ let references;
366
+ let threadId;
367
+ // If replying to a specific message, fetch its headers
368
+ if (options.replyToMessageId) {
369
+ const msg = await gmail.users.messages.get({
370
+ userId: "me",
371
+ id: options.replyToMessageId,
372
+ format: "metadata",
373
+ metadataHeaders: ["Message-ID", "References"],
374
+ });
375
+ const headers = msg.data.payload?.headers || [];
376
+ const messageId = headers.find((h) => h.name === "Message-ID")?.value;
377
+ const existingRefs = headers.find((h) => h.name === "References")?.value;
378
+ if (messageId) {
379
+ inReplyTo = messageId;
380
+ references = existingRefs ? `${existingRefs} ${messageId}` : messageId;
381
+ }
382
+ threadId = msg.data.threadId || undefined;
383
+ }
384
+ const hasAttachments = options.attachments && options.attachments.length > 0;
385
+ const boundary = `boundary_${Date.now()}_${Math.random().toString(36).slice(2)}`;
386
+ const headers = [
387
+ `From: ${email}`,
388
+ `To: ${to.join(", ")}`,
389
+ options.cc?.length ? `Cc: ${options.cc.join(", ")}` : "",
390
+ options.bcc?.length ? `Bcc: ${options.bcc.join(", ")}` : "",
391
+ `Subject: ${subject}`,
392
+ inReplyTo ? `In-Reply-To: ${inReplyTo}` : "",
393
+ references ? `References: ${references}` : "",
394
+ "MIME-Version: 1.0",
395
+ hasAttachments
396
+ ? `Content-Type: multipart/mixed; boundary="${boundary}"`
397
+ : "Content-Type: text/plain; charset=UTF-8",
398
+ ].filter(Boolean);
399
+ let emailContent;
400
+ if (hasAttachments) {
401
+ const parts = [];
402
+ // Text body part
403
+ parts.push(`--${boundary}\r\n` + "Content-Type: text/plain; charset=UTF-8\r\n\r\n" + body);
404
+ // Attachment parts
405
+ for (const filePath of options.attachments) {
406
+ const filename = path.basename(filePath);
407
+ const fileContent = fs.readFileSync(filePath);
408
+ const base64Content = fileContent.toString("base64");
409
+ const mimeType = this.getMimeType(filename);
410
+ parts.push(`--${boundary}\r\n` +
411
+ `Content-Type: ${mimeType}\r\n` +
412
+ "Content-Transfer-Encoding: base64\r\n" +
413
+ `Content-Disposition: attachment; filename="${filename}"\r\n\r\n` +
414
+ base64Content);
415
+ }
416
+ emailContent = headers.join("\r\n") + "\r\n\r\n" + parts.join("\r\n") + `\r\n--${boundary}--`;
417
+ }
418
+ else {
419
+ emailContent = headers.join("\r\n") + "\r\n\r\n" + body;
420
+ }
421
+ const encodedEmail = Buffer.from(emailContent).toString("base64url");
422
+ const response = await gmail.users.messages.send({
423
+ userId: "me",
424
+ requestBody: { raw: encodedEmail, threadId },
425
+ });
426
+ return response.data;
427
+ }
428
+ async downloadMessageAttachments(email, messageId) {
429
+ const gmail = this.getGmailClient(email);
430
+ const response = await gmail.users.messages.get({ userId: "me", id: messageId });
431
+ const message = response.data;
432
+ const attachmentsToDownload = [];
433
+ const collectAttachments = (payload) => {
434
+ if (payload?.parts) {
435
+ for (const part of payload.parts) {
436
+ if (part.body?.attachmentId && part.filename) {
437
+ attachmentsToDownload.push({
438
+ messageId,
439
+ attachmentId: part.body.attachmentId,
440
+ filename: part.filename,
441
+ size: part.body.size || 0,
442
+ mimeType: part.mimeType || "application/octet-stream",
443
+ });
444
+ }
445
+ collectAttachments(part);
446
+ }
447
+ }
448
+ };
449
+ collectAttachments(message.payload);
450
+ const downloadResults = await this.downloadAttachments(email, attachmentsToDownload.map((att) => ({
451
+ messageId: att.messageId,
452
+ attachmentId: att.attachmentId,
453
+ filename: att.filename,
454
+ })));
455
+ const downloadedAttachments = [];
456
+ for (let i = 0; i < attachmentsToDownload.length; i++) {
457
+ const attachment = attachmentsToDownload[i];
458
+ const result = downloadResults[i];
459
+ if (result.success && result.path) {
460
+ downloadedAttachments.push({
461
+ messageId: attachment.messageId,
462
+ filename: attachment.filename,
463
+ path: result.path,
464
+ size: attachment.size,
465
+ mimeType: attachment.mimeType,
466
+ cached: result.cached || false,
467
+ });
468
+ }
469
+ }
470
+ return downloadedAttachments;
471
+ }
472
+ getHeaderValue(message, headerName) {
473
+ const header = message.payload?.headers?.find((h) => h.name?.toLowerCase() === headerName.toLowerCase());
474
+ return header?.value || undefined;
475
+ }
476
+ }
477
+ //# sourceMappingURL=gmail-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-service.js","sourceRoot":"","sources":["../src/gmail-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface EmailAccount {
2
+ email: string;
3
+ oauth2: {
4
+ clientId: string;
5
+ clientSecret: string;
6
+ refreshToken: string;
7
+ accessToken?: string;
8
+ };
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACF"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@smcllns/gmail",
3
+ "version": "0.1.1",
4
+ "description": "Minimal Gmail CLI with restricted scopes for Claude Code agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "gmail": "dist/cli.js"
8
+ },
9
+ "main": "./dist/gmail-service.js",
10
+ "types": "./dist/gmail-service.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc && chmod +x dist/cli.js",
16
+ "check": "biome check src/ --write --diagnostic-level=error && tsgo --noEmit",
17
+ "prepublishOnly": "npm run build",
18
+ "prepare": "husky"
19
+ },
20
+ "dependencies": {
21
+ "google-auth-library": "^10.1.0",
22
+ "googleapis": "^153.0.0"
23
+ },
24
+ "devDependencies": {
25
+ "@biomejs/biome": "^1.9.4",
26
+ "@types/node": "^22.10.1",
27
+ "@typescript/native-preview": "^7.0.0-dev.20251204.1",
28
+ "husky": "^9.1.7",
29
+ "typescript": "^5.7.2"
30
+ },
31
+ "keywords": [
32
+ "gmail",
33
+ "email",
34
+ "cli"
35
+ ],
36
+ "author": "",
37
+ "license": "MIT",
38
+ "engines": {
39
+ "node": ">=20.0.0"
40
+ }
41
+ }