@framers/agentos-ext-gmail-source 0.5.2 → 0.6.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/README.md +8 -4
- package/dist/gmail.d.ts +19 -5
- package/dist/gmail.d.ts.map +1 -1
- package/dist/gmail.js +75 -12
- package/dist/gmail.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mailSanitize.d.ts +14 -1
- package/dist/mailSanitize.d.ts.map +1 -1
- package/dist/mailSanitize.js +23 -1
- package/dist/mailSanitize.js.map +1 -1
- package/dist/mapThread.d.ts +32 -7
- package/dist/mapThread.d.ts.map +1 -1
- package/dist/mapThread.js +68 -16
- package/dist/mapThread.js.map +1 -1
- package/dist/mime.d.ts +33 -7
- package/dist/mime.d.ts.map +1 -1
- package/dist/mime.js +110 -40
- package/dist/mime.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +4 -4
package/dist/mapThread.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { type SourceCachePermission, type SourceCacheHeaders, type SourceCacheDecision, type SourceSyncReadResult } from '@framers/agentos-ext-account-sources';
|
|
2
2
|
import { type GmailMappingBounds } from './mime.js';
|
|
3
|
+
/** A Gmail inbox tab beside Primary, by its `category:` search name. */
|
|
4
|
+
export type GmailCategory = 'forums' | 'promotions' | 'social' | 'updates';
|
|
5
|
+
/** Every category a client or a mapper can leave out, in the order the scan query names them. */
|
|
6
|
+
export declare const GMAIL_CATEGORIES: readonly GmailCategory[];
|
|
7
|
+
/**
|
|
8
|
+
* The categories an `excludedCategories` option names, deduplicated and in `GMAIL_CATEGORIES` order: none for an
|
|
9
|
+
* undefined option, null when the value is not an array of category names.
|
|
10
|
+
*/
|
|
11
|
+
export declare function gmailCategories(value: unknown): readonly GmailCategory[] | null;
|
|
12
|
+
/** The system labels of the given categories. */
|
|
13
|
+
export declare const categoryLabels: (categories: readonly GmailCategory[]) => ReadonlySet<string>;
|
|
3
14
|
/** The per-read values of one `map` call. The host supplies every value; none comes from a browser request. */
|
|
4
15
|
export interface GmailMapThreadOptions {
|
|
5
16
|
/** The requested thread id; the response must carry the same id. */
|
|
@@ -24,12 +35,23 @@ export interface GmailMapThreadOptions {
|
|
|
24
35
|
readonly permission: SourceCachePermission | null;
|
|
25
36
|
/** The thread response's own cache headers. */
|
|
26
37
|
readonly cacheHeaders: SourceCacheHeaders;
|
|
27
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* Label names from the cycle's labels response, by label id. They are text from a JSON body, not MIME header values:
|
|
40
|
+
* each is sanitized again and never decoded as RFC 2047 words, so a literal `=?` in a name stays as written. A run of
|
|
41
|
+
* encoded words in a name is decoded only to look inside, and one whose text holds an address or a credential is
|
|
42
|
+
* replaced by what the sanitizer leaves of it.
|
|
43
|
+
*/
|
|
28
44
|
readonly labelNames: Readonly<Record<string, string>>;
|
|
29
45
|
/** The labels response's own cache decision. Null, a refusal or an expired decision keeps ids without names. */
|
|
30
46
|
readonly labelCache: SourceCacheDecision | null;
|
|
31
47
|
/** Cancels the call between steps. */
|
|
32
48
|
readonly signal?: AbortSignal;
|
|
49
|
+
/**
|
|
50
|
+
* The inbox tabs whose messages are left out of the copy, by their `category:` names; none by default. A message
|
|
51
|
+
* carrying such a category's label (`CATEGORY_PROMOTIONS` for `promotions`, and so on) is omitted and counted under
|
|
52
|
+
* `excluded_category`.
|
|
53
|
+
*/
|
|
54
|
+
readonly excludedCategories?: readonly GmailCategory[];
|
|
33
55
|
}
|
|
34
56
|
/**
|
|
35
57
|
* Maps one parsed Gmail thread into a sanitized account-source document: one thread, one document, with each retained
|
|
@@ -49,12 +71,15 @@ export declare class GmailThreadMapper {
|
|
|
49
71
|
* Validates the whole response, filters each message by its internal date and by the spam, trash and draft labels,
|
|
50
72
|
* keeps the newest eligible messages up to the cap with ties broken by id, spends the thread's character budget
|
|
51
73
|
* newest first and renders the kept messages oldest first. A message's text is its sanitized header prefix followed
|
|
52
|
-
* by its sanitized, trimmed body,
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
74
|
+
* by its sanitized, trimmed body, cut to the message cap (or the thread cap when that is smaller) and never shorter:
|
|
75
|
+
* the first message whose text does not fit in what the thread budget has left, and every older one, is counted
|
|
76
|
+
* under `thread_limit` instead, so the text of a retained message never depends on the rest of its thread. Its span
|
|
77
|
+
* covers the body alone. A message that cannot be read is counted under `metadata.omitted` by a fixed reason. The
|
|
78
|
+
* cache expiry is the earliest of the permission's retention, the read start plus `maximumCacheMs`, the response's
|
|
79
|
+
* cache headers, every kept message's window end and the label names' expiry. The version is the history id and
|
|
80
|
+
* `contentHash`, the SHA-256 of the normalized text, metadata and spans: a release that normalizes text differently
|
|
81
|
+
* changes it for exactly the threads whose normalized text, metadata or spans change, so the store writes those
|
|
82
|
+
* copies again at their next read and keeps the rest.
|
|
58
83
|
*
|
|
59
84
|
* @param input The parsed `threads.get` response in the `full` format, from a transport that capped its bytes.
|
|
60
85
|
* @param options The per-read values.
|
package/dist/mapThread.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapThread.d.ts","sourceRoot":"","sources":["../src/mapThread.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EACjD,KAAK,oBAAoB,EACtD,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAOnB,+GAA+G;AAC/G,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,qHAAqH;IACrH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClD,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C
|
|
1
|
+
{"version":3,"file":"mapThread.d.ts","sourceRoot":"","sources":["../src/mapThread.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EACjD,KAAK,oBAAoB,EACtD,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAOnB,wEAAwE;AACxE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC3E,iGAAiG;AACjG,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAA0E,CAAC;AAKhI;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,aAAa,EAAE,GAAG,IAAI,CAM/E;AACD,iDAAiD;AACjD,eAAO,MAAM,cAAc,eAAgB,SAAS,aAAa,EAAE,KAAG,YAAY,MAAM,CACtB,CAAC;AACnE,+GAA+G;AAC/G,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,qHAAqH;IACrH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAClD,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,gHAAgH;IAChH,QAAQ,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAChD,sCAAsC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACxD;AA0CD;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C;;;OAGG;gBACS,MAAM,EAAE,kBAAkB;IAEtC,OAAO,CAAC,MAAM;YAKA,SAAS;IAiCvB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA8FzF"}
|
package/dist/mapThread.js
CHANGED
|
@@ -7,9 +7,31 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
9
|
import { decideSourceCache, SourceSyncFault, } from '@framers/agentos-ext-account-sources';
|
|
10
|
-
import { GmailMappingFault, mappingBounds, mappingActive, gmailId, parseMimeThread, decodedHeaders, decodeMimeWords, mimeBody, } from './mime.js';
|
|
11
|
-
import { GmailTextFault, sanitizeMailHeaders, sanitizeMailMetadata, } from './mailSanitize.js';
|
|
10
|
+
import { GmailMappingFault, mappingBounds, mappingActive, gmailId, parseMimeThread, decodedHeaders, decodeMimeWords, redactMimeWords, mimeBody, } from './mime.js';
|
|
11
|
+
import { GmailTextFault, sanitizeMailText, sanitizeMailHeaders, sanitizeMailMetadata, } from './mailSanitize.js';
|
|
12
12
|
import { messageText } from './messageText.js';
|
|
13
|
+
/** Every category a client or a mapper can leave out, in the order the scan query names them. */
|
|
14
|
+
export const GMAIL_CATEGORIES = Object.freeze(['forums', 'promotions', 'social', 'updates']);
|
|
15
|
+
// The system label Gmail gives a message of each category.
|
|
16
|
+
const CATEGORY_LABELS = Object.freeze({
|
|
17
|
+
forums: 'CATEGORY_FORUMS', promotions: 'CATEGORY_PROMOTIONS', social: 'CATEGORY_SOCIAL', updates: 'CATEGORY_UPDATES',
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* The categories an `excludedCategories` option names, deduplicated and in `GMAIL_CATEGORIES` order: none for an
|
|
21
|
+
* undefined option, null when the value is not an array of category names.
|
|
22
|
+
*/
|
|
23
|
+
export function gmailCategories(value) {
|
|
24
|
+
if (value === undefined)
|
|
25
|
+
return [];
|
|
26
|
+
if (!Array.isArray(value))
|
|
27
|
+
return null;
|
|
28
|
+
const entries = value;
|
|
29
|
+
if (entries.some((entry) => !GMAIL_CATEGORIES.includes(entry)))
|
|
30
|
+
return null;
|
|
31
|
+
return GMAIL_CATEGORIES.filter((category) => entries.includes(category));
|
|
32
|
+
}
|
|
33
|
+
/** The system labels of the given categories. */
|
|
34
|
+
export const categoryLabels = (categories) => new Set(categories.map((category) => CATEGORY_LABELS[category]));
|
|
13
35
|
// An epoch-millisecond value a Date can hold.
|
|
14
36
|
const validTime = (n) => Number.isSafeInteger(n) && n >= 0 && n <= 8_640_000_000_000_000;
|
|
15
37
|
const compareId = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
@@ -28,7 +50,8 @@ function configuration(options) {
|
|
|
28
50
|
if (!gmailId(options.sourceId) || typeof url !== 'string' || !/^\/[A-Za-z0-9_-]+(?:\/[A-Za-z0-9_-]+)*\/?$/.test(url)
|
|
29
51
|
|| url.length > 512 || !validTime(options.cutoff) || !validTime(options.readStartedAt)
|
|
30
52
|
|| !validTime(options.receivedAt) || options.receivedAt < options.readStartedAt || options.cutoff > options.receivedAt
|
|
31
|
-
|| !Number.isSafeInteger(options.windowMs) || options.windowMs < 1 || options.windowMs > 90 * 86_400_000
|
|
53
|
+
|| !Number.isSafeInteger(options.windowMs) || options.windowMs < 1 || options.windowMs > 90 * 86_400_000
|
|
54
|
+
|| gmailCategories(options.excludedCategories) === null) {
|
|
32
55
|
throw new GmailMappingFault('configuration');
|
|
33
56
|
}
|
|
34
57
|
}
|
|
@@ -69,12 +92,20 @@ export class GmailThreadMapper {
|
|
|
69
92
|
const attachments = body.attachments.map((attachment) => ({
|
|
70
93
|
filename: metadata(attachment.filename), mediaType: metadata(attachment.mediaType, 128), size: attachment.size,
|
|
71
94
|
}));
|
|
95
|
+
// A label name is JSON text, never MIME encoded: decoding it as RFC 2047 words refused a literal `=?` and lost every
|
|
96
|
+
// message carrying the label. It is sanitized as written, and a run of encoded words in it is decoded only to look
|
|
97
|
+
// inside: one whose text holds an address or a credential gives way to what the sanitizer leaves of it, so nothing
|
|
98
|
+
// a reader could decode back is stored.
|
|
99
|
+
const labelText = (raw) => redactMimeWords(raw, budget, (decoded) => {
|
|
100
|
+
const inspected = sanitizeMailText(decoded, this.policy(this.bounds.maxInputCharacters));
|
|
101
|
+
return inspected.addressRedactions + inspected.secretRedactions + inspected.suppressedLines > 0 ? inspected.text : null;
|
|
102
|
+
});
|
|
72
103
|
const labels = message.labels.map((id) => {
|
|
73
104
|
const permitted = options.labelCache?.kind === 'cache' && validTime(options.labelCache.expiresAt) && options.labelCache.expiresAt > options.receivedAt && options.labelCache.evidenceId.length > 0;
|
|
74
105
|
const raw = permitted && Object.hasOwn(options.labelNames, id) ? options.labelNames[id] : id;
|
|
75
106
|
if (typeof raw !== 'string')
|
|
76
107
|
throw new SourceSyncFault('invalid_response');
|
|
77
|
-
return { id, name:
|
|
108
|
+
return { id, name: sanitizeMailMetadata(labelText(raw), this.policy(200)).text };
|
|
78
109
|
});
|
|
79
110
|
const lines = ['subject', 'date', 'from', 'to', 'cc']
|
|
80
111
|
.filter((key) => headers[key] !== '').map((key) => key[0].toUpperCase() + key.slice(1) + ': ' + headers[key]);
|
|
@@ -89,12 +120,15 @@ export class GmailThreadMapper {
|
|
|
89
120
|
* Validates the whole response, filters each message by its internal date and by the spam, trash and draft labels,
|
|
90
121
|
* keeps the newest eligible messages up to the cap with ties broken by id, spends the thread's character budget
|
|
91
122
|
* newest first and renders the kept messages oldest first. A message's text is its sanitized header prefix followed
|
|
92
|
-
* by its sanitized, trimmed body,
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
123
|
+
* by its sanitized, trimmed body, cut to the message cap (or the thread cap when that is smaller) and never shorter:
|
|
124
|
+
* the first message whose text does not fit in what the thread budget has left, and every older one, is counted
|
|
125
|
+
* under `thread_limit` instead, so the text of a retained message never depends on the rest of its thread. Its span
|
|
126
|
+
* covers the body alone. A message that cannot be read is counted under `metadata.omitted` by a fixed reason. The
|
|
127
|
+
* cache expiry is the earliest of the permission's retention, the read start plus `maximumCacheMs`, the response's
|
|
128
|
+
* cache headers, every kept message's window end and the label names' expiry. The version is the history id and
|
|
129
|
+
* `contentHash`, the SHA-256 of the normalized text, metadata and spans: a release that normalizes text differently
|
|
130
|
+
* changes it for exactly the threads whose normalized text, metadata or spans change, so the store writes those
|
|
131
|
+
* copies again at their next read and keeps the rest.
|
|
98
132
|
*
|
|
99
133
|
* @param input The parsed `threads.get` response in the `full` format, from a transport that capped its bytes.
|
|
100
134
|
* @param options The per-read values.
|
|
@@ -109,6 +143,7 @@ export class GmailThreadMapper {
|
|
|
109
143
|
mappingActive(options.signal);
|
|
110
144
|
const skipped = (reason) => ({ kind: 'skipped', id: options.sourceId, reason });
|
|
111
145
|
const budget = { bounds: this.bounds, rawBytes: 0, decodedBytes: 0, parts: 0 };
|
|
146
|
+
const excludedLabels = categoryLabels(gmailCategories(options.excludedCategories) ?? []);
|
|
112
147
|
let thread;
|
|
113
148
|
try {
|
|
114
149
|
thread = parseMimeThread(input, options.sourceId, budget, options.signal);
|
|
@@ -133,18 +168,29 @@ export class GmailThreadMapper {
|
|
|
133
168
|
omit('excluded_label');
|
|
134
169
|
continue;
|
|
135
170
|
}
|
|
171
|
+
if (message.labels.some((label) => excludedLabels.has(label))) {
|
|
172
|
+
omit('excluded_category');
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
136
175
|
eligible.push(message);
|
|
137
176
|
}
|
|
138
177
|
eligible.sort(newest);
|
|
139
178
|
const selected = eligible.slice(0, this.bounds.maxMessages);
|
|
140
179
|
omit('message_limit', eligible.length - selected.length);
|
|
180
|
+
// Each message keeps its own cut, whatever else the thread holds: cutting the oldest kept message to what the newer
|
|
181
|
+
// ones left would change its text at every reply near the cap, and the account-source store charges a message its
|
|
182
|
+
// copy holds nothing only when its text hash, cut and length are unchanged. The first message that does not fit
|
|
183
|
+
// whole in what is left reaches the cap: it and every older message are omitted under `thread_limit`, unread, as
|
|
184
|
+
// they were once a cut message had filled the budget.
|
|
185
|
+
const cut = Math.min(this.bounds.maxMessageCharacters, this.bounds.maxThreadCharacters);
|
|
141
186
|
const retained = [];
|
|
142
187
|
let used = 0;
|
|
188
|
+
let full = false;
|
|
143
189
|
let lastReason = 'no_eligible_content';
|
|
144
190
|
for (const message of selected) {
|
|
145
191
|
mappingActive(options.signal);
|
|
146
192
|
const remaining = this.bounds.maxThreadCharacters - used - (retained.length ? 2 : 0);
|
|
147
|
-
if (remaining <= 0) {
|
|
193
|
+
if (full || remaining <= 0) {
|
|
148
194
|
omit('thread_limit');
|
|
149
195
|
continue;
|
|
150
196
|
}
|
|
@@ -161,26 +207,32 @@ export class GmailThreadMapper {
|
|
|
161
207
|
continue;
|
|
162
208
|
}
|
|
163
209
|
mappingActive(options.signal);
|
|
164
|
-
|
|
165
|
-
if (normalized.prefix.length > maximum) {
|
|
210
|
+
if (normalized.prefix.length > cut) {
|
|
166
211
|
lastReason = 'structure_limit';
|
|
167
212
|
omit('thread_limit');
|
|
168
213
|
continue;
|
|
169
214
|
}
|
|
170
|
-
const body = clip(normalized.body,
|
|
215
|
+
const body = clip(normalized.body, cut - normalized.prefix.length);
|
|
171
216
|
const text = normalized.prefix + body;
|
|
172
217
|
if (!text) {
|
|
173
218
|
lastReason = 'no_eligible_content';
|
|
174
219
|
omit(lastReason);
|
|
175
220
|
continue;
|
|
176
221
|
}
|
|
222
|
+
if (text.length > remaining) {
|
|
223
|
+
full = true;
|
|
224
|
+
omit('thread_limit');
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
177
227
|
retained.push({ normalized, text, bodyStart: normalized.prefix.length,
|
|
178
228
|
truncated: normalized.truncated || body.length < normalized.body.length });
|
|
179
229
|
used += text.length + (retained.length > 1 ? 2 : 0);
|
|
180
230
|
}
|
|
181
231
|
if (retained.length === 0) {
|
|
182
|
-
if (eligible.length === 0)
|
|
183
|
-
lastReason = omitted.excluded_label
|
|
232
|
+
if (eligible.length === 0) {
|
|
233
|
+
lastReason = omitted.excluded_label || omitted.excluded_category ? 'excluded_label'
|
|
234
|
+
: omitted.out_of_window ? 'out_of_window' : lastReason;
|
|
235
|
+
}
|
|
184
236
|
return skipped(lastReason);
|
|
185
237
|
}
|
|
186
238
|
retained.sort((a, b) => a.normalized.message.receivedAt - b.normalized.message.receivedAt
|
package/dist/mapThread.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapThread.js","sourceRoot":"","sources":["../src/mapThread.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mapThread.js","sourceRoot":"","sources":["../src/mapThread.ts"],"names":[],"mappings":"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"}
|
package/dist/mime.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type SourceSyncSkipReason } from '@framers/agentos-ext-account-sources';
|
|
2
|
-
import type
|
|
2
|
+
import { type GmailHeaderInput } from './mailSanitize.js';
|
|
3
3
|
/**
|
|
4
4
|
* The ceilings one mapper enforces, each a positive safe integer no greater than the value in brackets. They are
|
|
5
5
|
* operating choices, not Gmail service limits.
|
|
@@ -15,9 +15,16 @@ export interface GmailMappingBounds {
|
|
|
15
15
|
readonly maxMimeParts: number;
|
|
16
16
|
/** Messages retained in one thread document, newest first (100). */
|
|
17
17
|
readonly maxMessages: number;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* UTF-16 code units of one message's header prefix and body together (20,000). A message is cut to this, or to
|
|
20
|
+
* `maxThreadCharacters` when that is smaller, whatever else its thread holds.
|
|
21
|
+
*/
|
|
19
22
|
readonly maxMessageCharacters: number;
|
|
20
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* UTF-16 code units of the thread document's text, separators included (200,000). It is spent on the newest
|
|
25
|
+
* messages first, each whole at its own cut: the first message that does not fit in what is left, and every older
|
|
26
|
+
* one, is omitted under `thread_limit`, and none is cut shorter to fit.
|
|
27
|
+
*/
|
|
21
28
|
readonly maxThreadCharacters: number;
|
|
22
29
|
/** Characters of the document's serialized metadata (200,000). */
|
|
23
30
|
readonly maxMetadataCharacters: number;
|
|
@@ -126,15 +133,34 @@ export declare function parseMimeThread(value: unknown, sourceId: string, budget
|
|
|
126
133
|
* `response_too_large` above the character or decoded-byte bound.
|
|
127
134
|
*/
|
|
128
135
|
export declare function decodeMimeWords(input: string, budget: MimeBudget): string;
|
|
136
|
+
/**
|
|
137
|
+
* Looks inside the RFC 2047 encoded words of text that is not a MIME header value, such as a label name from the labels
|
|
138
|
+
* response, without decoding the text. Each run of encoded words (`=?charset?B?...?=` or `=?charset?Q?...?=`, of any
|
|
139
|
+
* length, with only whitespace between them) is decoded, its words joined as RFC 2047 joins adjacent words, only to
|
|
140
|
+
* hand its text to `redact`, whose answer replaces the run. When a word of the run has a malformed body, invalid bytes
|
|
141
|
+
* or a charset the runtime does not decode, that word stays as written and each other word is handed over alone. A
|
|
142
|
+
* null answer keeps a run or word as written, as every other character stays, a stray `=?` among them, so no text is
|
|
143
|
+
* refused.
|
|
144
|
+
*
|
|
145
|
+
* @param input The text, at most `maxInputCharacters` long.
|
|
146
|
+
* @param budget The call's running counts; the decoded bytes are charged to it.
|
|
147
|
+
* @param redact Given decoded text, what replaces the run or word it came from, or null to keep that as written.
|
|
148
|
+
* @returns The text with the runs and words `redact` answered replaced.
|
|
149
|
+
* @throws {GmailMappingFault} `response_too_large` above the character or decoded-byte bound.
|
|
150
|
+
*/
|
|
151
|
+
export declare function redactMimeWords(input: string, budget: MimeBudget, redact: (decoded: string) => string | null): string;
|
|
129
152
|
/** A part's Subject, Date, From, To and Cc, decoded; Bcc and every other header are never decoded or returned. */
|
|
130
153
|
export declare function decodedHeaders(part: MimePart, budget: MimeBudget): readonly GmailHeaderInput[];
|
|
131
154
|
/**
|
|
132
155
|
* Select before decoding, and never interpret Content-Transfer-Encoding a second time: Gmail's `data` already holds the
|
|
133
156
|
* part's bytes. Lists the message's attachments and builds its body text. Within `multipart/alternative` the branch
|
|
134
|
-
* with eligible plain text wins over HTML
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
157
|
+
* with eligible plain text wins over HTML, unless its text is blank: nothing but whitespace, padding and the percent
|
|
158
|
+
* and character references that decode to them (see `blankMailText`), as in the empty plain part some mailers send
|
|
159
|
+
* beside their HTML. A blank branch yields to the next one, a later branch whose bytes or charset cannot be read is
|
|
160
|
+
* passed over, and when every branch is blank the preferred one stands. Other multipart containers join their text
|
|
161
|
+
* children in MIME order. HTML becomes inert text through `HtmlLoader` given an in-memory Buffer; every character
|
|
162
|
+
* reference the loader leaves is then decoded, padding runs of no-break spaces and zero-width characters collapse,
|
|
163
|
+
* and whitespace collapses again. Other media types are counted, not read.
|
|
138
164
|
*
|
|
139
165
|
* @throws {GmailMappingFault} `invalid_encoding`, `unsupported_charset` or `response_too_large` for the message.
|
|
140
166
|
* @throws {SourceSyncFault} `cancelled` once the signal is aborted.
|
package/dist/mime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"AAWA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"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"}
|
package/dist/mime.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { HtmlLoader } from '@framers/agentos/cognition/memory';
|
|
12
12
|
import { SourceSyncFault } from '@framers/agentos-ext-account-sources';
|
|
13
|
+
import { blankMailText } from './mailSanitize.js';
|
|
13
14
|
import { collapsePadding, decodeCharacterReferences } from './characters.js';
|
|
14
15
|
/**
|
|
15
16
|
* A mapper's fixed refusal; its message is `gmail_mapping_<reason>` and never carries mail text. `configuration` is
|
|
@@ -226,31 +227,7 @@ export function decodeMimeWords(input, budget) {
|
|
|
226
227
|
throw new GmailMappingFault('invalid_encoding');
|
|
227
228
|
if (!(previousWord && /^[ \t\r\n]*$/.test(between)))
|
|
228
229
|
result += between;
|
|
229
|
-
|
|
230
|
-
if (match[2].toLowerCase() === 'b')
|
|
231
|
-
bytes = base64(match[3], false, budget);
|
|
232
|
-
else {
|
|
233
|
-
const encoded = match[3];
|
|
234
|
-
const values = [];
|
|
235
|
-
for (let i = 0; i < encoded.length; i++) {
|
|
236
|
-
const character = encoded[i];
|
|
237
|
-
if (character === '=') {
|
|
238
|
-
const hex = encoded.slice(i + 1, i + 3);
|
|
239
|
-
if (!/^[0-9a-f]{2}$/i.test(hex))
|
|
240
|
-
throw new GmailMappingFault('invalid_encoding');
|
|
241
|
-
values.push(Number.parseInt(hex, 16));
|
|
242
|
-
i += 2;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
const point = character.charCodeAt(0);
|
|
246
|
-
if (point < 33 || point > 126 || character === '?')
|
|
247
|
-
throw new GmailMappingFault('invalid_encoding');
|
|
248
|
-
values.push(character === '_' ? 32 : point);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
bytes = charge(Uint8Array.from(values), budget);
|
|
252
|
-
}
|
|
253
|
-
result += decode(bytes, match[1]);
|
|
230
|
+
result += decodeWord(match[1], match[2], match[3], budget);
|
|
254
231
|
end = start + match[0].length;
|
|
255
232
|
previousWord = true;
|
|
256
233
|
if (result.length > budget.bounds.maxInputCharacters)
|
|
@@ -261,6 +238,80 @@ export function decodeMimeWords(input, budget) {
|
|
|
261
238
|
throw new GmailMappingFault('invalid_encoding');
|
|
262
239
|
return result;
|
|
263
240
|
}
|
|
241
|
+
// One encoded word's text: its B body read as strict base64 or its Q body byte by byte, the bytes charged to the
|
|
242
|
+
// budget, then decoded with a fatal decoder for the declared charset.
|
|
243
|
+
function decodeWord(charsetName, encoding, encoded, budget) {
|
|
244
|
+
let bytes;
|
|
245
|
+
if (encoding.toLowerCase() === 'b')
|
|
246
|
+
bytes = base64(encoded, false, budget);
|
|
247
|
+
else {
|
|
248
|
+
const values = [];
|
|
249
|
+
for (let i = 0; i < encoded.length; i++) {
|
|
250
|
+
const character = encoded[i];
|
|
251
|
+
if (character === '=') {
|
|
252
|
+
const hex = encoded.slice(i + 1, i + 3);
|
|
253
|
+
if (!/^[0-9a-f]{2}$/i.test(hex))
|
|
254
|
+
throw new GmailMappingFault('invalid_encoding');
|
|
255
|
+
values.push(Number.parseInt(hex, 16));
|
|
256
|
+
i += 2;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
const point = character.charCodeAt(0);
|
|
260
|
+
if (point < 33 || point > 126 || character === '?')
|
|
261
|
+
throw new GmailMappingFault('invalid_encoding');
|
|
262
|
+
values.push(character === '_' ? 32 : point);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
bytes = charge(Uint8Array.from(values), budget);
|
|
266
|
+
}
|
|
267
|
+
return decode(bytes, charsetName);
|
|
268
|
+
}
|
|
269
|
+
// Whether an encoded word or a text part could not be read for its own bytes or charset; any other failure stands.
|
|
270
|
+
const unreadable = (error) => error instanceof GmailMappingFault
|
|
271
|
+
&& (error.reason === 'invalid_encoding' || error.reason === 'unsupported_charset');
|
|
272
|
+
/**
|
|
273
|
+
* Looks inside the RFC 2047 encoded words of text that is not a MIME header value, such as a label name from the labels
|
|
274
|
+
* response, without decoding the text. Each run of encoded words (`=?charset?B?...?=` or `=?charset?Q?...?=`, of any
|
|
275
|
+
* length, with only whitespace between them) is decoded, its words joined as RFC 2047 joins adjacent words, only to
|
|
276
|
+
* hand its text to `redact`, whose answer replaces the run. When a word of the run has a malformed body, invalid bytes
|
|
277
|
+
* or a charset the runtime does not decode, that word stays as written and each other word is handed over alone. A
|
|
278
|
+
* null answer keeps a run or word as written, as every other character stays, a stray `=?` among them, so no text is
|
|
279
|
+
* refused.
|
|
280
|
+
*
|
|
281
|
+
* @param input The text, at most `maxInputCharacters` long.
|
|
282
|
+
* @param budget The call's running counts; the decoded bytes are charged to it.
|
|
283
|
+
* @param redact Given decoded text, what replaces the run or word it came from, or null to keep that as written.
|
|
284
|
+
* @returns The text with the runs and words `redact` answered replaced.
|
|
285
|
+
* @throws {GmailMappingFault} `response_too_large` above the character or decoded-byte bound.
|
|
286
|
+
*/
|
|
287
|
+
export function redactMimeWords(input, budget, redact) {
|
|
288
|
+
if (input.length > budget.bounds.maxInputCharacters)
|
|
289
|
+
throw new GmailMappingFault('response_too_large');
|
|
290
|
+
const word = /=\?([^?\s]{1,40})\?([bq])\?([^?\r\n]*)\?=/gi;
|
|
291
|
+
const run = /=\?[^?\s]{1,40}\?[bq]\?[^?\r\n]*\?=(?:[ \t\r\n]*=\?[^?\s]{1,40}\?[bq]\?[^?\r\n]*\?=)*/gi;
|
|
292
|
+
return input.replace(run, (words) => {
|
|
293
|
+
let decoded = '';
|
|
294
|
+
try {
|
|
295
|
+
for (const match of words.matchAll(word))
|
|
296
|
+
decoded += decodeWord(match[1], match[2], match[3], budget);
|
|
297
|
+
return redact(decoded) ?? words;
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
if (!unreadable(error))
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
return words.replace(word, (one, charsetName, encoding, encoded) => {
|
|
304
|
+
try {
|
|
305
|
+
return redact(decodeWord(charsetName, encoding, encoded, budget)) ?? one;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (unreadable(error))
|
|
309
|
+
return one;
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
}
|
|
264
315
|
/** A part's Subject, Date, From, To and Cc, decoded; Bcc and every other header are never decoded or returned. */
|
|
265
316
|
export function decodedHeaders(part, budget) {
|
|
266
317
|
return part.headers.filter((h) => ['subject', 'date', 'from', 'to', 'cc'].includes(h.name.toLowerCase()))
|
|
@@ -310,10 +361,13 @@ function inertText(content) {
|
|
|
310
361
|
/**
|
|
311
362
|
* Select before decoding, and never interpret Content-Transfer-Encoding a second time: Gmail's `data` already holds the
|
|
312
363
|
* part's bytes. Lists the message's attachments and builds its body text. Within `multipart/alternative` the branch
|
|
313
|
-
* with eligible plain text wins over HTML
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
364
|
+
* with eligible plain text wins over HTML, unless its text is blank: nothing but whitespace, padding and the percent
|
|
365
|
+
* and character references that decode to them (see `blankMailText`), as in the empty plain part some mailers send
|
|
366
|
+
* beside their HTML. A blank branch yields to the next one, a later branch whose bytes or charset cannot be read is
|
|
367
|
+
* passed over, and when every branch is blank the preferred one stands. Other multipart containers join their text
|
|
368
|
+
* children in MIME order. HTML becomes inert text through `HtmlLoader` given an in-memory Buffer; every character
|
|
369
|
+
* reference the loader leaves is then decoded, padding runs of no-break spaces and zero-width characters collapse,
|
|
370
|
+
* and whitespace collapses again. Other media types are counted, not read.
|
|
317
371
|
*
|
|
318
372
|
* @throws {GmailMappingFault} `invalid_encoding`, `unsupported_charset` or `response_too_large` for the message.
|
|
319
373
|
* @throws {SourceSyncFault} `cancelled` once the signal is aborted.
|
|
@@ -327,20 +381,36 @@ export async function mimeBody(root, budget, signal) {
|
|
|
327
381
|
if (part.attachment)
|
|
328
382
|
return '';
|
|
329
383
|
if (part.mimeType === 'multipart/alternative') {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
}
|
|
339
|
-
if (!chosen) {
|
|
384
|
+
// Branches in preference order, plain text before HTML and MIME order within a rank, so the first is the one
|
|
385
|
+
// chosen by media type alone. A branch whose text would sanitize to nothing yields to the next: an empty plain
|
|
386
|
+
// part must not hide the HTML beside it. A later branch that cannot be read, for its bytes or its charset, is
|
|
387
|
+
// passed over, since it was read only in hope of something better. When every branch is blank the first stands,
|
|
388
|
+
// with only its own unsupported parts counted.
|
|
389
|
+
const branches = part.parts.map((child) => ({ child, score: rank(child) })).filter((branch) => branch.score > 0)
|
|
390
|
+
.sort((a, b) => b.score - a.score);
|
|
391
|
+
if (branches.length === 0) {
|
|
340
392
|
unsupportedParts++;
|
|
341
393
|
return '';
|
|
342
394
|
}
|
|
343
|
-
|
|
395
|
+
const counted = unsupportedParts;
|
|
396
|
+
let first;
|
|
397
|
+
for (const branch of branches) {
|
|
398
|
+
unsupportedParts = counted;
|
|
399
|
+
let value;
|
|
400
|
+
try {
|
|
401
|
+
value = await text(branch.child);
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
if (first && unreadable(error))
|
|
405
|
+
continue;
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
if (!blankMailText(value, budget.bounds.maxInputCharacters))
|
|
409
|
+
return value;
|
|
410
|
+
first ??= { value, unsupported: unsupportedParts };
|
|
411
|
+
}
|
|
412
|
+
unsupportedParts = first.unsupported;
|
|
413
|
+
return first.value;
|
|
344
414
|
}
|
|
345
415
|
if (part.mimeType.startsWith('multipart/')) {
|
|
346
416
|
const chunks = [];
|