@wirecat/cli-memo 0.30.0 → 0.32.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 (200) hide show
  1. package/README.md +1 -1
  2. package/dist/actions/command.d.ts.map +1 -1
  3. package/dist/actions/command.js +7 -7
  4. package/dist/actions/command.js.map +1 -1
  5. package/dist/agents/command.js +3 -3
  6. package/dist/agents/command.js.map +1 -1
  7. package/dist/answer.d.ts +23 -0
  8. package/dist/answer.d.ts.map +1 -0
  9. package/dist/answer.js +56 -0
  10. package/dist/answer.js.map +1 -0
  11. package/dist/answers/command.d.ts.map +1 -1
  12. package/dist/answers/command.js +6 -13
  13. package/dist/answers/command.js.map +1 -1
  14. package/dist/bin/memo.js +16 -2
  15. package/dist/bin/memo.js.map +1 -1
  16. package/dist/config.d.ts +8 -4
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +15 -7
  19. package/dist/config.js.map +1 -1
  20. package/dist/context/command.d.ts +1 -1
  21. package/dist/context/command.d.ts.map +1 -1
  22. package/dist/context/command.js +6 -14
  23. package/dist/context/command.js.map +1 -1
  24. package/dist/discovery/command.d.ts +1 -1
  25. package/dist/discovery/command.js +1 -1
  26. package/dist/doctor/command.d.ts +82 -0
  27. package/dist/doctor/command.d.ts.map +1 -0
  28. package/dist/doctor/command.js +148 -0
  29. package/dist/doctor/command.js.map +1 -0
  30. package/dist/effects.d.ts +6 -1
  31. package/dist/effects.d.ts.map +1 -1
  32. package/dist/effects.js +26 -9
  33. package/dist/effects.js.map +1 -1
  34. package/dist/examples.d.ts.map +1 -1
  35. package/dist/examples.js +7 -3
  36. package/dist/examples.js.map +1 -1
  37. package/dist/facts/command.d.ts.map +1 -1
  38. package/dist/facts/command.js +14 -22
  39. package/dist/facts/command.js.map +1 -1
  40. package/dist/facts/fact.d.ts +36 -0
  41. package/dist/facts/fact.d.ts.map +1 -0
  42. package/dist/facts/fact.js +47 -0
  43. package/dist/facts/fact.js.map +1 -0
  44. package/dist/failure.d.ts +5 -7
  45. package/dist/failure.d.ts.map +1 -1
  46. package/dist/failure.js +8 -27
  47. package/dist/failure.js.map +1 -1
  48. package/dist/knowledge/command.d.ts.map +1 -1
  49. package/dist/knowledge/command.js +33 -34
  50. package/dist/knowledge/command.js.map +1 -1
  51. package/dist/knowledge/meeting-projects-command.d.ts.map +1 -1
  52. package/dist/knowledge/meeting-projects-command.js +22 -12
  53. package/dist/knowledge/meeting-projects-command.js.map +1 -1
  54. package/dist/list-query.d.ts +18 -0
  55. package/dist/list-query.d.ts.map +1 -0
  56. package/dist/list-query.js +68 -0
  57. package/dist/list-query.js.map +1 -0
  58. package/dist/mail/apply.d.ts.map +1 -1
  59. package/dist/mail/apply.js +1 -0
  60. package/dist/mail/apply.js.map +1 -1
  61. package/dist/mail/command.d.ts.map +1 -1
  62. package/dist/mail/command.js +133 -108
  63. package/dist/mail/command.js.map +1 -1
  64. package/dist/mail/domain-age.d.ts +21 -0
  65. package/dist/mail/domain-age.d.ts.map +1 -0
  66. package/dist/mail/domain-age.js +99 -0
  67. package/dist/mail/domain-age.js.map +1 -0
  68. package/dist/mail/gmail.d.ts +1 -1
  69. package/dist/mail/gmail.d.ts.map +1 -1
  70. package/dist/mail/gmail.js +6 -1
  71. package/dist/mail/gmail.js.map +1 -1
  72. package/dist/mail/headers.d.ts +17 -3
  73. package/dist/mail/headers.d.ts.map +1 -1
  74. package/dist/mail/headers.js +32 -3
  75. package/dist/mail/headers.js.map +1 -1
  76. package/dist/mail/himalaya.d.ts +5 -0
  77. package/dist/mail/himalaya.d.ts.map +1 -1
  78. package/dist/mail/himalaya.js +34 -5
  79. package/dist/mail/himalaya.js.map +1 -1
  80. package/dist/mail/import.d.ts.map +1 -1
  81. package/dist/mail/import.js +4 -0
  82. package/dist/mail/import.js.map +1 -1
  83. package/dist/mail/messages-command.d.ts.map +1 -1
  84. package/dist/mail/messages-command.js +7 -13
  85. package/dist/mail/messages-command.js.map +1 -1
  86. package/dist/mail/probe.d.ts +7 -1
  87. package/dist/mail/probe.d.ts.map +1 -1
  88. package/dist/mail/probe.js +12 -1
  89. package/dist/mail/probe.js.map +1 -1
  90. package/dist/mail/resume.js +1 -1
  91. package/dist/mail/resume.js.map +1 -1
  92. package/dist/mail/rule-store.d.ts +33 -0
  93. package/dist/mail/rule-store.d.ts.map +1 -0
  94. package/dist/mail/rule-store.js +129 -0
  95. package/dist/mail/rule-store.js.map +1 -0
  96. package/dist/mail/rules.d.ts +6 -2
  97. package/dist/mail/rules.d.ts.map +1 -1
  98. package/dist/mail/rules.js +3 -3
  99. package/dist/mail/rules.js.map +1 -1
  100. package/dist/mail/score.d.ts +50 -0
  101. package/dist/mail/score.d.ts.map +1 -0
  102. package/dist/mail/score.js +118 -0
  103. package/dist/mail/score.js.map +1 -0
  104. package/dist/mcp/knowledge.d.ts.map +1 -1
  105. package/dist/mcp/knowledge.js +15 -9
  106. package/dist/mcp/knowledge.js.map +1 -1
  107. package/dist/mcp/server.d.ts.map +1 -1
  108. package/dist/mcp/server.js +30 -36
  109. package/dist/mcp/server.js.map +1 -1
  110. package/dist/mcp/task-relations.d.ts.map +1 -1
  111. package/dist/mcp/task-relations.js +9 -7
  112. package/dist/mcp/task-relations.js.map +1 -1
  113. package/dist/mcp/tool.d.ts +3 -2
  114. package/dist/mcp/tool.d.ts.map +1 -1
  115. package/dist/mcp/tool.js.map +1 -1
  116. package/dist/mcp/vocabulary.d.ts.map +1 -1
  117. package/dist/mcp/vocabulary.js +7 -6
  118. package/dist/mcp/vocabulary.js.map +1 -1
  119. package/dist/memories/command.d.ts.map +1 -1
  120. package/dist/memories/command.js +15 -19
  121. package/dist/memories/command.js.map +1 -1
  122. package/dist/memories/memory.d.ts +31 -0
  123. package/dist/memories/memory.d.ts.map +1 -0
  124. package/dist/memories/memory.js +43 -0
  125. package/dist/memories/memory.js.map +1 -0
  126. package/dist/notes/command.d.ts.map +1 -1
  127. package/dist/notes/command.js +39 -30
  128. package/dist/notes/command.js.map +1 -1
  129. package/dist/notes/embed.d.ts +2 -0
  130. package/dist/notes/embed.d.ts.map +1 -1
  131. package/dist/notes/embed.js +8 -0
  132. package/dist/notes/embed.js.map +1 -1
  133. package/dist/notes/folders-command.d.ts.map +1 -1
  134. package/dist/notes/folders-command.js +19 -26
  135. package/dist/notes/folders-command.js.map +1 -1
  136. package/dist/notes/search.d.ts.map +1 -1
  137. package/dist/notes/search.js +2 -8
  138. package/dist/notes/search.js.map +1 -1
  139. package/dist/output.d.ts +9 -7
  140. package/dist/output.d.ts.map +1 -1
  141. package/dist/output.js +11 -14
  142. package/dist/output.js.map +1 -1
  143. package/dist/page.d.ts +2 -5
  144. package/dist/page.d.ts.map +1 -1
  145. package/dist/page.js +7 -2
  146. package/dist/page.js.map +1 -1
  147. package/dist/people/command.d.ts.map +1 -1
  148. package/dist/people/command.js +3 -7
  149. package/dist/people/command.js.map +1 -1
  150. package/dist/program.d.ts.map +1 -1
  151. package/dist/program.js +6 -0
  152. package/dist/program.js.map +1 -1
  153. package/dist/reasons.d.ts.map +1 -1
  154. package/dist/reasons.js +12 -0
  155. package/dist/reasons.js.map +1 -1
  156. package/dist/run/auto.d.ts +11 -1
  157. package/dist/run/auto.d.ts.map +1 -1
  158. package/dist/run/auto.js +46 -18
  159. package/dist/run/auto.js.map +1 -1
  160. package/dist/run/import.d.ts.map +1 -1
  161. package/dist/run/import.js +15 -17
  162. package/dist/run/import.js.map +1 -1
  163. package/dist/search/answers.d.ts +16 -0
  164. package/dist/search/answers.d.ts.map +1 -0
  165. package/dist/search/answers.js +48 -0
  166. package/dist/search/answers.js.map +1 -0
  167. package/dist/search/command.d.ts.map +1 -1
  168. package/dist/search/command.js +29 -35
  169. package/dist/search/command.js.map +1 -1
  170. package/dist/search/hits.d.ts +8 -0
  171. package/dist/search/hits.d.ts.map +1 -0
  172. package/dist/search/hits.js +68 -0
  173. package/dist/search/hits.js.map +1 -0
  174. package/dist/tags/command.d.ts.map +1 -1
  175. package/dist/tags/command.js +23 -31
  176. package/dist/tags/command.js.map +1 -1
  177. package/dist/tasks/command.d.ts.map +1 -1
  178. package/dist/tasks/command.js +29 -44
  179. package/dist/tasks/command.js.map +1 -1
  180. package/dist/tasks/relations-command.js +4 -4
  181. package/dist/tasks/relations-command.js.map +1 -1
  182. package/dist/terminal.d.ts +4 -0
  183. package/dist/terminal.d.ts.map +1 -0
  184. package/dist/terminal.js +8 -0
  185. package/dist/terminal.js.map +1 -0
  186. package/dist/update.d.ts +26 -0
  187. package/dist/update.d.ts.map +1 -0
  188. package/dist/update.js +67 -0
  189. package/dist/update.js.map +1 -0
  190. package/dist/version.d.ts +1 -1
  191. package/dist/version.js +1 -1
  192. package/dist/vocabulary/command.d.ts.map +1 -1
  193. package/dist/vocabulary/command.js +3 -3
  194. package/dist/vocabulary/command.js.map +1 -1
  195. package/package.json +4 -2
  196. package/skills/cli-memo/SKILL.md +14 -5
  197. package/dist/records/run.d.ts +0 -7
  198. package/dist/records/run.d.ts.map +0 -1
  199. package/dist/records/run.js +0 -24
  200. package/dist/records/run.js.map +0 -1
@@ -1,64 +1,67 @@
1
- import { CliError, createRenderer } from "@wirecat/cli-base";
2
- import { openStore } from "@wirecat/cli-core/store";
3
- import { loadConfig, updateConfig } from "../config.js";
1
+ import { readFileSync } from "node:fs";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { momentOf } from "@wirecat/cli-core/cli";
4
+ import { answers, itemAnswer, wholeList, withStore } from "../answer.js";
5
+ import { loadConfig } from "../config.js";
4
6
  import { positive } from "../options.js";
5
- import { metaOf, snakeKeys } from "../output.js";
6
- import { printing } from "../records/run.js";
7
7
  import { withImportLock } from "../run/lock.js";
8
8
  import { mailAccounts, mailFolders, mailSource } from "./accounts.js";
9
9
  import { applyRules } from "./apply.js";
10
- import { probeMail, SUGGEST_RULE } from "./probe.js";
11
- import { envelopeBox, sameMatch } from "./rules.js";
10
+ import { knownAges, lookUpAges } from "./domain-age.js";
11
+ import { domainsToAge, probeMail, SUGGEST_RULE } from "./probe.js";
12
+ import { removeRule, ruleCounts, rulesOf, saveRule } from "./rule-store.js";
13
+ import { FREE_MAIL, SCORE_RULE } from "./score.js";
12
14
  import { mailStatus, statusText } from "./status.js";
13
15
  const accountOf = (config, name) => mailAccounts(config.mail?.accounts ?? [], [name])[0];
14
16
  const matchOf = ({ from, domain, listId }) => {
15
17
  const given = [from, domain, listId].filter((value) => value !== undefined);
16
18
  if (given.length !== 1)
17
19
  throw new CliError("validation_error", "give exactly one of --from, --domain, --list-id");
18
- return from !== undefined ? { from } : domain !== undefined ? { domain } : { listId: listId };
20
+ return from !== undefined ? { from } : domain !== undefined ? { domain } : { list_id: listId };
19
21
  };
20
22
  const describe = (match) => match.from !== undefined
21
23
  ? `from ${match.from}`
22
24
  : match.domain !== undefined
23
25
  ? `domain ${match.domain}`
24
- : `list-id ${match.listId}`;
26
+ : `list-id ${match.list_id}`;
25
27
  const ruleLine = (rule) => [
26
28
  rule.action.padEnd(8),
29
+ rule.protected ? "protected" : "",
27
30
  describe(rule.match),
28
- rule.decidedAt.slice(0, 10),
31
+ rule.decided_at.slice(0, 10),
29
32
  rule.recorded === undefined ? "" : `${rule.recorded.emails} emails, ${megabytes(rule.recorded.bytes)} MB`,
30
33
  rule.reason ?? "",
31
34
  ]
32
35
  .filter(Boolean)
33
36
  .join(" ")
34
37
  .trimEnd();
35
- const PAGE = 1000;
36
- /** What each envelope rule has recorded so far, read from the store; nothing is fetched from the mailbox. */
37
- const recordedBy = async (store, address, rule) => {
38
- const account = await store.storedAccount({ provider: "email", account: address.toLowerCase() }).catch(() => null);
39
- const recorded = { emails: 0, bytes: 0 };
40
- if (account === null)
41
- return recorded;
42
- const mailbox = envelopeBox(rule.match).externalId;
43
- for (let offset = 0;; offset += PAGE) {
44
- const page = await store.mail.emails({ accountId: account.id, mailbox, limit: PAGE, offset });
45
- for (const email of page) {
46
- recorded.emails++;
47
- recorded.bytes += email.size ?? 0;
48
- }
49
- if (page.length < PAGE)
50
- return recorded;
38
+ const ACTIONS = ["skip", "envelope", "keep"];
39
+ const rulesFileOf = (text, path) => {
40
+ const bad = (why) => new CliError("validation_error", `${path}: ${why}`, { reason: "mail.rules-file-invalid" });
41
+ let parsed;
42
+ try {
43
+ parsed = JSON.parse(text);
51
44
  }
52
- };
53
- const changeRules = (env, name, change) => {
54
- let changed = [];
55
- updateConfig((config) => {
56
- const account = accountOf(config, name);
57
- changed = change(account.rules ?? []);
58
- const accounts = (config.mail?.accounts ?? []).map((each) => each === account ? { ...each, rules: changed } : each);
59
- return { ...config, mail: { ...config.mail, accounts } };
60
- }, env);
61
- return changed;
45
+ catch {
46
+ throw bad("not JSON");
47
+ }
48
+ const rules = parsed.rules;
49
+ if (!Array.isArray(rules))
50
+ throw bad("no rules list; write it with memo mail rules export");
51
+ return rules.map((raw, index) => {
52
+ 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`);
57
+ return {
58
+ match: matchOf({ from: match.from, domain: match.domain, listId: match.list_id }),
59
+ action: rule.action,
60
+ ...(typeof rule.reason === "string" ? { reason: rule.reason } : {}),
61
+ ...(rule.protected === true ? { protected: true } : {}),
62
+ decided_at: typeof rule.decided_at === "string" ? rule.decided_at : new Date().toISOString(),
63
+ };
64
+ });
62
65
  };
63
66
  const applyText = (result) => [
64
67
  ...result.rules
@@ -80,9 +83,10 @@ const probeText = (probe) => {
80
83
  group.firstYear === group.lastYear ? String(group.firstYear) : `${group.firstYear}-${group.lastYear}`,
81
84
  group.replied ? "yes" : "no",
82
85
  group.suggest ?? "",
86
+ String(group.score),
83
87
  group.listId === null ? (group.from ?? "") : `${group.listId} (${group.from ?? "?"})`,
84
88
  ]);
85
- const header = ["emails", "MB", "unread", "bulk", "years", "replied", "suggest", "sender or list"];
89
+ const header = ["emails", "MB", "unread", "bulk", "years", "replied", "suggest", "score", "sender or list"];
86
90
  const widths = header.map((title, column) => Math.max(title.length, ...rows.map((row) => row[column]?.length ?? 0)));
87
91
  const line = (row) => row
88
92
  .map((cell, column) => (column < 2 ? cell.padStart(widths[column] ?? 0) : cell.padEnd(widths[column] ?? 0)))
@@ -96,7 +100,7 @@ const probeText = (probe) => {
96
100
  ].join("\n");
97
101
  };
98
102
  export const mailCommand = (program, streams, env) => {
99
- const print = printing(streams);
103
+ const { print } = answers(program, streams, env);
100
104
  const mail = program.command("mail").description("look at a mail account before importing it, and the owner's rules");
101
105
  mail
102
106
  .command("probe")
@@ -104,24 +108,38 @@ export const mailCommand = (program, streams, env) => {
104
108
  .argument("<account>", "the account's name in mail.accounts, or its address")
105
109
  .option("--since-time <time>", "only mail from this time, ISO 8601 or 30d ago (default: all mail)")
106
110
  .option("--limit-groups <n>", "show this many of the largest groups", positive, 50)
111
+ .option("--domain-age", "ask each shown sender domain's registry when it was registered (RDAP); tells each registry its domain")
107
112
  .option("--json", "print JSON; --json=id,title keeps only those fields")
108
- .addHelpText("after", "\nRead-only and headers only: about 300 bytes per email (From, To, Cc, List-Id, List-Unsubscribe, " +
109
- "Precedence), against Gmail's daily download limit. An mbox account reads the whole file once.\n\n" +
110
- `Each group's ${SUGGEST_RULE}. The owner decides; add a rule with memo mail rules add.`)
113
+ .addHelpText("after", "\nRead-only and headers only: about 1 KB per email (From, To, Cc, Reply-To, List-Id, List-Unsubscribe, " +
114
+ "Precedence and Gmail's SPF, DKIM and DMARC verdicts), against Gmail's daily download limit. An mbox " +
115
+ "account reads the whole file once.\n\n" +
116
+ `Each group's ${SUGGEST_RULE}. Its ${SCORE_RULE}. The owner decides; add a rule with memo mail rules add.\n\n` +
117
+ "--domain-age asks the registry of each shown group's sender domain, one a second, and keeps the answer " +
118
+ "on this computer for good. Big mailbox providers and senders the owner replied to are never asked; " +
119
+ "most country domains (.ru, .de, .es, .io) have no RDAP and stay unknown. Without it, only ages " +
120
+ "already kept are used and nothing leaves this computer.")
111
121
  .action(async (name, options) => {
112
122
  const account = accountOf(loadConfig(env), name);
113
- const since = new Date(options.sinceTime === undefined
114
- ? 0
115
- : (await import("@wirecat/cli-core/cli")).momentOf(options.sinceTime, "--since-time"));
123
+ const since = new Date(options.sinceTime === undefined ? 0 : momentOf(options.sinceTime, "--since-time"));
116
124
  const started = Date.now();
117
125
  const source = mailSource(account, env);
118
126
  const listed = new Map();
119
127
  for (const folder of mailFolders(account))
120
128
  for (const item of await source.list(since, folder, { headers: true }))
121
129
  listed.set(item.messageId, item);
122
- const probe = { ...probeMail([...listed.values()], options.limitGroups), seconds: 0 };
123
- probe.seconds = Math.round((Date.now() - started) / 100) / 10;
124
- print(options.json, probe, probeText(probe));
130
+ const items = [...listed.values()];
131
+ let probe = probeMail(items, options.limitGroups, knownAges(env));
132
+ let lookups;
133
+ if (options.domainAge) {
134
+ lookups = await lookUpAges(env, domainsToAge(probe.items, FREE_MAIL));
135
+ probe = probeMail(items, options.limitGroups, knownAges(env));
136
+ }
137
+ const shown = {
138
+ ...probe,
139
+ ...(lookups === undefined ? {} : { domainLookups: lookups }),
140
+ seconds: Math.round((Date.now() - started) / 100) / 10,
141
+ };
142
+ print(options.json, itemAnswer(shown), probeText(shown));
125
143
  });
126
144
  mail
127
145
  .command("status")
@@ -132,21 +150,8 @@ export const mailCommand = (program, streams, env) => {
132
150
  "recorded by a rule or skipped by one. The total is the mail in the window at the last sync's search.")
133
151
  .action(async (name, options) => {
134
152
  const account = accountOf(loadConfig(env), name);
135
- const startedAt = Date.now();
136
- const store = await openStore({ env });
137
- try {
138
- const status = await mailStatus(store, account);
139
- if (options.json)
140
- createRenderer({ format: "json", color: false, streams }).result({
141
- item: snakeKeys(status),
142
- meta: metaOf(startedAt, { accounts: [account.name] }),
143
- });
144
- else
145
- streams.data(`${statusText(status)}\n`);
146
- }
147
- finally {
148
- await store.close();
149
- }
153
+ const status = await withStore(env, (store) => mailStatus(store, account));
154
+ print(options.json, itemAnswer(status, { meta: { accounts: [account.name] } }), statusText(status));
150
155
  });
151
156
  const rules = mail
152
157
  .command("rules")
@@ -159,19 +164,15 @@ export const mailCommand = (program, streams, env) => {
159
164
  .addHelpText("after", "\nAn envelope rule shows how many emails it recorded and their size at the source.")
160
165
  .action(async (name, options) => {
161
166
  const account = accountOf(loadConfig(env), name);
162
- const rules = account.rules ?? [];
163
- const store = rules.some(({ action }) => action === "envelope") ? await openStore({ env }) : undefined;
164
- try {
165
- const items = [];
166
- for (const rule of rules)
167
- items.push(store !== undefined && rule.action === "envelope"
168
- ? { ...rule, recorded: await recordedBy(store, account.address, rule) }
169
- : rule);
170
- print(options.json, { items }, items.map(ruleLine).join("\n") || "no rules");
171
- }
172
- finally {
173
- await store?.close();
174
- }
167
+ const items = await withStore(env, async (store) => {
168
+ const rules = await rulesOf(store, account, env, streams.diagnostic);
169
+ const counts = await ruleCounts(store, account.address);
170
+ return rules.map((rule) => {
171
+ const recorded = rule.id === undefined ? undefined : counts.get(rule.id);
172
+ return rule.action === "envelope" ? { ...rule, recorded: recorded ?? { emails: 0, bytes: 0 } } : rule;
173
+ });
174
+ });
175
+ print(options.json, wholeList("mail rules list", items), items.map(ruleLine).join("\n") || "no rules");
175
176
  });
176
177
  rules
177
178
  .command("add")
@@ -190,7 +191,7 @@ export const mailCommand = (program, streams, env) => {
190
191
  "email costs no more from the mailbox than a skipped one; its subject is kept in its metadata, not in " +
191
192
  "search. Changing an envelope rule to keep, or removing it, reads those emails in full on the next sync. " +
192
193
  "Mail already stored in full stays.")
193
- .action((name, options) => {
194
+ .action(async (name, options) => {
194
195
  const match = matchOf(options);
195
196
  const actions = ["skip", "envelope", "keep"].filter((action) => options[action]);
196
197
  if (actions.length !== 1)
@@ -199,10 +200,14 @@ export const mailCommand = (program, streams, env) => {
199
200
  match,
200
201
  action: actions[0],
201
202
  ...(options.reason === undefined ? {} : { reason: options.reason }),
202
- decidedAt: new Date().toISOString(),
203
+ decided_at: new Date().toISOString(),
203
204
  };
204
- changeRules(env, name, (current) => [...current.filter((each) => !sameMatch(each.match, match)), rule]);
205
- print(options.json, rule, ruleLine(rule));
205
+ const account = accountOf(loadConfig(env), name);
206
+ const saved = await withStore(env, async (store) => {
207
+ await rulesOf(store, account, env, streams.diagnostic);
208
+ return saveRule(store, account.address, rule);
209
+ });
210
+ print(options.json, itemAnswer(saved), ruleLine(saved));
206
211
  });
207
212
  rules
208
213
  .command("remove")
@@ -212,14 +217,18 @@ export const mailCommand = (program, streams, env) => {
212
217
  .option("--domain <domain>", "a sender domain")
213
218
  .option("--list-id <id>", "a mailing list, by its List-Id")
214
219
  .option("--json", "print JSON; --json=id,title keeps only those fields")
215
- .action((name, options) => {
220
+ .action(async (name, options) => {
216
221
  const match = matchOf(options);
217
- if (!(accountOf(loadConfig(env), name).rules ?? []).some((rule) => sameMatch(rule.match, match)))
222
+ const account = accountOf(loadConfig(env), name);
223
+ const removed = await withStore(env, async (store) => {
224
+ await rulesOf(store, account, env, streams.diagnostic);
225
+ return removeRule(store, account.address, match);
226
+ });
227
+ if (!removed)
218
228
  throw new CliError("not_found", `no rule for ${describe(match)}; memo mail rules list ${name} shows them`, {
219
229
  reason: "mail.rule-not-found",
220
230
  });
221
- const left = changeRules(env, name, (current) => current.filter((rule) => !sameMatch(rule.match, match)));
222
- print(options.json, { removed: match, items: left }, `removed the rule for ${describe(match)}`);
231
+ print(options.json, itemAnswer({ removed: match }), `removed the rule for ${describe(match)}`);
223
232
  });
224
233
  rules
225
234
  .command("apply")
@@ -234,32 +243,48 @@ export const mailCommand = (program, streams, env) => {
234
243
  "mailbox. Changing a rule to keep, or removing it, reads those emails in full on the next sync.")
235
244
  .action(async (name, options) => {
236
245
  const account = accountOf(loadConfig(env), name);
237
- const since = new Date(options.sinceTime === undefined
238
- ? 0
239
- : (await import("@wirecat/cli-core/cli")).momentOf(options.sinceTime, "--since-time"));
240
- const startedAt = Date.now();
241
- const result = await withImportLock(env, async () => {
242
- const store = await openStore({ env });
243
- try {
244
- return await applyRules({
245
- store,
246
- source: mailSource(account, env),
247
- account,
248
- since,
249
- apply: options.yes === true,
250
- });
251
- }
252
- finally {
253
- await store.close();
254
- }
246
+ const since = new Date(options.sinceTime === undefined ? 0 : momentOf(options.sinceTime, "--since-time"));
247
+ const result = await withImportLock(env, () => withStore(env, async (store) => applyRules({
248
+ store,
249
+ source: mailSource(account, env),
250
+ account: { ...account, rules: await rulesOf(store, account, env, streams.diagnostic) },
251
+ since,
252
+ apply: options.yes === true,
253
+ })));
254
+ print(options.json, itemAnswer(result, { meta: { accounts: [account.name] } }), applyText(result));
255
+ });
256
+ rules
257
+ .command("export")
258
+ .description("print one account's rules as JSON, to review, keep or move elsewhere")
259
+ .argument("<account>", "the account's name in mail.accounts, or its address")
260
+ .addHelpText("after", "\nmemo mail rules export personal > rules.json; memo mail rules import reads it back.")
261
+ .action(async (name) => {
262
+ const account = accountOf(loadConfig(env), name);
263
+ const rules = await withStore(env, (store) => rulesOf(store, account, env, streams.diagnostic));
264
+ const file = {
265
+ version: 1,
266
+ account: account.address,
267
+ rules: rules.map(({ id: _, ...rule }) => rule),
268
+ };
269
+ streams.data(`${JSON.stringify(file, null, 2)}\n`);
270
+ });
271
+ rules
272
+ .command("import")
273
+ .description("add the rules of a file from memo mail rules export; same match replaces")
274
+ .argument("<account>", "the account's name in mail.accounts, or its address")
275
+ .argument("<file>", "the file memo mail rules export wrote")
276
+ .option("--json", "print JSON; --json=id,title keeps only those fields")
277
+ .action(async (name, path, options) => {
278
+ const account = accountOf(loadConfig(env), name);
279
+ const rules = rulesFileOf(readFileSync(path, "utf8"), path);
280
+ const saved = await withStore(env, async (store) => {
281
+ await rulesOf(store, account, env, streams.diagnostic);
282
+ const out = [];
283
+ for (const rule of rules)
284
+ out.push(await saveRule(store, account.address, rule));
285
+ return out;
255
286
  });
256
- if (options.json)
257
- createRenderer({ format: "json", color: false, streams }).result({
258
- item: snakeKeys(result),
259
- meta: metaOf(startedAt, { accounts: [account.name] }),
260
- });
261
- else
262
- streams.data(`${applyText(result)}\n`);
287
+ print(options.json, wholeList("mail rules import", saved), `imported ${saved.length} rules into ${account.name}`);
263
288
  });
264
289
  };
265
290
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/mail/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { DomainAge } from "./score.js";
2
+ /** IANA's list of which registry answers RDAP for which top-level domain (RFC 9224). */
3
+ export declare const BOOTSTRAP_URL = "https://data.iana.org/rdap/dns.json";
4
+ /** The ages already looked up; reads no network. */
5
+ export declare const knownAges: (env: NodeJS.ProcessEnv) => Map<string, DomainAge>;
6
+ export interface LookupDeps {
7
+ fetch: typeof fetch;
8
+ sleep: (ms: number) => Promise<void>;
9
+ now: () => Date;
10
+ }
11
+ export interface LookupResult {
12
+ looked: number;
13
+ failed: number;
14
+ }
15
+ /**
16
+ * Asks each domain's own registry when it was registered, straight from IANA's list, never through a relay: each
17
+ * question tells that registry, and only it, the domain's name. One question a second; answers are kept for good.
18
+ * A domain whose registry has no RDAP (most country domains: .ru, .de, .es, .io) is marked unsupported, not guessed.
19
+ */
20
+ export declare const lookUpAges: (env: NodeJS.ProcessEnv, domains: readonly string[], deps?: LookupDeps) => Promise<LookupResult>;
21
+ //# sourceMappingURL=domain-age.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-age.d.ts","sourceRoot":"","sources":["../../src/mail/domain-age.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,wFAAwF;AACxF,eAAO,MAAM,aAAa,wCAAwC,CAAA;AA8BlE,oDAAoD;AACpD,eAAO,MAAM,SAAS,QAAS,MAAM,CAAC,UAAU,KAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CACvB,CAAA;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,GAAG,EAAE,MAAM,IAAI,CAAA;CAChB;AAqBD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAChB,MAAM,CAAC,UAAU,WACb,SAAS,MAAM,EAAE,SACpB,UAAU,KACf,OAAO,CAAC,YAAY,CA4CtB,CAAA"}
@@ -0,0 +1,99 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { resolvePaths } from "@wirecat/cli-base";
4
+ import { VERSION } from "../version.js";
5
+ /** IANA's list of which registry answers RDAP for which top-level domain (RFC 9224). */
6
+ export const BOOTSTRAP_URL = "https://data.iana.org/rdap/dns.json";
7
+ const BOOTSTRAP_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
8
+ const REQUEST_GAP_MS = 1000;
9
+ const TIMEOUT_MS = 10_000;
10
+ const USER_AGENT = `cli-memo/${VERSION} (+https://github.com/WireCatLabs/cli-memo)`;
11
+ const fileOf = (env) => join(resolvePaths({ appName: "cli-memo", prefix: "MEMO", env }).state, "domain-ages.json");
12
+ // A registration date never changes, so the cache is kept on this computer for good and asked again never.
13
+ const loadCache = (env) => {
14
+ try {
15
+ return { domains: {}, ...JSON.parse(readFileSync(fileOf(env), "utf8")) };
16
+ }
17
+ catch {
18
+ return { domains: {} };
19
+ }
20
+ };
21
+ const saveCache = (env, cache) => {
22
+ const file = fileOf(env);
23
+ mkdirSync(join(file, ".."), { recursive: true });
24
+ writeFileSync(`${file}.tmp`, JSON.stringify(cache));
25
+ renameSync(`${file}.tmp`, file);
26
+ };
27
+ /** The ages already looked up; reads no network. */
28
+ export const knownAges = (env) => new Map(Object.entries(loadCache(env).domains));
29
+ const realDeps = {
30
+ fetch: (input, init) => fetch(input, init),
31
+ sleep: (ms) => new Promise((done) => setTimeout(done, ms)),
32
+ now: () => new Date(),
33
+ };
34
+ const getJson = async (deps, url) => {
35
+ const response = await deps.fetch(url, {
36
+ headers: { accept: "application/rdap+json, application/json", "user-agent": USER_AGENT },
37
+ signal: AbortSignal.timeout(TIMEOUT_MS),
38
+ });
39
+ return { status: response.status, body: response.ok ? await response.json() : undefined };
40
+ };
41
+ const registrationOf = (body) => (body?.events ?? []).find((event) => event.eventAction === "registration")?.eventDate;
42
+ /**
43
+ * Asks each domain's own registry when it was registered, straight from IANA's list, never through a relay: each
44
+ * question tells that registry, and only it, the domain's name. One question a second; answers are kept for good.
45
+ * A domain whose registry has no RDAP (most country domains: .ru, .de, .es, .io) is marked unsupported, not guessed.
46
+ */
47
+ export const lookUpAges = async (env, domains, deps = realDeps) => {
48
+ const cache = loadCache(env);
49
+ const wanted = [...new Set(domains.map((domain) => domain.toLowerCase()))].filter((domain) => cache.domains[domain] === undefined);
50
+ if (wanted.length === 0)
51
+ return { looked: 0, failed: 0 };
52
+ const fetchedAt = cache.bootstrap?.fetchedAt;
53
+ if (fetchedAt === undefined || deps.now().getTime() - Date.parse(fetchedAt) > BOOTSTRAP_MAX_AGE_MS) {
54
+ const { body } = await getJson(deps, BOOTSTRAP_URL);
55
+ const services = body?.services;
56
+ if (!Array.isArray(services))
57
+ throw new Error("IANA's RDAP list did not answer");
58
+ cache.bootstrap = { fetchedAt: deps.now().toISOString(), services };
59
+ }
60
+ const servers = new Map();
61
+ for (const [tlds, urls] of cache.bootstrap?.services ?? []) {
62
+ const url = urls.find((candidate) => candidate.startsWith("https://")) ?? urls[0];
63
+ if (url !== undefined)
64
+ for (const tld of tlds)
65
+ servers.set(tld.toLowerCase(), url.endsWith("/") ? url : `${url}/`);
66
+ }
67
+ let looked = 0;
68
+ let failed = 0;
69
+ for (const domain of wanted) {
70
+ const server = servers.get(domain.slice(domain.lastIndexOf(".") + 1));
71
+ const checkedAt = deps.now().toISOString();
72
+ if (server === undefined) {
73
+ cache.domains[domain] = { unsupported: true, checkedAt };
74
+ continue;
75
+ }
76
+ if (looked > 0)
77
+ await deps.sleep(REQUEST_GAP_MS);
78
+ looked++;
79
+ try {
80
+ const { status, body } = await getJson(deps, `${server}domain/${encodeURIComponent(domain)}`);
81
+ // Not found is an answer worth keeping; anything else may work another day, so it is not kept.
82
+ if (status === 404)
83
+ cache.domains[domain] = { checkedAt };
84
+ else if (status >= 200 && status < 300) {
85
+ const created = registrationOf(body);
86
+ cache.domains[domain] = { ...(created === undefined ? {} : { created }), checkedAt };
87
+ }
88
+ else
89
+ failed++;
90
+ }
91
+ catch {
92
+ failed++;
93
+ }
94
+ saveCache(env, cache);
95
+ }
96
+ saveCache(env, cache);
97
+ return { looked, failed };
98
+ };
99
+ //# sourceMappingURL=domain-age.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-age.js","sourceRoot":"","sources":["../../src/mail/domain-age.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type MailHeaders } from "./headers.js";
2
- import type { Himalaya } from "./himalaya.js";
2
+ import { type Himalaya } from "./himalaya.js";
3
3
  export interface Listed {
4
4
  uid: string;
5
5
  /** Gmail's own ids: the same in every folder, and they survive a UID reset. */
@@ -1 +1 @@
1
- {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAcD,6GAA6G;AAC7G,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAO7C,CAAA;AA2BJ,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,MAAmD,CAAA;AAE9F,qGAAqG;AACrG,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAGvC,CAAA;AAoDD,6FAA6F;AAC7F,MAAM,WAAW,QAAQ;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAQD,uGAAuG;AACvG,eAAO,MAAM,UAAU,QAAe,QAAQ,WAAW,MAAM,SAAS,IAAI,UAAU,MAAM,KAAG,OAAO,CAAC,QAAQ,CAW9G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,QACjB,QAAQ,WACJ,MAAM,SACR,IAAI,iDAGA,QAAQ,KAClB,OAAO,CAAC,MAAM,EAAE,CA0ElB,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,YAAY,QAClB,QAAQ,WACJ,MAAM,SACR,IAAI,UACH,MAAM,aACH,QAAQ,KAClB,OAAO,CAAC,MAAM,EAAE,CA0DlB,CAAA"}
1
+ {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/mail/gmail.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,eAAe,CAAA;AAE1E,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+FAA+F;IAC/F,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAcD,6GAA6G;AAC7G,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAO7C,CAAA;AA2BJ,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,MAAmD,CAAA;AAE9F,qGAAqG;AACrG,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAGvC,CAAA;AAuDD,6FAA6F;AAC7F,MAAM,WAAW,QAAQ;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAQD,uGAAuG;AACvG,eAAO,MAAM,UAAU,QAAe,QAAQ,WAAW,MAAM,SAAS,IAAI,UAAU,MAAM,KAAG,OAAO,CAAC,QAAQ,CAW9G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,QACjB,QAAQ,WACJ,MAAM,SACR,IAAI,iDAGA,QAAQ,KAClB,OAAO,CAAC,MAAM,EAAE,CA0ElB,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,YAAY,QAClB,QAAQ,WACJ,MAAM,SACR,IAAI,UACH,MAAM,aACH,QAAQ,KAClB,OAAO,CAAC,MAAM,EAAE,CA0DlB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { CliError } from "@wirecat/cli-base";
3
3
  import { HEADER_FIELDS, headersOf } from "./headers.js";
4
+ import { isThrottled, throttledError } from "./himalaya.js";
4
5
  const SYSTEM_LABELS = {
5
6
  inbox: "Inbox",
6
7
  sent: "Sent",
@@ -92,7 +93,11 @@ const assertCompleted = (output, tags) => {
92
93
  for (const tag of tags) {
93
94
  if (!new RegExp(`^${tag} OK`, "m").test(output)) {
94
95
  const line = output.split(/\r?\n/).find((text) => text.startsWith(`${tag} `)) ?? "no answer";
95
- throw new CliError("provider_error", `IMAP command ${tag} did not complete: ${line}`);
96
+ if (isThrottled(line))
97
+ throw throttledError(`IMAP command ${tag}`);
98
+ throw new CliError("provider_error", `IMAP command ${tag} did not complete: ${line}`, {
99
+ reason: "mail.source-failed",
100
+ });
96
101
  }
97
102
  }
98
103
  };