@marcfargas/go-easy 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +220 -0
  4. package/dist/auth.d.ts +41 -0
  5. package/dist/auth.d.ts.map +1 -0
  6. package/dist/auth.js +91 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/bin/calendar.d.ts +17 -0
  9. package/dist/bin/calendar.d.ts.map +1 -0
  10. package/dist/bin/calendar.js +162 -0
  11. package/dist/bin/calendar.js.map +1 -0
  12. package/dist/bin/drive.d.ts +18 -0
  13. package/dist/bin/drive.d.ts.map +1 -0
  14. package/dist/bin/drive.js +203 -0
  15. package/dist/bin/drive.js.map +1 -0
  16. package/dist/bin/gmail.d.ts +20 -0
  17. package/dist/bin/gmail.d.ts.map +1 -0
  18. package/dist/bin/gmail.js +171 -0
  19. package/dist/bin/gmail.js.map +1 -0
  20. package/dist/calendar/helpers.d.ts +23 -0
  21. package/dist/calendar/helpers.d.ts.map +1 -0
  22. package/dist/calendar/helpers.js +69 -0
  23. package/dist/calendar/helpers.js.map +1 -0
  24. package/dist/calendar/index.d.ts +64 -0
  25. package/dist/calendar/index.d.ts.map +1 -0
  26. package/dist/calendar/index.js +202 -0
  27. package/dist/calendar/index.js.map +1 -0
  28. package/dist/calendar/types.d.ts +107 -0
  29. package/dist/calendar/types.d.ts.map +1 -0
  30. package/dist/calendar/types.js +5 -0
  31. package/dist/calendar/types.js.map +1 -0
  32. package/dist/drive/helpers.d.ts +22 -0
  33. package/dist/drive/helpers.d.ts.map +1 -0
  34. package/dist/drive/helpers.js +85 -0
  35. package/dist/drive/helpers.js.map +1 -0
  36. package/dist/drive/index.d.ts +114 -0
  37. package/dist/drive/index.d.ts.map +1 -0
  38. package/dist/drive/index.js +418 -0
  39. package/dist/drive/index.js.map +1 -0
  40. package/dist/drive/types.d.ts +91 -0
  41. package/dist/drive/types.d.ts.map +1 -0
  42. package/dist/drive/types.js +5 -0
  43. package/dist/drive/types.js.map +1 -0
  44. package/dist/errors.d.ts +34 -0
  45. package/dist/errors.d.ts.map +1 -0
  46. package/dist/errors.js +53 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/gmail/helpers.d.ts +52 -0
  49. package/dist/gmail/helpers.d.ts.map +1 -0
  50. package/dist/gmail/helpers.js +282 -0
  51. package/dist/gmail/helpers.js.map +1 -0
  52. package/dist/gmail/index.d.ts +86 -0
  53. package/dist/gmail/index.d.ts.map +1 -0
  54. package/dist/gmail/index.js +395 -0
  55. package/dist/gmail/index.js.map +1 -0
  56. package/dist/gmail/types.d.ts +138 -0
  57. package/dist/gmail/types.d.ts.map +1 -0
  58. package/dist/gmail/types.js +5 -0
  59. package/dist/gmail/types.js.map +1 -0
  60. package/dist/index.d.ts +22 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +24 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/safety.d.ts +58 -0
  65. package/dist/safety.d.ts.map +1 -0
  66. package/dist/safety.js +61 -0
  67. package/dist/safety.js.map +1 -0
  68. package/package.json +48 -7
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Gmail module — search, read, send, reply, forward, labels, drafts.
3
+ *
4
+ * All functions take an OAuth2Client as first argument.
5
+ * Use `getAuth('gmail', 'account@email.com')` from the auth module.
6
+ */
7
+ import { gmail } from '@googleapis/gmail';
8
+ import { guardOperation } from '../safety.js';
9
+ import { NotFoundError, QuotaError, GoEasyError } from '../errors.js';
10
+ import { parseMessage, buildMimeMessage, buildForwardMime, base64UrlEncode } from './helpers.js';
11
+ /** Get a Gmail API client instance */
12
+ function gmailApi(auth) {
13
+ return gmail({ version: 'v1', auth });
14
+ }
15
+ /** Wrap Google API errors into our error types */
16
+ function handleApiError(err, context) {
17
+ if (err instanceof GoEasyError)
18
+ throw err;
19
+ const gErr = err;
20
+ if (gErr.code === 404)
21
+ throw new NotFoundError('message', context, err);
22
+ if (gErr.code === 429)
23
+ throw new QuotaError('gmail', err);
24
+ throw new GoEasyError(`Gmail ${context}: ${gErr.message ?? 'Unknown error'}`, 'GMAIL_ERROR', err);
25
+ }
26
+ /**
27
+ * Get the authenticated user's email address.
28
+ */
29
+ export async function getProfile(auth) {
30
+ const gmail = gmailApi(auth);
31
+ const res = await gmail.users.getProfile({ userId: 'me' });
32
+ return res.data.emailAddress ?? '';
33
+ }
34
+ /**
35
+ * Search messages using Gmail query syntax.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const results = await search(auth, { query: 'from:client is:unread' });
40
+ * ```
41
+ */
42
+ export async function search(auth, opts) {
43
+ const gmail = gmailApi(auth);
44
+ try {
45
+ const listRes = await gmail.users.messages.list({
46
+ userId: 'me',
47
+ q: opts.query,
48
+ maxResults: opts.maxResults ?? 20,
49
+ pageToken: opts.pageToken,
50
+ includeSpamTrash: opts.includeSpamTrash ?? false,
51
+ });
52
+ const messageRefs = listRes.data.messages ?? [];
53
+ // Fetch full message data for each result
54
+ const messages = await Promise.all(messageRefs.map(async (ref) => {
55
+ const msg = await gmail.users.messages.get({
56
+ userId: 'me',
57
+ id: ref.id,
58
+ format: 'full',
59
+ });
60
+ return parseMessage(msg.data);
61
+ }));
62
+ return {
63
+ items: messages,
64
+ nextPageToken: listRes.data.nextPageToken ?? undefined,
65
+ resultSizeEstimate: listRes.data.resultSizeEstimate ?? undefined,
66
+ };
67
+ }
68
+ catch (err) {
69
+ handleApiError(err, `search "${opts.query}"`);
70
+ }
71
+ }
72
+ /**
73
+ * Get a single message by ID.
74
+ */
75
+ export async function getMessage(auth, messageId) {
76
+ const gmail = gmailApi(auth);
77
+ try {
78
+ const res = await gmail.users.messages.get({
79
+ userId: 'me',
80
+ id: messageId,
81
+ format: 'full',
82
+ });
83
+ return parseMessage(res.data);
84
+ }
85
+ catch (err) {
86
+ handleApiError(err, messageId);
87
+ }
88
+ }
89
+ /**
90
+ * Get a thread (conversation) by ID.
91
+ */
92
+ export async function getThread(auth, threadId) {
93
+ const gmail = gmailApi(auth);
94
+ try {
95
+ const res = await gmail.users.threads.get({
96
+ userId: 'me',
97
+ id: threadId,
98
+ format: 'full',
99
+ });
100
+ const messages = (res.data.messages ?? []).map(parseMessage);
101
+ return {
102
+ id: res.data.id ?? threadId,
103
+ snippet: res.data.snippet ?? '',
104
+ messages,
105
+ };
106
+ }
107
+ catch (err) {
108
+ handleApiError(err, threadId);
109
+ }
110
+ }
111
+ /**
112
+ * Send an email.
113
+ *
114
+ * ⚠️ DESTRUCTIVE — requires safety confirmation.
115
+ */
116
+ export async function send(auth, opts) {
117
+ const to = Array.isArray(opts.to) ? opts.to.join(', ') : opts.to;
118
+ await guardOperation({
119
+ name: 'gmail.send',
120
+ level: 'DESTRUCTIVE',
121
+ description: `Send email to ${to}: "${opts.subject}"`,
122
+ details: { to: opts.to, subject: opts.subject },
123
+ });
124
+ const gmail = gmailApi(auth);
125
+ const from = await getProfile(auth);
126
+ const mime = await buildMimeMessage(from, opts);
127
+ const raw = base64UrlEncode(mime);
128
+ try {
129
+ const res = await gmail.users.messages.send({
130
+ userId: 'me',
131
+ requestBody: { raw },
132
+ });
133
+ return {
134
+ ok: true,
135
+ id: res.data.id ?? '',
136
+ threadId: res.data.threadId ?? undefined,
137
+ labelIds: res.data.labelIds ?? undefined,
138
+ };
139
+ }
140
+ catch (err) {
141
+ handleApiError(err, 'send');
142
+ }
143
+ }
144
+ /**
145
+ * Reply to a thread.
146
+ *
147
+ * ⚠️ DESTRUCTIVE — requires safety confirmation.
148
+ */
149
+ export async function reply(auth, opts) {
150
+ await guardOperation({
151
+ name: 'gmail.reply',
152
+ level: 'DESTRUCTIVE',
153
+ description: `Reply to thread ${opts.threadId}`,
154
+ details: { threadId: opts.threadId, messageId: opts.messageId },
155
+ });
156
+ const gmail = gmailApi(auth);
157
+ const from = await getProfile(auth);
158
+ // Get the original message for threading headers and recipients
159
+ const original = await getMessage(auth, opts.messageId);
160
+ const replyTo = opts.replyAll
161
+ ? [...new Set([original.from, ...original.to, ...original.cc])].filter((addr) => !addr.includes(from))
162
+ : [original.from];
163
+ const sendOpts = {
164
+ to: replyTo,
165
+ subject: original.subject.startsWith('Re:')
166
+ ? original.subject
167
+ : `Re: ${original.subject}`,
168
+ body: opts.body,
169
+ html: opts.html,
170
+ attachments: opts.attachments,
171
+ };
172
+ const extraHeaders = {
173
+ 'In-Reply-To': `<${opts.messageId}>`,
174
+ References: `<${opts.messageId}>`,
175
+ };
176
+ const mime = await buildMimeMessage(from, sendOpts, extraHeaders);
177
+ const raw = base64UrlEncode(mime);
178
+ try {
179
+ const res = await gmail.users.messages.send({
180
+ userId: 'me',
181
+ requestBody: {
182
+ raw,
183
+ threadId: opts.threadId,
184
+ },
185
+ });
186
+ return {
187
+ ok: true,
188
+ id: res.data.id ?? '',
189
+ threadId: res.data.threadId ?? undefined,
190
+ };
191
+ }
192
+ catch (err) {
193
+ handleApiError(err, 'reply');
194
+ }
195
+ }
196
+ /**
197
+ * Forward a message to new recipients.
198
+ *
199
+ * Fetches the original message, quotes its body, re-attaches original
200
+ * attachments (unless `includeAttachments: false`), and sends.
201
+ *
202
+ * ⚠️ DESTRUCTIVE — requires safety confirmation.
203
+ */
204
+ export async function forward(auth, opts) {
205
+ const to = Array.isArray(opts.to) ? opts.to.join(', ') : opts.to;
206
+ await guardOperation({
207
+ name: 'gmail.forward',
208
+ level: 'DESTRUCTIVE',
209
+ description: `Forward message ${opts.messageId} to ${to}`,
210
+ details: { messageId: opts.messageId, to: opts.to },
211
+ });
212
+ const gmail = gmailApi(auth);
213
+ const from = await getProfile(auth);
214
+ // Fetch original message
215
+ const original = await getMessage(auth, opts.messageId);
216
+ // Fetch original attachments as Buffers
217
+ const bufferAttachments = [];
218
+ if (opts.includeAttachments !== false && original.attachments.length > 0) {
219
+ for (const att of original.attachments) {
220
+ const data = await getAttachmentContent(auth, opts.messageId, att.id);
221
+ bufferAttachments.push({
222
+ filename: att.filename,
223
+ mimeType: att.mimeType,
224
+ data,
225
+ });
226
+ }
227
+ }
228
+ const subject = original.subject.startsWith('Fwd:')
229
+ ? original.subject
230
+ : `Fwd: ${original.subject}`;
231
+ const mime = await buildForwardMime(from, to, subject, opts.body, original.body, bufferAttachments);
232
+ const raw = base64UrlEncode(mime);
233
+ try {
234
+ const res = await gmail.users.messages.send({
235
+ userId: 'me',
236
+ requestBody: { raw },
237
+ });
238
+ return {
239
+ ok: true,
240
+ id: res.data.id ?? '',
241
+ threadId: res.data.threadId ?? undefined,
242
+ };
243
+ }
244
+ catch (err) {
245
+ handleApiError(err, 'forward');
246
+ }
247
+ }
248
+ /**
249
+ * Batch modify labels on multiple messages.
250
+ *
251
+ * This is a WRITE operation (reversible), no safety gate.
252
+ */
253
+ export async function batchModifyLabels(auth, opts) {
254
+ const gmail = gmailApi(auth);
255
+ try {
256
+ await gmail.users.messages.batchModify({
257
+ userId: 'me',
258
+ requestBody: {
259
+ ids: opts.messageIds,
260
+ addLabelIds: opts.addLabelIds,
261
+ removeLabelIds: opts.removeLabelIds,
262
+ },
263
+ });
264
+ return {
265
+ ok: true,
266
+ id: `batch:${opts.messageIds.length}`,
267
+ labelIds: opts.addLabelIds,
268
+ };
269
+ }
270
+ catch (err) {
271
+ handleApiError(err, 'batchModifyLabels');
272
+ }
273
+ }
274
+ /**
275
+ * List all labels for the account.
276
+ */
277
+ export async function listLabels(auth) {
278
+ const gmail = gmailApi(auth);
279
+ try {
280
+ const res = await gmail.users.labels.list({ userId: 'me' });
281
+ return (res.data.labels ?? []).map((l) => ({
282
+ id: l.id ?? '',
283
+ name: l.name ?? '',
284
+ type: l.type ?? '',
285
+ }));
286
+ }
287
+ catch (err) {
288
+ handleApiError(err, 'listLabels');
289
+ }
290
+ }
291
+ /**
292
+ * Create a draft.
293
+ *
294
+ * WRITE operation (reversible), no safety gate.
295
+ */
296
+ export async function createDraft(auth, opts) {
297
+ const gmail = gmailApi(auth);
298
+ const from = await getProfile(auth);
299
+ const mime = await buildMimeMessage(from, opts);
300
+ const raw = base64UrlEncode(mime);
301
+ try {
302
+ const res = await gmail.users.drafts.create({
303
+ userId: 'me',
304
+ requestBody: {
305
+ message: { raw },
306
+ },
307
+ });
308
+ return {
309
+ id: res.data.id ?? '',
310
+ message: parseMessage(res.data.message ?? {}),
311
+ };
312
+ }
313
+ catch (err) {
314
+ handleApiError(err, 'createDraft');
315
+ }
316
+ }
317
+ /**
318
+ * Send an existing draft.
319
+ *
320
+ * ⚠️ DESTRUCTIVE — requires safety confirmation.
321
+ */
322
+ export async function sendDraft(auth, draftId) {
323
+ await guardOperation({
324
+ name: 'gmail.sendDraft',
325
+ level: 'DESTRUCTIVE',
326
+ description: `Send draft ${draftId}`,
327
+ details: { draftId },
328
+ });
329
+ const gmail = gmailApi(auth);
330
+ try {
331
+ const res = await gmail.users.drafts.send({
332
+ userId: 'me',
333
+ requestBody: { id: draftId },
334
+ });
335
+ return {
336
+ ok: true,
337
+ id: res.data.id ?? '',
338
+ threadId: res.data.threadId ?? undefined,
339
+ };
340
+ }
341
+ catch (err) {
342
+ handleApiError(err, 'sendDraft');
343
+ }
344
+ }
345
+ /**
346
+ * List drafts.
347
+ */
348
+ export async function listDrafts(auth, maxResults = 20) {
349
+ const gmail = gmailApi(auth);
350
+ try {
351
+ const res = await gmail.users.drafts.list({
352
+ userId: 'me',
353
+ maxResults,
354
+ });
355
+ const drafts = await Promise.all((res.data.drafts ?? []).map(async (d) => {
356
+ const full = await gmail.users.drafts.get({
357
+ userId: 'me',
358
+ id: d.id,
359
+ format: 'full',
360
+ });
361
+ return {
362
+ id: full.data.id ?? '',
363
+ message: parseMessage(full.data.message ?? {}),
364
+ };
365
+ }));
366
+ return {
367
+ items: drafts,
368
+ nextPageToken: res.data.nextPageToken ?? undefined,
369
+ };
370
+ }
371
+ catch (err) {
372
+ handleApiError(err, 'listDrafts');
373
+ }
374
+ }
375
+ /**
376
+ * Download an attachment's content as a Buffer.
377
+ */
378
+ export async function getAttachmentContent(auth, messageId, attachmentId) {
379
+ const gmail = gmailApi(auth);
380
+ try {
381
+ const res = await gmail.users.messages.attachments.get({
382
+ userId: 'me',
383
+ messageId,
384
+ id: attachmentId,
385
+ });
386
+ const data = res.data.data;
387
+ if (!data)
388
+ throw new GoEasyError('Empty attachment data', 'GMAIL_ERROR');
389
+ return Buffer.from(data, 'base64url');
390
+ }
391
+ catch (err) {
392
+ handleApiError(err, `attachment ${attachmentId}`);
393
+ }
394
+ }
395
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gmail/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Gmail types — agent-friendly shapes, not raw API types.
3
+ */
4
+ /** A simplified email message */
5
+ export interface GmailMessage {
6
+ id: string;
7
+ threadId: string;
8
+ /** RFC 2822 date string */
9
+ date: string;
10
+ from: string;
11
+ to: string[];
12
+ cc: string[];
13
+ bcc: string[];
14
+ subject: string;
15
+ /** Snippet (truncated plain text preview) */
16
+ snippet: string;
17
+ /** Message body */
18
+ body: {
19
+ text?: string;
20
+ html?: string;
21
+ };
22
+ /** Label IDs applied to this message */
23
+ labelIds: string[];
24
+ /** Attachment metadata (not downloaded by default) */
25
+ attachments: AttachmentInfo[];
26
+ }
27
+ /** A thread (conversation) */
28
+ export interface GmailThread {
29
+ id: string;
30
+ /** Snippet of the last message */
31
+ snippet: string;
32
+ /** All messages in the thread, oldest first */
33
+ messages: GmailMessage[];
34
+ }
35
+ /** Attachment metadata */
36
+ export interface AttachmentInfo {
37
+ /** Attachment ID (needed for download) */
38
+ id: string;
39
+ /** Original filename */
40
+ filename: string;
41
+ /** MIME type */
42
+ mimeType: string;
43
+ /** Size in bytes */
44
+ size: number;
45
+ }
46
+ /** Options for sending an email */
47
+ export interface SendOptions {
48
+ to: string | string[];
49
+ cc?: string | string[];
50
+ bcc?: string | string[];
51
+ subject: string;
52
+ /** Plain text body */
53
+ body?: string;
54
+ /** HTML body (if provided, creates multipart/alternative) */
55
+ html?: string;
56
+ /** File paths to attach */
57
+ attachments?: string[];
58
+ }
59
+ /** Options for replying to a thread */
60
+ export interface ReplyOptions {
61
+ /** Thread ID to reply to */
62
+ threadId: string;
63
+ /** Message ID to reply to (for In-Reply-To header) */
64
+ messageId: string;
65
+ /** Plain text body */
66
+ body?: string;
67
+ /** HTML body */
68
+ html?: string;
69
+ /** File paths to attach */
70
+ attachments?: string[];
71
+ /** Reply to all recipients (default: false, reply to sender only) */
72
+ replyAll?: boolean;
73
+ }
74
+ /** Options for forwarding a message */
75
+ export interface ForwardOptions {
76
+ /** Message ID to forward */
77
+ messageId: string;
78
+ /** Recipients */
79
+ to: string | string[];
80
+ /** Optional body prepended to the forwarded message */
81
+ body?: string;
82
+ /** Include original attachments (default: true) */
83
+ includeAttachments?: boolean;
84
+ }
85
+ /** Options for listing/searching */
86
+ export interface SearchOptions {
87
+ /** Gmail search query (same syntax as Gmail UI) */
88
+ query: string;
89
+ /** Maximum results (default: 20) */
90
+ maxResults?: number;
91
+ /** Page token for pagination */
92
+ pageToken?: string;
93
+ /** Include spam and trash (default: false) */
94
+ includeSpamTrash?: boolean;
95
+ }
96
+ /** Paginated list result */
97
+ export interface ListResult<T> {
98
+ items: T[];
99
+ /** Token for next page, undefined if no more results */
100
+ nextPageToken?: string;
101
+ /** Estimated total results (Gmail-specific, may be inaccurate) */
102
+ resultSizeEstimate?: number;
103
+ }
104
+ /** Options for batch label modification */
105
+ export interface BatchLabelOptions {
106
+ /** Message IDs to modify */
107
+ messageIds: string[];
108
+ /** Label IDs to add */
109
+ addLabelIds?: string[];
110
+ /** Label IDs to remove */
111
+ removeLabelIds?: string[];
112
+ }
113
+ /** Draft info */
114
+ export interface GmailDraft {
115
+ id: string;
116
+ message: GmailMessage;
117
+ }
118
+ /** An in-memory attachment (for forwarding, where data comes from API not filesystem) */
119
+ export interface BufferAttachment {
120
+ /** Original filename */
121
+ filename: string;
122
+ /** MIME type */
123
+ mimeType: string;
124
+ /** Attachment content */
125
+ data: Buffer;
126
+ }
127
+ /** Result of a write operation */
128
+ export interface WriteResult {
129
+ /** Whether the operation succeeded */
130
+ ok: true;
131
+ /** ID of the created/modified resource */
132
+ id: string;
133
+ /** Thread ID (for messages) */
134
+ threadId?: string;
135
+ /** Label IDs (for label operations) */
136
+ labelIds?: string[];
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gmail/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Gmail types — agent-friendly shapes, not raw API types.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gmail/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * go-easy — Google APIs made easy.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import { getAuth } from '@marcfargas/go-easy/auth';
7
+ * import { search, send } from '@marcfargas/go-easy/gmail';
8
+ *
9
+ * const auth = await getAuth('gmail', 'marc@blegal.eu');
10
+ * const results = await search(auth, { query: 'is:unread' });
11
+ * ```
12
+ */
13
+ export { getAuth, listAccounts, clearAuthCache } from './auth.js';
14
+ export type { GoogleService } from './auth.js';
15
+ export { setSafetyContext, resetSafetyContext, guardOperation } from './safety.js';
16
+ export type { SafetyContext, SafetyLevel, OperationInfo } from './safety.js';
17
+ export { GoEasyError, AuthError, NotFoundError, QuotaError, SafetyError, } from './errors.js';
18
+ import * as gmail from './gmail/index.js';
19
+ import * as drive from './drive/index.js';
20
+ import * as calendar from './calendar/index.js';
21
+ export { gmail, drive, calendar };
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7E,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * go-easy — Google APIs made easy.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import { getAuth } from '@marcfargas/go-easy/auth';
7
+ * import { search, send } from '@marcfargas/go-easy/gmail';
8
+ *
9
+ * const auth = await getAuth('gmail', 'marc@blegal.eu');
10
+ * const results = await search(auth, { query: 'is:unread' });
11
+ * ```
12
+ */
13
+ // Auth
14
+ export { getAuth, listAccounts, clearAuthCache } from './auth.js';
15
+ // Safety
16
+ export { setSafetyContext, resetSafetyContext, guardOperation } from './safety.js';
17
+ // Errors
18
+ export { GoEasyError, AuthError, NotFoundError, QuotaError, SafetyError, } from './errors.js';
19
+ // Service modules (re-exported as namespaces)
20
+ import * as gmail from './gmail/index.js';
21
+ import * as drive from './drive/index.js';
22
+ import * as calendar from './calendar/index.js';
23
+ export { gmail, drive, calendar };
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO;AACP,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGlE,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGnF,SAAS;AACT,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,8CAA8C;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Safety module — guards destructive/irreversible operations.
3
+ *
4
+ * Operations are classified:
5
+ * READ — no gate (search, get, list)
6
+ * WRITE — logged, no block (create draft, label, upload)
7
+ * DESTRUCTIVE — blocked unless SafetyContext.confirm() returns true
8
+ * (send email, share file externally, delete event with attendees)
9
+ *
10
+ * Usage:
11
+ * // Set up context at startup (gateway or agent)
12
+ * setSafetyContext({
13
+ * confirm: async (op) => {
14
+ * console.log(`⚠️ ${op.description}`);
15
+ * return promptUser('Proceed? (y/n)') === 'y';
16
+ * }
17
+ * });
18
+ *
19
+ * // Inside library functions
20
+ * await guardOperation({
21
+ * name: 'gmail.send',
22
+ * level: 'DESTRUCTIVE',
23
+ * description: 'Send email to client@example.com',
24
+ * details: { to: 'client@example.com', subject: 'Invoice' }
25
+ * });
26
+ */
27
+ export type SafetyLevel = 'READ' | 'WRITE' | 'DESTRUCTIVE';
28
+ export interface OperationInfo {
29
+ /** Function name, e.g. 'gmail.send' */
30
+ name: string;
31
+ /** Safety classification */
32
+ level: SafetyLevel;
33
+ /** Human-readable description of what will happen */
34
+ description: string;
35
+ /** Structured details for logging */
36
+ details?: Record<string, unknown>;
37
+ }
38
+ export interface SafetyContext {
39
+ /**
40
+ * Called for DESTRUCTIVE operations.
41
+ * Return true to proceed, false to block.
42
+ */
43
+ confirm: (op: OperationInfo) => Promise<boolean>;
44
+ }
45
+ /** Set the safety context. Call once at startup. */
46
+ export declare function setSafetyContext(ctx: SafetyContext): void;
47
+ /** Reset to default (block-all) context. Useful for tests. */
48
+ export declare function resetSafetyContext(): void;
49
+ /** Get the current safety context. */
50
+ export declare function getSafetyContext(): SafetyContext;
51
+ /**
52
+ * Guard an operation. READ and WRITE pass through.
53
+ * DESTRUCTIVE operations require confirmation from the safety context.
54
+ *
55
+ * @throws SafetyError if destructive and not confirmed
56
+ */
57
+ export declare function guardOperation(op: OperationInfo): Promise<void>;
58
+ //# sourceMappingURL=safety.d.ts.map