@leemour/max-cli 0.5.0 → 0.7.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 (261) hide show
  1. package/README.md +22 -5
  2. package/dist/cache/index.d.ts +1 -0
  3. package/dist/cache/index.d.ts.map +1 -1
  4. package/dist/cache/index.js +4 -4
  5. package/dist/cache/index.js.map +1 -1
  6. package/dist/cache/store.d.ts.map +1 -1
  7. package/dist/cache/store.js +1 -0
  8. package/dist/cache/store.js.map +1 -1
  9. package/dist/client.d.ts +230 -7
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +959 -78
  12. package/dist/client.js.map +1 -1
  13. package/dist/commands/account.d.ts.map +1 -1
  14. package/dist/commands/account.js +71 -3
  15. package/dist/commands/account.js.map +1 -1
  16. package/dist/commands/chats.d.ts.map +1 -1
  17. package/dist/commands/chats.js +159 -0
  18. package/dist/commands/chats.js.map +1 -1
  19. package/dist/commands/commands.d.ts +8 -0
  20. package/dist/commands/commands.d.ts.map +1 -0
  21. package/dist/commands/commands.js +36 -0
  22. package/dist/commands/commands.js.map +1 -0
  23. package/dist/commands/complete.d.ts +10 -0
  24. package/dist/commands/complete.d.ts.map +1 -0
  25. package/dist/commands/complete.js +89 -0
  26. package/dist/commands/complete.js.map +1 -0
  27. package/dist/commands/config.d.ts.map +1 -1
  28. package/dist/commands/config.js +6 -2
  29. package/dist/commands/config.js.map +1 -1
  30. package/dist/commands/contacts.d.ts +3 -0
  31. package/dist/commands/contacts.d.ts.map +1 -1
  32. package/dist/commands/contacts.js +85 -0
  33. package/dist/commands/contacts.js.map +1 -1
  34. package/dist/commands/context.d.ts +26 -1
  35. package/dist/commands/context.d.ts.map +1 -1
  36. package/dist/commands/context.js +47 -6
  37. package/dist/commands/context.js.map +1 -1
  38. package/dist/commands/folders.d.ts +4 -0
  39. package/dist/commands/folders.d.ts.map +1 -0
  40. package/dist/commands/folders.js +76 -0
  41. package/dist/commands/folders.js.map +1 -0
  42. package/dist/commands/inbox.d.ts +14 -0
  43. package/dist/commands/inbox.d.ts.map +1 -0
  44. package/dist/commands/inbox.js +90 -0
  45. package/dist/commands/inbox.js.map +1 -0
  46. package/dist/commands/mcp.d.ts +3 -0
  47. package/dist/commands/mcp.d.ts.map +1 -0
  48. package/dist/commands/mcp.js +17 -0
  49. package/dist/commands/mcp.js.map +1 -0
  50. package/dist/commands/messages.d.ts.map +1 -1
  51. package/dist/commands/messages.js +90 -4
  52. package/dist/commands/messages.js.map +1 -1
  53. package/dist/commands/reactions.d.ts +3 -0
  54. package/dist/commands/reactions.d.ts.map +1 -0
  55. package/dist/commands/reactions.js +43 -0
  56. package/dist/commands/reactions.js.map +1 -0
  57. package/dist/commands/recipients.d.ts +9 -0
  58. package/dist/commands/recipients.d.ts.map +1 -0
  59. package/dist/commands/recipients.js +68 -0
  60. package/dist/commands/recipients.js.map +1 -0
  61. package/dist/commands/sends.d.ts +4 -0
  62. package/dist/commands/sends.d.ts.map +1 -0
  63. package/dist/commands/sends.js +21 -0
  64. package/dist/commands/sends.js.map +1 -0
  65. package/dist/commands/serve.d.ts +10 -0
  66. package/dist/commands/serve.d.ts.map +1 -0
  67. package/dist/commands/serve.js +50 -0
  68. package/dist/commands/serve.js.map +1 -0
  69. package/dist/commands/session.d.ts.map +1 -1
  70. package/dist/commands/session.js +84 -16
  71. package/dist/commands/session.js.map +1 -1
  72. package/dist/commands/skill.d.ts.map +1 -1
  73. package/dist/commands/skill.js +2 -1
  74. package/dist/commands/skill.js.map +1 -1
  75. package/dist/commands/update.d.ts +7 -0
  76. package/dist/commands/update.d.ts.map +1 -0
  77. package/dist/commands/update.js +53 -0
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/commands/watch.d.ts +9 -0
  80. package/dist/commands/watch.d.ts.map +1 -0
  81. package/dist/commands/watch.js +68 -0
  82. package/dist/commands/watch.js.map +1 -0
  83. package/dist/config.d.ts +24 -1
  84. package/dist/config.d.ts.map +1 -1
  85. package/dist/config.js +43 -4
  86. package/dist/config.js.map +1 -1
  87. package/dist/domain/map.d.ts +10 -1
  88. package/dist/domain/map.d.ts.map +1 -1
  89. package/dist/domain/map.js +51 -1
  90. package/dist/domain/map.js.map +1 -1
  91. package/dist/domain/models.d.ts +80 -0
  92. package/dist/domain/models.d.ts.map +1 -1
  93. package/dist/domain/models.js.map +1 -1
  94. package/dist/generated/client.generated.d.ts +36 -0
  95. package/dist/generated/client.generated.d.ts.map +1 -1
  96. package/dist/generated/client.generated.js +36 -0
  97. package/dist/generated/client.generated.js.map +1 -1
  98. package/dist/generated/opcodes.generated.d.ts +37 -5
  99. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  100. package/dist/generated/opcodes.generated.js +37 -5
  101. package/dist/generated/opcodes.generated.js.map +1 -1
  102. package/dist/generated/operations.generated.d.ts +245 -3
  103. package/dist/generated/operations.generated.d.ts.map +1 -1
  104. package/dist/generated/operations.generated.js +36 -4
  105. package/dist/generated/operations.generated.js.map +1 -1
  106. package/dist/markdown.d.ts +18 -0
  107. package/dist/markdown.d.ts.map +1 -0
  108. package/dist/markdown.js +52 -0
  109. package/dist/markdown.js.map +1 -0
  110. package/dist/mcp/confirm.d.ts +24 -0
  111. package/dist/mcp/confirm.d.ts.map +1 -0
  112. package/dist/mcp/confirm.js +53 -0
  113. package/dist/mcp/confirm.js.map +1 -0
  114. package/dist/mcp/instructions.d.ts +10 -0
  115. package/dist/mcp/instructions.d.ts.map +1 -0
  116. package/dist/mcp/instructions.js +25 -0
  117. package/dist/mcp/instructions.js.map +1 -0
  118. package/dist/mcp/server.d.ts +23 -0
  119. package/dist/mcp/server.d.ts.map +1 -0
  120. package/dist/mcp/server.js +38 -0
  121. package/dist/mcp/server.js.map +1 -0
  122. package/dist/mcp/session.d.ts +28 -0
  123. package/dist/mcp/session.d.ts.map +1 -0
  124. package/dist/mcp/session.js +91 -0
  125. package/dist/mcp/session.js.map +1 -0
  126. package/dist/mcp/tools.d.ts +8 -0
  127. package/dist/mcp/tools.d.ts.map +1 -0
  128. package/dist/mcp/tools.js +274 -0
  129. package/dist/mcp/tools.js.map +1 -0
  130. package/dist/program.d.ts.map +1 -1
  131. package/dist/program.js +27 -0
  132. package/dist/program.js.map +1 -1
  133. package/dist/protocol/connection.d.ts +10 -8
  134. package/dist/protocol/connection.d.ts.map +1 -1
  135. package/dist/protocol/connection.js +64 -7
  136. package/dist/protocol/connection.js.map +1 -1
  137. package/dist/protocol/frame.d.ts +2 -1
  138. package/dist/protocol/frame.d.ts.map +1 -1
  139. package/dist/protocol/frame.js.map +1 -1
  140. package/dist/rendering/messages.d.ts.map +1 -1
  141. package/dist/rendering/messages.js +21 -7
  142. package/dist/rendering/messages.js.map +1 -1
  143. package/dist/resolve.d.ts +15 -0
  144. package/dist/resolve.d.ts.map +1 -0
  145. package/dist/resolve.js +48 -0
  146. package/dist/resolve.js.map +1 -0
  147. package/dist/sends/guard.d.ts +27 -0
  148. package/dist/sends/guard.d.ts.map +1 -0
  149. package/dist/sends/guard.js +52 -0
  150. package/dist/sends/guard.js.map +1 -0
  151. package/dist/sends/journal.d.ts +42 -0
  152. package/dist/sends/journal.d.ts.map +1 -0
  153. package/dist/sends/journal.js +40 -0
  154. package/dist/sends/journal.js.map +1 -0
  155. package/dist/sends/recipients.d.ts +29 -0
  156. package/dist/sends/recipients.d.ts.map +1 -0
  157. package/dist/sends/recipients.js +62 -0
  158. package/dist/sends/recipients.js.map +1 -0
  159. package/dist/server/lines.d.ts +9 -0
  160. package/dist/server/lines.d.ts.map +1 -0
  161. package/dist/server/lines.js +25 -0
  162. package/dist/server/lines.js.map +1 -0
  163. package/dist/server/server-connection.d.ts +35 -0
  164. package/dist/server/server-connection.d.ts.map +1 -0
  165. package/dist/server/server-connection.js +195 -0
  166. package/dist/server/server-connection.js.map +1 -0
  167. package/dist/server/server.d.ts +62 -0
  168. package/dist/server/server.d.ts.map +1 -0
  169. package/dist/server/server.js +297 -0
  170. package/dist/server/server.js.map +1 -0
  171. package/dist/server/start.d.ts +12 -0
  172. package/dist/server/start.d.ts.map +1 -0
  173. package/dist/server/start.js +41 -0
  174. package/dist/server/start.js.map +1 -0
  175. package/dist/server/subscribe.d.ts +9 -0
  176. package/dist/server/subscribe.d.ts.map +1 -0
  177. package/dist/server/subscribe.js +26 -0
  178. package/dist/server/subscribe.js.map +1 -0
  179. package/dist/session/adopt.d.ts.map +1 -1
  180. package/dist/session/adopt.js +7 -6
  181. package/dist/session/adopt.js.map +1 -1
  182. package/dist/session/browser.d.ts +55 -0
  183. package/dist/session/browser.d.ts.map +1 -0
  184. package/dist/session/browser.js +319 -0
  185. package/dist/session/browser.js.map +1 -0
  186. package/dist/session/handshake.d.ts +2 -0
  187. package/dist/session/handshake.d.ts.map +1 -1
  188. package/dist/session/handshake.js +3 -1
  189. package/dist/session/handshake.js.map +1 -1
  190. package/dist/session/login.d.ts +20 -0
  191. package/dist/session/login.d.ts.map +1 -0
  192. package/dist/session/login.js +66 -0
  193. package/dist/session/login.js.map +1 -0
  194. package/dist/session/prompt.d.ts +3 -1
  195. package/dist/session/prompt.d.ts.map +1 -1
  196. package/dist/session/prompt.js +2 -2
  197. package/dist/session/prompt.js.map +1 -1
  198. package/dist/session/qr-terminal.d.ts +9 -0
  199. package/dist/session/qr-terminal.d.ts.map +1 -0
  200. package/dist/session/qr-terminal.js +34 -0
  201. package/dist/session/qr-terminal.js.map +1 -0
  202. package/dist/session/store.d.ts +4 -0
  203. package/dist/session/store.d.ts.map +1 -1
  204. package/dist/session/store.js +6 -0
  205. package/dist/session/store.js.map +1 -1
  206. package/dist/spec/define.d.ts.map +1 -1
  207. package/dist/spec/define.js +14 -1
  208. package/dist/spec/define.js.map +1 -1
  209. package/dist/spec/index.d.ts.map +1 -1
  210. package/dist/spec/index.js +38 -5
  211. package/dist/spec/index.js.map +1 -1
  212. package/dist/spec/operations/account.d.ts +20 -0
  213. package/dist/spec/operations/account.d.ts.map +1 -0
  214. package/dist/spec/operations/account.js +62 -0
  215. package/dist/spec/operations/account.js.map +1 -0
  216. package/dist/spec/operations/chats.d.ts +54 -0
  217. package/dist/spec/operations/chats.d.ts.map +1 -1
  218. package/dist/spec/operations/chats.js +121 -0
  219. package/dist/spec/operations/chats.js.map +1 -1
  220. package/dist/spec/operations/contacts.d.ts +19 -1
  221. package/dist/spec/operations/contacts.d.ts.map +1 -1
  222. package/dist/spec/operations/contacts.js +49 -6
  223. package/dist/spec/operations/contacts.js.map +1 -1
  224. package/dist/spec/operations/folders.d.ts +24 -0
  225. package/dist/spec/operations/folders.d.ts.map +1 -0
  226. package/dist/spec/operations/folders.js +64 -0
  227. package/dist/spec/operations/folders.js.map +1 -0
  228. package/dist/spec/operations/login.d.ts +64 -0
  229. package/dist/spec/operations/login.d.ts.map +1 -0
  230. package/dist/spec/operations/login.js +99 -0
  231. package/dist/spec/operations/login.js.map +1 -0
  232. package/dist/spec/operations/messages.d.ts +67 -3
  233. package/dist/spec/operations/messages.d.ts.map +1 -1
  234. package/dist/spec/operations/messages.js +126 -13
  235. package/dist/spec/operations/messages.js.map +1 -1
  236. package/dist/spec/operations/session.d.ts +7 -0
  237. package/dist/spec/operations/session.d.ts.map +1 -1
  238. package/dist/spec/operations/session.js +17 -0
  239. package/dist/spec/operations/session.js.map +1 -1
  240. package/dist/spec/operations/uploads.d.ts +18 -0
  241. package/dist/spec/operations/uploads.d.ts.map +1 -0
  242. package/dist/spec/operations/uploads.js +35 -0
  243. package/dist/spec/operations/uploads.js.map +1 -0
  244. package/dist/testing/mock-max.d.ts +15 -4
  245. package/dist/testing/mock-max.d.ts.map +1 -1
  246. package/dist/testing/mock-max.js +16 -3
  247. package/dist/testing/mock-max.js.map +1 -1
  248. package/dist/testing/sandbox.js +3 -0
  249. package/dist/testing/sandbox.js.map +1 -1
  250. package/dist/update.d.ts +36 -0
  251. package/dist/update.d.ts.map +1 -0
  252. package/dist/update.js +70 -0
  253. package/dist/update.js.map +1 -0
  254. package/dist/upload.d.ts +10 -0
  255. package/dist/upload.d.ts.map +1 -0
  256. package/dist/upload.js +61 -0
  257. package/dist/upload.js.map +1 -0
  258. package/dist/version.d.ts +1 -1
  259. package/dist/version.js +1 -1
  260. package/package.json +16 -3
  261. package/skills/max-cli/SKILL.md +23 -3
@@ -1,44 +1,73 @@
1
- import { Command } from "commander";
1
+ import { Argument, Command } from "commander";
2
2
  import { commandWords, refuseCommandName, rootOf } from "../profile.js";
3
+ import { stopServer } from "../server/server-connection.js";
3
4
  import { adoptToken } from "../session/adopt.js";
5
+ import { serveQrPage } from "../session/browser.js";
4
6
  import { readSecret } from "../session/prompt.js";
7
+ import { terminalQr } from "../session/qr-terminal.js";
5
8
  import { forCommand } from "./context.js";
9
+ // NEED-149: gentle on purpose — it asks for ordinary use alongside, and does not cite blocked accounts.
10
+ const TERMS_NOTICE = [
11
+ "max is not the official MAX app, and the MAX terms do not allow automated programs (legal.max.ru/ps, 4.3.7).",
12
+ "Keep using MAX as usual in the browser or on your phone alongside it. More: docs/security.md",
13
+ ].join("\n");
6
14
  export const sessionCommand = () => {
7
15
  const command = new Command("session").description("the stored MAX session for this profile");
8
16
  /**
9
- * For now, importing a token obtained elsewhere — from `web.max.ru`, or from another client.
17
+ * Four ways to a token, and one way to keep it: whatever produced the token, it reaches the
18
+ * keyring only once MAX has accepted it (`adoptToken`).
10
19
  *
11
- * This is not a stopgap: it is the escape hatch that keeps every other command usable when our
12
- * own login flow meets a captcha or an unusual second factor, and it is how the slice is tested
13
- * without an SMS per run. The interactive phone-and-code flow lands beside it, not instead of it.
20
+ * - `token` — pasted, or piped: `pass show max | max session start`. The default, and the escape
21
+ * hatch when a login meets a captcha or an unusual second factor.
22
+ * - `qr` — our own connection asks MAX for the code; it is drawn here, or opened in the default
23
+ * browser when the terminal is too narrow for it.
24
+ * - `qr-chrome`, `sms` — web.max.ru itself does the login, in a Chromium-family browser with a
25
+ * throwaway profile, and we read the token it stores. MAX sees its own web client. SMS has no
26
+ * other door: asked over our socket, MAX demands a captcha only the page can solve (2026-09-24).
14
27
  *
15
- * **The token is asked for, not passed.** A token in argv is read by `ps` and kept by shell
16
- * history, and a file leaves a copy nobody deletes, so with `MAX_TOKEN` unset it is read from the
17
- * terminal without being echoed — or from a pipe, for `pass show max | max session start`. From
18
- * there it goes to the OS keyring — **but only once MAX has accepted it**, which is `adoptToken`.
28
+ * **A token is never an argument.** argv is read by `ps` and kept by shell history.
19
29
  */
20
30
  command
21
31
  .command("start")
22
- .description("store a MAX session for this profile")
23
- .action(async function () {
24
- const { renderer, settings, store, createClient, run } = forCommand(this);
32
+ .description("log this profile in to MAX")
33
+ .addArgument(new Argument("[method]", "token (pasted or piped), qr, qr-chrome or sms").choices(METHODS).default("token"))
34
+ .action(async function (method) {
35
+ const context = forCommand(this);
36
+ const { renderer, settings, store, createClient, run, interactive } = context;
25
37
  // Creation is the only moment the collision can still be explained; after this the name is
26
38
  // written down and `max <name>` would silently be a command instead.
27
39
  refuseCommandName(settings.profile, commandWords(rootOf(this)));
28
- const token = process.env.MAX_TOKEN?.trim() || (await readSecret("MAX token: "));
40
+ if (method !== "token" && !interactive) {
41
+ renderer.failure(`\`session start ${method}\` needs a person at a terminal — use \`session start token\``);
42
+ process.exitCode = 2;
43
+ return;
44
+ }
45
+ // It outranks the keyring, so every later command would still log in with it and the new
46
+ // session would look as if it had not worked.
47
+ if (method !== "token" && process.env.MAX_TOKEN) {
48
+ renderer.failure("MAX_TOKEN is set, and it would outrank the new session — unset it first");
49
+ process.exitCode = 2;
50
+ return;
51
+ }
52
+ const pasted = method === "token" ? process.env.MAX_TOKEN?.trim() || (await readSecret("MAX token: ")) : undefined;
29
53
  // Before the run directory: nothing was attempted, so there is nothing to record.
30
- if (!token) {
54
+ if (method === "token" && !pasted) {
31
55
  renderer.failure("no token given");
32
56
  process.exitCode = 2;
33
57
  return;
34
58
  }
35
59
  await run("session start", async (events) => {
60
+ const token = method === "token" ? String(pasted) : await obtain(method, context, events);
36
61
  const client = createClient({ events });
62
+ // No account on record means this profile has never logged in, or `session end` forgot it.
63
+ const firstLogin = store.readState().viewerId === undefined;
37
64
  try {
38
65
  await adoptToken(client, store, token);
39
- const profile = client.account.me();
40
- renderer.result({ profile, stored: true });
66
+ const profile = await client.account.me();
67
+ renderer.result({ profile, stored: true, method });
41
68
  renderer.success(`logged in as ${profile.name ?? profile.id}`);
69
+ if (firstLogin)
70
+ renderer.note(TERMS_NOTICE);
42
71
  }
43
72
  finally {
44
73
  await client.close();
@@ -61,6 +90,8 @@ export const sessionCommand = () => {
61
90
  // It contacts nobody, so the run holds no events — but forgetting a session is an action, and
62
91
  // "when did this profile stop working" is a question the record is kept to answer.
63
92
  await run("session end", async () => {
93
+ // A server still logged in with the forgotten session would keep using it.
94
+ await stopServer(store.socketPath());
64
95
  const had = store.forget();
65
96
  renderer.result({ profile: store.profile, forgotten: had, revokedOnServer: false });
66
97
  if (had)
@@ -71,4 +102,41 @@ export const sessionCommand = () => {
71
102
  });
72
103
  return command;
73
104
  };
105
+ const METHODS = ["token", "qr", "qr-chrome", "sms"];
106
+ /** Long enough to find the phone and type a number and a code; the profile dies with the wait. */
107
+ const BROWSER_WAIT_MS = 5 * 60_000;
108
+ const obtain = async (method, { createClient, renderer, browser, track, ask, streams, columns }, events) => {
109
+ if (method !== "qr") {
110
+ renderer.note(method === "qr-chrome"
111
+ ? "web.max.ru is opening in a separate browser window — scan its QR code with the MAX app on your phone"
112
+ : "web.max.ru is opening in a separate browser window — choose to log in by phone number there");
113
+ return await browser.chromiumToken({ track, waitMs: BROWSER_WAIT_MS });
114
+ }
115
+ const client = createClient({ events });
116
+ let page;
117
+ try {
118
+ return await client.login.byQr({
119
+ show: async (link) => {
120
+ const drawn = terminalQr(link);
121
+ // Straight to the diagnostic stream, not through the renderer: --quiet must not hide the code.
122
+ if (columns !== undefined && drawn.width <= columns) {
123
+ streams.diagnostic(drawn.text);
124
+ renderer.note("scan this code with the MAX app on your phone");
125
+ return;
126
+ }
127
+ page = await serveQrPage(link);
128
+ track(page);
129
+ await browser.open(page.url);
130
+ renderer.note("the terminal is too narrow for the QR code, so it is open in your browser — scan it there");
131
+ },
132
+ askPassword: (hint, again) => ask(`${again ? "wrong password, try again" : "MAX password"}${hint ? ` (hint: ${hint})` : ""}: `, {
133
+ secret: true,
134
+ }),
135
+ });
136
+ }
137
+ finally {
138
+ await page?.close();
139
+ await client.close();
140
+ }
141
+ };
74
142
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,YAAY,QAAO,OAgB/B,CAAA"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,YAAY,QAAO,OAmB/B,CAAA"}
@@ -7,7 +7,8 @@ export const skillCommand = () => {
7
7
  const command = new Command("skill").description("the instructions an agent is given for this tool");
8
8
  command
9
9
  .command("show")
10
- .description("print SKILL.md — `max skill show > ~/.claude/skills/max-cli/SKILL.md` installs it")
10
+ .description("print SKILL.md — redirect it into ~/.claude/skills/max-cli/SKILL.md for Claude Code, " +
11
+ "or ~/.agents/skills/max-cli/SKILL.md for Codex and Gemini CLI")
11
12
  .action(function () {
12
13
  const { settings, renderer, streams } = forCommand(this);
13
14
  const content = readFileSync(SKILL, "utf8").trimEnd();
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,oGAAoG;AACpG,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,CAAA;IAEpG,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mFAAmF,CAAC;SAChG,MAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;QACrD,2FAA2F;QAC3F,qFAAqF;QACrF,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;;YAC7E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,oGAAoG;AACpG,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,CAAA;IAEpG,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,uFAAuF;QACrF,+DAA+D,CAClE;SACA,MAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;QACrD,2FAA2F;QAC3F,qFAAqF;QACrF,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;;YAC7E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Updates `max` with the package manager that installed it. Never runs by itself: this program
4
+ * holds the token of a personal account, and code that replaces itself unasked is not wanted here.
5
+ */
6
+ export declare const selfUpdateCommand: () => Command;
7
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAO,OA+B/B,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { isNewer, updateCommand } from "@leemour/cli-core/update";
2
+ import { Command } from "commander";
3
+ import { installer, latest, PACKAGE, runUpdate } from "../update.js";
4
+ import { VERSION } from "../version.js";
5
+ import { environmentOf, outputFor } from "./context.js";
6
+ const BY_HAND = {
7
+ checkout: "this is a checkout: `git pull && pnpm install && pnpm build`",
8
+ npx: "npx runs whatever version it is asked for: `npx @leemour/max-cli@latest`",
9
+ unknown: "cannot tell how max was installed, so nothing was run",
10
+ };
11
+ /**
12
+ * Updates `max` with the package manager that installed it. Never runs by itself: this program
13
+ * holds the token of a personal account, and code that replaces itself unasked is not wanted here.
14
+ */
15
+ export const selfUpdateCommand = () => new Command("update")
16
+ .description("update max with the package manager that installed it; --check only looks")
17
+ .option("--check", "say whether a newer version exists, and install nothing")
18
+ .action(async function ({ check }) {
19
+ const { renderer, format } = outputFor(this);
20
+ const environment = environmentOf(this).update ?? {};
21
+ const found = installer(environment);
22
+ const argv = updateCommand(found, PACKAGE);
23
+ const newest = await latest(environment);
24
+ const newer = newest !== undefined && isNewer(newest, VERSION);
25
+ const answer = {
26
+ current: VERSION,
27
+ latest: newest ?? null,
28
+ newer,
29
+ installer: found,
30
+ command: argv?.join(" ") ?? null,
31
+ };
32
+ if (check || !newer || !argv) {
33
+ if (!check && newest === undefined)
34
+ renderer.warn("npm did not answer, so nothing was run");
35
+ else if (!check && !newer)
36
+ renderer.note(`max ${VERSION} is the newest`);
37
+ else if (!check && !argv)
38
+ renderer.warn(BY_HAND[found] ?? BY_HAND.unknown ?? "");
39
+ renderer.result(format === "pretty" ? summary(answer) : { ...answer, updated: false });
40
+ return;
41
+ }
42
+ renderer.note(`running: ${argv.join(" ")}`);
43
+ const code = runUpdate(argv, environment);
44
+ if (code !== 0)
45
+ throw new Error(`${argv[0]} exited with ${code}; max is still ${VERSION}`);
46
+ renderer.result(format === "pretty" ? `max ${VERSION} → ${newest}` : { ...answer, updated: true });
47
+ });
48
+ const summary = ({ current, latest, newer }) => latest === null
49
+ ? `max ${current}; npm did not answer`
50
+ : newer
51
+ ? `max ${latest} is out — you have ${current}`
52
+ : `max ${current} is the newest`;
53
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `max watch` — new messages as they arrive, from a running `max serve`, until Ctrl-C.
4
+ *
5
+ * `--jsonl` gives one message per line in the shape `messages list` uses, which is what a script,
6
+ * an n8n node or an agent reads. It never marks anything read: the server only listens.
7
+ */
8
+ export declare const watchCommand: () => Command;
9
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,QAAO,OA8C1B,CAAA"}
@@ -0,0 +1,68 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { Command } from "commander";
3
+ import { renderMessages } from "../rendering/messages.js";
4
+ import { answers } from "../server/server.js";
5
+ import { startInBackground } from "../server/start.js";
6
+ import { subscribe } from "../server/subscribe.js";
7
+ import { forCommand } from "./context.js";
8
+ /**
9
+ * `max watch` — new messages as they arrive, from a running `max serve`, until Ctrl-C.
10
+ *
11
+ * `--jsonl` gives one message per line in the shape `messages list` uses, which is what a script,
12
+ * an n8n node or an agent reads. It never marks anything read: the server only listens.
13
+ */
14
+ export const watchCommand = () => new Command("watch")
15
+ .description("print new messages as they arrive, from a running `max serve`")
16
+ .action(async function () {
17
+ const context = forCommand(this);
18
+ const { renderer, settings, format, streams, store } = context;
19
+ const stop = new AbortController();
20
+ const end = () => stop.abort();
21
+ process.once("SIGINT", end);
22
+ process.once("SIGTERM", end);
23
+ try {
24
+ const listen = () => subscribe(store.socketPath(), settings.profile, (event) => {
25
+ if (event.event === "status") {
26
+ renderer.note(event.connected ? "connected" : "MAX dropped the connection; the server is reconnecting");
27
+ }
28
+ else if (format === "pretty") {
29
+ streams.data(renderMessages([event.message], {
30
+ color: context.color,
31
+ senderColors: settings.senderColors,
32
+ verbosity: settings.detail,
33
+ width: process.stdout.columns ?? 80,
34
+ profile: settings.profile,
35
+ }));
36
+ }
37
+ else
38
+ streams.data(JSON.stringify(event.message));
39
+ }, stop.signal);
40
+ try {
41
+ await listen();
42
+ }
43
+ catch (error) {
44
+ if (!(error instanceof CliError && error.code === "not_found") || !settings.serve)
45
+ throw error;
46
+ startInBackground(store);
47
+ renderer.note("no server was running — starting `max serve` in the background");
48
+ await untilListening(store.socketPath(), START_WAIT_MS);
49
+ await listen();
50
+ }
51
+ }
52
+ finally {
53
+ process.off("SIGINT", end);
54
+ process.off("SIGTERM", end);
55
+ }
56
+ });
57
+ /** Logging in takes a second or two; a server that has not listened by now is not coming. */
58
+ const START_WAIT_MS = 15_000;
59
+ const untilListening = async (path, withinMs) => {
60
+ const until = Date.now() + withinMs;
61
+ while (Date.now() < until) {
62
+ if (await answers(path))
63
+ return;
64
+ await new Promise((resolve) => setTimeout(resolve, 250));
65
+ }
66
+ throw new CliError("not_found", `\`max serve\` did not start within ${withinMs / 1000}s — its log is beside the profile's state`);
67
+ };
68
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -7,11 +7,16 @@ declare const profileSettings: v.StrictObjectSchema<{
7
7
  /** The run log reads these two; nothing records anything until it exists. */
8
8
  record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
9
9
  keepRunsForDays: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
10
+ readOnly: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
11
+ sendsPerHour: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
12
+ /** Start `max serve` in the background when a command needs MAX and none is running (`MAX-35`). */
13
+ serve: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
10
14
  }, v.ErrorMessage<v.StrictObjectIssue>>;
11
15
  export declare const configSchema: v.StrictObjectSchema<{
12
16
  defaultProfile: v.OptionalSchema<v.StringSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
13
17
  /** What every profile gets unless it says otherwise. */
14
18
  defaults: v.OptionalSchema<v.StrictObjectSchema<{
19
+ updateCheck: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
15
20
  limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
16
21
  timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
17
22
  color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
@@ -19,6 +24,10 @@ export declare const configSchema: v.StrictObjectSchema<{
19
24
  /** The run log reads these two; nothing records anything until it exists. */
20
25
  record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
21
26
  keepRunsForDays: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
27
+ readOnly: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
28
+ sendsPerHour: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
29
+ /** Start `max serve` in the background when a command needs MAX and none is running (`MAX-35`). */
30
+ serve: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
22
31
  }, v.ErrorMessage<v.StrictObjectIssue>>, undefined>;
23
32
  profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
24
33
  limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
@@ -28,11 +37,17 @@ export declare const configSchema: v.StrictObjectSchema<{
28
37
  /** The run log reads these two; nothing records anything until it exists. */
29
38
  record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
30
39
  keepRunsForDays: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
40
+ readOnly: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
41
+ sendsPerHour: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
42
+ /** Start `max serve` in the background when a command needs MAX and none is running (`MAX-35`). */
43
+ serve: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
31
44
  }, v.ErrorMessage<v.StrictObjectIssue>>, "has to be an object of profiles, by name">, {}>;
32
45
  }, v.ErrorMessage<v.StrictObjectIssue>>;
33
46
  export type Config = v.InferOutput<typeof configSchema>;
34
47
  export type ProfileSetting = keyof v.InferOutput<typeof profileSettings>;
35
48
  export declare const PROFILE_SETTINGS: ProfileSetting[];
49
+ export declare const DEFAULTS_ONLY_SETTINGS: readonly ["updateCheck"];
50
+ export declare const ALL_SETTINGS: string[];
36
51
  /** Whatever the command line carried. Everything is optional: absent means "not given here". */
37
52
  export interface GlobalFlags {
38
53
  profile?: string;
@@ -45,6 +60,7 @@ export interface GlobalFlags {
45
60
  page?: number;
46
61
  all?: boolean;
47
62
  record?: boolean;
63
+ serve?: boolean;
48
64
  /** Raw text from `--timeout`, parsed here so the unit rule lives in one place. */
49
65
  timeout?: string;
50
66
  }
@@ -82,7 +98,12 @@ export interface Settings {
82
98
  */
83
99
  commandTimeoutMs: number | undefined;
84
100
  record: boolean;
101
+ serve: boolean;
85
102
  keepRunsForDays: number;
103
+ readOnly: boolean;
104
+ sendsPerHour: number;
105
+ /** Whether a person at a terminal hears, once a day, that a newer version exists. */
106
+ updateCheck: boolean;
86
107
  /** Named in errors and in `max --help`, so a person can find the file that decided this. */
87
108
  configPath: string;
88
109
  configFound: boolean;
@@ -92,7 +113,7 @@ export interface Settings {
92
113
  sources: Record<SourcedSetting, Source>;
93
114
  }
94
115
  export type Source = "first word" | "flag" | "MAX_PROFILE" | "MAX_TIMEOUT" | "config file" | "config defaults" | "default";
95
- export type SourcedSetting = "profile" | "limit" | "timeoutMs" | "commandTimeoutMs" | "color" | "senderColors" | "record" | "keepRunsForDays";
116
+ export type SourcedSetting = "profile" | "limit" | "timeoutMs" | "commandTimeoutMs" | "color" | "senderColors" | "record" | "serve" | "keepRunsForDays" | "readOnly" | "sendsPerHour" | "updateCheck";
96
117
  export interface ResolveOptions {
97
118
  env?: NodeJS.ProcessEnv;
98
119
  /** Tests pass a temporary directory; nothing else should need this. */
@@ -121,6 +142,8 @@ export declare const resolveSettings: (flags?: GlobalFlags, { env, configDir }?:
121
142
  * Whoever prints this has to say so, or it reads as a complete list and quietly is not.
122
143
  */
123
144
  export declare const configuredProfiles: ({ env, configDir }?: ResolveOptions) => string[];
145
+ /** `30s`, `2m`, `500ms` — the one spelling of a duration, whatever it is for. */
146
+ export declare const parseDuration: (value: string, source: string) => number;
124
147
  /**
125
148
  * Sets or removes one setting of one profile, or of `defaults`, and writes the file back.
126
149
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -5,6 +5,8 @@ import { DEFAULT_PROFILE, usableProfileName } from "./profile.js";
5
5
  const APP = "max-cli";
6
6
  const DEFAULT_LIMIT = 20;
7
7
  const DEFAULT_KEEP_RUNS_FOR_DAYS = 30;
8
+ /** On by default (`NEED-159` answers): a limit that is off protects nobody from a loop. */
9
+ const DEFAULT_SENDS_PER_HOUR = 30;
8
10
  const plain = (rule) => (issue) => `${rule}, not ${issue.received}`;
9
11
  const wholeNumber = plain("has to be a whole number, 1 or more");
10
12
  const count = v.pipe(v.number(wholeNumber), v.integer(wholeNumber), v.minValue(1, wholeNumber));
@@ -32,16 +34,25 @@ const profileEntries = {
32
34
  /** The run log reads these two; nothing records anything until it exists. */
33
35
  record: v.optional(flag),
34
36
  keepRunsForDays: v.optional(count),
37
+ readOnly: v.optional(flag),
38
+ sendsPerHour: v.optional(count),
39
+ /** Start `max serve` in the background when a command needs MAX and none is running (`MAX-35`). */
40
+ serve: v.optional(flag),
35
41
  };
36
42
  const profileSettings = v.strictObject(profileEntries, objectMessage(Object.keys(profileEntries)));
43
+ /** One program, one version: whether to look for a newer one is not a per-profile matter. */
44
+ const defaultsEntries = { ...profileEntries, updateCheck: v.optional(flag) };
45
+ const defaultsSettings = v.strictObject(defaultsEntries, objectMessage(Object.keys(defaultsEntries)));
37
46
  const configEntries = {
38
47
  defaultProfile: v.optional(v.string(plain("has to be a profile name, in quotes"))),
39
48
  /** What every profile gets unless it says otherwise. */
40
- defaults: v.optional(profileSettings),
49
+ defaults: v.optional(defaultsSettings),
41
50
  profiles: v.optional(v.record(v.string(), profileSettings, "has to be an object of profiles, by name"), {}),
42
51
  };
43
52
  export const configSchema = v.strictObject(configEntries, objectMessage(Object.keys(configEntries)));
44
53
  export const PROFILE_SETTINGS = Object.keys(profileSettings.entries);
54
+ export const DEFAULTS_ONLY_SETTINGS = ["updateCheck"];
55
+ export const ALL_SETTINGS = [...PROFILE_SETTINGS, ...DEFAULTS_ONLY_SETTINGS];
45
56
  /** The first given value wins, and says which it was. */
46
57
  const first = (candidates, fallback) => {
47
58
  for (const [from, value] of candidates)
@@ -96,10 +107,24 @@ export const resolveSettings = (flags = {}, { env = process.env, configDir } = {
96
107
  ["config file", configured.record],
97
108
  ["config defaults", shared.record],
98
109
  ], false);
110
+ const serve = first([
111
+ ["flag", flags.serve],
112
+ ["config file", configured.serve],
113
+ ["config defaults", shared.serve],
114
+ ], true);
99
115
  const keepRunsForDays = first([
100
116
  ["config file", configured.keepRunsForDays],
101
117
  ["config defaults", shared.keepRunsForDays],
102
118
  ], DEFAULT_KEEP_RUNS_FOR_DAYS);
119
+ const readOnly = first([
120
+ ["config file", configured.readOnly],
121
+ ["config defaults", shared.readOnly],
122
+ ], false);
123
+ const sendsPerHour = first([
124
+ ["config file", configured.sendsPerHour],
125
+ ["config defaults", shared.sendsPerHour],
126
+ ], DEFAULT_SENDS_PER_HOUR);
127
+ const updateCheck = first([["config defaults", shared.updateCheck]], true);
103
128
  /**
104
129
  * ⚠ **The only setting with no `config file` row, on purpose.** A budget for one command is
105
130
  * about a particular run, not a habit, and a timeout written into a file is one somebody trips
@@ -124,7 +149,11 @@ export const resolveSettings = (flags = {}, { env = process.env, configDir } = {
124
149
  timeoutMs: timeoutMs.value,
125
150
  commandTimeoutMs: durationMs(timeout.value, timeout.from),
126
151
  record: record.value,
152
+ serve: serve.value,
127
153
  keepRunsForDays: keepRunsForDays.value,
154
+ readOnly: readOnly.value,
155
+ sendsPerHour: sendsPerHour.value,
156
+ updateCheck: updateCheck.value,
128
157
  configPath,
129
158
  configFound: existsSync(configPath),
130
159
  configuredProfiles: Object.keys(config.profiles),
@@ -136,7 +165,11 @@ export const resolveSettings = (flags = {}, { env = process.env, configDir } = {
136
165
  color: color.from,
137
166
  senderColors: senderColors.from,
138
167
  record: record.from,
168
+ serve: serve.from,
139
169
  keepRunsForDays: keepRunsForDays.from,
170
+ readOnly: readOnly.from,
171
+ sendsPerHour: sendsPerHour.from,
172
+ updateCheck: updateCheck.from,
140
173
  },
141
174
  };
142
175
  // The file was checked by the schema; a flag was not, and `--limit abc` is `NaN` by the time it
@@ -182,7 +215,10 @@ const durationMs = (value, from) => {
182
215
  return undefined;
183
216
  // Named by where it came from, so somebody who set `MAX_TIMEOUT` in a shell profile weeks ago is
184
217
  // told which thing is wrong rather than shown a flag they never typed.
185
- const source = from === "MAX_TIMEOUT" ? "MAX_TIMEOUT" : "--timeout";
218
+ return parseDuration(value, from === "MAX_TIMEOUT" ? "MAX_TIMEOUT" : "--timeout");
219
+ };
220
+ /** `30s`, `2m`, `500ms` — the one spelling of a duration, whatever it is for. */
221
+ export const parseDuration = (value, source) => {
186
222
  const match = DURATION.exec(value.trim());
187
223
  if (!match?.[1] || !match[2]) {
188
224
  throw new CliError("validation_error", `${source} takes a duration with a unit — 30s, 2m or 500ms — not "${value}"`);
@@ -200,8 +236,11 @@ const durationMs = (value, from) => {
200
236
  * anything is written — so `config set` cannot produce a file the next command refuses to load.
201
237
  */
202
238
  export const changeSetting = (path, { profile, setting, value }) => {
203
- if (!PROFILE_SETTINGS.includes(setting)) {
204
- throw new CliError("validation_error", `no setting called "${setting}" — one of: ${PROFILE_SETTINGS.join(", ")}`);
239
+ if (!ALL_SETTINGS.includes(setting)) {
240
+ throw new CliError("validation_error", `no setting called "${setting}" — one of: ${ALL_SETTINGS.join(", ")}`);
241
+ }
242
+ if (profile !== undefined && DEFAULTS_ONLY_SETTINGS.includes(setting)) {
243
+ throw new CliError("validation_error", `${setting} is one setting for the whole program, not per profile — add --defaults`);
205
244
  }
206
245
  const config = readConfig(path);
207
246
  const scope = { ...(profile === undefined ? config.defaults : config.profiles[profile]) };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}