@framers/agentos-ext-gmail-source 0.3.0 → 0.5.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.
package/dist/gmail.js ADDED
@@ -0,0 +1,592 @@
1
+ /**
2
+ * @fileoverview The capped, read-only Gmail API client: profile, labels, a bounded thread list, history pages and one
3
+ * thread read at fixed `users/me` paths. Every token refresh and every HTTP dispatch is admitted through the host's
4
+ * shared account-source quota with a new attempt id, and every refresh runs inside the host's grant operation on a
5
+ * flow built for it alone; given a holder, the clients of one sync lease share one access token. Responses are read
6
+ * through the released byte cap before decoding, with prompt cancellation, and only fixed failures leave the client.
7
+ * It never sleeps, retries a transient failure inline, stores, purges, logs, or fetches an attachment.
8
+ * @module agentos-ext-gmail-source/gmail
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { readCapped, ReadCapExceeded, decideSourceCache, sourceRetryAt, SourceSyncFault, SOURCE_GRANT_KEY, } from '@framers/agentos-ext-account-sources';
12
+ import { GmailOAuthFlow } from './GmailOAuthFlow.js';
13
+ import { GmailThreadMapper } from './mapThread.js';
14
+ import { mappingBounds, gmailId } from './mime.js';
15
+ import { sanitizeMailMetadata } from './mailSanitize.js';
16
+ import { classifyGmailHttp, gmailOAuthFault } from './retry.js';
17
+ /**
18
+ * A client's fixed refusal; its message is `gmail_api_<reason>`. `configuration` is thrown by the constructor;
19
+ * `response_too_large` stays inside the client, which answers it as a skipped thread or an invalid control page.
20
+ */
21
+ export class GmailApiFault extends Error {
22
+ reason;
23
+ /** @param reason Why the client refused. */
24
+ constructor(reason) {
25
+ super(`gmail_api_${reason}`);
26
+ this.reason = reason;
27
+ this.name = 'GmailApiFault';
28
+ }
29
+ }
30
+ const productionOrigin = 'https://gmail.googleapis.com';
31
+ // The latest epoch millisecond the account-source services accept.
32
+ const maxTime = 8_639_999_913_600_000;
33
+ const integer = (n) => Number.isSafeInteger(n) && n >= 0 && n <= maxTime;
34
+ // An invalid provider shape or argument is a fixed failure, never an empty success.
35
+ const invalid = () => { throw new SourceSyncFault('invalid_response'); };
36
+ const historyId = (value) => typeof value === 'string' && /^[0-9]{1,128}$/.test(value);
37
+ // The lease a held access token belongs to: the connection, its generation and the lease token, which a renewal keeps.
38
+ const leaseKey = (handle) => JSON.stringify([handle.lease.scope.tenantId,
39
+ handle.lease.scope.ownerId, handle.lease.scope.connectionId, handle.lease.generation, handle.lease.token]);
40
+ const labelId = (value) => typeof value === 'string'
41
+ && /^(?:[A-Z][A-Z0-9_]{0,63}|Label_[0-9]{1,64})$/.test(value);
42
+ // Orders decimal history ids as strings, by length and then lexically, so no id passes through a float.
43
+ function compareHistory(a, b) {
44
+ const left = a.replace(/^0+(?=.)/, '');
45
+ const right = b.replace(/^0+(?=.)/, '');
46
+ return left.length - right.length || (left < right ? -1 : left > right ? 1 : 0);
47
+ }
48
+ function object(value) {
49
+ if (!value || typeof value !== 'object' || Array.isArray(value))
50
+ return invalid();
51
+ return value;
52
+ }
53
+ function array(value, maximum) {
54
+ if (!Array.isArray(value) || value.length > maximum)
55
+ return invalid();
56
+ return value;
57
+ }
58
+ // Google's origin, or on CI only a loopback or `.invalid` origin with no path, query, fragment or userinfo.
59
+ function selectedOrigin(value) {
60
+ if (value === undefined)
61
+ return productionOrigin;
62
+ let url;
63
+ try {
64
+ url = new URL(value);
65
+ }
66
+ catch {
67
+ throw new GmailApiFault('configuration');
68
+ }
69
+ const local = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);
70
+ if (process.env.CI !== 'true' || (!local && !url.hostname.endsWith('.invalid'))
71
+ || (url.protocol !== 'https:' && !(local && url.protocol === 'http:'))
72
+ || url.username || url.password || url.pathname !== '/' || url.search || url.hash) {
73
+ throw new GmailApiFault('configuration');
74
+ }
75
+ return url.origin;
76
+ }
77
+ function cancel(response) { void response.body?.cancel().catch(() => { }); }
78
+ function active(signal) { if (signal?.aborted)
79
+ throw new SourceSyncFault('cancelled'); }
80
+ // Rejects promptly on abort; a response that arrives afterwards is handed to `discard` instead of the caller.
81
+ function abortable(work, signal, stopped, discard) {
82
+ return new Promise((resolve, reject) => {
83
+ let done = false;
84
+ const abort = () => { if (!done) {
85
+ done = true;
86
+ reject(stopped());
87
+ } };
88
+ signal.addEventListener('abort', abort, { once: true });
89
+ if (signal.aborted)
90
+ abort();
91
+ work.then((value) => {
92
+ signal.removeEventListener('abort', abort);
93
+ if (done) {
94
+ discard?.(value);
95
+ return;
96
+ }
97
+ done = true;
98
+ resolve(value);
99
+ }, (error) => {
100
+ signal.removeEventListener('abort', abort);
101
+ if (!done) {
102
+ done = true;
103
+ reject(error);
104
+ }
105
+ });
106
+ });
107
+ }
108
+ // Reads a body through the released byte cap. The bridge turns an abort into a fixed fault even while no bytes
109
+ // arrive, and passes cancellation through to the provider's stream.
110
+ async function bodyBytes(response, maximum, signal, stopped) {
111
+ if (signal.aborted) {
112
+ cancel(response);
113
+ throw stopped();
114
+ }
115
+ if (response.body === null)
116
+ return new Uint8Array(0);
117
+ const reader = response.body.getReader();
118
+ let closed = false;
119
+ let stop;
120
+ const bridge = new ReadableStream({
121
+ start(controller) {
122
+ stop = () => {
123
+ if (closed)
124
+ return;
125
+ closed = true;
126
+ controller.error(stopped());
127
+ void reader.cancel().catch(() => { });
128
+ };
129
+ signal.addEventListener('abort', stop, { once: true });
130
+ if (signal.aborted)
131
+ stop();
132
+ },
133
+ async pull(controller) {
134
+ try {
135
+ const next = await reader.read();
136
+ if (closed)
137
+ return;
138
+ if (next.done) {
139
+ closed = true;
140
+ controller.close();
141
+ }
142
+ else
143
+ controller.enqueue(next.value);
144
+ }
145
+ catch {
146
+ if (!closed) {
147
+ closed = true;
148
+ controller.error(signal.aborted ? stopped() : new SourceSyncFault('network'));
149
+ }
150
+ }
151
+ },
152
+ async cancel() { closed = true; try {
153
+ await reader.cancel();
154
+ }
155
+ catch { /* Fixed fault only. */ } },
156
+ });
157
+ try {
158
+ return await readCapped(new Response(bridge, { headers: response.headers }), maximum);
159
+ }
160
+ finally {
161
+ signal.removeEventListener('abort', stop);
162
+ try {
163
+ reader.releaseLock();
164
+ }
165
+ catch { /* Cancellation can still be settling. */ }
166
+ }
167
+ }
168
+ /**
169
+ * The capped, read-only Gmail API client. Each provider operation makes one attempt: one OAuth refresh inside the
170
+ * host's grant operation, or the access token a `tokenHolder` holds for the current lease, then one HTTP dispatch, each
171
+ * admitted by the shared quota with a new attempt id; a 401 drops a held token and earns one fresh token and one
172
+ * repeat of the same call. Provider waits are recorded through the quota's `defer` and thrown as `rate_limited` or
173
+ * `provider_unavailable` with their time; the durable coordinator owns retry episodes, backoff and exhaustion. Every
174
+ * failure is a fixed `SourceSyncFault`.
175
+ *
176
+ * @typeParam Prepared - The host's prepared-document type of its `SourceRevocations`.
177
+ */
178
+ export class GmailApi {
179
+ options;
180
+ origin;
181
+ send;
182
+ bounds;
183
+ limits;
184
+ mapper;
185
+ /**
186
+ * @param options The client, the host's grant and quota services, the quota keys, the bounds and limits, and the
187
+ * optional fetch, clock and CI-only endpoints.
188
+ * @throws {GmailApiFault} `configuration` for an origin override outside CI or not a loopback or `.invalid` origin,
189
+ * a limit outside its ceiling, or a malformed quota key.
190
+ * @throws {GmailMappingFault} `configuration` for invalid bounds.
191
+ */
192
+ constructor(options) {
193
+ this.options = options;
194
+ this.origin = selectedOrigin(options.apiOrigin);
195
+ this.send = options.fetchImpl ?? fetch;
196
+ this.bounds = mappingBounds(options.bounds);
197
+ this.mapper = new GmailThreadMapper(this.bounds);
198
+ const ceilings = { timeoutMs: 15_000, maxLabels: 1000, maxHistoryReferences: 10_000, maxPageTokenCharacters: 4096 };
199
+ for (const key of Object.keys(ceilings)) {
200
+ if (!integer(options.limits[key]) || options.limits[key] < 1 || options.limits[key] > ceilings[key]) {
201
+ throw new GmailApiFault('configuration');
202
+ }
203
+ }
204
+ this.limits = Object.freeze({ ...options.limits });
205
+ for (const key of [options.projectKey, options.mailboxKey]) {
206
+ if (typeof key !== 'string' || !/^[A-Za-z0-9:_-]{1,512}$/.test(key))
207
+ throw new GmailApiFault('configuration');
208
+ }
209
+ }
210
+ now() {
211
+ const value = this.options.clock?.() ?? Date.now();
212
+ if (!integer(value))
213
+ return invalid();
214
+ return value;
215
+ }
216
+ // A retry time handed back: never at or before this client's clock. The quota's times come from the database's
217
+ // clock, and the sync store refuses a retry time that is not after its own.
218
+ later(retryAt) { return Math.max(retryAt, this.now() + 1); }
219
+ pageToken(value) {
220
+ if (value === undefined || value === null)
221
+ return null;
222
+ if (typeof value !== 'string' || value.length < 1 || value.length > this.limits.maxPageTokenCharacters
223
+ || /[\x00-\x20\x7f]/.test(value))
224
+ return invalid();
225
+ return value;
226
+ }
227
+ pageSize(value) { if (!Number.isSafeInteger(value) || value < 1 || value > 100)
228
+ invalid(); }
229
+ // Nothing was sent for a deferral or a late start: both are retryable from their time, with a new attempt id. Only
230
+ // a reused attempt id is a fault.
231
+ quotaValue(result) {
232
+ if (result.kind === 'deferred' || result.kind === 'late')
233
+ throw new SourceSyncFault('rate_limited', this.later(result.retryAt));
234
+ if (result.kind === 'duplicate')
235
+ return invalid();
236
+ return result.value;
237
+ }
238
+ async reserve(method, work, parent) {
239
+ active(parent);
240
+ const result = await this.options.quota.run({ projectKey: this.options.projectKey,
241
+ mailboxKey: this.options.mailboxKey, method, attemptId: randomUUID() }, work, parent);
242
+ active(parent);
243
+ return this.quotaValue(result);
244
+ }
245
+ // Records a provider wait for the mailbox or the whole project, never shorter than the provider's Retry-After, and
246
+ // at least a day for the provider's daily limit, then throws it.
247
+ async defer(code, retryAfter, scope, daily) {
248
+ const now = this.now();
249
+ const retryAt = Math.max(sourceRetryAt(now, 1, retryAfter, 0), daily ? now + 86_400_000 : 0);
250
+ await this.options.quota.defer({ projectKey: this.options.projectKey,
251
+ ...(scope === 'mailbox' ? { mailboxKey: this.options.mailboxKey } : {}) }, retryAt);
252
+ throw new SourceSyncFault(code, this.later(retryAt));
253
+ }
254
+ // A fresh access token from a flow built inside the grant operation and discarded with it, or the token held for
255
+ // the current lease. OAuth failures are translated inside the operation, whose boundary would turn an unknown error
256
+ // into a storage failure.
257
+ async accessToken(parent) {
258
+ active(parent);
259
+ const handle = this.options.currentHandle();
260
+ const lease = leaseKey(handle);
261
+ const holder = this.options.tokenHolder;
262
+ const held = holder?.current ?? null;
263
+ if (holder && held) {
264
+ if (held.lease === lease && handle.lease.expiresAt > this.now())
265
+ return held.value;
266
+ holder.current = null;
267
+ }
268
+ const token = await this.options.revocations.withGrant(handle, async (tokens, grantSignal) => {
269
+ return this.reserve('profile', async (requestSignal) => {
270
+ let retryAfter = null;
271
+ const observedFetch = async (input, init) => {
272
+ const response = await this.send(input, init);
273
+ retryAfter = response.headers.get('retry-after');
274
+ return response;
275
+ };
276
+ try {
277
+ const flow = new GmailOAuthFlow(this.options.client, tokens, {
278
+ signal: requestSignal, fetchImpl: observedFetch, endpoints: this.options.oauthEndpoints,
279
+ });
280
+ return await flow.accessToken(SOURCE_GRANT_KEY);
281
+ }
282
+ catch (error) {
283
+ // A flow stopped by the quota's or the grant's own deadline, not by the caller, was a network failure.
284
+ const translated = gmailOAuthFault(error);
285
+ const fault = translated.code === 'cancelled' && !parent?.aborted ? new SourceSyncFault('network') : translated;
286
+ if (fault.code === 'rate_limited' || fault.code === 'provider_unavailable') {
287
+ return this.defer(fault.code, retryAfter, 'mailbox', false);
288
+ }
289
+ throw fault;
290
+ }
291
+ }, grantSignal);
292
+ }, parent).catch((error) => {
293
+ // A grant lease that another worker holds answers its expiry, which can pass before this caller reads it.
294
+ if (error instanceof SourceSyncFault && error.retryAt !== null)
295
+ throw new SourceSyncFault(error.code, this.later(error.retryAt));
296
+ throw error;
297
+ });
298
+ if (holder)
299
+ holder.current = { lease, value: token };
300
+ return token;
301
+ }
302
+ // A 401 ends a held token's use: this operation's repeat, or the next operation, refreshes the grant.
303
+ dropToken(token) {
304
+ const holder = this.options.tokenHolder;
305
+ if (holder && holder.current !== null && holder.current.value === token)
306
+ holder.current = null;
307
+ }
308
+ /** Consume/cancel the whole body within the quota callback, before releasing its slot. */
309
+ async wire(url, token, quotaSignal, parent) {
310
+ const controller = new AbortController();
311
+ let timedOut = false;
312
+ const abort = () => controller.abort();
313
+ const stopped = () => new SourceSyncFault(parent?.aborted ? 'cancelled' : 'network');
314
+ quotaSignal.addEventListener('abort', abort, { once: true });
315
+ parent?.addEventListener('abort', abort, { once: true });
316
+ if (quotaSignal.aborted || parent?.aborted)
317
+ abort();
318
+ const timer = setTimeout(() => { timedOut = true; controller.abort(); }, this.limits.timeoutMs);
319
+ try {
320
+ if (controller.signal.aborted)
321
+ throw stopped();
322
+ const readStartedAt = this.now();
323
+ const response = await abortable(this.send(url, { method: 'GET',
324
+ headers: { accept: 'application/json', authorization: 'Bearer ' + token },
325
+ redirect: 'error', credentials: 'omit', cache: 'no-store', referrerPolicy: 'no-referrer', signal: controller.signal,
326
+ }), controller.signal, stopped, cancel);
327
+ if (controller.signal.aborted) {
328
+ cancel(response);
329
+ throw stopped();
330
+ }
331
+ if (response.status < 200 || response.status >= 600 || (response.status >= 300 && response.status < 400)) {
332
+ cancel(response);
333
+ return invalid();
334
+ }
335
+ let bytes;
336
+ try {
337
+ bytes = await bodyBytes(response, this.bounds.maxResponseBytes, controller.signal, stopped);
338
+ }
339
+ catch (error) {
340
+ // Only a successful answer can be too large to use; an oversized failure is classified by its status alone.
341
+ if (error instanceof ReadCapExceeded) {
342
+ if (response.status === 200)
343
+ throw new GmailApiFault('response_too_large');
344
+ bytes = new Uint8Array(0);
345
+ }
346
+ else
347
+ throw error;
348
+ }
349
+ if (controller.signal.aborted)
350
+ throw stopped();
351
+ const receivedAt = this.now();
352
+ if (receivedAt < readStartedAt)
353
+ return invalid();
354
+ let body = null;
355
+ try {
356
+ body = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
357
+ }
358
+ catch {
359
+ if (response.status === 200)
360
+ return invalid();
361
+ }
362
+ return { status: response.status, body, readStartedAt, receivedAt,
363
+ retryAfter: response.headers.get('retry-after'), cacheHeaders: {
364
+ cacheControl: response.headers.get('cache-control'), date: response.headers.get('date'),
365
+ age: response.headers.get('age'), expires: response.headers.get('expires'),
366
+ } };
367
+ }
368
+ catch (error) {
369
+ if (parent?.aborted || timedOut || controller.signal.aborted)
370
+ throw stopped();
371
+ if (error instanceof SourceSyncFault || error instanceof GmailApiFault)
372
+ throw error;
373
+ throw new SourceSyncFault('network');
374
+ }
375
+ finally {
376
+ clearTimeout(timer);
377
+ quotaSignal.removeEventListener('abort', abort);
378
+ parent?.removeEventListener('abort', abort);
379
+ }
380
+ }
381
+ // One provider operation at a fixed path: a fresh token, one metered dispatch, and one repeat after a 401.
382
+ async request(method, path, query, signal) {
383
+ active(signal);
384
+ const expected = method === 'profile' ? 'profile' : method === 'labels' ? 'labels'
385
+ : method === 'list' ? 'threads' : method === 'changes' ? 'history' : null;
386
+ if ((expected !== null && path !== expected) || (expected === null && !/^threads\/[a-fA-F0-9]{1,64}$/.test(path)))
387
+ return invalid();
388
+ const url = new URL('/gmail/v1/users/me/' + path, this.origin);
389
+ for (const [key, value] of Object.entries(query))
390
+ url.searchParams.set(key, value);
391
+ for (let authAttempt = 0; authAttempt < 2; authAttempt++) {
392
+ const token = await this.accessToken(signal);
393
+ active(signal);
394
+ const response = await this.reserve(method, (quotaSignal) => this.wire(url, token, quotaSignal, signal), signal);
395
+ const disposition = classifyGmailHttp(response.status, response.body, method);
396
+ if (disposition.kind === 'ok')
397
+ return response;
398
+ if (disposition.kind === 'gone')
399
+ return null;
400
+ if (disposition.kind === 'refresh') {
401
+ this.dropToken(token);
402
+ if (authAttempt === 0)
403
+ continue;
404
+ throw new SourceSyncFault('grant_rejected');
405
+ }
406
+ if (disposition.kind === 'fault')
407
+ throw new SourceSyncFault(disposition.code);
408
+ if (disposition.kind === 'retry')
409
+ return this.defer(disposition.code, response.retryAfter, disposition.scope, disposition.daily);
410
+ }
411
+ return invalid();
412
+ }
413
+ // A control page: an absent or oversized answer fails without a partial page or a cursor advance.
414
+ async control(method, path, query, signal) {
415
+ try {
416
+ const result = await this.request(method, path, query, signal);
417
+ if (result === null)
418
+ return invalid();
419
+ return result;
420
+ }
421
+ catch (error) {
422
+ if (error instanceof GmailApiFault && error.reason === 'response_too_large')
423
+ return invalid();
424
+ throw error;
425
+ }
426
+ }
427
+ /**
428
+ * The mailbox address and current history id, for the host's private account binding and its history anchor. The
429
+ * answer's other fields are dropped.
430
+ *
431
+ * @param signal Cancels the call.
432
+ * @throws {SourceSyncFault} A fixed failure, `invalid_response` for a malformed answer.
433
+ */
434
+ async profile(signal) {
435
+ const response = await this.control('profile', 'profile', {}, signal);
436
+ const body = object(response.body);
437
+ if (typeof body.emailAddress !== 'string' || body.emailAddress.length > 320
438
+ || !/^[^\s@<>]+@[^\s@<>]+$/.test(body.emailAddress) || !historyId(body.historyId))
439
+ return invalid();
440
+ return { emailAddress: body.emailAddress, historyId: body.historyId };
441
+ }
442
+ /**
443
+ * The mailbox's labels: sanitized names by id under the labels response's own cache decision. A refused decision
444
+ * keeps no names.
445
+ *
446
+ * @param permission The host's evidenced cache permission; null refuses the names.
447
+ * @param signal Cancels the call.
448
+ * @throws {SourceSyncFault} A fixed failure, `invalid_response` for a malformed or oversized list.
449
+ */
450
+ async labels(permission, signal) {
451
+ const response = await this.control('labels', 'labels', {}, signal);
452
+ const body = object(response.body);
453
+ const entries = array(body.labels === undefined ? [] : body.labels, this.limits.maxLabels);
454
+ const cache = decideSourceCache({ permission, maximumCacheMs: this.bounds.maximumCacheMs,
455
+ readStartedAt: response.readStartedAt, receivedAt: response.receivedAt,
456
+ windowExpiresAt: response.readStartedAt + this.bounds.maximumCacheMs, headers: response.cacheHeaders });
457
+ const names = Object.create(null);
458
+ const seen = new Set();
459
+ for (const entry of entries) {
460
+ const row = object(entry);
461
+ if (!labelId(row.id) || seen.has(row.id) || typeof row.name !== 'string'
462
+ || row.name.length > this.bounds.maxInputCharacters)
463
+ return invalid();
464
+ seen.add(row.id);
465
+ if (cache.kind === 'cache')
466
+ names[row.id] = sanitizeMailMetadata(row.name, {
467
+ maxInputCharacters: this.bounds.maxInputCharacters, maxLineCharacters: this.bounds.maxLineCharacters,
468
+ maxOutputCharacters: Math.min(200, this.bounds.maxInputCharacters),
469
+ }).text;
470
+ }
471
+ active(signal);
472
+ return { names: Object.freeze(names), cache };
473
+ }
474
+ /**
475
+ * One page of candidate thread ids between `cutoff - windowMs` and `cutoff`, outside spam, trash and drafts. The
476
+ * query's whole-second bounds are widened by a second each way; the mapper enforces the exact window. Snippets and
477
+ * estimates are dropped, and no mailbox-wide completeness is claimed.
478
+ *
479
+ * @param cutoff The selection cutoff in epoch milliseconds.
480
+ * @param windowMs The window, from 1 millisecond to 90 days.
481
+ * @param pageSize Candidates per page, from 1 to 100.
482
+ * @param pageToken The resume token from the previous page, or null for the first.
483
+ * @param signal Cancels the call.
484
+ * @throws {SourceSyncFault} A fixed failure, `invalid_response` for bad arguments, a malformed page or a repeated
485
+ * page token.
486
+ */
487
+ async list(cutoff, windowMs, pageSize, pageToken, signal) {
488
+ this.pageSize(pageSize);
489
+ const token = this.pageToken(pageToken);
490
+ if (!integer(cutoff) || !integer(windowMs) || windowMs < 1 || windowMs > 90 * 86_400_000)
491
+ return invalid();
492
+ const after = Math.max(0, Math.floor((cutoff - windowMs) / 1000) - 1);
493
+ const before = Math.floor(cutoff / 1000) + 1;
494
+ const response = await this.control('list', 'threads', { maxResults: String(pageSize), includeSpamTrash: 'false',
495
+ q: `after:${after} before:${before} -in:spam -in:trash -in:drafts`,
496
+ ...(token === null ? {} : { pageToken: token }),
497
+ }, signal);
498
+ const body = object(response.body);
499
+ const entries = array(body.threads === undefined ? [] : body.threads, pageSize);
500
+ const ids = entries.map((entry) => { const id = object(entry).id; if (!gmailId(id))
501
+ return invalid(); return id; });
502
+ const nextPageToken = this.pageToken(body.nextPageToken);
503
+ if (nextPageToken !== null && nextPageToken === token)
504
+ return invalid();
505
+ return { kind: 'scan', ids, nextPageToken };
506
+ }
507
+ /**
508
+ * One page of history after `fromCursor`: the thread ids of every message addition, deletion and label change, and
509
+ * of generic message entries, deduplicated and sorted, with the page's decimal-string cursor. The host persists the
510
+ * pending work and commits a terminal cursor only once every item is terminal.
511
+ *
512
+ * @param fromCursor The committed history id, a decimal string.
513
+ * @param pageSize Records per page, from 1 to 100.
514
+ * @param pageToken The resume token from the previous page, or null for the first.
515
+ * @param signal Cancels the call.
516
+ * @throws {SourceSyncFault} `history_expired` when Google no longer holds the anchor; `invalid_response` for bad
517
+ * arguments, a malformed or out-of-order page, too many references or a repeated page token; another fixed failure.
518
+ */
519
+ async history(fromCursor, pageSize, pageToken, signal) {
520
+ this.pageSize(pageSize);
521
+ const token = this.pageToken(pageToken);
522
+ if (!historyId(fromCursor))
523
+ return invalid();
524
+ const response = await this.control('changes', 'history', { startHistoryId: fromCursor, maxResults: String(pageSize),
525
+ ...(token === null ? {} : { pageToken: token }),
526
+ }, signal);
527
+ const body = object(response.body);
528
+ if (!historyId(body.historyId) || compareHistory(body.historyId, fromCursor) < 0)
529
+ return invalid();
530
+ const records = array(body.history === undefined ? [] : body.history, pageSize);
531
+ const ids = new Set();
532
+ let references = 0;
533
+ let previous = fromCursor;
534
+ const changed = (value) => {
535
+ if (++references > this.limits.maxHistoryReferences)
536
+ return invalid();
537
+ const message = object(value);
538
+ if (!gmailId(message.id) || !gmailId(message.threadId))
539
+ return invalid();
540
+ ids.add(message.threadId);
541
+ };
542
+ for (const value of records) {
543
+ const entry = object(value);
544
+ if (!historyId(entry.id) || compareHistory(entry.id, fromCursor) <= 0
545
+ || compareHistory(entry.id, previous) < 0 || compareHistory(entry.id, body.historyId) > 0)
546
+ return invalid();
547
+ previous = entry.id;
548
+ for (const field of ['messages', 'messagesAdded', 'messagesDeleted', 'labelsAdded', 'labelsRemoved']) {
549
+ const events = array(entry[field] === undefined ? [] : entry[field], this.limits.maxHistoryReferences - references);
550
+ for (const event of events)
551
+ changed(field === 'messages' ? event : object(event).message);
552
+ }
553
+ }
554
+ const nextPageToken = this.pageToken(body.nextPageToken);
555
+ if (nextPageToken !== null && nextPageToken === token)
556
+ return invalid();
557
+ return { kind: 'history', ids: [...ids].sort(), nextPageToken, cursor: body.historyId };
558
+ }
559
+ /**
560
+ * Reads one thread in the `full` format and maps it with its own read times and cache headers and the separate
561
+ * label snapshot. A 404 is `gone`; an oversized successful answer is skipped as `response_too_large`; any other
562
+ * result is the mapper's. The raw response never leaves the client.
563
+ *
564
+ * @param sourceId The thread id, 1 to 64 hexadecimal characters.
565
+ * @param options The cutoff, window, detail path, cache permission, label snapshot and signal.
566
+ * @throws {SourceSyncFault} A fixed failure, `invalid_response` for a malformed id.
567
+ */
568
+ async readThread(sourceId, options) {
569
+ if (!gmailId(sourceId))
570
+ return invalid();
571
+ active(options.signal);
572
+ let response;
573
+ try {
574
+ response = await this.request('read', 'threads/' + sourceId, { format: 'full' }, options.signal);
575
+ }
576
+ catch (error) {
577
+ if (error instanceof GmailApiFault && error.reason === 'response_too_large') {
578
+ return { kind: 'skipped', id: sourceId, reason: 'response_too_large' };
579
+ }
580
+ throw error;
581
+ }
582
+ if (response === null)
583
+ return { kind: 'gone', id: sourceId };
584
+ return this.mapper.map(response.body, {
585
+ sourceId, sourceDetailUrl: options.sourceDetailUrl, cutoff: options.cutoff, windowMs: options.windowMs,
586
+ readStartedAt: response.readStartedAt, receivedAt: response.receivedAt,
587
+ permission: options.permission, cacheHeaders: response.cacheHeaders,
588
+ labelNames: options.labels?.names ?? {}, labelCache: options.labels?.cache ?? null, signal: options.signal,
589
+ });
590
+ }
591
+ }
592
+ //# sourceMappingURL=gmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../src/gmail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,GAIjG,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAA2B,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgGhE;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAEjB;IADrB,4CAA4C;IAC5C,YAAqB,MAA8C;QACjE,KAAK,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;QADV,WAAM,GAAN,MAAM,CAAwC;QACnC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC5D,CAAC;CACF;AAUD,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AACxD,mEAAmE;AACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;AAC1F,oFAAoF;AACpF,MAAM,OAAO,GAAG,GAAU,EAAE,GAAG,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjH,uHAAuH;AACvH,MAAM,QAAQ,GAAG,CAAC,MAAwB,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ;IAChG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7G,MAAM,OAAO,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ;OACzE,8CAA8C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChE,wGAAwG;AACxG,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,EAAE,CAAC;IAClF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,OAAe;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO;QAAE,OAAO,OAAO,EAAE,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AACD,4GAA4G;AAC5G,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IACjD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC;IAAC,CAAC;IACjF,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;WAC1E,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;WACnE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AACD,SAAS,MAAM,CAAC,QAAkB,IAAU,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAS,MAAM,CAAC,MAAoB,IAAU,IAAI,MAAM,EAAE,OAAO;IAAE,MAAM,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC5G,8GAA8G;AAC9G,SAAS,SAAS,CAAI,IAAgB,EAAE,MAAmB,EAAE,OAA8B,EACzF,OAA4B;IAC5B,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC;YAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,IAAI,EAAE,CAAC;gBAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AACD,+GAA+G;AAC/G,oEAAoE;AACpE,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,OAAe,EAAE,MAAmB,EAC/E,OAA8B;IAC9B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAAC,IAAI,MAAM,GAAG,KAAK,CAAC;IAAC,IAAI,IAAiB,CAAC;IACpF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAa;QAC5C,KAAK,CAAC,UAAU;YACd,IAAI,GAAG,GAAG,EAAE;gBACV,IAAI,MAAM;oBAAE,OAAO;gBACnB,MAAM,GAAG,IAAI,CAAC;gBAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,OAAO;gBAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,UAAU;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,MAAM;oBAAE,OAAO;gBACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;;oBAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5F,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAC,CAAC;YAChH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;KACnG,CAAC,CAAC;IACH,IAAI,CAAC;QAAC,OAAO,MAAM,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;YACtF,CAAC;QAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC;YAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IAAC,CAAC;AAC1I,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAQ;IAaU;IAZZ,MAAM,CAAS;IACf,IAAI,CAAe;IACnB,MAAM,CAAqB;IAC3B,MAAM,CAAiB;IACvB,MAAM,CAAoB;IAC3C;;;;;;OAMG;IACH,YAA6B,OAAkC;QAAlC,YAAO,GAAP,OAAO,CAA2B;QAC7D,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QACxF,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAmB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;QACpI,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA6B,EAAE,CAAC;YACpE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpG,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IACO,GAAG;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QAAC,OAAO,KAAK,CAAC;IAC1G,CAAC;IACD,+GAA+G;IAC/G,4EAA4E;IACpE,KAAK,CAAC,OAAe,IAAY,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,SAAS,CAAC,KAAc;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB;eACjG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IACO,QAAQ,CAAC,KAAa,IAAU,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAClH,mHAAmH;IACnH,kCAAkC;IAC1B,UAAU,CAAI,MAA4B;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAChI,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACO,KAAK,CAAC,OAAO,CAAI,MAAyB,EAAE,IAAyC,EAAE,MAAoB;QACjH,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAC/E,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,mHAAmH;IACnH,iEAAiE;IACzD,KAAK,CAAC,KAAK,CAAC,IAA6C,EAAE,UAAyB,EAC1F,KAA4B,EAAE,KAAc;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAClE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACtF,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,iHAAiH;IACjH,oHAAoH;IACpH,0BAA0B;IAClB,KAAK,CAAC,WAAW,CAAC,MAAoB;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC;QAC9E,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACnF,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;YAC3F,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;gBACrD,IAAI,UAAU,GAAkB,IAAI,CAAC;gBACrC,MAAM,aAAa,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAC9C,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACjD,OAAO,QAAQ,CAAC;gBAClB,CAAC,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;wBAC3D,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;qBACxF,CAAC,CAAC;oBACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,uGAAuG;oBACvG,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;oBAAC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;oBAC3J,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;wBAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBAC9D,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC,EAAE,WAAW,CAAC,CAAC;QAClB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAS,EAAE;YACzC,0GAA0G;YAC1G,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,MAAM,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACjI,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,sGAAsG;IAC9F,SAAS,CAAC,KAAa;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK;YAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACjG,CAAC;IACD,0FAA0F;IAClF,KAAK,CAAC,IAAI,CAAC,GAAQ,EAAE,KAAa,EAAE,WAAwB,EAAE,MAAoB;QACxF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAAC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrF,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,WAAW,CAAC,OAAO,IAAI,MAAM,EAAE,OAAO;YAAE,KAAK,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChG,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK;gBAC7D,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,GAAG,KAAK,EAAE;gBACzE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM;aACpH,CAAC,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACxC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,OAAO,EAAE,CAAC;YAAC,CAAC;YACrE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;gBACzG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,KAAiB,CAAC;YACtB,IAAI,CAAC;gBAAC,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,CAAC;YACpG,OAAO,KAAK,EAAE,CAAC;gBACb,4GAA4G;gBAC5G,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;oBACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;wBAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAAC;oBAC3E,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;;oBAAM,MAAM,KAAK,CAAC;YACrB,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,IAAI,UAAU,GAAG,aAAa;gBAAE,OAAO,OAAO,EAAE,CAAC;YAChF,IAAI,IAAI,GAAY,IAAI,CAAC;YACzB,IAAI,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,CAAC;YACnF,MAAM,CAAC;gBAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,OAAO,EAAE,CAAC;YAAC,CAAC;YACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU;gBAC/D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE;oBAC7D,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;oBACvF,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;iBAC3E,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,EAAE,OAAO,IAAI,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YAC9E,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,YAAY,aAAa;gBAAE,MAAM,KAAK,CAAC;YACpF,MAAM,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;IACD,2GAA2G;IACnG,KAAK,CAAC,OAAO,CAAC,MAAyB,EAAE,IAAY,EAC3D,KAAuC,EAAE,MAAoB;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAChF,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QACpI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,qBAAqB,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnF,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;YACjH,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9E,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAC/C,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC7C,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACtB,IAAI,WAAW,KAAK,CAAC;oBAAE,SAAS;gBAChC,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC9E,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAClE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IACD,kGAAkG;IAC1F,KAAK,CAAC,OAAO,CAAC,MAA0C,EAAE,IAAY,EAC5E,KAAuC,EAAE,MAAoB;QAC7D,IAAI,CAAC;YAAC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAAC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,OAAO,EAAE,CAAC;YAAC,OAAO,MAAM,CAAC;QAAC,CAAC;QAC7H,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB;gBAAE,OAAO,OAAO,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IAC/H,CAAC;IACD;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,GAAG;eACtE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QACtG,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACxE,CAAC;IACD;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,UAAwC,EAAE,MAAoB;QACzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;YACtF,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU;YACtE,eAAe,EAAE,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1G,MAAM,KAAK,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAA2B,CAAC;QACpF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;mBACnE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB;gBAAE,OAAO,OAAO,EAAE,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE;oBACzE,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;oBACpG,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;iBACnE,CAAC,CAAC,IAAI,CAAC;QACV,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAgB,EAC3D,SAAwB,EAAE,MAAoB;QAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,GAAG,UAAU;YAAE,OAAO,OAAO,EAAE,CAAC;QAC3G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,OAAO;YAC9G,CAAC,EAAE,SAAS,KAAK,WAAW,MAAM,gCAAgC;YAClE,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;SAChD,EAAE,MAAM,CAAC,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpH,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,OAAO,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAC9C,CAAC;IACD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,QAAgB,EAAE,SAAwB,EAC1E,MAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;YAClH,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;SAChD,EAAE,MAAM,CAAC,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QACnG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAAC,IAAI,UAAU,GAAG,CAAC,CAAC;QAAC,IAAI,QAAQ,GAAG,UAAU,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,KAAc,EAAQ,EAAE;YACvC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB;gBAAE,OAAO,OAAO,EAAE,CAAC;YACtE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,OAAO,EAAE,CAAC;YACzE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;mBAChE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,EAAE,CAAC;YAC9G,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,CAAU,EAAE,CAAC;gBAC9G,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,GAAG,UAAU,CAAC,CAAC;gBACpH,KAAK,MAAM,KAAK,IAAI,MAAM;oBAAE,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,OAAO,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1F,CAAC;IACD;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,OAAyB;QAC1D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,EAAE,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,QAA4B,CAAC;QACjC,IAAI,CAAC;YAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACzG,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;gBAC5E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACzE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;YACpC,QAAQ,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACtG,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU;YACtE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM;SAC3G,CAAC,CAAC;IACL,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -2,8 +2,11 @@
2
2
  * @fileoverview A read-only Gmail source's grant: Google's read-only scope on the AgentOS redirect OAuth flow and
3
3
  * sealed-token store, with capped, cancellable OAuth calls and fixed failures; its text helpers: bounded
4
4
  * pre-storage sanitization of mail text, allow-listed headers and metadata, and conservative trimming of reply history
5
- * and signatures; and its thread mapper: bounded MIME reading of one thread into a sanitized account-source document
6
- * with message provenance, attachment listings and an explicit cache decision.
5
+ * and signatures; its thread mapper: bounded MIME reading of one thread into a sanitized account-source document
6
+ * with message provenance, attachment listings and an explicit cache decision; its read-only API client: capped
7
+ * profile, label, list, history and thread calls through the host's grant and quota services, with fixed failures;
8
+ * and its connector: the bounded selected-id account-source interface and the resumable sync provider, with private
9
+ * mailbox verification, composed with the released durable coordinator and a one-time identity probe.
7
10
  * @module agentos-ext-gmail-source
8
11
  */
9
12
  export { GmailOAuthFlow } from './GmailOAuthFlow.js';
@@ -12,4 +15,8 @@ export { GmailTextFault, sanitizeMailText, sanitizeMailMetadata, sanitizeMailHea
12
15
  export { messageText, type GmailMessageText } from './messageText.js';
13
16
  export { GmailThreadMapper, type GmailMapThreadOptions } from './mapThread.js';
14
17
  export { GmailMappingFault, type GmailMappingBounds } from './mime.js';
18
+ export { GmailApi, GmailApiFault, type GmailApiOptions, type GmailApiLimits, type GmailProfile, type GmailLabels, type GmailReadOptions, type GmailTokenHolder, } from './gmail.js';
19
+ export { classifyGmailHttp, gmailOAuthFault, type GmailHttpDisposition } from './retry.js';
20
+ export { GmailSourceConnector, GmailConnectorFault, type GmailMailboxBinding, type GmailSourceConnectorOptions, } from './GmailSourceConnector.js';
21
+ export { runGmailSourceSync, verifyGmailSource, type GmailSourceRunOptions, type GmailSourceVerification, } from './sync.js';
15
22
  //# sourceMappingURL=index.d.ts.map