@leemour/max-cli 0.13.0 → 0.15.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 (210) hide show
  1. package/README.md +92 -14
  2. package/dist/bot/auth.d.ts +23 -0
  3. package/dist/bot/auth.d.ts.map +1 -0
  4. package/dist/bot/auth.js +36 -0
  5. package/dist/bot/auth.js.map +1 -0
  6. package/dist/bot/client.d.ts +20 -0
  7. package/dist/bot/client.d.ts.map +1 -0
  8. package/dist/bot/client.js +91 -0
  9. package/dist/bot/client.js.map +1 -0
  10. package/dist/bot/generated/manifest.d.ts +3 -0
  11. package/dist/bot/generated/manifest.d.ts.map +1 -0
  12. package/dist/bot/generated/manifest.js +1232 -0
  13. package/dist/bot/generated/manifest.js.map +1 -0
  14. package/dist/bot/generated/schemas.d.ts +271 -0
  15. package/dist/bot/generated/schemas.d.ts.map +1 -0
  16. package/dist/bot/generated/schemas.js +869 -0
  17. package/dist/bot/generated/schemas.js.map +1 -0
  18. package/dist/bot/generated/types.d.ts +1088 -0
  19. package/dist/bot/generated/types.d.ts.map +1 -0
  20. package/dist/bot/generated/types.js +5 -0
  21. package/dist/bot/generated/types.js.map +1 -0
  22. package/dist/bot/input.d.ts +10 -0
  23. package/dist/bot/input.d.ts.map +1 -0
  24. package/dist/bot/input.js +88 -0
  25. package/dist/bot/input.js.map +1 -0
  26. package/dist/bot/keep.d.ts +25 -0
  27. package/dist/bot/keep.d.ts.map +1 -0
  28. package/dist/bot/keep.js +96 -0
  29. package/dist/bot/keep.js.map +1 -0
  30. package/dist/bot/map.d.ts +11 -0
  31. package/dist/bot/map.d.ts.map +1 -0
  32. package/dist/bot/map.js +76 -0
  33. package/dist/bot/map.js.map +1 -0
  34. package/dist/bot/permissions.d.ts +14 -0
  35. package/dist/bot/permissions.d.ts.map +1 -0
  36. package/dist/bot/permissions.js +53 -0
  37. package/dist/bot/permissions.js.map +1 -0
  38. package/dist/bot/registry.d.ts +30 -0
  39. package/dist/bot/registry.d.ts.map +1 -0
  40. package/dist/bot/registry.js +85 -0
  41. package/dist/bot/registry.js.map +1 -0
  42. package/dist/bot/russian-trusted-root.d.ts +8 -0
  43. package/dist/bot/russian-trusted-root.d.ts.map +1 -0
  44. package/dist/bot/russian-trusted-root.js +41 -0
  45. package/dist/bot/russian-trusted-root.js.map +1 -0
  46. package/dist/bot/transport.d.ts +41 -0
  47. package/dist/bot/transport.d.ts.map +1 -0
  48. package/dist/bot/transport.js +200 -0
  49. package/dist/bot/transport.js.map +1 -0
  50. package/dist/bot/uploads.d.ts +34 -0
  51. package/dist/bot/uploads.d.ts.map +1 -0
  52. package/dist/bot/uploads.js +122 -0
  53. package/dist/bot/uploads.js.map +1 -0
  54. package/dist/client.d.ts +39 -3
  55. package/dist/client.d.ts.map +1 -1
  56. package/dist/client.js +168 -23
  57. package/dist/client.js.map +1 -1
  58. package/dist/commands/bot-comments.d.ts +4 -0
  59. package/dist/commands/bot-comments.d.ts.map +1 -0
  60. package/dist/commands/bot-comments.js +97 -0
  61. package/dist/commands/bot-comments.js.map +1 -0
  62. package/dist/commands/bot-context.d.ts +27 -0
  63. package/dist/commands/bot-context.d.ts.map +1 -0
  64. package/dist/commands/bot-context.js +82 -0
  65. package/dist/commands/bot-context.js.map +1 -0
  66. package/dist/commands/bot-members.d.ts +12 -0
  67. package/dist/commands/bot-members.d.ts.map +1 -0
  68. package/dist/commands/bot-members.js +136 -0
  69. package/dist/commands/bot-members.js.map +1 -0
  70. package/dist/commands/bot-reads.d.ts +7 -0
  71. package/dist/commands/bot-reads.d.ts.map +1 -0
  72. package/dist/commands/bot-reads.js +145 -0
  73. package/dist/commands/bot-reads.js.map +1 -0
  74. package/dist/commands/bot-sends.d.ts +17 -0
  75. package/dist/commands/bot-sends.d.ts.map +1 -0
  76. package/dist/commands/bot-sends.js +270 -0
  77. package/dist/commands/bot-sends.js.map +1 -0
  78. package/dist/commands/bot-setup.d.ts +5 -0
  79. package/dist/commands/bot-setup.d.ts.map +1 -0
  80. package/dist/commands/bot-setup.js +107 -0
  81. package/dist/commands/bot-setup.js.map +1 -0
  82. package/dist/commands/bot-updates.d.ts +3 -0
  83. package/dist/commands/bot-updates.d.ts.map +1 -0
  84. package/dist/commands/bot-updates.js +182 -0
  85. package/dist/commands/bot-updates.js.map +1 -0
  86. package/dist/commands/bot.d.ts +3 -0
  87. package/dist/commands/bot.d.ts.map +1 -0
  88. package/dist/commands/bot.js +160 -0
  89. package/dist/commands/bot.js.map +1 -0
  90. package/dist/commands/chats.d.ts.map +1 -1
  91. package/dist/commands/chats.js +79 -2
  92. package/dist/commands/chats.js.map +1 -1
  93. package/dist/commands/check.d.ts +8 -0
  94. package/dist/commands/check.d.ts.map +1 -0
  95. package/dist/commands/check.js +64 -0
  96. package/dist/commands/check.js.map +1 -0
  97. package/dist/commands/context.d.ts +15 -1
  98. package/dist/commands/context.d.ts.map +1 -1
  99. package/dist/commands/context.js +5 -1
  100. package/dist/commands/context.js.map +1 -1
  101. package/dist/commands/hearing.d.ts +25 -0
  102. package/dist/commands/hearing.d.ts.map +1 -0
  103. package/dist/commands/hearing.js +41 -0
  104. package/dist/commands/hearing.js.map +1 -0
  105. package/dist/commands/inbox.d.ts.map +1 -1
  106. package/dist/commands/inbox.js +19 -3
  107. package/dist/commands/inbox.js.map +1 -1
  108. package/dist/commands/mcp.d.ts +1 -0
  109. package/dist/commands/mcp.d.ts.map +1 -1
  110. package/dist/commands/mcp.js +7 -4
  111. package/dist/commands/mcp.js.map +1 -1
  112. package/dist/commands/messages.d.ts.map +1 -1
  113. package/dist/commands/messages.js +21 -5
  114. package/dist/commands/messages.js.map +1 -1
  115. package/dist/commands/paging.d.ts +3 -1
  116. package/dist/commands/paging.d.ts.map +1 -1
  117. package/dist/commands/paging.js +4 -1
  118. package/dist/commands/paging.js.map +1 -1
  119. package/dist/commands/review.d.ts.map +1 -1
  120. package/dist/commands/review.js +22 -8
  121. package/dist/commands/review.js.map +1 -1
  122. package/dist/commands/rules.d.ts +7 -0
  123. package/dist/commands/rules.d.ts.map +1 -0
  124. package/dist/commands/rules.js +69 -0
  125. package/dist/commands/rules.js.map +1 -0
  126. package/dist/domain/map.d.ts +6 -1
  127. package/dist/domain/map.d.ts.map +1 -1
  128. package/dist/domain/map.js +34 -1
  129. package/dist/domain/map.js.map +1 -1
  130. package/dist/domain/models.d.ts +55 -0
  131. package/dist/domain/models.d.ts.map +1 -1
  132. package/dist/domain/models.js.map +1 -1
  133. package/dist/generated/client.generated.d.ts +1 -0
  134. package/dist/generated/client.generated.d.ts.map +1 -1
  135. package/dist/generated/client.generated.js +1 -0
  136. package/dist/generated/client.generated.js.map +1 -1
  137. package/dist/generated/opcodes.generated.d.ts +1 -0
  138. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  139. package/dist/generated/opcodes.generated.js +1 -0
  140. package/dist/generated/opcodes.generated.js.map +1 -1
  141. package/dist/generated/operations.generated.d.ts +16 -1
  142. package/dist/generated/operations.generated.d.ts.map +1 -1
  143. package/dist/generated/operations.generated.js +2 -1
  144. package/dist/generated/operations.generated.js.map +1 -1
  145. package/dist/mcp/instructions.d.ts +2 -1
  146. package/dist/mcp/instructions.d.ts.map +1 -1
  147. package/dist/mcp/instructions.js +2 -1
  148. package/dist/mcp/instructions.js.map +1 -1
  149. package/dist/mcp/server.d.ts +2 -1
  150. package/dist/mcp/server.d.ts.map +1 -1
  151. package/dist/mcp/server.js +4 -1
  152. package/dist/mcp/server.js.map +1 -1
  153. package/dist/mcp/tools.d.ts +5 -1
  154. package/dist/mcp/tools.d.ts.map +1 -1
  155. package/dist/mcp/tools.js +160 -13
  156. package/dist/mcp/tools.js.map +1 -1
  157. package/dist/moderation/check.d.ts +98 -0
  158. package/dist/moderation/check.d.ts.map +1 -0
  159. package/dist/moderation/check.js +306 -0
  160. package/dist/moderation/check.js.map +1 -0
  161. package/dist/moderation/rules.d.ts +56 -0
  162. package/dist/moderation/rules.d.ts.map +1 -0
  163. package/dist/moderation/rules.js +138 -0
  164. package/dist/moderation/rules.js.map +1 -0
  165. package/dist/program.d.ts.map +1 -1
  166. package/dist/program.js +18 -3
  167. package/dist/program.js.map +1 -1
  168. package/dist/protocol/connection.d.ts.map +1 -1
  169. package/dist/protocol/connection.js +12 -1
  170. package/dist/protocol/connection.js.map +1 -1
  171. package/dist/review.d.ts +32 -5
  172. package/dist/review.d.ts.map +1 -1
  173. package/dist/review.js +82 -45
  174. package/dist/review.js.map +1 -1
  175. package/dist/sends/journal.d.ts +1 -1
  176. package/dist/sends/journal.d.ts.map +1 -1
  177. package/dist/session/store.d.ts +2 -0
  178. package/dist/session/store.d.ts.map +1 -1
  179. package/dist/session/store.js +2 -0
  180. package/dist/session/store.js.map +1 -1
  181. package/dist/spec/index.d.ts.map +1 -1
  182. package/dist/spec/index.js +2 -1
  183. package/dist/spec/index.js.map +1 -1
  184. package/dist/spec/operations/chats.d.ts +4 -1
  185. package/dist/spec/operations/chats.d.ts.map +1 -1
  186. package/dist/spec/operations/chats.js +10 -4
  187. package/dist/spec/operations/chats.js.map +1 -1
  188. package/dist/spec/operations/messages.d.ts.map +1 -1
  189. package/dist/spec/operations/messages.js +9 -4
  190. package/dist/spec/operations/messages.js.map +1 -1
  191. package/dist/spec/operations/uploads.d.ts +13 -0
  192. package/dist/spec/operations/uploads.d.ts.map +1 -1
  193. package/dist/spec/operations/uploads.js +21 -0
  194. package/dist/spec/operations/uploads.js.map +1 -1
  195. package/dist/transcribe/index.d.ts +36 -1
  196. package/dist/transcribe/index.d.ts.map +1 -1
  197. package/dist/transcribe/index.js +91 -14
  198. package/dist/transcribe/index.js.map +1 -1
  199. package/dist/upload.d.ts +3 -0
  200. package/dist/upload.d.ts.map +1 -1
  201. package/dist/upload.js +13 -7
  202. package/dist/upload.js.map +1 -1
  203. package/dist/version.d.ts +1 -1
  204. package/dist/version.js +1 -1
  205. package/dist/voice.d.ts +9 -0
  206. package/dist/voice.d.ts.map +1 -0
  207. package/dist/voice.js +36 -0
  208. package/dist/voice.js.map +1 -0
  209. package/package.json +17 -6
  210. package/skills/max-cli/SKILL.md +23 -2
@@ -0,0 +1,270 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { CliError } from "@leemour/cli-core";
4
+ import { annotate } from "@leemour/cli-core/commands";
5
+ import { pickChat } from "@leemour/cli-messaging";
6
+ import { newSendId, RecipientList, SendJournal, sendGuard } from "@leemour/cli-messaging/sends";
7
+ import { Command, Option } from "commander";
8
+ import { botOperations } from "../bot/client.js";
9
+ import { checkBody } from "../bot/input.js";
10
+ import { forget, keepSent } from "../bot/keep.js";
11
+ import { BOT_JOURNAL_KINDS } from "../bot/permissions.js";
12
+ import { botsDirectory } from "../bot/registry.js";
13
+ import { plainJson } from "../bot/transport.js";
14
+ import { endpointOf, UPLOAD_TYPES, uploadFile, uploadTypeOf, whenAttachmentReady, } from "../bot/uploads.js";
15
+ import { asFirstWord } from "../profile.js";
16
+ import { assertAllowed, botContext } from "./bot-context.js";
17
+ export const operation = (id) => {
18
+ const found = botOperations.find((candidate) => candidate.id === id);
19
+ if (!found)
20
+ throw new CliError("configuration_error", `the generated manifest has no operation ${id}`);
21
+ return found;
22
+ };
23
+ /** How the owner types this bot, so every refusal names the command that fixes it. */
24
+ const botWords = (profile) => `${asFirstWord(profile)}bot`;
25
+ const files = (profile) => ({
26
+ journal: join(botsDirectory(), "sends", `${profile}.jsonl`),
27
+ recipients: join(botsDirectory(), "recipients", `${profile}.json`),
28
+ });
29
+ const recipientsOf = (context) => new RecipientList(files(context.settings.profile).recipients, `max ${botWords(context.settings.profile)}`);
30
+ /**
31
+ * cli-messaging's guard with the bot's own recipient list and journal. `readOnly` and `allow` are
32
+ * checked before it, with the bot's permission names; a bot has no hourly limit (owner, `NEED-305`).
33
+ */
34
+ const guardOf = (context) => sendGuard({
35
+ profile: botWords(context.settings.profile),
36
+ command: "max",
37
+ readOnly: false,
38
+ readOnlyFrom: "default",
39
+ sendsPerHour: Number.POSITIVE_INFINITY,
40
+ journal: new SendJournal(files(context.settings.profile).journal),
41
+ recipients: recipientsOf(context),
42
+ warn: (message) => context.streams.diagnostic(message),
43
+ });
44
+ const DIGITS = /^-?\d+$/;
45
+ const targetOf = (reference, context) => {
46
+ if (DIGITS.test(reference))
47
+ return { key: reference, query: { chat_id: reference } };
48
+ const user = /^user:(\d+)$/.exec(reference);
49
+ if (user?.[1])
50
+ return { key: reference, query: { user_id: user[1] } };
51
+ const id = pickChat(reference, context.registry.list()).id;
52
+ return { key: id, query: { chat_id: id } };
53
+ };
54
+ /**
55
+ * `UX-14`: a positive number is a person far more often than a chat — group chats are negative —
56
+ * yet a dialog's chat id is positive too, so this is a hint and never a refusal.
57
+ */
58
+ const withPersonHint = (error, reference) => {
59
+ const failure = error;
60
+ if (!/^\d+$/.test(reference) || failure.details?.maxCode !== "chat.not.found" || !failure.code)
61
+ return error;
62
+ return new CliError(failure.code, `${failure.message} — a positive number is usually a person, not a chat: to write to them, use user:${reference}`, failure.details);
63
+ };
64
+ /** Step one through the client, step two to the upload host; the attachment a body carries. */
65
+ export const uploaded = async (context, path, type = uploadTypeOf(path), call = (target, input) => context.authenticated().call(target, input)) => {
66
+ const answer = await call(operation("getUploadUrl"), { query: { type } });
67
+ return uploadFile({
68
+ path,
69
+ type,
70
+ endpoint: endpointOf(answer),
71
+ fetch: context.uploadFetch(),
72
+ ...(context.signal ? { signal: context.signal } : {}),
73
+ ...(context.settings.timeoutMs === undefined ? {} : { timeoutMs: context.settings.timeoutMs }),
74
+ });
75
+ };
76
+ export const textOf = (text) => (text === "-" ? readFileSync(0, "utf8").replace(/\n$/, "") : text);
77
+ /** Runs one write through the guard and the journal, on every outcome. */
78
+ const guarded = async (context, request, body, length) => {
79
+ const guard = guardOf(context);
80
+ const sendId = newSendId();
81
+ const base = {
82
+ chatId: request.chatId,
83
+ kind: request.kind,
84
+ sendId,
85
+ ...(request.action ? { action: request.action } : {}),
86
+ ...(length === undefined ? {} : { length }),
87
+ };
88
+ try {
89
+ guard.check(request);
90
+ }
91
+ catch (error) {
92
+ const code = error.code;
93
+ guard.record({ ...base, outcome: "refused", ...(code ? { errorCode: code } : {}) });
94
+ throw error;
95
+ }
96
+ try {
97
+ const { result, messageId } = await body(sendId);
98
+ guard.record({
99
+ ...base,
100
+ outcome: "sent",
101
+ ...(messageId ? { messageId } : {}),
102
+ ...(request.count ? { count: request.count } : {}),
103
+ });
104
+ return result;
105
+ }
106
+ catch (error) {
107
+ const code = error.code;
108
+ guard.record({
109
+ ...base,
110
+ outcome: code === "outcome_unknown" ? "outcome_unknown" : "failed",
111
+ ...(code ? { errorCode: code } : {}),
112
+ });
113
+ throw error;
114
+ }
115
+ };
116
+ const chatOfMessage = async (context, messageId) => {
117
+ const message = await context.authenticated().message(messageId);
118
+ return message.chatId;
119
+ };
120
+ /**
121
+ * Which chat a write reaches, from its own parameters — the recipient list must hold for
122
+ * `max bot api` as much as for `messages send`, or the raw command is the way around it.
123
+ */
124
+ const chatOfCall = async (context, input) => {
125
+ const chat = input.path?.chatId ?? input.query?.chat_id;
126
+ if (typeof chat === "string")
127
+ return chat;
128
+ const user = input.query?.user_id;
129
+ if (typeof user === "string")
130
+ return `user:${user}`;
131
+ const message = input.path?.messageId ?? input.query?.message_id;
132
+ if (typeof message === "string")
133
+ return chatOfMessage(context, message);
134
+ return null;
135
+ };
136
+ /** Every bot write, from any command: readOnly and allow, then the recipient list and the journal. */
137
+ export const guardedCall = async (context, target, input) => {
138
+ const client = context.authenticated();
139
+ if (target.effect === "read")
140
+ return client.call(target, input);
141
+ assertAllowed(target, context.settings);
142
+ const kind = BOT_JOURNAL_KINDS[target.id];
143
+ if (!kind)
144
+ return client.call(target, input);
145
+ const chatId = await chatOfCall(context, input);
146
+ // The guard names every account change; the bot's own `allow` check has already run in assertAllowed.
147
+ const action = kind === "account" ? { action: "profile" } : {};
148
+ return guarded(context, { chatId, kind, ...action }, async () => ({ result: await client.call(target, input) }));
149
+ };
150
+ export const sendCommands = (messages) => {
151
+ annotate(messages.command("send"), { mutates: true })
152
+ .description("send a message as the bot — to a chat id, `user:<id>`, or the title of a chat it has seen; - reads stdin")
153
+ .argument("<chat>")
154
+ .argument("[text]", "may be left out with --file")
155
+ .addOption(new Option("--format <format>", "how the text is marked up").choices(["markdown", "html"]))
156
+ .option("--reply-to <message>", "answer this message")
157
+ .option("--silent", "no notification for the people in the chat")
158
+ .option("--file <path>", "attach a file from disk: an image, video or audio by its extension, else a file")
159
+ .addOption(new Option("--type <type>", "send --file as this kind instead of guessing").choices(UPLOAD_TYPES))
160
+ .action(async function (chat, text) {
161
+ const context = botContext(this);
162
+ const options = this.opts();
163
+ if (text === undefined && !options.file)
164
+ throw new CliError("validation_error", "nothing to send: give a text or --file");
165
+ const send = operation("sendMessage");
166
+ assertAllowed(send, context.settings);
167
+ const target = targetOf(chat, context);
168
+ const content = text === undefined ? "" : textOf(text);
169
+ const bodyWith = (attachments) => checkBody(send, JSON.stringify({
170
+ ...(content ? { text: content } : {}),
171
+ ...(attachments ? { attachments } : {}),
172
+ ...(options.format ? { format: options.format } : {}),
173
+ ...(options.silent ? { notify: false } : {}),
174
+ ...(options.replyTo ? { link: { type: "reply", mid: options.replyTo } } : {}),
175
+ }));
176
+ const client = context.authenticated();
177
+ const sent = await guarded(context, { chatId: target.key, kind: "message" }, async () => {
178
+ const attachment = options.file ? await uploaded(context, options.file, options.type) : undefined;
179
+ const body = bodyWith(attachment ? [attachment] : undefined);
180
+ const answer = (await whenAttachmentReady(() => client.call(send, { query: target.query, ...(body ? { body } : {}) }), context.signal));
181
+ const message = answer?.message ? { ...client.decodeMessage(answer.message), outgoing: true } : undefined;
182
+ return { result: message ?? plainJson(answer), ...(message ? { messageId: message.id } : {}) };
183
+ }, content.length).catch((error) => {
184
+ throw withPersonHint(error, chat);
185
+ });
186
+ const recipientChat = sent.chatId;
187
+ if (recipientChat && DIGITS.test(recipientChat))
188
+ context.registry.observe([{ id: recipientChat }]);
189
+ await keepSent(context.registry, sent, context.streams.diagnostic);
190
+ context.renderer.result(sent);
191
+ });
192
+ annotate(messages.command("edit"), { mutates: true })
193
+ .description("replace the text of a message the bot sent; - reads stdin")
194
+ .argument("<message>")
195
+ .argument("<text>")
196
+ .addOption(new Option("--format <format>", "how the text is marked up").choices(["markdown", "html"]))
197
+ .action(async function (messageId, text) {
198
+ const context = botContext(this);
199
+ const edit = operation("editMessage");
200
+ assertAllowed(edit, context.settings);
201
+ const content = textOf(text);
202
+ const format = this.opts().format;
203
+ const body = checkBody(edit, JSON.stringify({ text: content, ...(format ? { format } : {}) }));
204
+ const chatId = await chatOfMessage(context, messageId);
205
+ const answer = await guarded(context, { chatId, kind: "edit" }, async () => ({
206
+ result: plainJson(await context.authenticated().call(edit, { query: { message_id: messageId }, ...(body ? { body } : {}) })),
207
+ messageId,
208
+ }), content.length);
209
+ context.renderer.result(answer ?? { success: true });
210
+ });
211
+ annotate(messages.command("delete"), { mutates: true })
212
+ .description("delete a message in a chat the bot can delete in")
213
+ .argument("<message>")
214
+ .action(async function (messageId) {
215
+ const context = botContext(this);
216
+ const remove = operation("deleteMessage");
217
+ assertAllowed(remove, context.settings);
218
+ const chatId = await chatOfMessage(context, messageId);
219
+ const answer = await guarded(context, { chatId, kind: "delete", count: 1 }, async () => ({
220
+ result: plainJson(await context.authenticated().call(remove, { query: { message_id: messageId } })),
221
+ messageId,
222
+ }));
223
+ const botId = context.registry.botId();
224
+ if (botId)
225
+ await forget(botId, [{ chatId, messageId }], context.streams.diagnostic);
226
+ context.renderer.result(answer ?? { success: true });
227
+ });
228
+ };
229
+ export const recipientsCommand = () => {
230
+ const command = new Command("recipients").description("the chats this bot may write to; with no list, every chat — `off` removes the list");
231
+ command
232
+ .command("list")
233
+ .description("the chats on the list, or nothing when there is no list")
234
+ .action(function () {
235
+ const context = botContext(this);
236
+ context.renderer.result(recipientsOf(context).read() ?? []);
237
+ });
238
+ command
239
+ .command("add <chat>")
240
+ .description("allow a chat: its id, `user:<id>`, or the title of a chat this bot has seen")
241
+ .action(function (chat) {
242
+ const context = botContext(this);
243
+ const target = targetOf(chat, context);
244
+ const title = context.registry.list().find((seen) => seen.id === target.key)?.title ?? null;
245
+ recipientsOf(context).add({ id: target.key, title, addedAt: new Date().toISOString() });
246
+ context.renderer.result(recipientsOf(context).read() ?? []);
247
+ });
248
+ command
249
+ .command("remove <chat>")
250
+ .description("take a chat off the list")
251
+ .action(function (chat) {
252
+ const context = botContext(this);
253
+ context.renderer.result({ removed: recipientsOf(context).remove(chat) ?? null });
254
+ });
255
+ command
256
+ .command("off")
257
+ .description("remove the list: the bot may write to any chat again")
258
+ .action(function () {
259
+ const context = botContext(this);
260
+ context.renderer.result({ removed: recipientsOf(context).off() });
261
+ });
262
+ return command;
263
+ };
264
+ export const sendsCommand = () => new Command("sends")
265
+ .description("what this bot sent, edited and deleted from this machine — ids and outcomes, never text")
266
+ .addCommand(new Command("list").action(function () {
267
+ const context = botContext(this);
268
+ context.renderer.result(new SendJournal(files(context.settings.profile).journal).entries());
269
+ }));
270
+ //# sourceMappingURL=bot-sends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-sends.js","sourceRoot":"","sources":["../../src/commands/bot-sends.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAwC,MAAM,mBAAmB,CAAA;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAiB,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAC9G,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAkB,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EACL,UAAU,EACV,YAAY,EAEZ,UAAU,EACV,YAAY,EACZ,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI5D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACpE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,2CAA2C,EAAE,EAAE,CAAC,CAAA;IACtG,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,sFAAsF;AACtF,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAA;AAE1E,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,QAAQ,CAAC;IAC3D,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,OAAO,CAAC;CACnE,CAAC,CAAA;AAEF,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAE,CACxC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAE5G;;;GAGG;AACH,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAE,EAAE,CACnC,SAAS,CAAC;IACR,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC3C,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,MAAM,CAAC,iBAAiB;IACtC,OAAO,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IACjE,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC;IACjC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;CACvD,CAAC,CAAA;AAEJ,MAAM,MAAM,GAAG,SAAS,CAAA;AAQxB,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,OAAgB,EAAU,EAAE;IAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAA;IACpF,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3C,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;IAC1D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAA;AAC5C,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,SAAiB,EAAW,EAAE;IACpE,MAAM,OAAO,GAAG,KAAiG,CAAA;IACjH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,KAAK,gBAAgB,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC5G,OAAO,IAAI,QAAQ,CACjB,OAAO,CAAC,IAAI,EACZ,GAAG,OAAO,CAAC,OAAO,oFAAoF,SAAS,EAAE,EACjH,OAAO,CAAC,OAAO,CAChB,CAAA;AACH,CAAC,CAAA;AAED,+FAA+F;AAC/F,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAgB,EAChB,IAAY,EACZ,IAAI,GAAe,YAAY,CAAC,IAAI,CAAC,EACrC,IAAI,GAAsE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAC1F,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAC7C,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACzE,OAAO,UAAU,CAAC;QAChB,IAAI;QACJ,IAAI;QACJ,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE;QAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;KAC/F,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAElH,0EAA0E;AAC1E,MAAM,OAAO,GAAG,KAAK,EACnB,OAAgB,EAChB,OAAsF,EACtF,IAAoE,EACpE,MAAe,EACH,EAAE;IACd,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM;QACN,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAA;IACD,IAAI,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAA;QAC9C,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACnF,MAAM,KAAK,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;QAChD,KAAK,CAAC,MAAM,CAAC;YACX,GAAG,IAAI;YACP,OAAO,EAAE,MAAM;YACf,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAA;QAC9C,KAAK,CAAC,MAAM,CAAC;YACX,GAAG,IAAI;YACP,OAAO,EAAE,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ;YAClE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EAAE,OAAgB,EAAE,SAAiB,EAAmB,EAAE;IACnF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAChE,OAAO,OAAO,CAAC,MAAM,CAAA;AACvB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,GAAG,KAAK,EAAE,OAAgB,EAAE,KAAgB,EAA0B,EAAE;IACtF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,CAAA;IACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,CAAA;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,IAAI,EAAE,CAAA;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,CAAA;IAChE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACvE,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,OAAgB,EAAE,MAAyB,EAAE,KAAgB,EAAoB,EAAE;IACnH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAA;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/D,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC/C,sGAAsG;IACtG,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AAClH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAiB,EAAQ,EAAE;IACtD,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAClD,WAAW,CACV,0GAA0G,CAC3G;SACA,QAAQ,CAAC,QAAQ,CAAC;SAClB,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;SACrG,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;SACrD,MAAM,CAAC,UAAU,EAAE,4CAA4C,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,iFAAiF,CAAC;SAC1G,SAAS,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SAC5G,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,IAAwB;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAMrB,CAAA;QACJ,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI;YACrC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,wCAAwC,CAAC,CAAA;QAClF,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,CAAC,WAAuB,EAAE,EAAE,CAC3C,SAAS,CACP,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC,CACH,CAAA;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EACvC,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACjG,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAG,CAAC,MAAM,mBAAmB,CACvC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,OAAO,CAAC,MAAM,CACf,CAAiC,CAAA;YAClC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;YACzG,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAChG,CAAC,EACD,OAAO,CAAC,MAAM,CACf,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACzB,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,MAAM,aAAa,GAAI,IAA4B,CAAC,MAAM,CAAA;QAC1D,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;QAClG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAClD,WAAW,CAAC,2DAA2D,CAAC;SACxE,QAAQ,CAAC,WAAW,CAAC;SACrB,QAAQ,CAAC,QAAQ,CAAC;SAClB,SAAS,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;SACrG,MAAM,CAAC,KAAK,WAA0B,SAAiB,EAAE,IAAY;QACpE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAuB,CAAC,MAAM,CAAA;QACtD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9F,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,OAAO,EACP,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EACxB,KAAK,IAAI,EAAE,CAAC,CAAC;YACX,MAAM,EAAE,SAAS,CACf,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC1G;YACD,SAAS;SACV,CAAC,EACF,OAAO,CAAC,MAAM,CACf,CAAA;QACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACpD,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,WAAW,CAAC;SACrB,MAAM,CAAC,KAAK,WAA0B,SAAiB;QACtD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,CAAA;QACzC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACvF,MAAM,EAAE,SAAS,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACnG,SAAS;SACV,CAAC,CAAC,CAAA;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QACtC,IAAI,KAAK;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAY,EAAE;IAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CACnD,oFAAoF,CACrF,CAAA;IACD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IACJ,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,6EAA6E,CAAC;SAC1F,MAAM,CAAC,UAAyB,IAAY;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAA;QAC3F,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QACvF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IACJ,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,UAAyB,IAAY;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAClF,CAAC,CAAC,CAAA;IACJ,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC;QACN,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IACJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE,CACxC,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,yFAAyF,CAAC;KACtG,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;AAC7F,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ export declare const menuCommand: () => Command;
3
+ export declare const uploadsCommand: () => Command;
4
+ export declare const webhooksCommand: () => Command;
5
+ //# sourceMappingURL=bot-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-setup.d.ts","sourceRoot":"","sources":["../../src/commands/bot-setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAe3C,eAAO,MAAM,WAAW,QAAO,OA+B9B,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,OAmBjC,CAAA;AAWD,eAAO,MAAM,eAAe,QAAO,OAyDlC,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { annotate } from "@leemour/cli-core/commands";
3
+ import { Command, Option } from "commander";
4
+ import { plainJson } from "../bot/transport.js";
5
+ import { UPLOAD_TYPES } from "../bot/uploads.js";
6
+ import { assertAllowed, botContext } from "./bot-context.js";
7
+ import { checked } from "./bot-members.js";
8
+ import { guardedCall, operation, uploaded } from "./bot-sends.js";
9
+ const commandOf = (entry) => {
10
+ const split = entry.indexOf("=");
11
+ const name = (split === -1 ? entry : entry.slice(0, split)).replace(/^\//, "").trim();
12
+ const description = split === -1 ? "" : entry.slice(split + 1).trim();
13
+ if (!name)
14
+ throw new CliError("validation_error", `a command is name=description, not ${entry}`);
15
+ return description ? { name, description } : { name };
16
+ };
17
+ export const menuCommand = () => {
18
+ const command = new Command("commands").description("the bot's command menu — what people see after /");
19
+ command
20
+ .command("list")
21
+ .description("the commands in the menu now")
22
+ .action(async function () {
23
+ const context = botContext(this);
24
+ context.renderer.result(plainJson((await context.authenticated().me()).commands ?? []));
25
+ });
26
+ const edit = async (context, commands) => {
27
+ const answer = await guardedCall(context, operation("editMyCommands"), {
28
+ body: checked("editMyCommands", JSON.stringify({ commands })),
29
+ });
30
+ context.renderer.result(plainJson(answer) ?? { success: true });
31
+ };
32
+ annotate(command.command("set <commands...>"), { mutates: true })
33
+ .description("replace the whole menu: each command as name=description, e.g. start=Начать")
34
+ .action(async function (entries) {
35
+ await edit(botContext(this), entries.map(commandOf));
36
+ });
37
+ annotate(command.command("clear"), { mutates: true })
38
+ .description("empty the menu")
39
+ .action(async function () {
40
+ await edit(botContext(this), []);
41
+ });
42
+ return command;
43
+ };
44
+ export const uploadsCommand = () => {
45
+ const command = new Command("uploads").description("files uploaded to MAX, to attach to a message");
46
+ annotate(command.command("put <file>"), { mutates: true })
47
+ .description("upload a file from disk and print the attachment to put in a message's `attachments` — " +
48
+ "`messages send --file` does both steps at once")
49
+ .addOption(new Option("--type <type>", "upload as this kind instead of guessing by extension").choices(UPLOAD_TYPES))
50
+ .action(async function (file) {
51
+ const context = botContext(this);
52
+ const type = this.opts().type;
53
+ const attachment = await uploaded(context, file, type, (target, input) => guardedCall(context, target, input));
54
+ context.renderer.result(attachment);
55
+ });
56
+ return command;
57
+ };
58
+ const subscriptionsOf = async (context) => {
59
+ const answer = plainJson(await context.authenticated().call(operation("getSubscriptions"), {}));
60
+ return answer?.subscriptions ?? [];
61
+ };
62
+ export const webhooksCommand = () => {
63
+ const command = new Command("webhooks").description("where MAX pushes this bot's updates — while one is set, the bot cannot read updates by polling");
64
+ command
65
+ .command("list")
66
+ .description("the webhooks this bot has")
67
+ .action(async function () {
68
+ const context = botContext(this);
69
+ context.renderer.result(await subscriptionsOf(context));
70
+ });
71
+ annotate(command.command("set <url>"), { mutates: true })
72
+ .description("send this bot's updates to an HTTPS URL on port 443 — a new URL does not replace an old one, " +
73
+ "so every update would arrive twice; refused while another is set, unless --add")
74
+ .option("--types <types>", "only these update types, a comma list (message_created,bot_started,…)")
75
+ .option("--secret-stdin", "a secret MAX sends back in X-Max-Bot-Api-Secret — asked for, or read from a pipe")
76
+ .option("--add", "keep the webhooks already set and add this one beside them")
77
+ .action(async function (url) {
78
+ const context = botContext(this);
79
+ const options = this.opts();
80
+ assertAllowed(operation("subscribe"), context.settings);
81
+ const others = (await subscriptionsOf(context)).filter((one) => one.url !== url);
82
+ if (others.length > 0 && !options.add) {
83
+ throw new CliError("confirmation_required", `this bot already sends its updates to ${others.map((one) => one.url).join(", ")}; a second webhook ` +
84
+ "gets every update twice — remove the old one with `webhooks delete <url>`, or give --add");
85
+ }
86
+ const secret = options.secretStdin ? (await context.ask("Webhook secret: ", { secret: true })).trim() : undefined;
87
+ if (options.secretStdin && !secret)
88
+ throw new CliError("validation_error", "no secret given");
89
+ const types = options.types
90
+ ?.split(",")
91
+ .map((one) => one.trim())
92
+ .filter(Boolean);
93
+ await guardedCall(context, operation("subscribe"), {
94
+ body: checked("subscribe", JSON.stringify({ url, ...(secret ? { secret } : {}), ...(types?.length ? { update_types: types } : {}) })),
95
+ });
96
+ context.renderer.result(await subscriptionsOf(context));
97
+ });
98
+ annotate(command.command("delete <url>"), { mutates: true })
99
+ .description("stop sending updates to this URL; with none left, the bot can poll again")
100
+ .action(async function (url) {
101
+ const context = botContext(this);
102
+ await guardedCall(context, operation("unsubscribe"), { query: { url } });
103
+ context.renderer.result(await subscriptionsOf(context));
104
+ });
105
+ return command;
106
+ };
107
+ //# sourceMappingURL=bot-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-setup.js","sourceRoot":"","sources":["../../src/commands/bot-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const updatesCommand: () => Command;
3
+ //# sourceMappingURL=bot-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-updates.d.ts","sourceRoot":"","sources":["../../src/commands/bot-updates.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyHnC,eAAO,MAAM,cAAc,QAAO,OA2EjC,CAAA"}
@@ -0,0 +1,182 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { CliError, writeSecurely } from "@leemour/cli-core";
4
+ import { annotate } from "@leemour/cli-core/commands";
5
+ import { renderMessages } from "@leemour/cli-messaging";
6
+ import { Command } from "commander";
7
+ import { botOperations } from "../bot/client.js";
8
+ import { forget, keep, PROVIDER } from "../bot/keep.js";
9
+ import { botsDirectory } from "../bot/registry.js";
10
+ import { plainJson } from "../bot/transport.js";
11
+ import { asFirstWord } from "../profile.js";
12
+ import { assertAllowed, botContext } from "./bot-context.js";
13
+ const POLL_SECONDS = 30;
14
+ const FIRST_WAIT_MS = 1_000;
15
+ const LONGEST_WAIT_MS = 60_000;
16
+ /** Waiting cannot help these: the token, the profile's rules or the request itself is wrong. */
17
+ const FINAL = new Set(["authentication_error", "permission_error", "validation_error", "configuration_error"]);
18
+ const CHAT_ID = /^-?\d+$/;
19
+ const operation = (id) => {
20
+ const found = botOperations.find((candidate) => candidate.id === id);
21
+ if (!found)
22
+ throw new CliError("configuration_error", `the generated manifest has no operation ${id}`);
23
+ return found;
24
+ };
25
+ /**
26
+ * Where the next `getUpdates` starts. State, not cache: passing a marker commits everything before
27
+ * it for every reader of this bot, so losing it means printing a batch twice, never losing one.
28
+ */
29
+ const markerFile = (profile) => ({
30
+ path: join(botsDirectory(), "updates", `${profile}.json`),
31
+ read() {
32
+ if (!existsSync(this.path))
33
+ return undefined;
34
+ try {
35
+ const { marker } = JSON.parse(readFileSync(this.path, "utf8"));
36
+ return typeof marker === "string" ? marker : undefined;
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ },
42
+ write(marker) {
43
+ writeSecurely(this.path, `${JSON.stringify({ marker })}\n`, 0o600);
44
+ },
45
+ });
46
+ /**
47
+ * Envelope first, so an update type newer than the committed schema is printed as it came rather
48
+ * than failing the batch (`RISK-51`); a message inside goes through the same fallback as a read.
49
+ */
50
+ const decode = (raw, client, self) => {
51
+ const update = plainJson(raw);
52
+ const inner = raw?.message;
53
+ const message = inner ? client.decodeMessage(inner, self) : undefined;
54
+ const chatId = message?.chatId ?? (update.chat_id === undefined ? undefined : String(update.chat_id));
55
+ return {
56
+ type: String(update.update_type ?? "unknown"),
57
+ line: message ? { ...update, message } : update,
58
+ ...(message ? { message } : {}),
59
+ ...(chatId && CHAT_ID.test(chatId) ? { chatId } : {}),
60
+ ...(update.update_type === "message_removed" && chatId && typeof update.message_id === "string"
61
+ ? { removal: { chatId, messageId: update.message_id } }
62
+ : {}),
63
+ };
64
+ };
65
+ const pause = (ms, signal) => new Promise((resolve) => {
66
+ const timer = setTimeout(done, ms);
67
+ function done() {
68
+ clearTimeout(timer);
69
+ signal.removeEventListener("abort", done);
70
+ resolve();
71
+ }
72
+ signal.addEventListener("abort", done, { once: true });
73
+ });
74
+ const refuseWebhook = async (context, client) => {
75
+ const answer = plainJson(await client.call(operation("getSubscriptions"), {}));
76
+ if (!answer?.subscriptions?.length)
77
+ return;
78
+ throw new CliError("validation_error", "this bot gets its updates by webhook, and MAX gives long polling nothing while one is set — " +
79
+ `\`max ${asFirstWord(context.settings.profile)}bot api get-subscriptions\` shows it`);
80
+ };
81
+ const print = (context, update) => {
82
+ if (context.format !== "pretty") {
83
+ context.streams.data(JSON.stringify(update.line));
84
+ return;
85
+ }
86
+ if (update.type === "message_callback") {
87
+ const callback = (update.line.callback ?? {});
88
+ const who = typeof callback.user?.first_name === "string" ? ` from ${callback.user.first_name}` : "";
89
+ context.streams.data(`button pressed${who}${update.chatId ? ` in ${update.chatId}` : ""}: ${String(callback.payload ?? "")}\n`);
90
+ return;
91
+ }
92
+ if (update.message) {
93
+ const edited = update.type === "message_edited" ? "edited:\n" : "";
94
+ context.streams.data(edited +
95
+ renderMessages([update.message], {
96
+ verbosity: context.settings.detail,
97
+ color: context.color,
98
+ profile: context.settings.profile,
99
+ provider: PROVIDER,
100
+ }));
101
+ return;
102
+ }
103
+ context.streams.data(`${update.type}${update.chatId ? ` in ${update.chatId}` : ""}\n`);
104
+ };
105
+ export const updatesCommand = () => {
106
+ const command = new Command("updates").description("what happens in this bot's chats, as MAX reports it");
107
+ // A write only because every poll commits the marker for any other reader of this bot (S-9).
108
+ annotate(command.command("watch"), { mutates: true })
109
+ .description("print updates as they arrive and keep their messages, until Ctrl-C — refused while a webhook is set")
110
+ .option("--types <types>", "only these, comma separated: message_created,message_edited,bot_added,…")
111
+ .action(async function (options) {
112
+ const context = botContext(this);
113
+ const getUpdates = operation("getUpdates");
114
+ assertAllowed(getUpdates, context.settings);
115
+ const stop = new AbortController();
116
+ const end = () => stop.abort();
117
+ process.once("SIGINT", end);
118
+ process.once("SIGTERM", end);
119
+ try {
120
+ const client = context.authenticated(stop.signal);
121
+ const self = (await client.me()).user_id;
122
+ context.registry.rememberBot(self);
123
+ await refuseWebhook(context, client);
124
+ const markers = markerFile(context.settings.profile);
125
+ let marker = markers.read();
126
+ let failures = 0;
127
+ const wait = async (reason) => {
128
+ failures += 1;
129
+ const ms = Math.min(LONGEST_WAIT_MS, FIRST_WAIT_MS * 2 ** (failures - 1));
130
+ context.streams.diagnostic(`${reason} — trying again in ${Math.round(ms / 1000)} s`);
131
+ await pause(ms, stop.signal);
132
+ };
133
+ while (!stop.signal.aborted) {
134
+ let page;
135
+ try {
136
+ page = (await client.call(getUpdates, {
137
+ query: {
138
+ timeout: String(POLL_SECONDS),
139
+ ...(marker ? { marker } : {}),
140
+ ...(options.types ? { types: options.types } : {}),
141
+ },
142
+ }));
143
+ }
144
+ catch (error) {
145
+ if (stop.signal.aborted)
146
+ break;
147
+ const code = error.code;
148
+ if (code && FINAL.has(code))
149
+ throw error;
150
+ await wait(`MAX did not answer getUpdates (${code ?? "unknown"})`);
151
+ continue;
152
+ }
153
+ const updates = (page?.updates ?? []).map((raw) => decode(raw, client, self));
154
+ const messages = updates.flatMap((update) => (update.message ? [update.message] : []));
155
+ const removals = updates.flatMap((update) => (update.removal ? [update.removal] : []));
156
+ const kept = (await keep(self, messages, "update", context.streams.diagnostic)) &&
157
+ (await forget(self, removals, context.streams.diagnostic));
158
+ // Not printed, and the marker not moved: the next poll with the same marker gets this batch again.
159
+ if (!kept) {
160
+ await wait("the updates were not kept");
161
+ continue;
162
+ }
163
+ failures = 0;
164
+ for (const update of updates)
165
+ print(context, update);
166
+ const seen = [...new Set(updates.flatMap((update) => (update.chatId ? [update.chatId] : [])))];
167
+ context.registry.observe(seen.map((id) => ({ id })));
168
+ const next = plainJson(page)?.marker;
169
+ if (next !== undefined && next !== null && String(next) !== marker) {
170
+ marker = String(next);
171
+ markers.write(marker);
172
+ }
173
+ }
174
+ }
175
+ finally {
176
+ process.off("SIGINT", end);
177
+ process.off("SIGTERM", end);
178
+ }
179
+ });
180
+ return command;
181
+ };
182
+ //# sourceMappingURL=bot-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-updates.js","sourceRoot":"","sources":["../../src/commands/bot-updates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const botCommand: () => Command;
3
+ //# sourceMappingURL=bot.d.ts.map