@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
package/dist/doctor/command.d.ts
CHANGED
package/dist/effects.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
package/dist/effects.js.map
CHANGED
|
@@ -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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"}
|
package/dist/examples.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
27
|
-
"memo mail rules add personal --
|
|
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"],
|
package/dist/examples.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAGrD,MAAM,CAAC,MAAM,QAAQ,GAAgD;IACnE,OAAO,EAAE,CAAC,oCAAoC,EAAE,qDAAqD,CAAC;IACtG,YAAY,EAAE,CAAC,yBAAyB,EAAE,8CAA8C,CAAC;IACzF,YAAY,EAAE;QACZ,iDAAiD;QACjD,oDAAoD;QACpD,4CAA4C;KAC7C;IACD,WAAW,EAAE;QACX,+EAA+E;QAC/E,4GAA4G;KAC7G;IACD,YAAY,EAAE,CAAC,uEAAuE,CAAC;IACvF,cAAc,EAAE,CAAC,2BAA2B,CAAC;IAC7C,cAAc,EAAE,CAAC,+DAA+D,CAAC;IACjF,aAAa,EAAE,CAAC,0BAA0B,CAAC;IAC3C,gBAAgB,EAAE,CAAC,+BAA+B,CAAC;IACnD,cAAc,EAAE,CAAC,0BAA0B,CAAC;IAC5C,eAAe,EAAE,CAAC,oFAAoF,CAAC;IACvG,YAAY,EAAE,CAAC,qCAAqC,EAAE,+CAA+C,CAAC;IACtG,aAAa,EAAE,CAAC,2BAA2B,EAAE,kCAAkC,CAAC;IAChF,iBAAiB,EAAE,CAAC,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
|
package/dist/json-fields.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/json-fields.js
CHANGED
|
@@ -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
|
};
|
package/dist/json-fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAgB,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"json-fields.js","sourceRoot":"","sources":["../src/json-fields.ts"],"names":[],"mappings":"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"}
|
package/dist/mail/apply.d.ts
CHANGED
|
@@ -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
|
package/dist/mail/apply.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/mail/apply.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { mailFolders } from "./accounts.js";
|
|
2
|
-
import {
|
|
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,
|
|
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
|
package/dist/mail/apply.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/mail/apply.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
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 @@
|
|
|
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;
|
|
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"}
|
package/dist/mail/command.js
CHANGED
|
@@ -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
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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 =
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|
|
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", "\
|
|
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
|
|
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("
|
|
180
|
-
.argument("<account>", "the account's name in mail.accounts, or its address")
|
|
181
|
-
.
|
|
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", "\
|
|
189
|
-
"
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
"
|
|
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
|
|
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")
|