@leemour/cli-messaging 0.96.0 → 0.98.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 (203) hide show
  1. package/README.md +11 -3
  2. package/dist/cli/bot/admins.d.ts +10 -0
  3. package/dist/cli/bot/admins.d.ts.map +1 -0
  4. package/dist/cli/bot/admins.js +114 -0
  5. package/dist/cli/bot/admins.js.map +1 -0
  6. package/dist/cli/bot/command.d.ts +1 -1
  7. package/dist/cli/bot/command.d.ts.map +1 -1
  8. package/dist/cli/bot/command.js +60 -23
  9. package/dist/cli/bot/command.js.map +1 -1
  10. package/dist/cli/bot/context.d.ts +19 -1
  11. package/dist/cli/bot/context.d.ts.map +1 -1
  12. package/dist/cli/bot/context.js +44 -3
  13. package/dist/cli/bot/context.js.map +1 -1
  14. package/dist/cli/bot/copy.d.ts +19 -0
  15. package/dist/cli/bot/copy.d.ts.map +1 -0
  16. package/dist/cli/bot/copy.js +85 -0
  17. package/dist/cli/bot/copy.js.map +1 -0
  18. package/dist/cli/bot/messages.d.ts +10 -0
  19. package/dist/cli/bot/messages.d.ts.map +1 -0
  20. package/dist/cli/bot/messages.js +252 -0
  21. package/dist/cli/bot/messages.js.map +1 -0
  22. package/dist/cli/bot/port.d.ts +83 -5
  23. package/dist/cli/bot/port.d.ts.map +1 -1
  24. package/dist/cli/bot/port.js +2 -1
  25. package/dist/cli/bot/port.js.map +1 -1
  26. package/dist/cli/config-command.js +1 -1
  27. package/dist/cli/config-command.js.map +1 -1
  28. package/dist/cli/deadline.d.ts.map +1 -1
  29. package/dist/cli/deadline.js +11 -2
  30. package/dist/cli/deadline.js.map +1 -1
  31. package/dist/cli/index.d.ts +6 -2
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +4 -0
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/messenger/admin-moderation-command.js +2 -2
  36. package/dist/cli/messenger/admin-moderation-command.js.map +1 -1
  37. package/dist/cli/messenger/ask.d.ts.map +1 -1
  38. package/dist/cli/messenger/ask.js +1 -1
  39. package/dist/cli/messenger/ask.js.map +1 -1
  40. package/dist/cli/messenger/context.d.ts +18 -2
  41. package/dist/cli/messenger/context.d.ts.map +1 -1
  42. package/dist/cli/messenger/context.js +30 -8
  43. package/dist/cli/messenger/context.js.map +1 -1
  44. package/dist/cli/messenger/download-command.d.ts.map +1 -1
  45. package/dist/cli/messenger/download-command.js +97 -30
  46. package/dist/cli/messenger/download-command.js.map +1 -1
  47. package/dist/cli/messenger/guard-commands.js +3 -3
  48. package/dist/cli/messenger/guard-commands.js.map +1 -1
  49. package/dist/cli/messenger/port.d.ts +12 -1
  50. package/dist/cli/messenger/port.d.ts.map +1 -1
  51. package/dist/cli/messenger/port.js.map +1 -1
  52. package/dist/cli/messenger/stored.d.ts +3 -2
  53. package/dist/cli/messenger/stored.d.ts.map +1 -1
  54. package/dist/cli/messenger/stored.js +34 -4
  55. package/dist/cli/messenger/stored.js.map +1 -1
  56. package/dist/cli/messenger/watch-command.d.ts +2 -1
  57. package/dist/cli/messenger/watch-command.d.ts.map +1 -1
  58. package/dist/cli/messenger/watch-command.js +11 -2
  59. package/dist/cli/messenger/watch-command.js.map +1 -1
  60. package/dist/domain/capabilities.d.ts +3 -0
  61. package/dist/domain/capabilities.d.ts.map +1 -1
  62. package/dist/kit/contract.d.ts +37 -0
  63. package/dist/kit/contract.d.ts.map +1 -0
  64. package/dist/kit/contract.js +408 -0
  65. package/dist/kit/contract.js.map +1 -0
  66. package/dist/kit/fake.d.ts +16 -0
  67. package/dist/kit/fake.d.ts.map +1 -0
  68. package/dist/kit/fake.js +457 -0
  69. package/dist/kit/fake.js.map +1 -0
  70. package/dist/kit/index.d.ts +4 -0
  71. package/dist/kit/index.d.ts.map +1 -0
  72. package/dist/kit/index.js +4 -0
  73. package/dist/kit/index.js.map +1 -0
  74. package/dist/kit/seed.d.ts +38 -0
  75. package/dist/kit/seed.d.ts.map +1 -0
  76. package/dist/kit/seed.js +83 -0
  77. package/dist/kit/seed.js.map +1 -0
  78. package/dist/mcp/resources.d.ts +6 -1
  79. package/dist/mcp/resources.d.ts.map +1 -1
  80. package/dist/mcp/resources.js +14 -5
  81. package/dist/mcp/resources.js.map +1 -1
  82. package/dist/mcp/server.d.ts.map +1 -1
  83. package/dist/mcp/server.js +3 -0
  84. package/dist/mcp/server.js.map +1 -1
  85. package/dist/mcp/tool.d.ts +12 -2
  86. package/dist/mcp/tool.d.ts.map +1 -1
  87. package/dist/mcp/tool.js +15 -8
  88. package/dist/mcp/tool.js.map +1 -1
  89. package/dist/mcp/tools/chats.js +3 -3
  90. package/dist/mcp/tools/chats.js.map +1 -1
  91. package/dist/mcp/tools/contacts.js +3 -3
  92. package/dist/mcp/tools/contacts.js.map +1 -1
  93. package/dist/mcp/tools/inbox.d.ts.map +1 -1
  94. package/dist/mcp/tools/inbox.js +3 -4
  95. package/dist/mcp/tools/inbox.js.map +1 -1
  96. package/dist/mcp/tools/messages.d.ts.map +1 -1
  97. package/dist/mcp/tools/messages.js +5 -8
  98. package/dist/mcp/tools/messages.js.map +1 -1
  99. package/dist/mcp/tools/review.d.ts.map +1 -1
  100. package/dist/mcp/tools/review.js +3 -4
  101. package/dist/mcp/tools/review.js.map +1 -1
  102. package/dist/moderation/check.d.ts +3 -1
  103. package/dist/moderation/check.d.ts.map +1 -1
  104. package/dist/moderation/check.js +3 -2
  105. package/dist/moderation/check.js.map +1 -1
  106. package/dist/parity/audit.d.ts +11 -9
  107. package/dist/parity/audit.d.ts.map +1 -1
  108. package/dist/parity/audit.js +63 -46
  109. package/dist/parity/audit.js.map +1 -1
  110. package/dist/parity/bin.js +17 -8
  111. package/dist/parity/bin.js.map +1 -1
  112. package/dist/parity/catalogue.d.ts.map +1 -1
  113. package/dist/parity/catalogue.js +7 -1
  114. package/dist/parity/catalogue.js.map +1 -1
  115. package/dist/parity/manifest.d.ts +19 -12
  116. package/dist/parity/manifest.d.ts.map +1 -1
  117. package/dist/parity/manifest.js +60 -37
  118. package/dist/parity/manifest.js.map +1 -1
  119. package/dist/parity/pages.d.ts +3 -3
  120. package/dist/parity/pages.d.ts.map +1 -1
  121. package/dist/parity/pages.js +4 -5
  122. package/dist/parity/pages.js.map +1 -1
  123. package/dist/parity/seed.d.ts +11 -0
  124. package/dist/parity/seed.d.ts.map +1 -0
  125. package/dist/parity/seed.js +99 -0
  126. package/dist/parity/seed.js.map +1 -0
  127. package/dist/parity/wording.d.ts +4 -3
  128. package/dist/parity/wording.d.ts.map +1 -1
  129. package/dist/parity/wording.js +21 -10
  130. package/dist/parity/wording.js.map +1 -1
  131. package/dist/search/correct.d.ts +25 -0
  132. package/dist/search/correct.d.ts.map +1 -0
  133. package/dist/search/correct.js +65 -0
  134. package/dist/search/correct.js.map +1 -0
  135. package/dist/search/query.d.ts +5 -2
  136. package/dist/search/query.d.ts.map +1 -1
  137. package/dist/search/query.js +5 -4
  138. package/dist/search/query.js.map +1 -1
  139. package/dist/search/search.d.ts +27 -0
  140. package/dist/search/search.d.ts.map +1 -0
  141. package/dist/search/search.js +65 -0
  142. package/dist/search/search.js.map +1 -0
  143. package/dist/sends/guarded.d.ts +12 -0
  144. package/dist/sends/guarded.d.ts.map +1 -1
  145. package/dist/sends/guarded.js +24 -2
  146. package/dist/sends/guarded.js.map +1 -1
  147. package/dist/services/archive.d.ts +8 -3
  148. package/dist/services/archive.d.ts.map +1 -1
  149. package/dist/services/archive.js +21 -2
  150. package/dist/services/archive.js.map +1 -1
  151. package/dist/services/chats.d.ts.map +1 -1
  152. package/dist/services/chats.js +11 -7
  153. package/dist/services/chats.js.map +1 -1
  154. package/dist/services/deps.d.ts +13 -0
  155. package/dist/services/deps.d.ts.map +1 -1
  156. package/dist/services/deps.js +12 -0
  157. package/dist/services/deps.js.map +1 -1
  158. package/dist/services/inbox.d.ts +13 -3
  159. package/dist/services/inbox.d.ts.map +1 -1
  160. package/dist/services/inbox.js +45 -15
  161. package/dist/services/inbox.js.map +1 -1
  162. package/dist/services/messages.d.ts +9 -2
  163. package/dist/services/messages.d.ts.map +1 -1
  164. package/dist/services/messages.js +27 -4
  165. package/dist/services/messages.js.map +1 -1
  166. package/dist/services/moderation.d.ts.map +1 -1
  167. package/dist/services/moderation.js +7 -1
  168. package/dist/services/moderation.js.map +1 -1
  169. package/dist/services/people.d.ts.map +1 -1
  170. package/dist/services/people.js +5 -4
  171. package/dist/services/people.js.map +1 -1
  172. package/dist/speech/hearing.d.ts +1 -1
  173. package/dist/speech/hearing.d.ts.map +1 -1
  174. package/dist/speech/hearing.js +2 -2
  175. package/dist/speech/hearing.js.map +1 -1
  176. package/dist/store/index.d.ts +1 -1
  177. package/dist/store/index.d.ts.map +1 -1
  178. package/dist/store/index.js.map +1 -1
  179. package/dist/store/sqlite/completeness.d.ts +17 -0
  180. package/dist/store/sqlite/completeness.d.ts.map +1 -0
  181. package/dist/store/sqlite/completeness.js +30 -0
  182. package/dist/store/sqlite/completeness.js.map +1 -0
  183. package/dist/store/sqlite/messages.d.ts +2 -2
  184. package/dist/store/sqlite/messages.d.ts.map +1 -1
  185. package/dist/store/sqlite/messages.js +14 -2
  186. package/dist/store/sqlite/messages.js.map +1 -1
  187. package/dist/store/sqlite/search-index.d.ts.map +1 -1
  188. package/dist/store/sqlite/search-index.js +45 -9
  189. package/dist/store/sqlite/search-index.js.map +1 -1
  190. package/dist/store/sqlite/search.d.ts +2 -0
  191. package/dist/store/sqlite/search.d.ts.map +1 -1
  192. package/dist/store/sqlite/search.js +27 -17
  193. package/dist/store/sqlite/search.js.map +1 -1
  194. package/dist/store/sqlite/words.d.ts +78 -0
  195. package/dist/store/sqlite/words.d.ts.map +1 -0
  196. package/dist/store/sqlite/words.js +237 -0
  197. package/dist/store/sqlite/words.js.map +1 -0
  198. package/dist/store/store.d.ts +35 -0
  199. package/dist/store/store.d.ts.map +1 -1
  200. package/dist/store/store.js +14 -2
  201. package/dist/store/store.js.map +1 -1
  202. package/package.json +8 -3
  203. package/parity.json +533 -440
@@ -0,0 +1,85 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { openStore } from "../../store/index.js";
3
+ const CHAT_ID = /^-?\d+$/;
4
+ /** The reason, never the path — a home directory is nobody else's business. */
5
+ const reasonOf = (error) => {
6
+ const code = error?.code;
7
+ if (typeof code === "string")
8
+ return code;
9
+ return error instanceof Error ? error.name : "an unknown problem";
10
+ };
11
+ /**
12
+ * **A store that fails never fails the command** — the messenger answered, and the answer is printed
13
+ * either way; the reason goes to stderr. Answers whether it was saved, for `watch`, which must not
14
+ * move its marker past what it failed to keep.
15
+ */
16
+ const quietly = async (write, warn) => {
17
+ let store;
18
+ try {
19
+ store = await openStore();
20
+ await write(store);
21
+ return true;
22
+ }
23
+ catch (error) {
24
+ warn(`the local copy was not updated: ${reasonOf(error)}`);
25
+ return false;
26
+ }
27
+ finally {
28
+ await store?.close();
29
+ }
30
+ };
31
+ /**
32
+ * What a bot read, sent or received, kept in the shared store under its own provider and the bot's
33
+ * id, so each bot sees only its own copy. Only a real chat is kept: `user:<id>` is a send address,
34
+ * and stored it would make a chat that does not exist.
35
+ */
36
+ export const botCopy = (provider) => {
37
+ const accountOf = (botId) => ({ provider, account: botId });
38
+ const storable = (message) => CHAT_ID.test(message.chatId) && message.id !== "unknown";
39
+ return {
40
+ accountOf,
41
+ keep: async (botId, messages, via, warn, senders = []) => {
42
+ const byChat = new Map();
43
+ for (const message of messages.filter(storable)) {
44
+ byChat.set(message.chatId, [...(byChat.get(message.chatId) ?? []), message]);
45
+ }
46
+ if (byChat.size === 0 && senders.length === 0)
47
+ return true;
48
+ return quietly(async (store) => {
49
+ for (const [chatId, chatMessages] of byChat) {
50
+ await store.saveMessages(accountOf(botId), chatId, chatMessages, { via });
51
+ }
52
+ if (senders.length > 0)
53
+ await store.savePeople(accountOf(botId), [...senders]);
54
+ }, warn);
55
+ },
56
+ /** Only a chat the messenger has just described in full: the store replaces a title it is not given. */
57
+ keepChat: async (botId, chat, warn) => {
58
+ if (CHAT_ID.test(chat.id))
59
+ await quietly((store) => store.saveChats(accountOf(botId), [chat]), warn);
60
+ },
61
+ /** Messages the bot deleted, kept as tombstones: reads and search stop returning them. */
62
+ forget: async (botId, chatId, messageIds, warn) => {
63
+ if (!CHAT_ID.test(chatId) || messageIds.length === 0)
64
+ return true;
65
+ return quietly((store) => store.markDeleted(accountOf(botId), messageIds, { chatId }), warn);
66
+ },
67
+ /** For a read the local copy answers: here the store is the answer, so a failure is the command's. */
68
+ read: async (read) => {
69
+ let store;
70
+ try {
71
+ store = await openStore();
72
+ }
73
+ catch (error) {
74
+ throw new CliError("configuration_error", `the local copy cannot be opened: ${reasonOf(error)}`);
75
+ }
76
+ try {
77
+ return await read(store);
78
+ }
79
+ finally {
80
+ await store.close();
81
+ }
82
+ },
83
+ };
84
+ };
85
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/bot/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from "commander";
2
+ import { type BotContext } from "./context.js";
3
+ import type { BotAdapter, BotMessenger } from "./port.js";
4
+ /** The adapter's `method`, or a refusal naming what this messenger's bot cannot do. */
5
+ export declare const botCan: <K extends keyof BotAdapter>(adapter: BotAdapter, method: K, bot: BotMessenger, what: string) => NonNullable<BotAdapter[K]>;
6
+ /** The bot's own id — the key its local copy is kept under — remembered after the first time it is asked. */
7
+ export declare const botIdOf: (context: BotContext, adapter: BotAdapter) => Promise<string>;
8
+ /** `bot messages`: the bot's own messages, under the names the personal account uses. */
9
+ export declare const botMessagesCommand: (bot: BotMessenger) => Command;
10
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/messages.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAEzD,uFAAuF;AACvF,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,UAAU,WACtC,UAAU,UACX,CAAC,OACJ,YAAY,QACX,MAAM,KACX,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAM3B,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,OAAO,YAAmB,UAAU,WAAW,UAAU,KAAG,OAAO,CAAC,MAAM,CAMtF,CAAA;AAuQD,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,QAAS,YAAY,KAAG,OAShB,CAAA"}
@@ -0,0 +1,252 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { annotate } from "@leemour/cli-core/commands";
3
+ import { Command } from "commander";
4
+ import { parseMarkdown } from "../../domain/markdown.js";
5
+ import { renderMessages } from "../../render/messages.js";
6
+ import { guardedWrite } from "../../sends/guarded.js";
7
+ import { newOperationId } from "../../sends/send-id.js";
8
+ import { readAttachments } from "../../sends/upload.js";
9
+ import { environmentOf } from "../context.js";
10
+ import { readAll } from "../messenger/stdin.js";
11
+ import { listed, positiveCount } from "../paging.js";
12
+ import { botContext } from "./context.js";
13
+ /** The adapter's `method`, or a refusal naming what this messenger's bot cannot do. */
14
+ export const botCan = (adapter, method, bot, what) => {
15
+ const found = adapter[method];
16
+ if (typeof found !== "function") {
17
+ throw new CliError("validation_error", `a ${bot.name ?? "messenger"} bot cannot ${what}`);
18
+ }
19
+ return found.bind(adapter);
20
+ };
21
+ /** The bot's own id — the key its local copy is kept under — remembered after the first time it is asked. */
22
+ export const botIdOf = async (context, adapter) => {
23
+ const known = context.registry.botId();
24
+ if (known)
25
+ return known;
26
+ const { id } = await adapter.me();
27
+ context.registry.rememberBot(id);
28
+ return id;
29
+ };
30
+ const show = (context, bot, messages, one = false) => {
31
+ if (context.format === "pretty") {
32
+ context.streams.data(renderMessages(messages, {
33
+ color: context.color,
34
+ verbosity: context.settings.detail,
35
+ senderColors: context.settings.senderColors,
36
+ profile: context.profile,
37
+ provider: bot.provider,
38
+ locale: bot.app.locale,
39
+ }));
40
+ }
41
+ else if (context.format === "jsonl")
42
+ context.renderer.stream(messages);
43
+ else
44
+ context.renderer.result(one ? messages[0] : listed(messages));
45
+ };
46
+ /** Says what fills the copy, rather than printing an empty list. */
47
+ const nothingKept = (context) => new CliError("not_found", `this bot has kept nothing on this machine yet — run \`${context.words} messages list <chat>\` once without --offline`);
48
+ const marks = (md, html) => {
49
+ if (md && html)
50
+ throw new CliError("validation_error", "--md and --html mark up the text two ways; use one");
51
+ };
52
+ /** Wrote somewhere real — a numeric chat — so the bot has seen that chat. */
53
+ const seen = (context, message) => {
54
+ if (/^-?\d+$/.test(message.chatId))
55
+ context.registry.observe([{ id: message.chatId }]);
56
+ };
57
+ const sendCommand = (bot) => annotate(new Command("send"), { mutates: true })
58
+ .description("send a message as the bot; without [text], the text is read from stdin")
59
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
60
+ .argument("[text]", "the message")
61
+ .option("--reply-to <message>", "answer this message, by its id in the same chat")
62
+ .option("--silent", "deliver without a notification")
63
+ .option("--md", "read **bold**, _italic_, ~~struck~~ and `code` in the text; \\ keeps a mark literal")
64
+ .option("--html", "the text is HTML: <b>, <i>, <a href>, <code>")
65
+ .option("--file <file>", "attach a file; the text becomes its caption")
66
+ .option("--photo <file>", "attach a .jpg, .png or .webp as a photo; the text becomes its caption")
67
+ .option("--as-file", "send the --file as a file to download, a video included")
68
+ .option("--voice <file>", "send an Ogg Opus file as a voice message, alone, with no text")
69
+ .option("--allow-any-file", "send a file even from a hidden folder, ~/.ssh or this CLI's own folders")
70
+ .action(async function (chat, text) {
71
+ const context = botContext(this, bot);
72
+ const options = this.opts();
73
+ marks(options.md, options.html);
74
+ const ref = context.chatRef(chat);
75
+ const attachments = await readAttachments({
76
+ ...(options.photo === undefined ? {} : { photo: options.photo }),
77
+ ...(options.file === undefined ? {} : { file: options.file }),
78
+ ...(options.voice === undefined ? {} : { voice: options.voice }),
79
+ ...(text === undefined ? {} : { text }),
80
+ asFile: options.asFile === true,
81
+ }, { app: bot.app, env: context.env, anyFile: options.allowAnyFile === true });
82
+ const body = text ?? (attachments.length > 0 ? "" : await readAll(environmentOf(this).stdin ?? process.stdin));
83
+ if (body.trim() === "" && attachments.length === 0) {
84
+ throw new CliError("validation_error", "nothing to send — give the text or pipe it in");
85
+ }
86
+ const { text: plain, markup } = options.md ? parseMarkdown(body) : { text: body, markup: undefined };
87
+ const replyTo = options.replyTo?.trim();
88
+ await context.run(async (events) => {
89
+ const adapter = await context.authenticated({ events });
90
+ const send = botCan(adapter, "send", bot, "send messages");
91
+ const operationId = newOperationId();
92
+ const message = await guardedWrite(context.guard(), {
93
+ operationId,
94
+ chatId: ref,
95
+ kind: "message",
96
+ key: "bot.messages.send",
97
+ length: plain.length,
98
+ ...(replyTo ? { replyTo } : {}),
99
+ }, () => send(ref, plain, {
100
+ ...(replyTo ? { replyTo } : {}),
101
+ ...(options.silent ? { silent: true } : {}),
102
+ ...(markup ? { markup } : {}),
103
+ ...(options.html ? { html: true } : {}),
104
+ ...(attachments.length > 0 ? { attachments } : {}),
105
+ }), (sent) => ({ messageId: sent.id }));
106
+ seen(context, message);
107
+ if (message.senderId)
108
+ context.registry.rememberBot(message.senderId);
109
+ const botId = message.senderId ?? (await botIdOf(context, adapter));
110
+ await context.copy.keep(botId, [message], "send", context.renderer.warn, adapter.senders?.());
111
+ context.renderer.result({ operationId, message });
112
+ });
113
+ });
114
+ const listCommand = (bot) => new Command("list")
115
+ .description(`the latest messages in a chat; where ${bot.name ?? "the messenger"} gives a bot no history, and with --offline, ` +
116
+ "the ones this bot has seen on this machine")
117
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
118
+ .option("--limit <n>", "how many, the newest", positiveCount("--limit"))
119
+ .action(async function (chat) {
120
+ const context = botContext(this, bot);
121
+ const ref = context.chatRef(chat);
122
+ const limit = this.opts().limit ?? context.settings.limit;
123
+ await context.run(async (events) => {
124
+ const fromCopy = async (botId) => {
125
+ const page = await context.copy.read((store) => store.messages(context.copy.accountOf(botId), ref, { limit }));
126
+ return page.items;
127
+ };
128
+ if (context.settings.offline) {
129
+ const botId = context.registry.botId();
130
+ if (!botId)
131
+ throw nothingKept(context);
132
+ show(context, bot, await fromCopy(botId));
133
+ return;
134
+ }
135
+ const adapter = await context.authenticated({ events });
136
+ const botId = await botIdOf(context, adapter);
137
+ if (!adapter.history) {
138
+ context.renderer.note(`${bot.name ?? "the messenger"} gives a bot no history: these are the messages it kept`);
139
+ show(context, bot, await fromCopy(botId));
140
+ return;
141
+ }
142
+ const messages = await adapter.history(ref, { limit });
143
+ await context.copy.keep(botId, messages, "history", context.renderer.warn, adapter.senders?.());
144
+ if (/^-?\d+$/.test(ref))
145
+ context.registry.observe([{ id: ref }]);
146
+ show(context, bot, messages);
147
+ });
148
+ });
149
+ const showCommand = (bot) => new Command("show")
150
+ .description("one message by its id in a chat")
151
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
152
+ .argument("<message>", "message id")
153
+ .action(async function (chat, messageId) {
154
+ const context = botContext(this, bot);
155
+ const ref = context.chatRef(chat);
156
+ await context.run(async (events) => {
157
+ const fromCopy = async (botId) => {
158
+ const kept = await context.copy.read((store) => store.message(context.copy.accountOf(botId), messageId, { chatId: ref }));
159
+ if (!kept)
160
+ throw new CliError("not_found", `message ${messageId} is not in this bot's local copy`);
161
+ return kept;
162
+ };
163
+ if (context.settings.offline) {
164
+ const botId = context.registry.botId();
165
+ if (!botId)
166
+ throw nothingKept(context);
167
+ show(context, bot, [await fromCopy(botId)], true);
168
+ return;
169
+ }
170
+ const adapter = await context.authenticated({ events });
171
+ const botId = await botIdOf(context, adapter);
172
+ if (!adapter.message) {
173
+ show(context, bot, [await fromCopy(botId)], true);
174
+ return;
175
+ }
176
+ const found = await adapter.message(ref, messageId);
177
+ await context.copy.keep(botId, [found], "history", context.renderer.warn, adapter.senders?.());
178
+ show(context, bot, [found], true);
179
+ });
180
+ });
181
+ const editCommand = (bot) => annotate(new Command("edit"), { mutates: true })
182
+ .description("replace the text of a message the bot sent")
183
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
184
+ .argument("<message>", "message id")
185
+ .argument("<text>", "the new text")
186
+ .option("--md", "read **bold**, _italic_, ~~struck~~ and `code` in the text; \\ keeps a mark literal")
187
+ .option("--html", "the text is HTML: <b>, <i>, <a href>, <code>")
188
+ .action(async function (chat, messageId, text) {
189
+ const context = botContext(this, bot);
190
+ const options = this.opts();
191
+ marks(options.md, options.html);
192
+ const ref = context.chatRef(chat);
193
+ const { text: plain, markup } = options.md ? parseMarkdown(text) : { text, markup: undefined };
194
+ await context.run(async (events) => {
195
+ const adapter = await context.authenticated({ events });
196
+ const edit = botCan(adapter, "edit", bot, "edit messages");
197
+ const operationId = newOperationId();
198
+ const message = await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "edit", key: "bot.messages.edit", messageId, length: plain.length }, () => edit(ref, messageId, plain, { ...(markup ? { markup } : {}), ...(options.html ? { html: true } : {}) }));
199
+ await context.copy.keep(await botIdOf(context, adapter), [message], "send", context.renderer.warn, adapter.senders?.());
200
+ context.renderer.result({ operationId, message });
201
+ });
202
+ });
203
+ const deleteCommand = (bot) => annotate(new Command("delete"), { mutates: true })
204
+ .description("delete messages in a chat the bot can delete in; it cannot be undone")
205
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
206
+ .argument("<messages...>", "message ids")
207
+ .option("--allow-dangerous", "delete without asking")
208
+ .action(async function (chat, messageIds) {
209
+ const context = botContext(this, bot);
210
+ const ref = context.chatRef(chat);
211
+ await context.run(async (events) => {
212
+ const adapter = await context.authenticated({ events });
213
+ const remove = botCan(adapter, "delete", bot, "delete messages");
214
+ const operationId = newOperationId();
215
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "delete", key: "bot.messages.delete", count: messageIds.length }, () => remove(ref, messageIds));
216
+ await context.copy.forget(await botIdOf(context, adapter), ref, messageIds, context.renderer.warn);
217
+ context.renderer.result({ operationId, deleted: messageIds });
218
+ });
219
+ });
220
+ const pinCommand = (bot, pin) => {
221
+ const command = annotate(new Command(pin ? "pin" : "unpin"), { mutates: true })
222
+ .description(pin ? "pin a message in a chat; quietly unless --notify" : "unpin a message in a chat")
223
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
224
+ .argument("<message>", "message id");
225
+ if (pin)
226
+ command.option("--notify", "tell the chat's members");
227
+ return command.action(async function (chat, messageId) {
228
+ const context = botContext(this, bot);
229
+ const ref = context.chatRef(chat);
230
+ const notify = this.opts().notify === true;
231
+ await context.run(async (events) => {
232
+ const adapter = await context.authenticated({ events });
233
+ const operationId = newOperationId();
234
+ const key = pin ? "bot.messages.pin" : "bot.messages.unpin";
235
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "pin", key, messageId }, () => pin
236
+ ? botCan(adapter, "pin", bot, "pin messages")(ref, messageId, { notify })
237
+ : botCan(adapter, "unpin", bot, "unpin messages")(ref, messageId));
238
+ context.renderer.result({ operationId, chatId: ref, messageId, pinned: pin });
239
+ });
240
+ });
241
+ };
242
+ /** `bot messages`: the bot's own messages, under the names the personal account uses. */
243
+ export const botMessagesCommand = (bot) => new Command("messages")
244
+ .description("the messages in the chats this bot is in")
245
+ .addCommand(sendCommand(bot))
246
+ .addCommand(listCommand(bot))
247
+ .addCommand(showCommand(bot))
248
+ .addCommand(editCommand(bot))
249
+ .addCommand(deleteCommand(bot))
250
+ .addCommand(pinCommand(bot, true))
251
+ .addCommand(pinCommand(bot, false));
252
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/cli/bot/messages.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,92 @@
1
1
  import type { Command } from "commander";
2
- import type { Provider } from "../../domain/models.js";
2
+ import type { Markup } from "../../domain/markdown.js";
3
+ import type { AdminRight, Chat, Id, Member, Message, Provider } from "../../domain/models.js";
4
+ import type { Upload } from "../../sends/upload.js";
5
+ import type { PersonFacts } from "../../store/index.js";
3
6
  import type { AppIdentity } from "../app.js";
4
- import type { MessengerCore } from "../messenger/port.js";
7
+ import type { MessagePins, MessengerCore } from "../messenger/port.js";
5
8
  import type { EventSink } from "../runs/events.js";
6
9
  import type { GlobalFlags, ResolveOptions, Settings } from "../settings.js";
7
10
  import type { ChatRegistry } from "./registry.js";
8
11
  import type { BotTokenStore } from "./token.js";
9
12
  /**
10
- * The part of the personal core a bot can do. It grows as bot commands move here; a bot never gets
11
- * `chats` or `history` from this type, because neither Bot API lists a bot's chats.
13
+ * A chat as a bot command names it, resolved: a chat id, or `user:<id>` for the dialog with a person —
14
+ * MAX's Bot API writes to a person by user id, and Telegram's chat id for a dialog is the person's id.
12
15
  */
13
- export type BotAdapter = Pick<MessengerCore, "me" | "close">;
16
+ export type BotChatRef = string;
17
+ /** How one bot message goes. A bot send is never repeated — neither Bot API makes a repeat safe — so it has no send id. */
18
+ export interface BotSendOptions {
19
+ /** A message id in the same chat. */
20
+ replyTo?: Id;
21
+ silent?: boolean;
22
+ /** Spans of `text`, from `--md`. */
23
+ markup?: Markup[];
24
+ /** `text` is the messenger's HTML. */
25
+ html?: boolean;
26
+ attachments?: Upload[];
27
+ }
28
+ /** Sending, changing and deleting the bot's messages. */
29
+ export interface BotMessaging {
30
+ send(chat: BotChatRef, text: string, options: BotSendOptions): Promise<Message>;
31
+ edit(chat: BotChatRef, messageId: Id, text: string, options: {
32
+ markup?: Markup[];
33
+ html?: boolean;
34
+ }): Promise<Message>;
35
+ delete(chat: BotChatRef, messageIds: Id[]): Promise<void>;
36
+ }
37
+ /** Reading from the messenger, where its Bot API allows it — MAX's does, Telegram's does not. */
38
+ export interface BotHistory {
39
+ /** The newest `limit`, oldest first. */
40
+ history(chat: BotChatRef, window: {
41
+ limit: number;
42
+ }): Promise<Message[]>;
43
+ message(chat: BotChatRef, messageId: Id): Promise<Message>;
44
+ }
45
+ /** Who wrote what the adapter read, with what a `Message` has no field for. */
46
+ export interface BotPeople {
47
+ /** The senders of the messages decoded since the last call — their handle and whether each is a bot — for the local copy. */
48
+ senders(): PersonFacts[];
49
+ }
50
+ /** What a bot shows in a chat while it works. */
51
+ export declare const BOT_ACTIONS: readonly ["typing", "photo", "video", "voice", "file"];
52
+ export type BotAction = (typeof BOT_ACTIONS)[number];
53
+ /** One chat the bot is in. */
54
+ export interface BotChatTools {
55
+ chat(chat: BotChatRef): Promise<Chat>;
56
+ /** Only an admin of the chat can bring the bot back. */
57
+ leave(chat: BotChatRef): Promise<void>;
58
+ action(chat: BotChatRef, action: BotAction): Promise<void>;
59
+ }
60
+ /** An admin of a chat, and what they may do. */
61
+ export interface BotChatAdmin extends Member {
62
+ role: "owner" | "admin";
63
+ /** In the shared words; a right the messenger has and these words lack is left out. */
64
+ rights: AdminRight[];
65
+ /** The title shown beside their name, when they have one. */
66
+ title: string | null;
67
+ }
68
+ /** Who runs a chat the bot is an admin in. */
69
+ export interface BotChatAdmins {
70
+ admins(chat: BotChatRef): Promise<BotChatAdmin[]>;
71
+ /** A right this messenger lacks is refused, never dropped. */
72
+ addAdmin(chat: BotChatRef, person: Id, rights: AdminRight[], options: {
73
+ title?: string;
74
+ }): Promise<void>;
75
+ /** They stay a member. */
76
+ removeAdmin(chat: BotChatRef, person: Id): Promise<void>;
77
+ }
78
+ /** Taking people out of a chat the bot is an admin in. */
79
+ export interface BotChatMembers {
80
+ /** Their messages stay; `block` also keeps them from coming back by the chat's link. */
81
+ removeMember(chat: BotChatRef, person: Id, options: {
82
+ block: boolean;
83
+ }): Promise<void>;
84
+ }
85
+ /**
86
+ * The part of the personal core a bot can do, and the groups its Bot API has. A bot never gets
87
+ * `chats` from this type: neither Bot API lists a bot's chats.
88
+ */
89
+ export type BotAdapter = Pick<MessengerCore, "me" | "close"> & Partial<BotMessaging> & Partial<BotHistory> & Partial<MessagePins> & Partial<BotChatTools> & Partial<BotChatAdmins> & Partial<BotChatMembers> & Partial<BotPeople>;
14
90
  export interface BotConnectOptions {
15
91
  stop?: AbortSignal;
16
92
  events?: EventSink;
@@ -22,6 +98,8 @@ export interface BotMessenger {
22
98
  provider: Provider;
23
99
  /** The messenger's own name, as its users write it — `MAX`, `Telegram`. */
24
100
  name?: string;
101
+ /** The admin rights `--can` offers; every shared one when unset. */
102
+ adminRights?: readonly AdminRight[];
25
103
  /** Called with `kind: "bot"`. */
26
104
  resolveSettings: (flags: GlobalFlags, options?: ResolveOptions) => Settings;
27
105
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,CAAA;IAChB,uGAAuG;IACvG,QAAQ,EAAE,QAAQ,CAAA;IAClB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,QAAQ,CAAA;IAC3E;;;OAGG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9F,sGAAsG;IACtG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,aAAa,CAAA;IACjE,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,YAAY,CAAA;IAC9D,+FAA+F;IAC/F,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnE"}
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/port.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- export {};
1
+ /** What a bot shows in a chat while it works. */
2
+ export const BOT_ACTIONS = ["typing", "photo", "video", "voice", "file"];
2
3
  //# sourceMappingURL=port.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../src/cli/bot/port.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../src/cli/bot/port.ts"],"names":[],"mappings":"AAkDA,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA"}
@@ -37,7 +37,7 @@ export const configCommand = (app, config) => {
37
37
  }
38
38
  });
39
39
  for (const action of ["set", "unset"]) {
40
- const sub = annotate(command.command(action), { mutates: true })
40
+ const sub = annotate(command.command(action), { mutates: true, local: true })
41
41
  .argument("<setting>", `one of: ${config.allSettings.join(", ")}`)
42
42
  .option("--defaults", "change what every profile gets, rather than this profile")
43
43
  .option("--personal", "only for personal accounts — the personal section of the file")
@@ -1 +1 @@
1
- {"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../src/cli/config-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAoB,OAAO,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAsB,QAAQ,EAAiB,MAAM,eAAe,CAAA;AAE3E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAgB,EAAE,MAAqB,EAAW,EAAE;IAChF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAA;IAExG,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gFAAgF,CAAC;SAC7F,MAAM,CAAC,OAAO,EAAE,qFAAqF,CAAC;SACtG,MAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAqB,CAAC,GAAG,KAAK,IAAI,CAAA;QACvD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACvE,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC/E,CAAA;QACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAE3F,QAAQ,CAAC,MAAM,CAAC;YACd,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;YACrC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAClG,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,UAAU;YAC3B,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC;iBAClD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,KAAK,eAAe,CAAC;iBACvD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAChD,CAAC,CAAA;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,YAAY;gBACrG,8FAA8F,CACjG,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAU,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aAC7D,QAAQ,CAAC,WAAW,EAAE,WAAW,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACjE,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC;aAChF,MAAM,CAAC,YAAY,EAAE,+DAA+D,CAAC;aACrF,MAAM,CAAC,OAAO,EAAE,6CAA6C,CAAC,CAAA;QACjE,IAAI,MAAM,KAAK,KAAK;YAClB,GAAG;iBACA,QAAQ,CAAC,SAAS,EAAE,iEAAiE,CAAC;iBACtF,WAAW,CAAC,0CAA0C,CAAC,CAAA;;YACvD,GAAG,CAAC,WAAW,CAAC,8CAA8C,CAAC,CAAA;QAEpE,GAAG,CAAC,MAAM,CAAC,UAAyB,OAAe,EAAE,KAAc;YACjE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;YAC7E,MAAM,EACJ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EACR,GAAG,GACJ,GAAG,IAAI,CAAC,IAAI,EAA6D,CAAA;YAC1E,MAAM,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAA;YAClC,IAAI,QAAQ,IAAI,GAAG;gBACjB,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,uDAAuD,CAAC,CAAA;YACjG,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;YAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;YACzC,IAAI,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,uDAAuD;gBACvD,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,qCAAqC,QAAQ,CAAC,OAAO,KAAK,IAAI,sCAAsC,CACrG,CAAA;YACH,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE;gBACtD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAChD,OAAO;gBACP,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnD,IAAI;aACL,CAAC,CAAA;YACF,QAAQ,CAAC,MAAM,CAAC;gBACd,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC7D,OAAO;gBACP,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,IAAwB,EAAE,OAA2B,EAAU,EAAE,CAChF,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9F,gGAAgG;AAChG,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAE,OAAe,EAAE,EAAE;IACtD,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAI,QAA+C,CAAC,OAAO,CAAC,CAAA;QACvE,0DAA0D;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;IACtH,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAU,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAA;IAChG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACjC,CAAC,CAAA;AAED,6GAA6G;AAC7G,MAAM,iBAAiB,GAA4B,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAE7E,4FAA4F;AAC5F,MAAM,oBAAoB,GAAG,CAAC,GAAgB,EAAE,GAAsB,EAAY,EAAE;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACtG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/B,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA"}
1
+ {"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../src/cli/config-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAoB,OAAO,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAsB,QAAQ,EAAiB,MAAM,eAAe,CAAA;AAE3E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAgB,EAAE,MAAqB,EAAW,EAAE;IAChF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAA;IAExG,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gFAAgF,CAAC;SAC7F,MAAM,CAAC,OAAO,EAAE,qFAAqF,CAAC;SACtG,MAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAqB,CAAC,GAAG,KAAK,IAAI,CAAA;QACvD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACvE,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC/E,CAAA;QACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAE3F,QAAQ,CAAC,MAAM,CAAC;YACd,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;YACrC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAClG,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,UAAU;YAC3B,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC;iBAClD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,OAAO,KAAK,eAAe,CAAC;iBACvD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAChD,CAAC,CAAA;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,YAAY;gBACrG,8FAA8F,CACjG,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAU,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aAC1E,QAAQ,CAAC,WAAW,EAAE,WAAW,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACjE,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC;aAChF,MAAM,CAAC,YAAY,EAAE,+DAA+D,CAAC;aACrF,MAAM,CAAC,OAAO,EAAE,6CAA6C,CAAC,CAAA;QACjE,IAAI,MAAM,KAAK,KAAK;YAClB,GAAG;iBACA,QAAQ,CAAC,SAAS,EAAE,iEAAiE,CAAC;iBACtF,WAAW,CAAC,0CAA0C,CAAC,CAAA;;YACvD,GAAG,CAAC,WAAW,CAAC,8CAA8C,CAAC,CAAA;QAEpE,GAAG,CAAC,MAAM,CAAC,UAAyB,OAAe,EAAE,KAAc;YACjE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;YAC7E,MAAM,EACJ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EACR,GAAG,GACJ,GAAG,IAAI,CAAC,IAAI,EAA6D,CAAA;YAC1E,MAAM,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAA;YAClC,IAAI,QAAQ,IAAI,GAAG;gBACjB,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,uDAAuD,CAAC,CAAA;YACjG,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;YAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;YACzC,IAAI,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,uDAAuD;gBACvD,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,qCAAqC,QAAQ,CAAC,OAAO,KAAK,IAAI,sCAAsC,CACrG,CAAA;YACH,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE;gBACtD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAChD,OAAO;gBACP,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnD,IAAI;aACL,CAAC,CAAA;YACF,QAAQ,CAAC,MAAM,CAAC;gBACd,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC7D,OAAO;gBACP,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,IAAwB,EAAE,OAA2B,EAAU,EAAE,CAChF,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9F,gGAAgG;AAChG,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAE,OAAe,EAAE,EAAE;IACtD,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAI,QAA+C,CAAC,OAAO,CAAC,CAAA;QACvE,0DAA0D;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;IACtH,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAU,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAA;IAChG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACjC,CAAC,CAAA;AAED,6GAA6G;AAC7G,MAAM,iBAAiB,GAA4B,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAE7E,4FAA4F;AAC5F,MAAM,oBAAoB,GAAG,CAAC,GAAgB,EAAE,GAAsB,EAAY,EAAE;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACtG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/B,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../../src/cli/deadline.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,MAC9B,MAAM,GAAG,SAAS,cACV,SAAS,EAAE,QACjB,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAsBX,CAAA"}
1
+ {"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../../src/cli/deadline.ts"],"names":[],"mappings":"AAGA,oGAAoG;AACpG,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,MAC9B,MAAM,GAAG,SAAS,cACV,SAAS,EAAE,QACjB,MAAM,OAAO,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,CAAC,CAiCX,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
+ import { writesInFlight } from "../sends/guarded.js";
2
3
  /**
3
4
  * Stops the whole command at `ms`, and **closes what it was holding on the way out**.
4
5
  *
@@ -23,16 +24,24 @@ export const withDeadline = async (ms, closeables, body) => {
23
24
  return body();
24
25
  let timer;
25
26
  let timedOut;
27
+ const writes = new Set();
26
28
  const expired = new Promise((_, reject) => {
27
29
  timer = setTimeout(() => {
28
- timedOut = new CliError("timeout", `the command did not finish within ${ms}ms — \`--timeout\` ended it`);
30
+ const cut = [...writes];
31
+ for (const write of cut)
32
+ write.cut();
33
+ timedOut =
34
+ cut.length > 0
35
+ ? new CliError("outcome_unknown", `\`--timeout\` ended the command after ${ms}ms with ${cut.length === 1 ? "a write" : `${cut.length} writes`} ` +
36
+ "in flight; the messenger may or may not have carried it out — check before repeating it", { operationIds: cut.map((write) => write.operationId), retryable: false })
37
+ : new CliError("timeout", `the command did not finish within ${ms}ms — \`--timeout\` ended it`);
29
38
  // Sockets first, then the message: the rejection is what the person reads, and the closing
30
39
  // is what lets the process actually end once they have read it.
31
40
  void Promise.allSettled(closeables.map((closeable) => closeable.close())).then(() => reject(timedOut));
32
41
  }, ms);
33
42
  });
34
43
  try {
35
- return await Promise.race([body(), expired]);
44
+ return await Promise.race([writesInFlight.run(writes, body), expired]);
36
45
  }
37
46
  catch (error) {
38
47
  // Closing rejects the body's own request, and that rejection arrives first.
@@ -1 +1 @@
1
- {"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../src/cli/deadline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAO5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,EAAsB,EACtB,UAAuB,EACvB,IAAsB,EACV,EAAE;IACd,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,EAAE,CAAA;IAEnC,IAAI,KAAiC,CAAA;IACrC,IAAI,QAA8B,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,qCAAqC,EAAE,6BAA6B,CAAC,CAAA;YACxG,2FAA2F;YAC3F,gEAAgE;YAChE,KAAK,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACxG,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,MAAM,QAAQ,IAAI,KAAK,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../src/cli/deadline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAsB,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAOxE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,EAAsB,EACtB,UAAuB,EACvB,IAAsB,EACV,EAAE;IACd,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,IAAI,EAAE,CAAA;IAEnC,IAAI,KAAiC,CAAA;IACrC,IAAI,QAA8B,CAAA;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAA;IACvC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YACvB,KAAK,MAAM,KAAK,IAAI,GAAG;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAA;YACpC,QAAQ;gBACN,GAAG,CAAC,MAAM,GAAG,CAAC;oBACZ,CAAC,CAAC,IAAI,QAAQ,CACV,iBAAiB,EACjB,yCAAyC,EAAE,WAAW,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,SAAS,GAAG;wBAC5G,yFAAyF,EAC3F,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAC1E;oBACH,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,qCAAqC,EAAE,6BAA6B,CAAC,CAAA;YACnG,2FAA2F;YAC3F,gEAAgE;YAChE,KAAK,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACxG,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,MAAM,QAAQ,IAAI,KAAK,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC,CAAA"}