@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
@@ -19,9 +19,9 @@ export declare const diagnose: (env: NodeJS.ProcessEnv) => Promise<{
19
19
  state: string;
20
20
  cache: string;
21
21
  store: {
22
+ error?: undefined;
22
23
  path: string;
23
24
  exists: boolean;
24
- error?: undefined;
25
25
  } | {
26
26
  path: string;
27
27
  exists: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6FrD,CAAA;AAED,wGAAwG;AACxG,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAiB3D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAa,OAAO,KAAG,IAM7C,CAAA"}
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8FrD,CAAA;AAED,wGAAwG;AACxG,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAuB3D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAAa,OAAO,KAAG,IAM7C,CAAA"}
package/dist/effects.js CHANGED
@@ -23,6 +23,7 @@ export const EFFECTS = {
23
23
  "mail rules apply": LOCAL_WRITE,
24
24
  "mail rules export": LOCAL_READ,
25
25
  "mail rules import": LOCAL_WRITE,
26
+ "mail rules import-filters": LOCAL_WRITE,
26
27
  note: LOCAL_WRITE,
27
28
  "tags add": LOCAL_WRITE,
28
29
  "tags remove": LOCAL_WRITE,
@@ -115,6 +116,12 @@ export const OUTPUTS = {
115
116
  "memories show": { entity: "memory" },
116
117
  "memories confirm": { entity: "memory" },
117
118
  "memories stale": { entity: "memory" },
119
+ "tags list": { entity: "source_tag" },
120
+ "vocabulary list": { entity: "vocabulary" },
121
+ "actions list": { entity: "proposed_action" },
122
+ "agents log": { entity: "agent_action" },
123
+ "projects meetings list": { entity: "meeting_project" },
124
+ "folders list": { entity: "notes_folder" },
118
125
  };
119
126
  /**
120
127
  * Puts each leaf's effects and answer in `commands --json`, where retries, steps and MCP hints are judged from them.
@@ -1 +1 @@
1
- {"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA0IhE,CAAA;AAED,eAAO,MAAM,MAAM,YAAa,OAAO,SAAQ,MAAM,EAAE,KAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAI5E,CAAA;AAEJ,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,OAAO,KAAG,IAO9C,CAAA"}
1
+ {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA8IhE,CAAA;AAED,eAAO,MAAM,MAAM,YAAa,OAAO,SAAQ,MAAM,EAAE,KAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAI5E,CAAA;AAEJ,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,OAAO,KAAG,IAO9C,CAAA"}
package/dist/examples.js CHANGED
@@ -20,16 +20,20 @@ export const EXAMPLES = {
20
20
  "messages show": ["memo messages show 'msg:email/me%40example.com/thread/42' --before-n 2 --after-n 2"],
21
21
  "mail probe": ["memo mail probe personal --limit 30", "memo mail probe work --since-time 365d --json"],
22
22
  "mail status": ["memo mail status personal", "memo mail status personal --json"],
23
- "mail rules list": ["memo mail rules list personal --json"],
23
+ "mail rules list": ["memo mail rules list personal --json", "memo mail rules list personal --filter is:protected"],
24
24
  "mail rules add": [
25
- "memo mail rules add personal --domain news.example --do envelope --reason 'newsletters'",
26
- "memo mail rules add personal --domain spam.example --do skip",
27
- "memo mail rules add personal --sender alice@news.example --do keep",
25
+ "memo mail rules add personal --domain news.example --do envelope,tag:newsletter --reason 'newsletters'",
26
+ "memo mail rules add personal --domain tax.gov.example --do protect",
27
+ "memo mail rules add personal --filter 'label:Promotions older:365d' --do envelope",
28
28
  ],
29
29
  "mail rules remove": ["memo mail rules remove personal --domain news.example"],
30
30
  "mail rules apply": ["memo mail rules apply personal", "memo mail rules apply personal --yes --json"],
31
31
  "mail rules export": ["memo mail rules export personal"],
32
32
  "mail rules import": ["memo mail rules import personal rules.json"],
33
+ "mail rules import-filters": [
34
+ "memo mail rules import-filters personal Filters.json",
35
+ "memo mail rules import-filters personal Filters.json --yes",
36
+ ],
33
37
  note: ["memo note telegram:'Kai Sample' People/Kai.md", "memo note telegram:'Kai Sample' --clear"],
34
38
  "tags add": ["memo tags add follow-up --note note:12", "memo tags add harbour --project HRB"],
35
39
  "tags remove": ["memo tags remove follow-up --note note:12"],
@@ -1 +1 @@
1
- {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { type Streams } from "@wirecat/cli-base";
2
+ import { type JsonFieldsResolver } from "@wirecat/cli-core/cli";
2
3
  import type { Command } from "commander";
3
4
  /**
4
5
  * `--json=a,b` keeps those fields of an answer's item or items, read the way tg and max read it. memo's commands
5
6
  * print through many renderers, so the fields are applied where every answer passes: the data stream.
6
7
  */
7
- export declare const jsonFields: (streams: Streams) => {
8
+ export declare const jsonFields: (streams: Streams, resolve?: JsonFieldsResolver) => {
8
9
  streams: {
9
10
  diagnostic: (text: string) => void;
10
11
  drain?: (signal?: AbortSignal) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"json-fields.d.ts","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuBxC;;;GAGG;AACH,eAAO,MAAM,UAAU,YAAa,OAAO;;;;;qBAGH,MAAM;;qBACzB,OAAO,uBAA6C,IAAI;CAa5E,CAAA"}
1
+ {"version":3,"file":"json-fields.d.ts","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAa,KAAK,kBAAkB,EAAY,MAAM,uBAAuB,CAAA;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuBxC;;;GAGG;AACH,eAAO,MAAM,UAAU,YAAa,OAAO,YAAY,kBAAkB;;;;;qBAGjC,MAAM;;qBACzB,OAAO,uBAA6C,IAAI;CAa5E,CAAA"}
@@ -27,7 +27,7 @@ const keep = (text, paths) => {
27
27
  * `--json=a,b` keeps those fields of an answer's item or items, read the way tg and max read it. memo's commands
28
28
  * print through many renderers, so the fields are applied where every answer passes: the data stream.
29
29
  */
30
- export const jsonFields = (streams) => {
30
+ export const jsonFields = (streams, resolve) => {
31
31
  let fields;
32
32
  return {
33
33
  streams: { ...streams, data: (text) => streams.data(fields ? keep(text, fieldsOf(fields)) : text) },
@@ -35,12 +35,12 @@ export const jsonFields = (streams) => {
35
35
  const parse = program.parseAsync.bind(program);
36
36
  program.parseAsync = async (argv = process.argv, settings) => {
37
37
  const user = settings?.from === "user";
38
- const requested = liftJson(user ? argv : argv.slice(2), (words) => commandIn(program, words));
38
+ const requested = liftJson(user ? argv : argv.slice(2), (words) => commandIn(program, words), resolve);
39
39
  fields = requested.fields;
40
40
  return parse(user ? requested.argv : [...argv.slice(0, 2), ...requested.argv], settings);
41
41
  };
42
42
  program.hook("preAction", (_root, action) => {
43
- checkJson(action, { json: action.opts().json === true, ...(fields ? { fields } : {}) }, terminal);
43
+ checkJson(action, { json: action.opts().json === true, ...(fields ? { fields } : {}) }, terminal, resolve);
44
44
  });
45
45
  },
46
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { MessageStore } from "@wirecat/cli-core/store";
2
2
  import type { MailAccount } from "./import.js";
3
+ import { type TagOutcome } from "./rule-tags.js";
3
4
  import { type MailRule } from "./rules.js";
4
5
  import type { MailSource } from "./source.js";
5
6
  export interface RuleEffect {
@@ -17,7 +18,13 @@ export interface ApplyResult {
17
18
  bytes: number;
18
19
  /** Stored in full, matched only by a skip rule: left as stored, since removing them is another decision. */
19
20
  skipMatched: number;
21
+ /** Stored in full, matched by a protected rule: never cut, whatever else matches. */
22
+ protectedKept: number;
23
+ /** Stored emails a rule's tag was put on, or would be. */
24
+ tagged: number;
20
25
  rules: RuleEffect[];
26
+ tagsReused?: TagOutcome["reused"];
27
+ tagsSkipped?: TagOutcome["skipped"];
21
28
  }
22
29
  /**
23
30
  * Cuts mail stored in full that an envelope rule now matches down to what an envelope import stores. Matching
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/mail/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAiC,KAAK,QAAQ,EAAiC,MAAM,YAAY,CAAA;AACxG,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,4GAA4G;IAC5G,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAID;;;GAGG;AACH,eAAO,MAAM,UAAU,mDAOpB;IACD,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,KAAG,OAAO,CAAC,WAAW,CAmFtB,CAAA"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/mail/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAGvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EAAiC,KAAK,QAAQ,EAAyC,MAAM,YAAY,CAAA;AAChH,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,4GAA4G;IAC5G,WAAW,EAAE,MAAM,CAAA;IACnB,qFAAqF;IACrF,aAAa,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CACpC;AAID;;;GAGG;AACH,eAAO,MAAM,UAAU,mDAOpB;IACD,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,KAAG,OAAO,CAAC,WAAW,CAmGtB,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import { mailFolders } from "./accounts.js";
2
- import { decide, ENVELOPE, envelopeBox, sameMatch } from "./rules.js";
2
+ import { factsOf } from "./facts.js";
3
+ import { ruleTagger, settleRuleTags } from "./rule-tags.js";
4
+ import { decide, ENVELOPE, envelopeBox, sameMatch, tagsOf } from "./rules.js";
3
5
  const textBytes = (text) => (text ? Buffer.byteLength(text) : 0);
4
6
  /**
5
7
  * Cuts mail stored in full that an envelope rule now matches down to what an envelope import stores. Matching
@@ -10,7 +12,7 @@ export const applyRules = async ({ store, source, account, since, apply, now = D
10
12
  const key = { provider: "email", account: account.address.toLowerCase() };
11
13
  const rules = account.rules ?? [];
12
14
  const effects = rules
13
- .filter(({ action }) => action === ENVELOPE)
15
+ .filter(({ action, protected: kept }) => action === ENVELOPE && !kept)
14
16
  .map((rule) => ({ rule, emails: 0, bytes: 0 }));
15
17
  const result = {
16
18
  account: key.account,
@@ -19,9 +21,11 @@ export const applyRules = async ({ store, source, account, since, apply, now = D
19
21
  envelopes: 0,
20
22
  bytes: 0,
21
23
  skipMatched: 0,
24
+ protectedKept: 0,
25
+ tagged: 0,
22
26
  rules: effects,
23
27
  };
24
- if (effects.length === 0)
28
+ if (effects.length === 0 && !rules.some(({ tags, protected: kept }) => tags?.length || kept))
25
29
  return result;
26
30
  const stored = await store.storedAccount(key).catch(() => null);
27
31
  if (stored === null)
@@ -35,11 +39,23 @@ export const applyRules = async ({ store, source, account, since, apply, now = D
35
39
  .filter(({ deleted, mailboxes }) => !deleted && !mailboxes.some(({ kind }) => kind === ENVELOPE))
36
40
  .map(({ externalId }) => externalId));
37
41
  const effectOf = (match) => effects.find(({ rule }) => sameMatch(rule.match, match));
42
+ const all = new Set((await store.mail.emailRefs({ accountId: stored.id })).map(({ externalId }) => externalId));
43
+ const factsFor = factsOf([...listed.values()], rules);
44
+ const tagger = ruleTagger(store, key);
38
45
  const chosen = [];
39
46
  for (const item of listed.values()) {
47
+ const facts = factsFor(item);
48
+ const tags = all.has(item.messageId) ? tagsOf(rules, facts) : [];
49
+ if (tags.length) {
50
+ result.tagged++;
51
+ if (apply)
52
+ await tagger.tag({ type: "message", chatId: item.threadId, messageId: item.messageId }, tags);
53
+ }
40
54
  if (!full.has(item.messageId))
41
55
  continue;
42
- const rule = decide(rules, item.headers);
56
+ const rule = decide(rules, facts);
57
+ if (rule?.protected)
58
+ result.protectedKept++;
43
59
  if (rule?.action === "skip")
44
60
  result.skipMatched++;
45
61
  if (rule?.action === ENVELOPE)
@@ -89,6 +105,13 @@ export const applyRules = async ({ store, source, account, since, apply, now = D
89
105
  ],
90
106
  });
91
107
  }
108
+ const tagging = tagger.outcome();
109
+ if (apply)
110
+ await settleRuleTags(store, stored.id, rules, tagging);
111
+ if (tagging.reused.length)
112
+ result.tagsReused = tagging.reused;
113
+ if (tagging.skipped.length)
114
+ result.tagsSkipped = tagging.skipped;
92
115
  return result;
93
116
  };
94
117
  //# sourceMappingURL=apply.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/mail/apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/mail/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Mail sent to many: its own mailbox, so search can leave it out. Not a folder, so it proves nothing about deletions. */
2
+ export declare const BULK = "bulk";
3
+ export declare const bulkBox: {
4
+ externalId: string;
5
+ name: string;
6
+ kind: string;
7
+ };
8
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../src/mail/bulk.ts"],"names":[],"mappings":"AAAA,0HAA0H;AAC1H,eAAO,MAAM,IAAI,SAAS,CAAA;AAE1B,eAAO,MAAM,OAAO;;;;CAAwD,CAAA"}
@@ -0,0 +1,4 @@
1
+ /** Mail sent to many: its own mailbox, so search can leave it out. Not a folder, so it proves nothing about deletions. */
2
+ export const BULK = "bulk";
3
+ export const bulkBox = { externalId: "memo:bulk", name: "bulk", kind: BULK };
4
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../src/mail/bulk.ts"],"names":[],"mappings":"AAAA,0HAA0H;AAC1H,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAA;AAE1B,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmIxC,eAAO,MAAM,WAAW,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IAuNxF,CAAA"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkLxC,eAAO,MAAM,WAAW,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IA6QxF,CAAA"}
@@ -8,26 +8,41 @@ import { withImportLock } from "../run/lock.js";
8
8
  import { mailAccounts, mailFolders, mailSource } from "./accounts.js";
9
9
  import { applyRules } from "./apply.js";
10
10
  import { knownAges, lookUpAges } from "./domain-age.js";
11
+ import { importFilters } from "./filters.js";
12
+ import { PRESET_NAMES } from "./presets.js";
11
13
  import { domainsToAge, probeMail, SUGGEST_RULE } from "./probe.js";
14
+ import { ACTION_HELP, actionsOf, FILTER_HELP, filterMatch } from "./rule-query.js";
12
15
  import { removeRule, ruleCounts, rulesOf, saveRule } from "./rule-store.js";
16
+ import { mapProposedTags } from "./rule-tags.js";
17
+ import { conditionKeys, describeMatch } from "./rules.js";
13
18
  import { FREE_MAIL, SCORE_RULE } from "./score.js";
14
19
  import { mailStatus, statusText } from "./status.js";
15
20
  const accountOf = (config, name) => mailAccounts(config.mail?.accounts ?? [], [name])[0];
16
- const matchOf = ({ sender, domain, listId }) => {
17
- const given = [sender, domain, listId].filter((value) => value !== undefined);
18
- if (given.length !== 1)
19
- throw new CliError("validation_error", "give exactly one of --sender, --domain, --list-id");
20
- return sender !== undefined ? { from: sender } : domain !== undefined ? { domain } : { list_id: listId };
21
+ const MATCH_OPTIONS = (command) => command
22
+ .option("--sender <address>", "one sender address")
23
+ .option("--domain <domain>", "a sender domain, and its subdomains")
24
+ .option("--list-id <id>", "a mailing list, by its List-Id")
25
+ .option("--filter <query>", FILTER_HELP)
26
+ .option("--kind <kind>", `a built-in kind of mail: ${PRESET_NAMES.join(", ")}`, oneOf(PRESET_NAMES));
27
+ const matchOf = (options) => {
28
+ const match = {
29
+ ...(options.sender === undefined ? {} : { from: options.sender }),
30
+ ...(options.domain === undefined ? {} : { domain: options.domain }),
31
+ ...(options.listId === undefined ? {} : { list_id: options.listId }),
32
+ ...(options.filter === undefined ? {} : filterMatch(options.filter)),
33
+ ...(options.kind === undefined ? {} : { preset: options.kind }),
34
+ };
35
+ if (conditionKeys(match).length === 0)
36
+ throw new CliError("validation_error", "give at least one of --sender, --domain, --list-id, --filter, --kind");
37
+ return match;
21
38
  };
22
- const describe = (match) => match.from !== undefined
23
- ? `from ${match.from}`
24
- : match.domain !== undefined
25
- ? `domain ${match.domain}`
26
- : `list-id ${match.list_id}`;
39
+ const describe = describeMatch;
27
40
  const ruleLine = (rule) => [
28
- rule.action.padEnd(8),
29
- rule.protected ? "protected" : "",
41
+ rule.protected ? "PROTECTED" : rule.action.padEnd(8),
30
42
  describe(rule.match),
43
+ rule.tags?.length ? `tag ${rule.tags.join(", ")}` : "",
44
+ rule.tags_skipped ? `tags skipped: ${Object.keys(rule.tags_skipped).join(", ")}` : "",
45
+ rule.source === undefined ? "" : `(${rule.source})`,
31
46
  rule.decided_at.slice(0, 10),
32
47
  rule.recorded === undefined ? "" : `${rule.recorded.emails} emails, ${megabytes(rule.recorded.bytes)} MB`,
33
48
  rule.reason ?? "",
@@ -50,26 +65,45 @@ const rulesFileOf = (text, path) => {
50
65
  throw bad("no rules list; write it with memo mail rules export");
51
66
  return rules.map((raw, index) => {
52
67
  const rule = raw;
53
- const match = rule.match ?? {};
54
- const given = [match.from, match.domain, match.list_id].filter((value) => typeof value === "string");
55
- if (given.length !== 1 || !ACTIONS.includes(rule.action))
56
- throw bad(`rule ${index + 1} needs one of match.from, match.domain, match.list_id and an action`);
68
+ if (!ACTIONS.includes(rule.action) || conditionKeys(rule.match ?? {}).length === 0)
69
+ throw bad(`rule ${index + 1} needs at least one match condition and an action`);
70
+ const match = rule.match;
71
+ const unknown = conditionKeys(match).filter((key) => !CONDITIONS.includes(key));
72
+ if (unknown.length)
73
+ throw bad(`rule ${index + 1} has conditions memo does not know: ${unknown.join(", ")}`);
57
74
  return {
58
- match: matchOf({ sender: match.from, domain: match.domain, listId: match.list_id }),
75
+ match,
59
76
  action: rule.action,
77
+ ...(Array.isArray(rule.tags) ? { tags: rule.tags.filter((tag) => typeof tag === "string") } : {}),
60
78
  ...(typeof rule.reason === "string" ? { reason: rule.reason } : {}),
61
79
  ...(rule.protected === true ? { protected: true } : {}),
80
+ ...(typeof rule.source === "string" ? { source: rule.source } : {}),
62
81
  decided_at: typeof rule.decided_at === "string" ? rule.decided_at : new Date().toISOString(),
63
82
  };
64
83
  });
65
84
  };
85
+ const CONDITIONS = [
86
+ "from",
87
+ "domain",
88
+ "list_id",
89
+ "subject",
90
+ "older_than_days",
91
+ "larger_than_bytes",
92
+ "has_attachments",
93
+ "label",
94
+ "unread",
95
+ "bulk",
96
+ "score_at_least",
97
+ "preset",
98
+ ];
66
99
  const applyText = (result) => [
67
100
  ...result.rules
68
101
  .filter(({ emails }) => emails > 0)
69
102
  .map(({ rule, emails, bytes }) => `${describe(rule.match)} ${emails} emails, ${megabytes(bytes)} MB of text`),
70
103
  `${result.applied ? "cut" : "would cut"} ${result.envelopes} emails to envelopes, ` +
71
104
  `${megabytes(result.bytes)} MB of text, of ${result.listed} listed; ` +
72
- `${result.skipMatched} match only a skip rule and stay as stored` +
105
+ `${result.skipMatched} match only a skip rule and stay as stored; ` +
106
+ `${result.protectedKept} are protected and stay whole; ${result.applied ? "tagged" : "would tag"} ${result.tagged}` +
73
107
  (result.applied || result.envelopes === 0 ? "" : `; memo mail rules apply ${result.account} --yes cuts them`),
74
108
  ].join("\n");
75
109
  const megabytes = (bytes) => (bytes / 1024 / 1024).toFixed(1);
@@ -97,6 +131,13 @@ const probeText = (probe) => {
97
131
  `${probe.withoutHeaders} without readable headers; ${probe.seconds}s`,
98
132
  line(header),
99
133
  ...rows.map(line),
134
+ ...(probe.presets.length
135
+ ? [
136
+ "",
137
+ "kinds this mail would match (memo mail rules add <account> --kind <kind> --do envelope):",
138
+ ...probe.presets.map(({ preset, emails, groups, bytes }) => ` ${preset.padEnd(12)}${emails} emails, ${groups} groups, ${megabytes(bytes)} MB`),
139
+ ]
140
+ : []),
100
141
  ].join("\n");
101
142
  };
102
143
  export const mailCommand = (program, streams, env) => {
@@ -155,46 +196,55 @@ export const mailCommand = (program, streams, env) => {
155
196
  });
156
197
  const rules = mail
157
198
  .command("rules")
158
- .description("the owner's decisions on which mail to skip or keep, by sender, domain or list");
199
+ .description("the owner's decisions on which mail to keep, record, skip, tag or protect");
159
200
  rules
160
201
  .command("list")
161
- .description("one account's rules")
202
+ .description("one account's rules, protected ones first")
162
203
  .argument("<account>", "the account's name in mail.accounts, or its address")
204
+ .option("--filter <query>", "is:protected lists only the rules no cleanup may override")
163
205
  .option("--json", "print JSON; --json=id,title keeps only those fields")
164
- .addHelpText("after", "\nAn envelope rule shows how many emails it recorded and their size at the source.")
206
+ .addHelpText("after", "\nProtected rules come first, as PROTECTED. An envelope rule shows how many emails it recorded and their " +
207
+ "size at the source.")
165
208
  .action(async (name, options) => {
209
+ if (options.filter !== undefined && options.filter.trim() !== "is:protected")
210
+ throw new CliError("validation_error", "--filter: rules list knows only is:protected");
211
+ const only = options.filter !== undefined;
166
212
  const account = accountOf(loadConfig(env), name);
167
213
  const items = await withStore(env, async (store) => {
168
214
  const rules = await rulesOf(store, account, env, streams.diagnostic);
169
215
  const counts = await ruleCounts(store, account.address);
170
- return rules.map((rule) => {
216
+ return rules
217
+ .filter((rule) => !only || rule.protected)
218
+ .sort((a, b) => Number(b.protected === true) - Number(a.protected === true))
219
+ .map((rule) => {
171
220
  const recorded = rule.id === undefined ? undefined : counts.get(rule.id);
172
221
  return rule.action === "envelope" ? { ...rule, recorded: recorded ?? { emails: 0, bytes: 0 } } : rule;
173
222
  });
174
223
  });
175
224
  print(options.json, wholeList("mail rules list", items), items.map(ruleLine).join("\n") || "no rules");
176
225
  });
177
- rules
226
+ MATCH_OPTIONS(rules
178
227
  .command("add")
179
- .description("skip, record or keep mail by sender, domain or list; a repeat replaces its rule")
180
- .argument("<account>", "the account's name in mail.accounts, or its address")
181
- .option("--sender <address>", "one sender address")
182
- .option("--domain <domain>", "a sender domain, and its subdomains")
183
- .option("--list-id <id>", "a mailing list, by its List-Id")
184
- .requiredOption("--do <actions>", "one of skip (never read or store this mail), envelope (store only sender, date, size and labels: " +
185
- "counted, out of search, cleanable later), keep (import it even when a skip or envelope rule matches)", oneOf(ACTIONS))
228
+ .description("decide mail by sender, list, subject, age, size, label or kind; repeats replace")
229
+ .argument("<account>", "the account's name in mail.accounts, or its address"))
230
+ .requiredOption("--do <actions>", ACTION_HELP, actionsOf)
186
231
  .option("--reason <text>", "why, for the owner later")
187
232
  .option("--json", "print JSON; --json=id,title keeps only those fields")
188
- .addHelpText("after", "\nA keep wins over an envelope, an envelope over a skip, so --do keep --sender one sender overrides " +
189
- "--do skip --domain of its domain. A skipped email is never read or stored by memo sync. An envelope " +
190
- "email costs no more from the mailbox than a skipped one; its subject is kept in its metadata, not in " +
191
- "search. Changing an envelope rule to keep, or removing it, reads those emails in full on the next sync. " +
192
- "Mail already stored in full stays.")
233
+ .addHelpText("after", "\nAll conditions given must hold. A protected rule wins over every other rule and kind; then keep wins over " +
234
+ "envelope and envelope over skip, so --do keep --sender one sender overrides --do skip --domain of its " +
235
+ "domain; an explicit rule wins over a --kind one. A skipped email is never read or stored by memo sync. An " +
236
+ "envelope email costs no more from the mailbox than a skipped one; its subject is kept in its metadata, not " +
237
+ "in search. Changing an envelope rule to keep, or removing it, reads those emails in full on the next sync. " +
238
+ "Mail already stored in full stays; memo mail rules apply cuts or tags it.\n\n" +
239
+ "score: and --kind judge a sender by its mail in the same listing; a sync that lists only new mail judges it " +
240
+ "from that mail. has:attachment reads Content-Type at list time: a guess, not a parse.")
193
241
  .action(async (name, options) => {
194
- const match = matchOf(options);
195
242
  const rule = {
196
- match,
197
- action: options.do,
243
+ match: matchOf(options),
244
+ action: options.do.action,
245
+ ...(options.do.tags.length ? { tags: options.do.tags } : {}),
246
+ ...(options.do.protect ? { protected: true } : {}),
247
+ ...(options.kind === undefined ? {} : { source: `preset:${options.kind}` }),
198
248
  ...(options.reason === undefined ? {} : { reason: options.reason }),
199
249
  decided_at: new Date().toISOString(),
200
250
  };
@@ -205,13 +255,10 @@ export const mailCommand = (program, streams, env) => {
205
255
  });
206
256
  print(options.json, itemAnswer(saved), ruleLine(saved));
207
257
  });
208
- rules
258
+ MATCH_OPTIONS(rules
209
259
  .command("remove")
210
- .description("drop the rule for a sender, domain or list")
211
- .argument("<account>", "the account's name in mail.accounts, or its address")
212
- .option("--sender <address>", "one sender address")
213
- .option("--domain <domain>", "a sender domain")
214
- .option("--list-id <id>", "a mailing list, by its List-Id")
260
+ .description("drop the rule with exactly these conditions")
261
+ .argument("<account>", "the account's name in mail.accounts, or its address"))
215
262
  .option("--json", "print JSON; --json=id,title keeps only those fields")
216
263
  .action(async (name, options) => {
217
264
  const match = matchOf(options);
@@ -226,6 +273,38 @@ export const mailCommand = (program, streams, env) => {
226
273
  });
227
274
  print(options.json, itemAnswer({ removed: match }), `removed the rule for ${describe(match)}`);
228
275
  });
276
+ rules
277
+ .command("import-filters")
278
+ .description("propose rules from a Takeout export's Gmail filters; --yes adds them")
279
+ .argument("<account>", "the account's name in mail.accounts, or its address")
280
+ .argument("<file>", "Takeout's Mail/User settings/Filters.json")
281
+ .option("--yes", "add the proposed rules; without it, only show them")
282
+ .option("--json", "print JSON; --json=id,title keeps only those fields")
283
+ .addHelpText("after", "\nA filter that skips the inbox, marks read or deletes becomes an envelope rule; one that only adds labels " +
284
+ "becomes a tag. A filter memo cannot express (a search query, a size, no sender) is listed as skipped.")
285
+ .action(async (name, path, options) => {
286
+ const account = accountOf(loadConfig(env), name);
287
+ const parsed = importFilters(readFileSync(path, "utf8"), path);
288
+ const { proposal, mapping, added } = await withStore(env, async (store) => {
289
+ const { rules: mapped, mapping } = await mapProposedTags(store, parsed.rules);
290
+ const proposal = { ...parsed, rules: mapped };
291
+ if (!options.yes)
292
+ return { proposal, mapping, added: 0 };
293
+ await rulesOf(store, account, env, streams.diagnostic);
294
+ const out = [];
295
+ for (const rule of proposal.rules)
296
+ out.push(await saveRule(store, account.address, rule));
297
+ return { proposal, mapping, added: out.length };
298
+ });
299
+ print(options.json, itemAnswer({ ...proposal, tagMapping: mapping, added }), [
300
+ ...proposal.rules.map(ruleLine),
301
+ ...mapping.map(({ tag, as, why }) => `label ${tag} → ${as} (${why === "reuse" ? "same label" : "similar label"})`),
302
+ ...proposal.skipped.map(({ filter, why }) => `skipped ${filter}: ${why}`),
303
+ options.yes
304
+ ? `added ${added} rules to ${account.name}`
305
+ : `${proposal.rules.length} rules proposed; memo mail rules import-filters ${name} ${path} --yes adds them`,
306
+ ].join("\n"));
307
+ });
229
308
  rules
230
309
  .command("apply")
231
310
  .description("cut stored mail an envelope rule matches to its envelope; dry run unless --yes")