@wirecat/cli-memo 0.41.0 → 0.43.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/doctor/command.d.ts +1 -1
- package/dist/effects.d.ts.map +1 -1
- package/dist/effects.js +7 -0
- package/dist/effects.js.map +1 -1
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +8 -4
- package/dist/examples.js.map +1 -1
- package/dist/json-fields.d.ts +2 -1
- package/dist/json-fields.d.ts.map +1 -1
- package/dist/json-fields.js +3 -3
- package/dist/json-fields.js.map +1 -1
- package/dist/mail/apply.d.ts +7 -0
- package/dist/mail/apply.d.ts.map +1 -1
- package/dist/mail/apply.js +27 -4
- package/dist/mail/apply.js.map +1 -1
- package/dist/mail/bulk.d.ts +8 -0
- package/dist/mail/bulk.d.ts.map +1 -0
- package/dist/mail/bulk.js +4 -0
- package/dist/mail/bulk.js.map +1 -0
- package/dist/mail/command.d.ts.map +1 -1
- package/dist/mail/command.js +123 -44
- package/dist/mail/command.js.map +1 -1
- package/dist/mail/facts.d.ts +10 -0
- package/dist/mail/facts.d.ts.map +1 -0
- package/dist/mail/facts.js +23 -0
- package/dist/mail/facts.js.map +1 -0
- package/dist/mail/filters.d.ts +11 -0
- package/dist/mail/filters.d.ts.map +1 -0
- package/dist/mail/filters.js +150 -0
- package/dist/mail/filters.js.map +1 -0
- package/dist/mail/headers.d.ts +3 -1
- package/dist/mail/headers.d.ts.map +1 -1
- package/dist/mail/headers.js +2 -1
- package/dist/mail/headers.js.map +1 -1
- package/dist/mail/import.d.ts +5 -0
- package/dist/mail/import.d.ts.map +1 -1
- package/dist/mail/import.js +25 -4
- package/dist/mail/import.js.map +1 -1
- package/dist/mail/parse.d.ts +3 -0
- package/dist/mail/parse.d.ts.map +1 -1
- package/dist/mail/parse.js +7 -2
- package/dist/mail/parse.js.map +1 -1
- package/dist/mail/presets.d.ts +31 -0
- package/dist/mail/presets.d.ts.map +1 -0
- package/dist/mail/presets.js +96 -0
- package/dist/mail/presets.js.map +1 -0
- package/dist/mail/probe.d.ts +13 -0
- package/dist/mail/probe.d.ts.map +1 -1
- package/dist/mail/probe.js +17 -1
- package/dist/mail/probe.js.map +1 -1
- package/dist/mail/repair.d.ts +7 -0
- package/dist/mail/repair.d.ts.map +1 -0
- package/dist/mail/repair.js +45 -0
- package/dist/mail/repair.js.map +1 -0
- package/dist/mail/rule-query.d.ts +15 -0
- package/dist/mail/rule-query.d.ts.map +1 -0
- package/dist/mail/rule-query.js +101 -0
- package/dist/mail/rule-query.js.map +1 -0
- package/dist/mail/rule-store.d.ts +3 -5
- package/dist/mail/rule-store.d.ts.map +1 -1
- package/dist/mail/rule-store.js +47 -17
- package/dist/mail/rule-store.js.map +1 -1
- package/dist/mail/rule-tags.d.ts +41 -0
- package/dist/mail/rule-tags.d.ts.map +1 -0
- package/dist/mail/rule-tags.js +88 -0
- package/dist/mail/rule-tags.js.map +1 -0
- package/dist/mail/rules.d.ts +51 -6
- package/dist/mail/rules.d.ts.map +1 -1
- package/dist/mail/rules.js +86 -22
- package/dist/mail/rules.js.map +1 -1
- package/dist/mail/score.d.ts +2 -0
- package/dist/mail/score.d.ts.map +1 -1
- package/dist/mail/score.js +11 -1
- package/dist/mail/score.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +44 -1
- package/dist/program.js.map +1 -1
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +6 -0
- package/dist/reasons.js.map +1 -1
- package/dist/run/import.d.ts.map +1 -1
- package/dist/run/import.js +4 -0
- package/dist/run/import.js.map +1 -1
- package/dist/search/command.d.ts.map +1 -1
- package/dist/search/command.js +12 -3
- package/dist/search/command.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/skills/cli-memo/SKILL.md +8 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-query.js","sourceRoot":"","sources":["../../src/mail/rule-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,11 @@ import type { AccountKey, MessageStore } from "@wirecat/cli-core/store";
|
|
|
2
2
|
import type { MailAccountConfig } from "./accounts.js";
|
|
3
3
|
import { type MailRule, type MailRuleMatch } from "./rules.js";
|
|
4
4
|
export declare const ruleInput: (rule: MailRule, source?: string) => {
|
|
5
|
-
conditions:
|
|
6
|
-
from?: string | undefined;
|
|
7
|
-
domain?: string | undefined;
|
|
8
|
-
list_id?: string | undefined;
|
|
9
|
-
};
|
|
5
|
+
conditions: Record<string, string | number | boolean>;
|
|
10
6
|
actions: {
|
|
11
7
|
store: string;
|
|
8
|
+
tags?: string[] | undefined;
|
|
9
|
+
tags_skipped?: Record<string, string> | undefined;
|
|
12
10
|
};
|
|
13
11
|
protected: boolean;
|
|
14
12
|
source: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-store.d.ts","sourceRoot":"","sources":["../../src/mail/rule-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,yBAAyB,CAAA;AAE/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"rule-store.d.ts","sourceRoot":"","sources":["../../src/mail/rule-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,yBAAyB,CAAA;AAE/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,EAAyD,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAkBrH,eAAO,MAAM,SAAS,SAAU,QAAQ;;;;;;;;;;;CAWtC,CAAA;AAiDF,eAAO,MAAM,UAAU,YAAa,MAAM,KAAG,UAAqE,CAAA;AAMlH;;;;GAIG;AACH,eAAO,MAAM,eAAe,UACnB,YAAY,OACd,MAAM,CAAC,UAAU,OACjB,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC1B,OAAO,CAAC,IAAI,CAuCd,CAAA;AAqBD,uGAAuG;AACvG,eAAO,MAAM,OAAO,UACX,YAAY,WACV,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,OACtC,MAAM,CAAC,UAAU,OACjB,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC1B,OAAO,CAAC,QAAQ,EAAE,CAWpB,CAAA;AAED,eAAO,MAAM,QAAQ,UAAiB,YAAY,WAAW,MAAM,QAAQ,QAAQ,KAAG,OAAO,CAAC,QAAQ,CAIrG,CAAA;AAED,eAAO,MAAM,UAAU,UAAiB,YAAY,WAAW,MAAM,SAAS,aAAa,KAAG,OAAO,CAAC,OAAO,CAI5G,CAAA;AAED,eAAO,MAAM,UAAU,UAAiB,YAAY,WAAW,MAAM;;;GAMlE,CAAA"}
|
package/dist/mail/rule-store.js
CHANGED
|
@@ -1,38 +1,68 @@
|
|
|
1
1
|
import { chmodSync, copyFileSync, existsSync } from "node:fs";
|
|
2
2
|
import { configPath, loadConfig, updateConfig } from "../config.js";
|
|
3
|
-
import {
|
|
3
|
+
import { PRESET_NAMES } from "./presets.js";
|
|
4
|
+
import { conditionKeys, ENVELOPE, envelopeBox } from "./rules.js";
|
|
4
5
|
const STORE_ACTION = { keep: "full", envelope: "envelope", skip: "skip" };
|
|
5
6
|
const ACTION_OF = { full: "keep", envelope: "envelope", skip: "skip" };
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const LOWER = ["from", "domain", "list_id", "subject"];
|
|
8
|
+
const conditionsOf = (match) => Object.fromEntries(conditionKeys(match).map((key) => {
|
|
9
|
+
const value = match[key];
|
|
10
|
+
return [
|
|
11
|
+
key,
|
|
12
|
+
LOWER.includes(key) && typeof value === "string" ? value.toLowerCase() : value,
|
|
13
|
+
];
|
|
14
|
+
}));
|
|
15
|
+
export const ruleInput = (rule, source = rule.source ?? "owner") => ({
|
|
12
16
|
conditions: conditionsOf(rule.match),
|
|
13
|
-
actions: {
|
|
17
|
+
actions: {
|
|
18
|
+
store: STORE_ACTION[rule.action],
|
|
19
|
+
...(rule.tags?.length ? { tags: rule.tags } : {}),
|
|
20
|
+
...(rule.tags_skipped && Object.keys(rule.tags_skipped).length ? { tags_skipped: rule.tags_skipped } : {}),
|
|
21
|
+
},
|
|
14
22
|
protected: rule.protected === true,
|
|
15
23
|
source,
|
|
16
24
|
reason: rule.reason ?? null,
|
|
17
25
|
decidedAt: Date.parse(rule.decided_at) || Date.now(),
|
|
18
26
|
});
|
|
27
|
+
const KINDS = {
|
|
28
|
+
from: "string",
|
|
29
|
+
from_contains: "string",
|
|
30
|
+
domain: "string",
|
|
31
|
+
to: "string",
|
|
32
|
+
list_id: "string",
|
|
33
|
+
subject: "string",
|
|
34
|
+
older_than_days: "number",
|
|
35
|
+
larger_than_bytes: "number",
|
|
36
|
+
has_attachments: "boolean",
|
|
37
|
+
label: "string",
|
|
38
|
+
unread: "boolean",
|
|
39
|
+
bulk: "boolean",
|
|
40
|
+
score_at_least: "number",
|
|
41
|
+
preset: "string",
|
|
42
|
+
};
|
|
19
43
|
const fromStored = (stored) => {
|
|
20
44
|
const action = ACTION_OF[String(stored.actions.store)];
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// A condition memo does not know yet, from a newer memo or a preset, is left to that memo rather than misread.
|
|
28
|
-
if (action === undefined || Object.keys(match).length !== Object.keys(stored.conditions).length)
|
|
45
|
+
const entries = Object.entries(stored.conditions);
|
|
46
|
+
// A condition memo does not know yet, from a newer memo, is left to that memo rather than misread.
|
|
47
|
+
const known = entries.every(([key, value]) => key in KINDS &&
|
|
48
|
+
typeof value === KINDS[key] &&
|
|
49
|
+
!(key === "preset" && !PRESET_NAMES.includes(value)));
|
|
50
|
+
if (action === undefined || !known || entries.length === 0)
|
|
29
51
|
return undefined;
|
|
52
|
+
const tags = Array.isArray(stored.actions.tags) ? stored.actions.tags.filter((tag) => typeof tag === "string") : [];
|
|
53
|
+
const skipped = stored.actions.tags_skipped;
|
|
54
|
+
const tagsSkipped = skipped !== null && typeof skipped === "object" && !Array.isArray(skipped)
|
|
55
|
+
? Object.fromEntries(Object.entries(skipped).filter(([, why]) => typeof why === "string"))
|
|
56
|
+
: {};
|
|
30
57
|
return {
|
|
31
58
|
id: stored.id,
|
|
32
|
-
match,
|
|
59
|
+
match: Object.fromEntries(entries),
|
|
33
60
|
action,
|
|
61
|
+
...(tags.length ? { tags: tags } : {}),
|
|
62
|
+
...(Object.keys(tagsSkipped).length ? { tags_skipped: tagsSkipped } : {}),
|
|
34
63
|
...(stored.reason === null ? {} : { reason: stored.reason }),
|
|
35
64
|
...(stored.protected ? { protected: true } : {}),
|
|
65
|
+
...(stored.source === "owner" ? {} : { source: stored.source }),
|
|
36
66
|
decided_at: new Date(stored.decidedAt).toISOString(),
|
|
37
67
|
};
|
|
38
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-store.js","sourceRoot":"","sources":["../../src/mail/rule-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAsD,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"rule-store.js","sourceRoot":"","sources":["../../src/mail/rule-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AccountKey, MessageStore } from "@wirecat/cli-core/store";
|
|
2
|
+
import type { MailRule } from "./rules.js";
|
|
3
|
+
type MessageRef = {
|
|
4
|
+
type: "message";
|
|
5
|
+
chatId: string;
|
|
6
|
+
messageId: string;
|
|
7
|
+
};
|
|
8
|
+
export interface TagOutcome {
|
|
9
|
+
/** A rule's tag the store refused as too close to an existing label, put on mail as that label instead. */
|
|
10
|
+
reused: {
|
|
11
|
+
tag: string;
|
|
12
|
+
as: string;
|
|
13
|
+
}[];
|
|
14
|
+
/** A rule's tag the store refused with nothing to reuse: the mail is stored, untagged. */
|
|
15
|
+
skipped: {
|
|
16
|
+
tag: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
emails: number;
|
|
19
|
+
}[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Tags mail for confirmed rules. A label the store refuses never fails the import: the label it points to is
|
|
23
|
+
* reused, and a tag with nothing to reuse is skipped and counted.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ruleTagger: (store: MessageStore, key: AccountKey) => {
|
|
26
|
+
tag: (ref: MessageRef, tags: readonly string[]) => Promise<void>;
|
|
27
|
+
outcome: () => TagOutcome;
|
|
28
|
+
};
|
|
29
|
+
/** Writes what a run learned back into the rules, so the next run tags with the reused label and skips the rest. */
|
|
30
|
+
export declare const settleRuleTags: (store: MessageStore, accountId: number, rules: readonly MailRule[], outcome: TagOutcome) => Promise<void>;
|
|
31
|
+
/** Proposed tags matched to labels that already exist, before any is created: `reuse` exact, `similar` closest. */
|
|
32
|
+
export declare const mapProposedTags: (store: MessageStore, rules: readonly MailRule[]) => Promise<{
|
|
33
|
+
rules: MailRule[];
|
|
34
|
+
mapping: {
|
|
35
|
+
tag: string;
|
|
36
|
+
as: string;
|
|
37
|
+
why: "reuse" | "similar";
|
|
38
|
+
}[];
|
|
39
|
+
}>;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=rule-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tags.d.ts","sourceRoot":"","sources":["../../src/mail/rule-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,MAAM,WAAW,UAAU;IACzB,2GAA2G;IAC3G,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrC,0FAA0F;IAC1F,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC3D;AAYD;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,YAAY,OAAO,UAAU;IA4B3D,GAAG,QAAc,UAAU,QAAQ,SAAS,MAAM,EAAE;IAGpD,OAAO,QAAM,UAAU;CAK1B,CAAA;AAED,oHAAoH;AACpH,eAAO,MAAM,cAAc,UAClB,YAAY,aACR,MAAM,SACV,SAAS,QAAQ,EAAE,WACjB,UAAU,KAClB,OAAO,CAAC,IAAI,CAcd,CAAA;AAED,mHAAmH;AACnH,eAAO,MAAM,eAAe,UACnB,YAAY,SACZ,SAAS,QAAQ,EAAE,KACzB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,EAAE,CAAA;CAAE,CAqBjG,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ruleInput } from "./rule-store.js";
|
|
2
|
+
const reuseOf = (error) => {
|
|
3
|
+
const { details } = error;
|
|
4
|
+
return details?.reason === "tag-review.required" ? details.candidates?.[0]?.name : undefined;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Tags mail for confirmed rules. A label the store refuses never fails the import: the label it points to is
|
|
8
|
+
* reused, and a tag with nothing to reuse is skipped and counted.
|
|
9
|
+
*/
|
|
10
|
+
export const ruleTagger = (store, key) => {
|
|
11
|
+
const resolved = new Map();
|
|
12
|
+
const reasons = new Map();
|
|
13
|
+
const skippedEmails = new Map();
|
|
14
|
+
const add = async (ref, tag) => {
|
|
15
|
+
const known = resolved.get(tag);
|
|
16
|
+
if (known === null) {
|
|
17
|
+
skippedEmails.set(tag, (skippedEmails.get(tag) ?? 0) + 1);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const name = known ?? tag;
|
|
21
|
+
try {
|
|
22
|
+
await store.addTags(key, ref, [name]);
|
|
23
|
+
if (known === undefined)
|
|
24
|
+
resolved.set(tag, name);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const reuse = known === undefined ? reuseOf(error) : undefined;
|
|
28
|
+
if (reuse !== undefined) {
|
|
29
|
+
resolved.set(tag, reuse);
|
|
30
|
+
return add(ref, tag);
|
|
31
|
+
}
|
|
32
|
+
resolved.set(tag, null);
|
|
33
|
+
reasons.set(tag, error.message ?? String(error));
|
|
34
|
+
skippedEmails.set(tag, (skippedEmails.get(tag) ?? 0) + 1);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
tag: async (ref, tags) => {
|
|
39
|
+
for (const tag of tags)
|
|
40
|
+
await add(ref, tag);
|
|
41
|
+
},
|
|
42
|
+
outcome: () => ({
|
|
43
|
+
reused: [...resolved].flatMap(([tag, as]) => (as !== null && as !== tag ? [{ tag, as }] : [])),
|
|
44
|
+
skipped: [...reasons].map(([tag, reason]) => ({ tag, reason, emails: skippedEmails.get(tag) ?? 0 })),
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/** Writes what a run learned back into the rules, so the next run tags with the reused label and skips the rest. */
|
|
49
|
+
export const settleRuleTags = async (store, accountId, rules, outcome) => {
|
|
50
|
+
if (outcome.reused.length === 0 && outcome.skipped.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const as = new Map(outcome.reused.map(({ tag, as }) => [tag, as]));
|
|
53
|
+
const skipped = new Map(outcome.skipped.map(({ tag, reason }) => [tag, reason]));
|
|
54
|
+
for (const rule of rules) {
|
|
55
|
+
if (rule.id === undefined || !rule.tags?.some((tag) => as.has(tag) || skipped.has(tag)))
|
|
56
|
+
continue;
|
|
57
|
+
const tags = [...new Set(rule.tags.filter((tag) => !skipped.has(tag)).map((tag) => as.get(tag) ?? tag))];
|
|
58
|
+
const tagsSkipped = { ...rule.tags_skipped };
|
|
59
|
+
for (const tag of rule.tags) {
|
|
60
|
+
const why = skipped.get(tag);
|
|
61
|
+
if (why !== undefined)
|
|
62
|
+
tagsSkipped[tag] = why;
|
|
63
|
+
}
|
|
64
|
+
await store.mail.rules.upsert(accountId, ruleInput({ ...rule, tags, tags_skipped: tagsSkipped }), Date.now());
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
/** Proposed tags matched to labels that already exist, before any is created: `reuse` exact, `similar` closest. */
|
|
68
|
+
export const mapProposedTags = async (store, rules) => {
|
|
69
|
+
const mapping = [];
|
|
70
|
+
for (const tag of new Set(rules.flatMap(({ tags }) => tags ?? []))) {
|
|
71
|
+
const plan = await store.knowledge.tagPreflight(tag).catch(() => undefined);
|
|
72
|
+
const as = plan?.disposition === "reuse"
|
|
73
|
+
? plan.existing?.name
|
|
74
|
+
: plan?.disposition === "review"
|
|
75
|
+
? plan.suggestions[0]?.entry.name
|
|
76
|
+
: undefined;
|
|
77
|
+
if (as !== undefined && as !== tag)
|
|
78
|
+
mapping.push({ tag, as, why: plan?.disposition === "reuse" ? "reuse" : "similar" });
|
|
79
|
+
}
|
|
80
|
+
if (mapping.length === 0)
|
|
81
|
+
return { rules: [...rules], mapping };
|
|
82
|
+
const as = new Map(mapping.map(({ tag, as }) => [tag, as]));
|
|
83
|
+
return {
|
|
84
|
+
rules: rules.map((rule) => rule.tags?.length ? { ...rule, tags: [...new Set(rule.tags.map((tag) => as.get(tag) ?? tag))] } : rule),
|
|
85
|
+
mapping,
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=rule-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tags.js","sourceRoot":"","sources":["../../src/mail/rule-tags.ts"],"names":[],"mappings":"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"}
|
package/dist/mail/rules.d.ts
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
import type { MailHeaders } from "./headers.js";
|
|
2
|
+
import { type PresetName } from "./presets.js";
|
|
3
|
+
/** All given conditions must hold; a rule with none matches nothing. */
|
|
2
4
|
export interface MailRuleMatch {
|
|
3
5
|
from?: string;
|
|
6
|
+
/** A word the sender's address or display name contains, any case: Gmail's `from:smith`. */
|
|
7
|
+
from_contains?: string;
|
|
4
8
|
domain?: string;
|
|
9
|
+
/** One recipient address in To or Cc. */
|
|
10
|
+
to?: string;
|
|
5
11
|
list_id?: string;
|
|
12
|
+
/** Words that must all appear in the subject, any case. */
|
|
13
|
+
subject?: string;
|
|
14
|
+
older_than_days?: number;
|
|
15
|
+
larger_than_bytes?: number;
|
|
16
|
+
/** Sent as `multipart/mixed`, the way mail with attachments is. */
|
|
17
|
+
has_attachments?: boolean;
|
|
18
|
+
/** A Gmail label, by its plain name: `Promotions`, `Inbox`, or one the owner made. */
|
|
19
|
+
label?: string;
|
|
20
|
+
unread?: boolean;
|
|
21
|
+
/** List-Id, List-Unsubscribe or `Precedence: bulk`. */
|
|
22
|
+
bulk?: boolean;
|
|
23
|
+
/** The sender's score (memo mail probe) is at least this. */
|
|
24
|
+
score_at_least?: number;
|
|
25
|
+
/** A built-in kind of mail, see presets.ts. */
|
|
26
|
+
preset?: PresetName;
|
|
6
27
|
}
|
|
7
28
|
export type MailAction = "skip" | "envelope" | "keep";
|
|
8
29
|
export interface MailRule {
|
|
@@ -11,18 +32,42 @@ export interface MailRule {
|
|
|
11
32
|
match: MailRuleMatch;
|
|
12
33
|
/** skip: never read or stored · envelope: stored without its text, so it can be counted and cleaned later. */
|
|
13
34
|
action: MailAction;
|
|
35
|
+
/** memo tags put on every email the rule matches, with any action. */
|
|
36
|
+
tags?: string[];
|
|
37
|
+
/** Tags the store refused with no label to reuse, and why; the mail is stored untagged. */
|
|
38
|
+
tags_skipped?: Record<string, string>;
|
|
14
39
|
reason?: string;
|
|
15
|
-
/**
|
|
40
|
+
/** Stored in full, and no cleanup may cut, archive or trash it, whatever other rules or presets say. */
|
|
16
41
|
protected?: boolean;
|
|
42
|
+
/** owner, preset:<name>, probe or gmail-filter. */
|
|
43
|
+
source?: string;
|
|
17
44
|
decided_at: string;
|
|
18
45
|
}
|
|
19
|
-
/**
|
|
20
|
-
export
|
|
46
|
+
/** What is known of one email when a rule decides it: its headers at list time, and what the listing says. */
|
|
47
|
+
export interface MailFacts {
|
|
48
|
+
headers?: MailHeaders;
|
|
49
|
+
receivedAt?: string;
|
|
50
|
+
size?: number;
|
|
51
|
+
labels?: string[];
|
|
52
|
+
seen?: boolean;
|
|
53
|
+
/** The sender group's score, when a rule asks for one. */
|
|
54
|
+
score?: number;
|
|
55
|
+
/** The owner wrote to this sender. */
|
|
56
|
+
replied?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** Unknown facts never match: a rule about size skips an email whose size the listing did not give. */
|
|
59
|
+
export declare const matches: (match: MailRuleMatch, facts: MailFacts, now?: number) => boolean;
|
|
21
60
|
/**
|
|
22
|
-
* The rule that decides an email
|
|
23
|
-
*
|
|
61
|
+
* The rule that decides an email. A protected rule wins over everything and keeps the mail whole; then keep wins
|
|
62
|
+
* over envelope, envelope over skip, so a keep for one sender overrides a skip of its domain and mail both record
|
|
63
|
+
* and drop rules match is recorded, since a record can be cleaned later. An explicit rule wins over a preset.
|
|
24
64
|
*/
|
|
25
|
-
export declare const decide: (rules: readonly MailRule[],
|
|
65
|
+
export declare const decide: (rules: readonly MailRule[], facts: MailFacts | undefined) => MailRule | undefined;
|
|
66
|
+
/** The tags of every rule that matches, whichever rule decides the action. */
|
|
67
|
+
export declare const tagsOf: (rules: readonly MailRule[], facts: MailFacts) => string[];
|
|
68
|
+
export declare const conditionKeys: (match: MailRuleMatch) => (keyof MailRuleMatch)[];
|
|
69
|
+
/** A short, stable name of a match: `domain shop.example`, or `subject invoice, larger_than_bytes 1000`. */
|
|
70
|
+
export declare const describeMatch: (match: MailRuleMatch) => string;
|
|
26
71
|
/** Where the store keeps the emails one envelope rule recorded: a mailbox of its own, per rule. */
|
|
27
72
|
export declare const envelopeBox: (match: MailRuleMatch) => {
|
|
28
73
|
externalId: string;
|
package/dist/mail/rules.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,cAAc,CAAA;AAE7D,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,QAAQ;IACvB,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,aAAa,CAAA;IACpB,8GAA8G;IAC9G,MAAM,EAAE,UAAU,CAAA;IAClB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wGAAwG;IACxG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,8GAA8G;AAC9G,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAgBD,uGAAuG;AACvG,eAAO,MAAM,OAAO,UAAW,aAAa,SAAS,SAAS,mBAAqB,OA0ClF,CAAA;AAOD;;;;GAIG;AACH,eAAO,MAAM,MAAM,UAAW,SAAS,QAAQ,EAAE,SAAS,SAAS,GAAG,SAAS,KAAG,QAAQ,GAAG,SAK5F,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,MAAM,UAAW,SAAS,QAAQ,EAAE,SAAS,SAAS,KAAG,MAAM,EAI3E,CAAA;AAKD,eAAO,MAAM,aAAa,UAAW,aAAa,4BACgD,CAAA;AAElG,4GAA4G;AAC5G,eAAO,MAAM,aAAa,UAAW,aAAa,KAAG,MAGtC,CAAA;AAEf,mGAAmG;AACnG,eAAO,MAAM,WAAW,UAAW,aAAa;;;;CAW/C,CAAA;AAED,eAAO,MAAM,QAAQ,aAAa,CAAA;AAUlC,eAAO,MAAM,SAAS,MAAO,aAAa,KAAK,aAAa,KAAG,OAA0C,CAAA;AAEzG,eAAO,MAAM,aAAa,eAAgB,MAAM;;;;CAG/C,CAAA"}
|
package/dist/mail/rules.js
CHANGED
|
@@ -1,33 +1,95 @@
|
|
|
1
|
+
import { presetMatches } from "./presets.js";
|
|
2
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
1
3
|
const domainOf = (address) => address.slice(address.lastIndexOf("@") + 1);
|
|
2
4
|
/** A domain also matches its subdomains: bulk mail often comes from `mail.` or `news.` of the same domain. */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (from === undefined && domain === undefined && listId === undefined)
|
|
5
|
+
const domainMatches = (wanted, sender) => {
|
|
6
|
+
if (sender === undefined)
|
|
6
7
|
return false;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const host = domainOf(sender);
|
|
9
|
+
const domain = wanted.toLowerCase();
|
|
10
|
+
return host === domain || host.endsWith(`.${domain}`);
|
|
11
|
+
};
|
|
12
|
+
const words = (text) => text.toLowerCase().split(/\s+/).filter(Boolean);
|
|
13
|
+
/** Unknown facts never match: a rule about size skips an email whose size the listing did not give. */
|
|
14
|
+
export const matches = (match, facts, now = Date.now()) => {
|
|
15
|
+
const conditions = Object.entries(match).filter(([, value]) => value !== undefined);
|
|
16
|
+
if (conditions.length === 0)
|
|
17
|
+
return false;
|
|
18
|
+
const { headers } = facts;
|
|
19
|
+
return conditions.every(([key, value]) => {
|
|
20
|
+
switch (key) {
|
|
21
|
+
case "from":
|
|
22
|
+
return headers?.from === String(value).toLowerCase();
|
|
23
|
+
case "from_contains": {
|
|
24
|
+
const word = String(value).toLowerCase();
|
|
25
|
+
return [headers?.from, headers?.fromName?.toLowerCase()].some((part) => part?.includes(word) ?? false);
|
|
26
|
+
}
|
|
27
|
+
case "domain":
|
|
28
|
+
return domainMatches(String(value), headers?.from);
|
|
29
|
+
case "to":
|
|
30
|
+
return headers?.to.includes(String(value).toLowerCase()) ?? false;
|
|
31
|
+
case "list_id":
|
|
32
|
+
return headers?.listId === String(value).toLowerCase();
|
|
33
|
+
case "subject": {
|
|
34
|
+
const subject = headers?.subject?.toLowerCase();
|
|
35
|
+
return subject !== undefined && words(String(value)).every((word) => subject.includes(word));
|
|
36
|
+
}
|
|
37
|
+
case "older_than_days":
|
|
38
|
+
return facts.receivedAt !== undefined && now - Date.parse(facts.receivedAt) > Number(value) * DAY_MS;
|
|
39
|
+
case "larger_than_bytes":
|
|
40
|
+
return facts.size !== undefined && facts.size > Number(value);
|
|
41
|
+
case "has_attachments":
|
|
42
|
+
return headers !== undefined && (headers.attachments === true) === value;
|
|
43
|
+
case "label":
|
|
44
|
+
return facts.labels?.some((label) => label.toLowerCase() === String(value).toLowerCase()) ?? false;
|
|
45
|
+
case "unread":
|
|
46
|
+
return facts.seen !== undefined && !facts.seen === value;
|
|
47
|
+
case "bulk":
|
|
48
|
+
return headers !== undefined && headers.bulk === value;
|
|
49
|
+
case "score_at_least":
|
|
50
|
+
return facts.score !== undefined && facts.score >= Number(value);
|
|
51
|
+
case "preset":
|
|
52
|
+
return presetMatches(value, facts);
|
|
53
|
+
default:
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
13
57
|
};
|
|
14
58
|
const RANK = { keep: 0, envelope: 1, skip: 2 };
|
|
59
|
+
const strength = (rule) => (rule.protected ? 0 : 10) + RANK[rule.action] + (rule.source?.startsWith("preset:") ? 5 : 0);
|
|
15
60
|
/**
|
|
16
|
-
* The rule that decides an email
|
|
17
|
-
*
|
|
61
|
+
* The rule that decides an email. A protected rule wins over everything and keeps the mail whole; then keep wins
|
|
62
|
+
* over envelope, envelope over skip, so a keep for one sender overrides a skip of its domain and mail both record
|
|
63
|
+
* and drop rules match is recorded, since a record can be cleaned later. An explicit rule wins over a preset.
|
|
18
64
|
*/
|
|
19
|
-
export const decide = (rules,
|
|
20
|
-
if (headers === undefined)
|
|
65
|
+
export const decide = (rules, facts) => {
|
|
66
|
+
if (facts?.headers === undefined)
|
|
21
67
|
return undefined;
|
|
22
|
-
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
const hit = rules.filter((rule) => matches(rule.match, facts, now)).sort((a, b) => strength(a) - strength(b))[0];
|
|
70
|
+
return hit?.protected ? { ...hit, action: "keep" } : hit;
|
|
71
|
+
};
|
|
72
|
+
/** The tags of every rule that matches, whichever rule decides the action. */
|
|
73
|
+
export const tagsOf = (rules, facts) => {
|
|
74
|
+
if (facts.headers === undefined)
|
|
75
|
+
return [];
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
return [...new Set(rules.flatMap((rule) => (rule.tags?.length && matches(rule.match, facts, now) ? rule.tags : [])))];
|
|
23
78
|
};
|
|
79
|
+
/** The only conditions an envelope mailbox can be named by: one sender, domain or list. */
|
|
80
|
+
const SINGLE = ["from", "domain", "list_id"];
|
|
81
|
+
export const conditionKeys = (match) => Object.keys(match).filter((key) => match[key] !== undefined).sort();
|
|
82
|
+
/** A short, stable name of a match: `domain shop.example`, or `subject invoice, larger_than_bytes 1000`. */
|
|
83
|
+
export const describeMatch = (match) => conditionKeys(match)
|
|
84
|
+
.map((key) => `${key === "list_id" ? "list-id" : key.replace(/_/g, "-")} ${String(match[key])}`)
|
|
85
|
+
.join(", ");
|
|
24
86
|
/** Where the store keeps the emails one envelope rule recorded: a mailbox of its own, per rule. */
|
|
25
87
|
export const envelopeBox = (match) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
88
|
+
const keys = conditionKeys(match);
|
|
89
|
+
const single = keys.length === 1 && SINGLE.includes(keys[0]);
|
|
90
|
+
const [kind, value] = single
|
|
91
|
+
? [keys[0] === "list_id" ? "list-id" : String(keys[0]), String(match[keys[0]])]
|
|
92
|
+
: ["rule", describeMatch(match)];
|
|
31
93
|
return {
|
|
32
94
|
externalId: `memo:envelope:${kind}:${value.toLowerCase()}`,
|
|
33
95
|
name: `envelope: ${kind} ${value}`,
|
|
@@ -35,9 +97,11 @@ export const envelopeBox = (match) => {
|
|
|
35
97
|
};
|
|
36
98
|
};
|
|
37
99
|
export const ENVELOPE = "envelope";
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
100
|
+
const normalized = (match) => JSON.stringify(conditionKeys(match).map((key) => {
|
|
101
|
+
const value = match[key];
|
|
102
|
+
return [key, typeof value === "string" ? value.toLowerCase() : value];
|
|
103
|
+
}));
|
|
104
|
+
export const sameMatch = (a, b) => normalized(a) === normalized(b);
|
|
41
105
|
export const envelopeBoxOf = (externalId) => {
|
|
42
106
|
const [, , kind, ...value] = externalId.split(":");
|
|
43
107
|
return { externalId, name: `envelope: ${kind} ${value.join(":")}`, kind: ENVELOPE };
|
package/dist/mail/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,aAAa,EAAE,MAAM,cAAc,CAAA;AA6D7D,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAElC,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzF,8GAA8G;AAC9G,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,MAA0B,EAAW,EAAE;IAC5E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IACnC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAE/E,uGAAuG;AACvG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,KAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAW,EAAE;IAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAA;IACnF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IACzB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACvC,QAAQ,GAA0B,EAAE,CAAC;YACnC,KAAK,MAAM;gBACT,OAAO,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YACtD,KAAK,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;gBACxC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAA;YACxG,CAAC;YACD,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YACpD,KAAK,IAAI;gBACP,OAAO,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAA;YACnE,KAAK,SAAS;gBACZ,OAAO,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YACxD,KAAK,SAAS,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;gBAC/C,OAAO,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;YAC9F,CAAC;YACD,KAAK,iBAAiB;gBACpB,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAA;YACtG,KAAK,mBAAmB;gBACtB,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/D,KAAK,iBAAiB;gBACpB,OAAO,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK,KAAK,CAAA;YAC1E,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAA;YACpG,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAA;YAC1D,KAAK,MAAM;gBACT,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAA;YACxD,KAAK,gBAAgB;gBACnB,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAA;YAClE,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,KAAmB,EAAE,KAAK,CAAC,CAAA;YAClD;gBACE,OAAO,KAAK,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,IAAI,GAA+B,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;AAE1E,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,EAAE,CAClC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE9F;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA0B,EAAE,KAA4B,EAAwB,EAAE;IACvG,IAAI,KAAK,EAAE,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,OAAO,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AAC1D,CAAC,CAAA;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAA0B,EAAE,KAAgB,EAAY,EAAE;IAC/E,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACvH,CAAC,CAAA;AAED,2FAA2F;AAC3F,MAAM,MAAM,GAAqC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE,CACnD,MAAM,CAAC,IAAI,CAAC,KAAK,CAA6B,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;AAElG,4GAA4G;AAC5G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAU,EAAE,CAC5D,aAAa,CAAC,KAAK,CAAC;KACjB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;KAC/F,IAAI,CAAC,IAAI,CAAC,CAAA;AAEf,mGAAmG;AACnG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAwB,CAAC,CAAA;IACnF,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;QAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAwB,CAAC,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAClC,OAAO;QACL,UAAU,EAAE,iBAAiB,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE;QAC1D,IAAI,EAAE,aAAa,IAAI,IAAI,KAAK,EAAE;QAClC,IAAI,EAAE,QAAQ;KACf,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAElC,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,EAAE,CAC1C,IAAI,CAAC,SAAS,CACZ,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AACvE,CAAC,CAAC,CACH,CAAA;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAA;AAEzG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,EAAE;IAClD,MAAM,CAAC,EAAE,AAAD,EAAG,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AACrF,CAAC,CAAA"}
|
package/dist/mail/score.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export declare const WEIGHTS: {
|
|
|
9
9
|
readonly brand_spoof: 3;
|
|
10
10
|
readonly young_domain: 3;
|
|
11
11
|
readonly reply_to_elsewhere: 2;
|
|
12
|
+
readonly never_opened: 2;
|
|
13
|
+
readonly dkim_not_passed: 2;
|
|
12
14
|
readonly disposable_domain: 2;
|
|
13
15
|
readonly bulk_never_replied: 1;
|
|
14
16
|
readonly replied: -5;
|
package/dist/mail/score.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/mail/score.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,OAAO;aAClB,WAAW,EAAE,CAAC;aACd,UAAU,EAAE,CAAC;aACb,WAAW,EAAE,CAAC;aACd,YAAY,EAAE,CAAC;aACf,kBAAkB,EAAE,CAAC;aACrB,iBAAiB,EAAE,CAAC;aACpB,kBAAkB,EAAE,CAAC;aACrB,OAAO,EAAE,CAAC,CAAC;CACH,CAAA;AAEV,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,OAAO,CAAA;AAEzC,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/mail/score.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;GAGG;AACH,eAAO,MAAM,OAAO;aAClB,WAAW,EAAE,CAAC;aACd,UAAU,EAAE,CAAC;aACb,WAAW,EAAE,CAAC;aACd,YAAY,EAAE,CAAC;aACf,kBAAkB,EAAE,CAAC;aACrB,YAAY,EAAE,CAAC;aACf,eAAe,EAAE,CAAC;aAClB,iBAAiB,EAAE,CAAC;aACpB,kBAAkB,EAAE,CAAC;aACrB,OAAO,EAAE,CAAC,CAAC;CACH,CAAA;AAEV,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,OAAO,CAAA;AAEzC,eAAO,MAAM,UAAU,QAI4B,CAAA;AAEnD,iGAAiG;AACjG,eAAO,MAAM,UAAU,MAAM,CAAA;AAE7B,iHAAiH;AACjH,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,2FAA2F;AAC3F,eAAO,MAAM,aAAa,YAAa,MAAM,KAAG,MAG/C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,aAwBpB,CAAA;AAuBF,yFAAyF;AACzF,eAAO,MAAM,YAAY,SAAU,MAAM,GAAG,SAAS,WAAW,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAM7F,CAAA;AAID,qEAAqE;AACrE,eAAO,MAAM,OAAO,QAAS,SAAS,GAAG,SAAS,MAAM,MAAM,KAAG,OAC6B,CAAA;AAE9F,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAKD;;;GAGG;AACH,eAAO,MAAM,UAAU,UACd,MAAM,EAAE,WACN;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,KAChF,MA2BF,CAAA"}
|