@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.
Files changed (90) hide show
  1. package/dist/doctor/command.d.ts +1 -1
  2. package/dist/effects.d.ts.map +1 -1
  3. package/dist/effects.js +7 -0
  4. package/dist/effects.js.map +1 -1
  5. package/dist/examples.d.ts.map +1 -1
  6. package/dist/examples.js +8 -4
  7. package/dist/examples.js.map +1 -1
  8. package/dist/json-fields.d.ts +2 -1
  9. package/dist/json-fields.d.ts.map +1 -1
  10. package/dist/json-fields.js +3 -3
  11. package/dist/json-fields.js.map +1 -1
  12. package/dist/mail/apply.d.ts +7 -0
  13. package/dist/mail/apply.d.ts.map +1 -1
  14. package/dist/mail/apply.js +27 -4
  15. package/dist/mail/apply.js.map +1 -1
  16. package/dist/mail/bulk.d.ts +8 -0
  17. package/dist/mail/bulk.d.ts.map +1 -0
  18. package/dist/mail/bulk.js +4 -0
  19. package/dist/mail/bulk.js.map +1 -0
  20. package/dist/mail/command.d.ts.map +1 -1
  21. package/dist/mail/command.js +123 -44
  22. package/dist/mail/command.js.map +1 -1
  23. package/dist/mail/facts.d.ts +10 -0
  24. package/dist/mail/facts.d.ts.map +1 -0
  25. package/dist/mail/facts.js +23 -0
  26. package/dist/mail/facts.js.map +1 -0
  27. package/dist/mail/filters.d.ts +11 -0
  28. package/dist/mail/filters.d.ts.map +1 -0
  29. package/dist/mail/filters.js +150 -0
  30. package/dist/mail/filters.js.map +1 -0
  31. package/dist/mail/headers.d.ts +3 -1
  32. package/dist/mail/headers.d.ts.map +1 -1
  33. package/dist/mail/headers.js +2 -1
  34. package/dist/mail/headers.js.map +1 -1
  35. package/dist/mail/import.d.ts +5 -0
  36. package/dist/mail/import.d.ts.map +1 -1
  37. package/dist/mail/import.js +25 -4
  38. package/dist/mail/import.js.map +1 -1
  39. package/dist/mail/parse.d.ts +3 -0
  40. package/dist/mail/parse.d.ts.map +1 -1
  41. package/dist/mail/parse.js +7 -2
  42. package/dist/mail/parse.js.map +1 -1
  43. package/dist/mail/presets.d.ts +31 -0
  44. package/dist/mail/presets.d.ts.map +1 -0
  45. package/dist/mail/presets.js +96 -0
  46. package/dist/mail/presets.js.map +1 -0
  47. package/dist/mail/probe.d.ts +13 -0
  48. package/dist/mail/probe.d.ts.map +1 -1
  49. package/dist/mail/probe.js +17 -1
  50. package/dist/mail/probe.js.map +1 -1
  51. package/dist/mail/repair.d.ts +7 -0
  52. package/dist/mail/repair.d.ts.map +1 -0
  53. package/dist/mail/repair.js +45 -0
  54. package/dist/mail/repair.js.map +1 -0
  55. package/dist/mail/rule-query.d.ts +15 -0
  56. package/dist/mail/rule-query.d.ts.map +1 -0
  57. package/dist/mail/rule-query.js +101 -0
  58. package/dist/mail/rule-query.js.map +1 -0
  59. package/dist/mail/rule-store.d.ts +3 -5
  60. package/dist/mail/rule-store.d.ts.map +1 -1
  61. package/dist/mail/rule-store.js +47 -17
  62. package/dist/mail/rule-store.js.map +1 -1
  63. package/dist/mail/rule-tags.d.ts +41 -0
  64. package/dist/mail/rule-tags.d.ts.map +1 -0
  65. package/dist/mail/rule-tags.js +88 -0
  66. package/dist/mail/rule-tags.js.map +1 -0
  67. package/dist/mail/rules.d.ts +51 -6
  68. package/dist/mail/rules.d.ts.map +1 -1
  69. package/dist/mail/rules.js +86 -22
  70. package/dist/mail/rules.js.map +1 -1
  71. package/dist/mail/score.d.ts +2 -0
  72. package/dist/mail/score.d.ts.map +1 -1
  73. package/dist/mail/score.js +11 -1
  74. package/dist/mail/score.js.map +1 -1
  75. package/dist/program.d.ts.map +1 -1
  76. package/dist/program.js +44 -1
  77. package/dist/program.js.map +1 -1
  78. package/dist/reasons.d.ts.map +1 -1
  79. package/dist/reasons.js +6 -0
  80. package/dist/reasons.js.map +1 -1
  81. package/dist/run/import.d.ts.map +1 -1
  82. package/dist/run/import.js +4 -0
  83. package/dist/run/import.js.map +1 -1
  84. package/dist/search/command.d.ts.map +1 -1
  85. package/dist/search/command.js +12 -3
  86. package/dist/search/command.js.map +1 -1
  87. package/dist/version.d.ts +1 -1
  88. package/dist/version.js +1 -1
  89. package/package.json +2 -2
  90. 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;AACtD,OAAO,EAA0C,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAWtG,eAAO,MAAM,SAAS,SAAU,QAAQ;;;;;;;QAE3B,KAAK;;;;;;CAKhB,CAAA;AAsBF,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"}
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"}
@@ -1,38 +1,68 @@
1
1
  import { chmodSync, copyFileSync, existsSync } from "node:fs";
2
2
  import { configPath, loadConfig, updateConfig } from "../config.js";
3
- import { ENVELOPE, envelopeBox } from "./rules.js";
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 conditionsOf = (match) => ({
7
- ...(match.from === undefined ? {} : { from: match.from.toLowerCase() }),
8
- ...(match.domain === undefined ? {} : { domain: match.domain.toLowerCase() }),
9
- ...(match.list_id === undefined ? {} : { list_id: match.list_id.toLowerCase() }),
10
- });
11
- export const ruleInput = (rule, source = "owner") => ({
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: { store: STORE_ACTION[rule.action] },
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 { from, domain, list_id } = stored.conditions;
22
- const match = {
23
- ...(typeof from === "string" ? { from } : {}),
24
- ...(typeof domain === "string" ? { domain } : {}),
25
- ...(typeof list_id === "string" ? { list_id } : {}),
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":"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"}
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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"}
@@ -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
- /** No cleanup may cut, archive or trash what this rule matches. */
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
- /** A domain also matches its subdomains: bulk mail often comes from `mail.` or `news.` of the same domain. */
20
- export declare const matches: (match: MailRuleMatch, headers: MailHeaders) => boolean;
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: keep wins over envelope, envelope over skip, so a keep for one sender overrides
23
- * a skip of its domain, and mail both record and drop rules match is recorded, since a record can be cleaned later.
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[], headers: MailHeaders | undefined) => MailRule | undefined;
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;
@@ -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;AAE/C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;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,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,8GAA8G;AAC9G,eAAO,MAAM,OAAO,UAAW,aAAa,WAAW,WAAW,KAAG,OAWpE,CAAA;AAID;;;GAGG;AACH,eAAO,MAAM,MAAM,UAAW,SAAS,QAAQ,EAAE,WAAW,WAAW,GAAG,SAAS,KAAG,QAAQ,GAAG,SAGhG,CAAA;AAED,mGAAmG;AACnG,eAAO,MAAM,WAAW,UAAW,aAAa;;;;CAY/C,CAAA;AAED,eAAO,MAAM,QAAQ,aAAa,CAAA;AAElC,eAAO,MAAM,SAAS,MAAO,aAAa,KAAK,aAAa,KAAG,OAGR,CAAA;AAEvD,eAAO,MAAM,aAAa,eAAgB,MAAM;;;;CAG/C,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"}
@@ -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
- export const matches = (match, headers) => {
4
- const { from, domain, list_id: listId } = match;
5
- if (from === undefined && domain === undefined && listId === undefined)
5
+ const domainMatches = (wanted, sender) => {
6
+ if (sender === undefined)
6
7
  return false;
7
- const sender = headers.from;
8
- const host = sender === undefined ? undefined : domainOf(sender);
9
- const wanted = domain?.toLowerCase();
10
- return ((from === undefined || sender === from.toLowerCase()) &&
11
- (wanted === undefined || (host !== undefined && (host === wanted || host.endsWith(`.${wanted}`)))) &&
12
- (listId === undefined || headers.listId === listId.toLowerCase()));
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: keep wins over envelope, envelope over skip, so a keep for one sender overrides
17
- * a skip of its domain, and mail both record and drop rules match is recorded, since a record can be cleaned later.
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, headers) => {
20
- if (headers === undefined)
65
+ export const decide = (rules, facts) => {
66
+ if (facts?.headers === undefined)
21
67
  return undefined;
22
- return rules.filter((rule) => matches(rule.match, headers)).sort((a, b) => RANK[a.action] - RANK[b.action])[0];
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 [kind, value] = match.from !== undefined
27
- ? ["from", match.from]
28
- : match.domain !== undefined
29
- ? ["domain", match.domain]
30
- : ["list-id", match.list_id ?? ""];
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
- export const sameMatch = (a, b) => a.from?.toLowerCase() === b.from?.toLowerCase() &&
39
- a.domain?.toLowerCase() === b.domain?.toLowerCase() &&
40
- a.list_id?.toLowerCase() === b.list_id?.toLowerCase();
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/mail/rules.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -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,QAG6E,CAAA;AAEpG,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,MAsBF,CAAA"}
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"}