@leemour/max-cli 0.4.0 → 0.6.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 (190) hide show
  1. package/README.md +14 -5
  2. package/dist/bin/max.js +0 -0
  3. package/dist/cache/store.d.ts +14 -8
  4. package/dist/cache/store.d.ts.map +1 -1
  5. package/dist/cache/store.js +30 -5
  6. package/dist/cache/store.js.map +1 -1
  7. package/dist/client.d.ts +93 -5
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +347 -59
  10. package/dist/client.js.map +1 -1
  11. package/dist/commands/chats.d.ts.map +1 -1
  12. package/dist/commands/chats.js +20 -0
  13. package/dist/commands/chats.js.map +1 -1
  14. package/dist/commands/commands.d.ts +8 -0
  15. package/dist/commands/commands.d.ts.map +1 -0
  16. package/dist/commands/commands.js +36 -0
  17. package/dist/commands/commands.js.map +1 -0
  18. package/dist/commands/config.d.ts.map +1 -1
  19. package/dist/commands/config.js +29 -0
  20. package/dist/commands/config.js.map +1 -1
  21. package/dist/commands/contacts.d.ts.map +1 -1
  22. package/dist/commands/contacts.js +18 -0
  23. package/dist/commands/contacts.js.map +1 -1
  24. package/dist/commands/context.d.ts +18 -0
  25. package/dist/commands/context.d.ts.map +1 -1
  26. package/dist/commands/context.js +22 -0
  27. package/dist/commands/context.js.map +1 -1
  28. package/dist/commands/inbox.d.ts +14 -0
  29. package/dist/commands/inbox.d.ts.map +1 -0
  30. package/dist/commands/inbox.js +90 -0
  31. package/dist/commands/inbox.js.map +1 -0
  32. package/dist/commands/messages.d.ts.map +1 -1
  33. package/dist/commands/messages.js +55 -4
  34. package/dist/commands/messages.js.map +1 -1
  35. package/dist/commands/reactions.d.ts +3 -0
  36. package/dist/commands/reactions.d.ts.map +1 -0
  37. package/dist/commands/reactions.js +26 -0
  38. package/dist/commands/reactions.js.map +1 -0
  39. package/dist/commands/recipients.d.ts +9 -0
  40. package/dist/commands/recipients.d.ts.map +1 -0
  41. package/dist/commands/recipients.js +68 -0
  42. package/dist/commands/recipients.js.map +1 -0
  43. package/dist/commands/sends.d.ts +4 -0
  44. package/dist/commands/sends.d.ts.map +1 -0
  45. package/dist/commands/sends.js +21 -0
  46. package/dist/commands/sends.js.map +1 -0
  47. package/dist/commands/session.d.ts.map +1 -1
  48. package/dist/commands/session.js +80 -15
  49. package/dist/commands/session.js.map +1 -1
  50. package/dist/commands/skill.d.ts.map +1 -1
  51. package/dist/commands/skill.js +2 -1
  52. package/dist/commands/skill.js.map +1 -1
  53. package/dist/config.d.ts +54 -13
  54. package/dist/config.d.ts.map +1 -1
  55. package/dist/config.js +98 -16
  56. package/dist/config.js.map +1 -1
  57. package/dist/domain/map.d.ts +3 -1
  58. package/dist/domain/map.d.ts.map +1 -1
  59. package/dist/domain/map.js +15 -1
  60. package/dist/domain/map.js.map +1 -1
  61. package/dist/domain/models.d.ts +55 -1
  62. package/dist/domain/models.d.ts.map +1 -1
  63. package/dist/domain/models.js.map +1 -1
  64. package/dist/download.d.ts +15 -0
  65. package/dist/download.d.ts.map +1 -0
  66. package/dist/download.js +60 -0
  67. package/dist/download.js.map +1 -0
  68. package/dist/generated/client.generated.d.ts +14 -0
  69. package/dist/generated/client.generated.d.ts.map +1 -1
  70. package/dist/generated/client.generated.js +14 -0
  71. package/dist/generated/client.generated.js.map +1 -1
  72. package/dist/generated/opcodes.generated.d.ts +15 -0
  73. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  74. package/dist/generated/opcodes.generated.js +15 -0
  75. package/dist/generated/opcodes.generated.js.map +1 -1
  76. package/dist/generated/operations.generated.d.ts +99 -1
  77. package/dist/generated/operations.generated.d.ts.map +1 -1
  78. package/dist/generated/operations.generated.js +13 -1
  79. package/dist/generated/operations.generated.js.map +1 -1
  80. package/dist/markdown.d.ts +18 -0
  81. package/dist/markdown.d.ts.map +1 -0
  82. package/dist/markdown.js +52 -0
  83. package/dist/markdown.js.map +1 -0
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +10 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/rendering/messages.d.ts.map +1 -1
  88. package/dist/rendering/messages.js +6 -0
  89. package/dist/rendering/messages.js.map +1 -1
  90. package/dist/resolve.d.ts +15 -0
  91. package/dist/resolve.d.ts.map +1 -0
  92. package/dist/resolve.js +48 -0
  93. package/dist/resolve.js.map +1 -0
  94. package/dist/runs/recording.d.ts.map +1 -1
  95. package/dist/runs/recording.js +7 -0
  96. package/dist/runs/recording.js.map +1 -1
  97. package/dist/runs/run.d.ts +2 -0
  98. package/dist/runs/run.d.ts.map +1 -1
  99. package/dist/runs/run.js +1 -0
  100. package/dist/runs/run.js.map +1 -1
  101. package/dist/sends/guard.d.ts +26 -0
  102. package/dist/sends/guard.d.ts.map +1 -0
  103. package/dist/sends/guard.js +48 -0
  104. package/dist/sends/guard.js.map +1 -0
  105. package/dist/sends/journal.d.ts +29 -0
  106. package/dist/sends/journal.d.ts.map +1 -0
  107. package/dist/sends/journal.js +40 -0
  108. package/dist/sends/journal.js.map +1 -0
  109. package/dist/sends/recipients.d.ts +29 -0
  110. package/dist/sends/recipients.d.ts.map +1 -0
  111. package/dist/sends/recipients.js +62 -0
  112. package/dist/sends/recipients.js.map +1 -0
  113. package/dist/session/adopt.d.ts.map +1 -1
  114. package/dist/session/adopt.js +7 -6
  115. package/dist/session/adopt.js.map +1 -1
  116. package/dist/session/browser.d.ts +55 -0
  117. package/dist/session/browser.d.ts.map +1 -0
  118. package/dist/session/browser.js +292 -0
  119. package/dist/session/browser.js.map +1 -0
  120. package/dist/session/handshake.d.ts +3 -1
  121. package/dist/session/handshake.d.ts.map +1 -1
  122. package/dist/session/handshake.js +3 -1
  123. package/dist/session/handshake.js.map +1 -1
  124. package/dist/session/login.d.ts +20 -0
  125. package/dist/session/login.d.ts.map +1 -0
  126. package/dist/session/login.js +66 -0
  127. package/dist/session/login.js.map +1 -0
  128. package/dist/session/prompt.d.ts +3 -1
  129. package/dist/session/prompt.d.ts.map +1 -1
  130. package/dist/session/prompt.js +2 -2
  131. package/dist/session/prompt.js.map +1 -1
  132. package/dist/session/qr-terminal.d.ts +9 -0
  133. package/dist/session/qr-terminal.d.ts.map +1 -0
  134. package/dist/session/qr-terminal.js +34 -0
  135. package/dist/session/qr-terminal.js.map +1 -0
  136. package/dist/session/store.d.ts +2 -0
  137. package/dist/session/store.d.ts.map +1 -1
  138. package/dist/session/store.js +2 -0
  139. package/dist/session/store.js.map +1 -1
  140. package/dist/spec/index.d.ts.map +1 -1
  141. package/dist/spec/index.js +14 -1
  142. package/dist/spec/index.js.map +1 -1
  143. package/dist/spec/operations/attachments.d.ts +15 -0
  144. package/dist/spec/operations/attachments.d.ts.map +1 -0
  145. package/dist/spec/operations/attachments.js +38 -0
  146. package/dist/spec/operations/attachments.js.map +1 -0
  147. package/dist/spec/operations/login.d.ts +64 -0
  148. package/dist/spec/operations/login.d.ts.map +1 -0
  149. package/dist/spec/operations/login.js +99 -0
  150. package/dist/spec/operations/login.js.map +1 -0
  151. package/dist/spec/operations/messages.d.ts +27 -1
  152. package/dist/spec/operations/messages.d.ts.map +1 -1
  153. package/dist/spec/operations/messages.js +46 -2
  154. package/dist/spec/operations/messages.js.map +1 -1
  155. package/dist/testing/mock-max.d.ts +10 -4
  156. package/dist/testing/mock-max.d.ts.map +1 -1
  157. package/dist/testing/mock-max.js +5 -1
  158. package/dist/testing/mock-max.js.map +1 -1
  159. package/dist/testing/sandbox.js +3 -0
  160. package/dist/testing/sandbox.js.map +1 -1
  161. package/dist/testing/unscripted.d.ts +2 -0
  162. package/dist/testing/unscripted.d.ts.map +1 -0
  163. package/dist/testing/unscripted.js +18 -0
  164. package/dist/testing/unscripted.js.map +1 -0
  165. package/dist/version.d.ts +1 -1
  166. package/dist/version.js +1 -1
  167. package/package.json +31 -22
  168. package/skills/max-cli/SKILL.md +25 -6
  169. package/dist/commands/login.d.ts +0 -15
  170. package/dist/commands/login.d.ts.map +0 -1
  171. package/dist/commands/login.js +0 -43
  172. package/dist/commands/login.js.map +0 -1
  173. package/dist/commands/logout.d.ts +0 -10
  174. package/dist/commands/logout.d.ts.map +0 -1
  175. package/dist/commands/logout.js +0 -22
  176. package/dist/commands/logout.js.map +0 -1
  177. package/dist/commands/me.d.ts +0 -3
  178. package/dist/commands/me.d.ts.map +0 -1
  179. package/dist/commands/me.js +0 -18
  180. package/dist/commands/me.js.map +0 -1
  181. package/dist/commands/send.d.ts +0 -10
  182. package/dist/commands/send.d.ts.map +0 -1
  183. package/dist/commands/send.js +0 -30
  184. package/dist/commands/send.js.map +0 -1
  185. package/dist/protocol/session.d.ts +0 -54
  186. package/dist/protocol/session.d.ts.map +0 -1
  187. package/dist/protocol/session.js +0 -57
  188. package/dist/protocol/session.js.map +0 -1
  189. package/dist/spec/operations/auth.d.ts +0 -42
  190. package/dist/spec/operations/auth.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,eAAO,MAAM,eAAe,QAAO,OAiKlC,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,eAAO,MAAM,eAAe,QAAO,OAmNlC,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
+ import { annotate } from "@leemour/cli-core/commands";
2
3
  import { Command } from "commander";
3
4
  import { openProfileCache } from "../cache/index.js";
5
+ import { save } from "../download.js";
4
6
  import { renderMessages } from "../rendering/messages.js";
5
7
  import { readBody } from "./body.js";
6
8
  import { forCommand } from "./context.js";
@@ -20,17 +22,27 @@ export const messagesCommand = () => {
20
22
  // rather than approximate. A message id is what the reader has in front of them, having just
21
23
  // read the output; an ISO 8601 time is what still works once that message is gone.
22
24
  .option("--before <id-or-time>", "read what came before this message id, or this ISO 8601 time")
25
+ .option("--after <id-or-time>", "read what came after this message id, or this ISO 8601 time; not with --before")
23
26
  .action(async function (chat) {
24
27
  const options = this.optsWithGlobals();
28
+ if (options.before !== undefined && options.after !== undefined) {
29
+ throw new CliError("validation_error", "--before and --after are two directions; give one of them");
30
+ }
25
31
  const context = forCommand(this);
26
32
  const { renderer, settings, createClient, run } = context;
27
33
  const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
28
34
  await run("messages list", async (events) => {
29
35
  const client = createClient({ events, ...(cache ? { cache } : {}) });
30
36
  try {
37
+ const anchor = options.after !== undefined
38
+ ? { after: client.messages.moment(String(options.after), "--after") }
39
+ : options.before !== undefined
40
+ ? { before: client.messages.moment(String(options.before)) }
41
+ : {};
31
42
  const chatId = await client.chats.resolve(chat);
32
- const before = options.before === undefined ? {} : { before: client.messages.before(String(options.before)) };
33
- renderPage(context, await client.messages.list(chatId, { limit: settings.limit, ...before }), feed(context), ([oldest]) => `older ones: \`--before ${oldest?.id}\``);
43
+ renderPage(context, await client.messages.list(chatId, { limit: settings.limit, ...anchor }), feed(context), (items) => "after" in anchor
44
+ ? `newer ones: \`--after ${items.at(-1)?.id}\``
45
+ : `older ones: \`--before ${items[0]?.id}\``);
34
46
  }
35
47
  finally {
36
48
  await client.close();
@@ -100,6 +112,42 @@ export const messagesCommand = () => {
100
112
  const { before, after } = this.opts();
101
113
  await readWindow(this, chat, messageId, { before, after }, "messages context");
102
114
  });
115
+ command
116
+ .command("download")
117
+ .argument("<chat>", "chat id, or part of a chat name")
118
+ .argument("<message>", "message id")
119
+ .description("save a message's photos, files, videos and audio to a directory")
120
+ .option("--output <dir>", "where to save them", ".")
121
+ .action(async function (chat, messageId) {
122
+ const { output } = this.opts();
123
+ const context = forCommand(this);
124
+ const { renderer, format, streams, createClient, run } = context;
125
+ await run("messages download", async (events) => {
126
+ const client = createClient({ events });
127
+ try {
128
+ const chatId = await client.chats.resolve(chat);
129
+ const id = messageId.trim();
130
+ const { links, skipped } = await client.messages.links(chatId, id);
131
+ if (skipped.length > 0)
132
+ renderer.note(`not downloadable: ${skipped.join(", ")}`);
133
+ if (links.length === 0)
134
+ throw new CliError("not_found", `message ${id} has nothing to download`);
135
+ const saved = [];
136
+ for (const [index, attachment] of links.entries()) {
137
+ if (attachment.unsafe)
138
+ renderer.note(`MAX marks ${attachment.name ?? "this file"} as possibly unsafe`);
139
+ saved.push(await save(attachment, output, `${id}-${index + 1}`));
140
+ }
141
+ if (format === "pretty")
142
+ streams.data(`${saved.map((file) => file.path).join("\n")}\n`);
143
+ else
144
+ renderer.result({ items: saved });
145
+ }
146
+ finally {
147
+ await client.close();
148
+ }
149
+ });
150
+ });
103
151
  /**
104
152
  * One message, one command, no retry.
105
153
  *
@@ -110,8 +158,7 @@ export const messagesCommand = () => {
110
158
  * **The body may come from a pipe instead**, by leaving the argument off — `readBody` says why
111
159
  * argv is the wrong place for it and why omission is the signal rather than a flag.
112
160
  */
113
- command
114
- .command("send")
161
+ annotate(command.command("send"), { mutates: true })
115
162
  .argument("<chat>", "chat id, or part of a chat name")
116
163
  .argument("[text]", "what to say; leave it off to read the message from stdin")
117
164
  .description("send one text message")
@@ -120,6 +167,8 @@ export const messagesCommand = () => {
120
167
  // whose absence is felt at the other end rather than here: a script posting at 3am wakes
121
168
  // somebody up, and there was no way to say otherwise.
122
169
  .option("--silent", "deliver without a notification")
170
+ .option("--reply-to <message>", "answer this message id in the same chat")
171
+ .option("--md, --markdown", "read **bold**, _italic_, ~~struck~~ and `code` in the text; \\ keeps a mark literal")
123
172
  .action(async function (chat, text) {
124
173
  const options = this.optsWithGlobals();
125
174
  const { renderer, settings, createClient, run } = forCommand(this);
@@ -134,6 +183,8 @@ export const messagesCommand = () => {
134
183
  const sent = await client.messages.send(chatId, body, {
135
184
  ...(options.cid === undefined ? {} : { cid: options.cid }),
136
185
  ...(options.silent === true ? { notify: false } : {}),
186
+ ...(options.replyTo === undefined ? {} : { replyTo: String(options.replyTo).trim() }),
187
+ ...(options.markdown === true ? { markdown: true } : {}),
137
188
  });
138
189
  renderer.result(sent);
139
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const reactionsCommand: () => Command;
3
+ //# sourceMappingURL=reactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.d.ts","sourceRoot":"","sources":["../../src/commands/reactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,eAAO,MAAM,gBAAgB,QAAO,OAuBnC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { annotate } from "@leemour/cli-core/commands";
2
+ import { Command } from "commander";
3
+ import { forCommand } from "./context.js";
4
+ export const reactionsCommand = () => {
5
+ const command = new Command("reactions").description("react to messages");
6
+ annotate(command.command("add"), { mutates: true })
7
+ .argument("<chat>", "chat id, or part of a chat name")
8
+ .argument("<message>", "message id")
9
+ .argument("<emoji>", "one emoji, for example 👍")
10
+ .description("put your reaction on a message; it replaces the one you had")
11
+ .action(async function (chat, messageId, emoji) {
12
+ const { renderer, createClient, run } = forCommand(this);
13
+ await run("reactions add", async (events) => {
14
+ const client = createClient({ events });
15
+ try {
16
+ const chatId = await client.chats.resolve(chat);
17
+ renderer.result(await client.messages.react(chatId, messageId.trim(), emoji.trim()));
18
+ }
19
+ finally {
20
+ await client.close();
21
+ }
22
+ });
23
+ });
24
+ return command;
25
+ };
26
+ //# sourceMappingURL=reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactions.js","sourceRoot":"","sources":["../../src/commands/reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAY,EAAE;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAA;IAEzE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAChD,QAAQ,CAAC,QAAQ,EAAE,iCAAiC,CAAC;SACrD,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;SACnC,QAAQ,CAAC,SAAS,EAAE,2BAA2B,CAAC;SAChD,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,SAAiB,EAAE,KAAa;QACnF,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAExD,MAAM,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACvC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBAC/C,QAAQ,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACtF,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * The chats this profile may send to. Off until the first `add`; `off` turns it off again.
4
+ *
5
+ * Scripts may change it too (`NEED-159` answers): the list stops a model that a message talked
6
+ * into writing somewhere, not an agent set on getting around it.
7
+ */
8
+ export declare const recipientsCommand: () => Command;
9
+ //# sourceMappingURL=recipients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../src/commands/recipients.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAO,OA0DpC,CAAA"}
@@ -0,0 +1,68 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { Command } from "commander";
3
+ import { RecipientList, recipientsPathFor } from "../sends/recipients.js";
4
+ import { forCommand } from "./context.js";
5
+ /**
6
+ * The chats this profile may send to. Off until the first `add`; `off` turns it off again.
7
+ *
8
+ * Scripts may change it too (`NEED-159` answers): the list stops a model that a message talked
9
+ * into writing somewhere, not an agent set on getting around it.
10
+ */
11
+ export const recipientsCommand = () => {
12
+ const command = new Command("recipients").description("the chats this profile may send to, when the list is on");
13
+ command
14
+ .command("list")
15
+ .description("the chats on the list; empty and off until the first add")
16
+ .action(function () {
17
+ const { settings, renderer } = forCommand(this);
18
+ const chats = listFor(settings.profile).read();
19
+ renderer.stream(chats ?? []);
20
+ if (!chats)
21
+ renderer.note("the recipient list is off — this profile may send to any chat");
22
+ else if (chats.length === 0)
23
+ renderer.note("the recipient list is on and empty — this profile may send nowhere");
24
+ });
25
+ command
26
+ .command("add")
27
+ .argument("<chat>", "chat id, or part of a chat name")
28
+ .description("allow sending to this chat; the first add turns the list on")
29
+ .action(async function (chat) {
30
+ const { settings, renderer, createClient, run } = forCommand(this);
31
+ await run("recipients add", async (events) => {
32
+ const client = createClient({ events });
33
+ try {
34
+ const found = await client.chats.show(chat);
35
+ const added = listFor(settings.profile).add({
36
+ id: found.id,
37
+ title: found.title,
38
+ addedAt: new Date().toISOString(),
39
+ });
40
+ renderer.result({ id: found.id, title: found.title, added });
41
+ }
42
+ finally {
43
+ await client.close();
44
+ }
45
+ });
46
+ });
47
+ command
48
+ .command("remove")
49
+ .argument("<chat>", "chat id, or the title as the list shows it")
50
+ .description("stop allowing this chat; the list stays on")
51
+ .action(function (chat) {
52
+ const { settings, renderer } = forCommand(this);
53
+ const gone = listFor(settings.profile).remove(chat);
54
+ if (!gone)
55
+ throw new CliError("not_found", `${chat.trim()} is not on the recipient list of ${settings.profile}`);
56
+ renderer.result({ id: gone.id, title: gone.title, removed: true });
57
+ });
58
+ command
59
+ .command("off")
60
+ .description("turn the list off: this profile may send to any chat again")
61
+ .action(function () {
62
+ const { settings, renderer } = forCommand(this);
63
+ renderer.result({ off: true, wasOn: listFor(settings.profile).off() });
64
+ });
65
+ return command;
66
+ };
67
+ const listFor = (profile) => new RecipientList(recipientsPathFor(profile));
68
+ //# sourceMappingURL=recipients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../src/commands/recipients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ /** Every attempt to send from this profile, kept whatever `--record` says. Never the text. */
3
+ export declare const sendsCommand: () => Command;
4
+ //# sourceMappingURL=sends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sends.d.ts","sourceRoot":"","sources":["../../src/commands/sends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,8FAA8F;AAC9F,eAAO,MAAM,YAAY,QAAO,OAiB/B,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { Command } from "commander";
2
+ import { SendJournal, sendsPathFor } from "../sends/journal.js";
3
+ import { forCommand } from "./context.js";
4
+ /** Every attempt to send from this profile, kept whatever `--record` says. Never the text. */
5
+ export const sendsCommand = () => {
6
+ const command = new Command("sends").description("every attempt to send from this profile — never the text");
7
+ command
8
+ .command("list")
9
+ .description("attempts to send, newest first: sent, refused, failed, or not known")
10
+ .option("--limit <n>", "how many to show", (value) => Number.parseInt(value, 10), 20)
11
+ .action(function () {
12
+ const { limit } = this.opts();
13
+ const { settings, renderer } = forCommand(this);
14
+ const entries = new SendJournal(sendsPathFor(settings.profile)).entries().reverse();
15
+ renderer.stream(entries.slice(0, limit));
16
+ if (entries.length === 0)
17
+ renderer.note(`profile ${settings.profile} has not tried to send anything`);
18
+ });
19
+ return command;
20
+ };
21
+ //# sourceMappingURL=sends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sends.js","sourceRoot":"","sources":["../../src/commands/sends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0DAA0D,CAAC,CAAA;IAE5G,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;SACpF,MAAM,CAAC;QACN,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAqB,CAAA;QAChD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAA;QAEnF,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,OAAO,iCAAiC,CAAC,CAAA;IACvG,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,cAAc,QAAO,OA0EjC,CAAA"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAE,MAAM,WAAW,CAAA;AAe7C,eAAO,MAAM,cAAc,QAAO,OAmGjC,CAAA"}
@@ -1,44 +1,72 @@
1
- import { Command } from "commander";
1
+ import { Argument, Command } from "commander";
2
2
  import { commandWords, refuseCommandName, rootOf } from "../profile.js";
3
3
  import { adoptToken } from "../session/adopt.js";
4
+ import { serveQrPage } from "../session/browser.js";
4
5
  import { readSecret } from "../session/prompt.js";
6
+ import { terminalQr } from "../session/qr-terminal.js";
5
7
  import { forCommand } from "./context.js";
8
+ // NEED-149: gentle on purpose — it asks for ordinary use alongside, and does not cite blocked accounts.
9
+ const TERMS_NOTICE = [
10
+ "max is not the official MAX app, and the MAX terms do not allow automated programs (legal.max.ru/ps, 4.3.7).",
11
+ "Keep using MAX as usual in the browser or on your phone alongside it. More: docs/security.md",
12
+ ].join("\n");
6
13
  export const sessionCommand = () => {
7
14
  const command = new Command("session").description("the stored MAX session for this profile");
8
15
  /**
9
- * For now, importing a token obtained elsewhere — from `web.max.ru`, or from another client.
16
+ * Four ways to a token, and one way to keep it: whatever produced the token, it reaches the
17
+ * keyring only once MAX has accepted it (`adoptToken`).
10
18
  *
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.
19
+ * - `token` — pasted, or piped: `pass show max | max session start`. The default, and the escape
20
+ * hatch when a login meets a captcha or an unusual second factor.
21
+ * - `qr` — our own connection asks MAX for the code; it is drawn here, or opened in the default
22
+ * browser when the terminal is too narrow for it.
23
+ * - `qr-chrome`, `sms` — web.max.ru itself does the login, in a Chromium-family browser with a
24
+ * throwaway profile, and we read the token it stores. MAX sees its own web client. SMS has no
25
+ * other door: asked over our socket, MAX demands a captcha only the page can solve (2026-09-24).
14
26
  *
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`.
27
+ * **A token is never an argument.** argv is read by `ps` and kept by shell history.
19
28
  */
20
29
  command
21
30
  .command("start")
22
- .description("store a MAX session for this profile")
23
- .action(async function () {
24
- const { renderer, settings, store, createClient, run } = forCommand(this);
31
+ .description("log this profile in to MAX")
32
+ .addArgument(new Argument("[method]", "token (pasted or piped), qr, qr-chrome or sms").choices(METHODS).default("token"))
33
+ .action(async function (method) {
34
+ const context = forCommand(this);
35
+ const { renderer, settings, store, createClient, run, interactive } = context;
25
36
  // Creation is the only moment the collision can still be explained; after this the name is
26
37
  // written down and `max <name>` would silently be a command instead.
27
38
  refuseCommandName(settings.profile, commandWords(rootOf(this)));
28
- const token = process.env.MAX_TOKEN?.trim() || (await readSecret("MAX token: "));
39
+ if (method !== "token" && !interactive) {
40
+ renderer.failure(`\`session start ${method}\` needs a person at a terminal — use \`session start token\``);
41
+ process.exitCode = 2;
42
+ return;
43
+ }
44
+ // It outranks the keyring, so every later command would still log in with it and the new
45
+ // session would look as if it had not worked.
46
+ if (method !== "token" && process.env.MAX_TOKEN) {
47
+ renderer.failure("MAX_TOKEN is set, and it would outrank the new session — unset it first");
48
+ process.exitCode = 2;
49
+ return;
50
+ }
51
+ const pasted = method === "token" ? process.env.MAX_TOKEN?.trim() || (await readSecret("MAX token: ")) : undefined;
29
52
  // Before the run directory: nothing was attempted, so there is nothing to record.
30
- if (!token) {
53
+ if (method === "token" && !pasted) {
31
54
  renderer.failure("no token given");
32
55
  process.exitCode = 2;
33
56
  return;
34
57
  }
35
58
  await run("session start", async (events) => {
59
+ const token = method === "token" ? String(pasted) : await obtain(method, context, events);
36
60
  const client = createClient({ events });
61
+ // No account on record means this profile has never logged in, or `session end` forgot it.
62
+ const firstLogin = store.readState().viewerId === undefined;
37
63
  try {
38
64
  await adoptToken(client, store, token);
39
65
  const profile = client.account.me();
40
- renderer.result({ profile, stored: true });
66
+ renderer.result({ profile, stored: true, method });
41
67
  renderer.success(`logged in as ${profile.name ?? profile.id}`);
68
+ if (firstLogin)
69
+ renderer.note(TERMS_NOTICE);
42
70
  }
43
71
  finally {
44
72
  await client.close();
@@ -71,4 +99,41 @@ export const sessionCommand = () => {
71
99
  });
72
100
  return command;
73
101
  };
102
+ const METHODS = ["token", "qr", "qr-chrome", "sms"];
103
+ /** Long enough to find the phone and type a number and a code; the profile dies with the wait. */
104
+ const BROWSER_WAIT_MS = 5 * 60_000;
105
+ const obtain = async (method, { createClient, renderer, browser, track, ask, streams, columns }, events) => {
106
+ if (method !== "qr") {
107
+ renderer.note(method === "qr-chrome"
108
+ ? "web.max.ru is opening in a separate browser window — scan its QR code with the MAX app on your phone"
109
+ : "web.max.ru is opening in a separate browser window — choose to log in by phone number there");
110
+ return await browser.chromiumToken({ track, waitMs: BROWSER_WAIT_MS });
111
+ }
112
+ const client = createClient({ events });
113
+ let page;
114
+ try {
115
+ return await client.login.byQr({
116
+ show: async (link) => {
117
+ const drawn = terminalQr(link);
118
+ // Straight to the diagnostic stream, not through the renderer: --quiet must not hide the code.
119
+ if (columns !== undefined && drawn.width <= columns) {
120
+ streams.diagnostic(drawn.text);
121
+ renderer.note("scan this code with the MAX app on your phone");
122
+ return;
123
+ }
124
+ page = await serveQrPage(link);
125
+ track(page);
126
+ await browser.open(page.url);
127
+ renderer.note("the terminal is too narrow for the QR code, so it is open in your browser — scan it there");
128
+ },
129
+ askPassword: (hint, again) => ask(`${again ? "wrong password, try again" : "MAX password"}${hint ? ` (hint: ${hint})` : ""}: `, {
130
+ secret: true,
131
+ }),
132
+ });
133
+ }
134
+ finally {
135
+ await page?.close();
136
+ await client.close();
137
+ }
138
+ };
74
139
  //# 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"}
package/dist/config.d.ts CHANGED
@@ -1,17 +1,44 @@
1
1
  import * as v from "valibot";
2
+ declare const profileSettings: v.StrictObjectSchema<{
3
+ 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>;
4
+ 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>;
5
+ color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
6
+ senderColors: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
7
+ /** The run log reads these two; nothing records anything until it exists. */
8
+ record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
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
+ }, v.ErrorMessage<v.StrictObjectIssue>>;
2
13
  export declare const configSchema: v.StrictObjectSchema<{
3
- readonly defaultProfile: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
4
- readonly profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
5
- readonly limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
6
- readonly timeoutMs: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
7
- readonly color: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
8
- readonly senderColors: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
14
+ defaultProfile: v.OptionalSchema<v.StringSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
15
+ /** What every profile gets unless it says otherwise. */
16
+ defaults: v.OptionalSchema<v.StrictObjectSchema<{
17
+ 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>;
18
+ 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>;
19
+ color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
20
+ senderColors: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
9
21
  /** The run log reads these two; nothing records anything until it exists. */
10
- readonly record: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
11
- readonly keepRunsForDays: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>, undefined>;
12
- }, undefined>, undefined>, {}>;
13
- }, undefined>;
22
+ record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
23
+ 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>;
24
+ readOnly: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
25
+ 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>;
26
+ }, v.ErrorMessage<v.StrictObjectIssue>>, undefined>;
27
+ profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
28
+ 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>;
29
+ 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>;
30
+ color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
31
+ senderColors: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
32
+ /** The run log reads these two; nothing records anything until it exists. */
33
+ record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
34
+ 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>;
35
+ readOnly: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
36
+ 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>;
37
+ }, v.ErrorMessage<v.StrictObjectIssue>>, "has to be an object of profiles, by name">, {}>;
38
+ }, v.ErrorMessage<v.StrictObjectIssue>>;
14
39
  export type Config = v.InferOutput<typeof configSchema>;
40
+ export type ProfileSetting = keyof v.InferOutput<typeof profileSettings>;
41
+ export declare const PROFILE_SETTINGS: ProfileSetting[];
15
42
  /** Whatever the command line carried. Everything is optional: absent means "not given here". */
16
43
  export interface GlobalFlags {
17
44
  profile?: string;
@@ -62,6 +89,8 @@ export interface Settings {
62
89
  commandTimeoutMs: number | undefined;
63
90
  record: boolean;
64
91
  keepRunsForDays: number;
92
+ readOnly: boolean;
93
+ sendsPerHour: number;
65
94
  /** Named in errors and in `max --help`, so a person can find the file that decided this. */
66
95
  configPath: string;
67
96
  configFound: boolean;
@@ -70,8 +99,8 @@ export interface Settings {
70
99
  /** Where each value came from — `max config show` prints it. */
71
100
  sources: Record<SourcedSetting, Source>;
72
101
  }
73
- export type Source = "first word" | "flag" | "MAX_PROFILE" | "MAX_TIMEOUT" | "config file" | "default";
74
- export type SourcedSetting = "profile" | "limit" | "timeoutMs" | "commandTimeoutMs" | "color" | "senderColors" | "record" | "keepRunsForDays";
102
+ export type Source = "first word" | "flag" | "MAX_PROFILE" | "MAX_TIMEOUT" | "config file" | "config defaults" | "default";
103
+ export type SourcedSetting = "profile" | "limit" | "timeoutMs" | "commandTimeoutMs" | "color" | "senderColors" | "record" | "keepRunsForDays" | "readOnly" | "sendsPerHour";
75
104
  export interface ResolveOptions {
76
105
  env?: NodeJS.ProcessEnv;
77
106
  /** Tests pass a temporary directory; nothing else should need this. */
@@ -89,7 +118,7 @@ export interface ResolveOptions {
89
118
  * Two things already jump this queue and are documented rather than re-litigated here:
90
119
  * `MAX_TOKEN` outranks the keyring (`cli-core`'s `Credentials.read`), and `MAX_CONFIG_DIR`,
91
120
  * `MAX_STATE_DIR` or `MAX_CACHE_DIR` move the whole installation — including which keyring entry
92
- * a profile means (`ARCHITECTURE.md` §13).
121
+ * a profile means (`ARCHITECTURE.md` §14).
93
122
  */
94
123
  export declare const resolveSettings: (flags?: GlobalFlags, { env, configDir }?: ResolveOptions) => Settings;
95
124
  /**
@@ -100,4 +129,16 @@ export declare const resolveSettings: (flags?: GlobalFlags, { env, configDir }?:
100
129
  * Whoever prints this has to say so, or it reads as a complete list and quietly is not.
101
130
  */
102
131
  export declare const configuredProfiles: ({ env, configDir }?: ResolveOptions) => string[];
132
+ /**
133
+ * Sets or removes one setting of one profile, or of `defaults`, and writes the file back.
134
+ *
135
+ * **The value is checked by the same schema that reads the file**, on the whole result, before
136
+ * anything is written — so `config set` cannot produce a file the next command refuses to load.
137
+ */
138
+ export declare const changeSetting: (path: string, { profile, setting, value }: {
139
+ profile: string | undefined;
140
+ setting: string;
141
+ value: string | undefined;
142
+ }) => unknown;
143
+ export {};
103
144
  //# sourceMappingURL=config.d.ts.map