@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
package/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  The messenger-neutral half of a messaging command line tool, shared by
4
4
  [`tg-cli`](https://github.com/leemour/tg-cli) and, later, [`max-cli`](https://github.com/leemour/max-cli).
5
- Built on [`@leemour/cli-core`](https://github.com/leemour/cli-core).
5
+ Built on [`@leemour/cli-core`](https://github.com/leemour/cli-core), a peer dependency: the CLI installs
6
+ it itself, so the install holds one copy.
6
7
 
7
8
  **Status: on npm** — what each version changed is in [CHANGELOG.md](CHANGELOG.md). The domain model, message locators, message rendering, name
8
9
  resolution, the SQLite seam that runs under Node and Bun, and the first part of the command
@@ -21,6 +22,7 @@ provider has travels in `providerMetadata`.
21
22
  | `./store` | `openCache` — `node:sqlite` under Node, `bun:sqlite` under Bun, WAL and a busy timeout on both · `openStore` — the shared message store, every method async: one file for every messenger (`MESSAGING_STORE` overrides where), forward-only migrations with `min_compatible`, every sender an identity with a person of their own, edits kept as revisions, a message by its id, deletions kept as tombstones, trigram search · `find` — by text, by sender, or both; `together` for the chats where every sender wrote, `perChat` to cap each chat · `savePeople` and `people` — usernames and bot flags, and a `PeopleLookup` for `pickPerson` |
22
23
  | `./sends` | the send guard: a level per command path (`permissions`: deny, readonly, ask, allow — `readOnly` and `allow` read as levels), a recipient list, an hourly limit, and a journal of every attempt that never holds the text; `newSendId` for a send's identity across retries |
23
24
  | `./cli` | the command skeleton: `run` (never throws, returns an exit code), the global flags, `settingsFor` (flag → environment → file → default, one strict file schema with each CLI's own fields), the profile as the first word, `--timeout` that closes what a command holds, paging, and run records: `--record` keeps a run's ids and timings (never content), a failure is kept unless `--no-record`, and `runsCommand` gives `runs list\|show\|path` · `configCommand(app, config)` shows and changes the settings with where each came from · `completeCommand(messenger, config)` gives shell completion, chat ids from the store and never a connection · `doctorCommand(messenger)` reports the installation's state from disk (the store, the account, sends, runs, the messenger's own checks), and connects only with `--online`; `doctor report create` writes that, the failed run and the recent sends to a file with every id a label · `skillCommand(app, url)` prints the CLI's own SKILL.md for an agent (`skill show`) · `commandsCommand(app)` describes every command as JSON, with `contract` (`CONTRACT`, the major version of the output types) and which commands write · the shared read commands: a CLI describes its messenger once (`Messenger`: its app, a `connect` that returns a `MessengerAdapter`, how `me` maps to a chat) and gets `accountCommand`, `chatsCommand` (`list`, `show`), `contactsCommand` (`list`, `show`) `recipientsCommand`, `sendsCommand`, `watchCommand` (new messages as they arrive, `--jsonl`, until Ctrl-C or `--timeout`; `--events` adds edits, deletions and reactions, each kept in the store), `storeCommand` (the local store: `store fetch` puts a chat's history into it, resumable, FloodWait-aware, `--since` to stop at a time, `--background` for a detached job that `store jobs list|show|cancel` follow, `--estimate` to only price what is left from the store alone; `store status` what it holds; `store export` a chat's messages out of it, as JSON or `--format markdown`; `store clear --left` deletes the chats the account has left; `store info`, `store check`, `store migrate`, `store backup` and `store restore` look after the file itself — its size and schema, whether it is healthy and which chats are behind, bringing it up to this build, and a copy to go back to), `inboxCommand` (other people's unread messages in every chat, or with `--new` what arrived since the last check — each message once, the point moved only by a run that printed; copied from max-cli), `serveCommand` (keeps the store current until stopped — one per profile by a lock file, catch-up on, started by a person, `server start` or a unit), `serverCommand` (`server start|stop|restart|status|logs`: `serve` in the background, as max-cli's `server`; `install|uninstall` add a systemd user unit or a launchd agent per profile, and `install` starts nothing), and `messagesCommand` (`list`, `show`, `context`, `search` over the store by any three letters inside a word, or `--regex`, `send` through the send guard (`--reply-to`, `--silent`, `--no-preview`, `--md`, `--file` and `--photo` with the text as the caption, and `--at` to send later, with `scheduled` listing the queue), `edit` of the owner's own message, `forward` to another chat and `pin`/`unpin` through it too (the adapter's optional `edit`, `forward`, `pin` and `unpin`), and `delete` — at most 10, for the owner unless `--for-everyone`; it asks first by default, and `--allow-dangerous` is the yes · `reactionsCommand` (`add`, `remove`: the owner's reaction on a message, through the guard; the adapter's optional `react`) · `pollsCommand` (`show` a poll with its answer ids, `vote` by id or `--retract`, `close` the owner's own, `create` one — a vote guarded as a reaction, closing as an edit, a new poll as a message with a send id); a `msg:` locator names a message) — every read saved to the store, `--offline` answered from it, each call a run event · `mcpCommand(messenger)` serves the profile to an agent over MCP on stdin and stdout (copied from max-cli: one connection held for minutes, one call at a time, read tools named `<cli>_<command words>` answering what `--json` prints, `<cli>_status` without connecting; the write tools — `<cli>_messages_send`, `_edit`, `_forward`, `_pin`, `_unpin`, `_delete`, `<cli>_reactions_add`, `_remove`, `<cli>_chats_mark_read`, `<cli>_polls_vote`, `_close` and `_create` — are offered by the profile's `permissions` and run through the same guard as their commands; a write at level `ask` shows the owner a form first (`--allow-dangerous` or `--yes` skips it), `--confirm-send` puts every write through the form, and `messages_delete` never deletes for everyone), and `mcp config` prints the entry for a desktop client |
25
+ | `./testing` | the adapter kit — **not stable yet**, so it may change in any release: `fakeAdapter(seed)`, a messenger in memory with every method group, for command tests; `contractCases({ connect })`, the port's promises as cases any test runner runs over an adapter; `contractSeed`, the chats and messages they read. How to write an adapter and run them: [the adapter guide](docs/dev/ADAPTERS.md) |
24
26
 
25
27
  ⚠ **Errors are recognised by shape, not by class** (`isCliFailure`). A package linked during
26
28
  development brings its own copy of cli-core, and an error built by one copy is not an `instanceof`
@@ -56,7 +58,13 @@ Both refuse a dirty tree, a branch other than `main` and an unpushed `main`. Whe
56
58
  version, or a higher one, they commit the next free version to `main` — the next minor for `x.y.0`,
57
59
  the next patch otherwise — and publish that. They run every check, and tag `v<version>` once npm
58
60
  shows it. The token is never printed and never
59
- written to a file. The GitHub form publishes from the job in the `npm` environment, which is what
61
+ written to a file.
62
+
63
+ Both also refuse within 24 hours of the last version npm shows, and say when the next one may go. A
64
+ consumer blocked today is the exception (below): `bin/release --blocked "<consumer and reason>"`
65
+ writes `Released early: <reason>` under the version's changelog heading, commits it to `main` and
66
+ publishes. Name the consumer and what it cannot do, in plain words — `pnpm docs:check` refuses an
67
+ internal id. When npm cannot be asked, they refuse rather than skip the check. The GitHub form publishes from the job in the `npm` environment, which is what
60
68
  npm's trusted publisher names: `leemour` / `cli-messaging` / `release.yml` / environment `npm`.
61
69
 
62
70
  ### How often, and what may break
@@ -78,7 +86,7 @@ the same day.
78
86
  | `./services` | `servicesFor`, `Override` and the service names |
79
87
  | `./background` | `lockPath`, `readLock`, `holdLock`, `releaseLock`, `servingProfiles`, `alive`, `carries`, `holdersOf`, `ServerSystem`, `thisMachine`, `platformFor` and the systemd and launchd units |
80
88
 
81
- Everything else may change in any release, and still goes under "Changed — may break callers" when
89
+ `./testing` and `./parity` are not on this list. Everything else may change in any release, and still goes under "Changed — may break callers" when
82
90
  it does. tg-cli and max-cli take new versions through Dependabot pull requests.
83
91
 
84
92
  ## Licence
@@ -0,0 +1,10 @@
1
+ import { Command } from "commander";
2
+ import type { BotMessenger } from "./port.js";
3
+ /** `bot chats admins`: who runs a chat the bot is an admin in, under the personal account's names. */
4
+ export declare const botAdminsCommand: (bot: BotMessenger) => Command;
5
+ /**
6
+ * `bot chats members`: `remove`, which both Bot APIs have. A CLI whose bot can list or add members
7
+ * adds those commands to this group.
8
+ */
9
+ export declare const botMembersCommand: (bot: BotMessenger) => Command;
10
+ //# sourceMappingURL=admins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/admins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAY7C,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,QAAS,YAAY,KAAG,OAuEpD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAS,YAAY,KAAG,OAkCrD,CAAA"}
@@ -0,0 +1,114 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { annotate } from "@leemour/cli-core/commands";
3
+ import { Command } from "commander";
4
+ import { ADMIN_RIGHTS } from "../../domain/models.js";
5
+ import { guardedWrite } from "../../sends/guarded.js";
6
+ import { newOperationId } from "../../sends/send-id.js";
7
+ import { rightsOf } from "../messenger/admin-commands.js";
8
+ import { renderList } from "../paging.js";
9
+ import { botContext, online } from "./context.js";
10
+ import { botCan } from "./messages.js";
11
+ const CHAT = "a chat id, or the title of a chat this bot has seen";
12
+ const PERSON = "the person's user id";
13
+ /** Neither Bot API finds a person by name, so a person is their id. */
14
+ const personOf = (typed) => {
15
+ const id = typed.trim();
16
+ if (!/^\d+$/.test(id))
17
+ throw new CliError("validation_error", `a person is their user id, digits only — not ${typed}`);
18
+ return id;
19
+ };
20
+ /** `bot chats admins`: who runs a chat the bot is an admin in, under the personal account's names. */
21
+ export const botAdminsCommand = (bot) => {
22
+ const offered = bot.adminRights ?? ADMIN_RIGHTS;
23
+ const command = new Command("admins").description("the admins of a chat the bot is an admin in");
24
+ command
25
+ .command("list")
26
+ .description("the chat's admins and what each may do")
27
+ .argument("<chat>", CHAT)
28
+ .action(async function (chat) {
29
+ const context = online(botContext(this, bot), this);
30
+ const ref = context.chatRef(chat);
31
+ await context.run(async (events) => {
32
+ const adapter = await context.authenticated({ events });
33
+ const admins = await botCan(adapter, "admins", bot, "list a chat's admins")(ref);
34
+ renderList(context.renderer, context.format, admins);
35
+ });
36
+ });
37
+ annotate(command.command("add"), { mutates: true })
38
+ .description("make a member an admin with these rights")
39
+ .argument("<chat>", CHAT)
40
+ .argument("<person>", PERSON)
41
+ .requiredOption("--can <rights>", `what they may do, comma-separated: ${offered.join(", ")}`)
42
+ .option("--title <title>", "the title shown beside their name")
43
+ .action(async function (chat, person) {
44
+ const context = online(botContext(this, bot), this);
45
+ const ref = context.chatRef(chat);
46
+ const personId = personOf(person);
47
+ const { can, title } = this.opts();
48
+ const rights = rightsOf(offered, can);
49
+ await context.run(async (events) => {
50
+ const adapter = await context.authenticated({ events });
51
+ const add = botCan(adapter, "addAdmin", bot, "make an admin");
52
+ const operationId = newOperationId();
53
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "chat", action: "admins.add", key: "bot.chats.admins.add" }, () => add(ref, personId, rights, title === undefined ? {} : { title }));
54
+ context.renderer.result({
55
+ operationId,
56
+ chatId: ref,
57
+ personId,
58
+ rights,
59
+ ...(title === undefined ? {} : { title }),
60
+ });
61
+ });
62
+ });
63
+ annotate(command.command("remove"), { mutates: true })
64
+ .description("take an admin's rights back; they stay a member")
65
+ .argument("<chat>", CHAT)
66
+ .argument("<person>", PERSON)
67
+ .action(async function (chat, person) {
68
+ const context = online(botContext(this, bot), this);
69
+ const ref = context.chatRef(chat);
70
+ const personId = personOf(person);
71
+ await context.run(async (events) => {
72
+ const adapter = await context.authenticated({ events });
73
+ const remove = botCan(adapter, "removeAdmin", bot, "take admin rights back");
74
+ const operationId = newOperationId();
75
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "chat", action: "admins.remove", key: "bot.chats.admins.remove" }, () => remove(ref, personId));
76
+ context.renderer.result({ operationId, chatId: ref, personId });
77
+ });
78
+ });
79
+ return command;
80
+ };
81
+ /**
82
+ * `bot chats members`: `remove`, which both Bot APIs have. A CLI whose bot can list or add members
83
+ * adds those commands to this group.
84
+ */
85
+ export const botMembersCommand = (bot) => {
86
+ const command = new Command("members").description("the people in a chat the bot is an admin in");
87
+ annotate(command.command("remove"), { mutates: true })
88
+ .description("take a person out of a chat; their messages stay")
89
+ .argument("<chat>", CHAT)
90
+ .argument("<person>", PERSON)
91
+ .option("--block", "also keep them from coming back by the chat's link")
92
+ .action(async function (chat, person) {
93
+ const context = online(botContext(this, bot), this);
94
+ const ref = context.chatRef(chat);
95
+ const personId = personOf(person);
96
+ const block = this.opts().block === true;
97
+ await context.run(async (events) => {
98
+ const adapter = await context.authenticated({ events });
99
+ const remove = botCan(adapter, "removeMember", bot, "remove people from a chat");
100
+ const operationId = newOperationId();
101
+ await guardedWrite(context.guard(), {
102
+ operationId,
103
+ chatId: ref,
104
+ kind: "chat",
105
+ action: "members.remove",
106
+ key: "bot.chats.members.remove",
107
+ people: 1,
108
+ }, () => remove(ref, personId, { block }));
109
+ context.renderer.result({ operationId, chatId: ref, removed: [personId], blocked: block });
110
+ });
111
+ });
112
+ return command;
113
+ };
114
+ //# sourceMappingURL=admins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins.js","sourceRoot":"","sources":["../../../src/cli/bot/admins.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Command } from "commander";
2
- import type { BotMessenger } from "./port.js";
2
+ import { type BotMessenger } from "./port.js";
3
3
  /**
4
4
  * The `bot` group: a bot account through the messenger's official Bot API and a bot token. A CLI adds
5
5
  * the commands that are still its own with `addCommand`, on this group or on its `chats`.
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAoL7C;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAS,YAAY,KAAG,OAW9C,CAAA"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,OAAO,EAAE,MAAM,WAAW,CAAA;AAQ7C,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAwN1E;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAS,YAAY,KAAG,OAY9C,CAAA"}
@@ -1,29 +1,19 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
2
  import { annotate } from "@leemour/cli-core/commands";
3
- import { Command } from "commander";
4
- import { pickChat } from "../../resolve.js";
3
+ import { Argument, Command } from "commander";
4
+ import { guardedWrite } from "../../sends/guarded.js";
5
+ import { newOperationId } from "../../sends/send-id.js";
5
6
  import { envName } from "../app.js";
6
7
  import { renderList } from "../paging.js";
7
- import { botContext } from "./context.js";
8
+ import { botAdminsCommand, botMembersCommand } from "./admins.js";
9
+ import { botContext, online } from "./context.js";
10
+ import { botCan, botIdOf, botMessagesCommand } from "./messages.js";
11
+ import { BOT_ACTIONS } from "./port.js";
8
12
  import { registryProfiles } from "./registry.js";
9
13
  import { BotTokenStore } from "./token.js";
10
- /** `--offline` reads the local copy; a command that has to ask the messenger refuses it rather than ignoring it. */
11
- const online = (context, command) => {
12
- if (context.settings.offline) {
13
- throw new CliError("validation_error", `--offline reads the local copy; \`${command.name()}\` has to ask the messenger`);
14
- }
15
- return context;
16
- };
17
- const DIGITS = /^-?\d+$/;
18
- /** What the recipient list names: a chat id, `user:<id>` for a person, or the id of a seen chat with that title. */
19
- const recipientKey = (reference, context) => {
20
- if (DIGITS.test(reference) || /^user:\d+$/.test(reference))
21
- return reference;
22
- return pickChat(reference, context.registry.list()).id;
23
- };
24
14
  const authCommand = (bot, tokenVariable) => {
25
15
  const auth = new Command("auth").description("the bot token this profile uses");
26
- annotate(auth.command("set"), { mutates: true })
16
+ annotate(auth.command("set"), { mutates: true, local: true })
27
17
  .description(`check a bot token with ${bot.name ?? "the messenger"}, then keep it — typed at a hidden prompt or piped on stdin`)
28
18
  .action(async function () {
29
19
  const context = online(botContext(this, bot), this);
@@ -63,7 +53,7 @@ const authCommand = (bot, tokenVariable) => {
63
53
  });
64
54
  });
65
55
  });
66
- annotate(auth.command("remove"), { mutates: true })
56
+ annotate(auth.command("remove"), { mutates: true, local: true })
67
57
  .description("forget this profile's bot token")
68
58
  .action(async function () {
69
59
  const context = botContext(this, bot);
@@ -116,24 +106,24 @@ const recipientsCommand = (bot) => {
116
106
  const context = botContext(this, bot);
117
107
  await context.run(async () => renderList(context.renderer, context.format, context.recipients().read() ?? []));
118
108
  });
119
- annotate(command.command("add <chat>"), { mutates: true })
109
+ annotate(command.command("add <chat>"), { mutates: true, local: true })
120
110
  .description("allow a chat: its id, `user:<id>`, or the title of a chat this bot has seen")
121
111
  .action(async function (chat) {
122
112
  const context = botContext(this, bot);
123
113
  await context.run(async () => {
124
- const id = recipientKey(chat, context);
114
+ const id = context.chatRef(chat);
125
115
  const title = context.registry.list().find((seen) => seen.id === id)?.title ?? null;
126
116
  context.recipients().add({ id, title, addedAt: new Date().toISOString() });
127
117
  renderList(context.renderer, context.format, context.recipients().read() ?? []);
128
118
  });
129
119
  });
130
- annotate(command.command("remove <chat>"), { mutates: true })
120
+ annotate(command.command("remove <chat>"), { mutates: true, local: true })
131
121
  .description("take a chat off the list")
132
122
  .action(async function (chat) {
133
123
  const context = botContext(this, bot);
134
124
  await context.run(async () => context.renderer.result({ removed: context.recipients().remove(chat) ?? null }));
135
125
  });
136
- annotate(command.command("clear"), { mutates: true })
126
+ annotate(command.command("clear"), { mutates: true, local: true })
137
127
  .description("remove the list: the bot may write to any chat again")
138
128
  .action(async function () {
139
129
  const context = botContext(this, bot);
@@ -156,6 +146,52 @@ const chatsCommand = (bot) => {
156
146
  const context = botContext(this, bot);
157
147
  await context.run(async () => renderList(context.renderer, context.format, context.registry.list()));
158
148
  });
149
+ command
150
+ .command("show")
151
+ .description(`one chat from ${bot.name ?? "the messenger"}, and remember it`)
152
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
153
+ .action(async function (chat) {
154
+ const context = online(botContext(this, bot), this);
155
+ const ref = context.chatRef(chat);
156
+ await context.run(async (events) => {
157
+ const adapter = await context.authenticated({ events });
158
+ const found = await botCan(adapter, "chat", bot, "describe a chat")(ref);
159
+ context.registry.observe([found]);
160
+ await context.copy.keepChat(await botIdOf(context, adapter), found, context.renderer.warn);
161
+ context.renderer.result(found);
162
+ });
163
+ });
164
+ annotate(command.command("leave"), { mutates: true })
165
+ .description("take the bot out of a chat; only an admin of the chat can bring it back")
166
+ .argument("<chat>", "a chat id, or the title of a chat this bot has seen")
167
+ .action(async function (chat) {
168
+ const context = online(botContext(this, bot), this);
169
+ const ref = context.chatRef(chat);
170
+ await context.run(async (events) => {
171
+ const adapter = await context.authenticated({ events });
172
+ const leave = botCan(adapter, "leave", bot, "leave a chat");
173
+ const operationId = newOperationId();
174
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "chat", action: "leave", key: "bot.chats.leave" }, () => leave(ref));
175
+ context.renderer.result({ operationId, chatId: ref, left: true });
176
+ });
177
+ });
178
+ annotate(command.command("action"), { mutates: true })
179
+ .description("show what the bot is doing in a chat — typing, sending a photo — for a few seconds")
180
+ .argument("<chat>", "a chat id, user:<id> for a person, or the title of a chat this bot has seen")
181
+ .addArgument(new Argument("<action>", "what the chat sees").choices(BOT_ACTIONS))
182
+ .action(async function (chat, action) {
183
+ const context = online(botContext(this, bot), this);
184
+ const ref = context.chatRef(chat);
185
+ await context.run(async (events) => {
186
+ const adapter = await context.authenticated({ events });
187
+ const act = botCan(adapter, "action", bot, "show an action");
188
+ const operationId = newOperationId();
189
+ await guardedWrite(context.guard(), { operationId, chatId: ref, kind: "chat", key: "bot.chats.action" }, () => act(ref, action));
190
+ context.renderer.result({ operationId, chatId: ref, action });
191
+ });
192
+ });
193
+ command.addCommand(botAdminsCommand(bot));
194
+ command.addCommand(botMembersCommand(bot));
159
195
  return command;
160
196
  };
161
197
  /**
@@ -169,6 +205,7 @@ export const botCommand = (bot) => {
169
205
  .addCommand(authCommand(bot, tokenVariable))
170
206
  .addCommand(listCommand(bot, tokenVariable))
171
207
  .addCommand(chatsCommand(bot))
208
+ .addCommand(botMessagesCommand(bot))
172
209
  .addCommand(recipientsCommand(bot))
173
210
  .addCommand(sendsCommand(bot));
174
211
  };
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/bot/command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/cli/bot/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,WAAW,EAAqC,MAAM,WAAW,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,WAAW,GAAG,CAAC,GAAiB,EAAE,aAAqB,EAAW,EAAE;IACxE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAA;IAE/E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC1D,WAAW,CACV,0BAA0B,GAAG,CAAC,IAAI,IAAI,eAAe,6DAA6D,CACnH;SACA,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC9D,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;YACpE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YACxB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,iEAAiE,CAAC,CAAA;YAC/G,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM;gBACN,GAAG,EAAE,OAAO,CAAC,IAAI;gBACjB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAA;YAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;YACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM;gBACN,GAAG,EAAE,OAAO,CAAC,IAAI;gBACjB,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC7D,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CACxF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,GAAiB,EAAE,aAAqB,EAAW,EAAE,CACxE,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,WAAW,CACV,iEAAiE,GAAG,CAAC,IAAI,IAAI,eAAe,oBAAoB,CACjH;KACA,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,IAAI,IAAI,eAAe,kBAAkB,CAAC;KACvE,MAAM,CAAC,KAAK;IACX,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAuB,CAAC,KAAK,KAAK,IAAI,CAAA;IAC7D,IAAI,KAAK;QAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAChC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG;YACZ,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3G,CAAC,IAAI,EAAE,CAAA;QACR,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,4CAA4C,CAAC,CAAA;QAC1F,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GACV,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YACtG,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;YAC5B,IAAI,CAAC,MAAM;gBAAE,SAAQ;YACrB,MAAM,GAAG,GAA4B,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;YACnE,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;oBAC5E,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;gBAC/E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,OAAO,GAAI,KAA2B,CAAC,IAAI,IAAI,QAAQ,CAAA;gBAC7D,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC;QACD,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEN,MAAM,iBAAiB,GAAG,CAAC,GAAiB,EAAW,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CACnD,sFAAsF,CACvF,CAAA;IACD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAChH,CAAC,CAAC,CAAA;IACJ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACpE,WAAW,CAAC,6EAA6E,CAAC;SAC1F,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,CAAA;YACnF,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAC1E,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACJ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACvE,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IAChH,CAAC,CAAC,CAAA;IACJ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SAC/D,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IACjG,CAAC,CAAC,CAAA;IACJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,GAAiB,EAAW,EAAE,CAClD,IAAI,OAAO,CAAC,OAAO,CAAC;KACjB,WAAW,CAAC,yFAAyF,CAAC;KACtG,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AAC1G,CAAC,CAAC,CACH,CAAA;AAEL,MAAM,YAAY,GAAG,CAAC,GAAiB,EAAW,EAAE;IAClD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAC9C,8BAA8B,GAAG,CAAC,IAAI,IAAI,eAAe,sEAAsE,CAChI,CAAA;IACD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sEAAsE,GAAG,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;SAChH,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACtG,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,GAAG,CAAC,IAAI,IAAI,eAAe,mBAAmB,CAAC;SAC5E,QAAQ,CAAC,QAAQ,EAAE,6EAA6E,CAAC;SACjG,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACvD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAA;YACxE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YACjC,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC1F,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAClD,WAAW,CAAC,yEAAyE,CAAC;SACtF,QAAQ,CAAC,QAAQ,EAAE,qDAAqD,CAAC;SACzE,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACvD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,CAAC,CAAA;YAC3D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;YACpC,MAAM,YAAY,CAChB,OAAO,CAAC,KAAK,EAAE,EACf,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,EACnF,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CACjB,CAAA;YACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACnD,WAAW,CAAC,oFAAoF,CAAC;SACjG,QAAQ,CAAC,QAAQ,EAAE,6EAA6E,CAAC;SACjG,WAAW,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SAChF,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,MAAiB;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YACvD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAA;YAC5D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;YACpC,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAC5G,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CACjB,CAAA;YACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACJ,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1C,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAiB,EAAW,EAAE;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IACnD,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CACV,KAAK,GAAG,CAAC,IAAI,IAAI,WAAW,gFAAgF,CAC7G;SACA,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SAC3C,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SAC3C,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SAC7B,UAAU,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SACnC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;SAClC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;AAClC,CAAC,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import type { Command } from "commander";
2
2
  import { SendJournal } from "../../sends/journal.js";
3
3
  import { RecipientList } from "../../sends/recipients.js";
4
- import type { BotAdapter, BotConnectOptions, BotMessenger } from "./port.js";
4
+ import type { BotAdapter, BotChatRef, BotConnectOptions, BotMessenger } from "./port.js";
5
5
  import { ChatRegistry } from "./registry.js";
6
6
  import { BotTokenStore } from "./token.js";
7
7
  /** How the owner types this bot — `max sales bot` — so a refusal names the command that fixes it. */
@@ -25,6 +25,22 @@ export declare const botContext: (command: Command, bot: BotMessenger) => {
25
25
  registry: ChatRegistry;
26
26
  recipients: () => RecipientList;
27
27
  journal: () => SendJournal;
28
+ /** What this bot has read, sent and received, in the shared store. */
29
+ copy: {
30
+ accountOf: (botId: string) => import("../../store/store.js").AccountKey;
31
+ keep: (botId: string, messages: readonly import("../../index.js").Message[], via: import("../../store/store.js").IngestedVia, warn: (message: string) => void, senders?: readonly import("../../store/store.js").PersonFacts[]) => Promise<boolean>;
32
+ keepChat: (botId: string, chat: import("../../index.js").Chat, warn: (message: string) => void) => Promise<void>;
33
+ forget: (botId: string, chatId: string, messageIds: string[], warn: (message: string) => void) => Promise<boolean>;
34
+ read: <T>(read: (store: import("../../store/store.js").MessageStore) => Promise<T>) => Promise<T>;
35
+ };
36
+ /**
37
+ * The profile's guard with this bot's recipient list and journal. `profile` reads as the words
38
+ * a fix is typed with — `max sales bot recipients add …` — and a bot has no hourly limit unless
39
+ * its section sets one.
40
+ */
41
+ guard: () => import("../../sends/guard.js").SendGuard;
42
+ /** A chat id, `user:<id>`, or the title of a chat this bot has seen — never a guess. */
43
+ chatRef: (typed: string) => BotChatRef;
28
44
  readSecret: (prompt: string) => Promise<string>;
29
45
  /** A client for this token, closed when the command ends. */
30
46
  connect: (token: string, options?: BotConnectOptions) => Promise<BotAdapter>;
@@ -32,4 +48,6 @@ export declare const botContext: (command: Command, bot: BotMessenger) => {
32
48
  authenticated: (options?: BotConnectOptions) => Promise<BotAdapter>;
33
49
  };
34
50
  export type BotContext = ReturnType<typeof botContext>;
51
+ /** `--offline` reads the local copy; a command that has to ask the messenger refuses it rather than ignoring it. */
52
+ export declare const online: (context: BotContext, command: Command) => BotContext;
35
53
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAY,YAAY,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,qGAAqG;AACrG,eAAO,MAAM,QAAQ,QAAS,YAAY,WAAW,MAAM,KAAG,MAAyD,CAAA;AAEvH,yFAAyF;AACzF,eAAO,MAAM,UAAU,YAAa,OAAO,OAAO,YAAY;;;;;;;;;;;;;;;;;;yBAoBrC,MAAM;IAI3B,6DAA6D;qBAjBjC,MAAM,YAAW,iBAAiB,KAAQ,OAAO,CAAC,UAAU,CAAC;IAmBzF,8EAA8E;8BACrD,iBAAiB,KAAQ,OAAO,CAAC,UAAU,CAAC;CAQxE,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxF,OAAO,EAAY,YAAY,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,qGAAqG;AACrG,eAAO,MAAM,QAAQ,QAAS,YAAY,WAAW,MAAM,KAAG,MAAyD,CAAA;AAEvH,yFAAyF;AACzF,eAAO,MAAM,UAAU,YAAa,OAAO,OAAO,YAAY;;;;;;;;;;;;;;;;;;IAuB1D,sEAAsE;;;;;;;;IAEtE;;;;OAIG;;IAeH,wFAAwF;qBACvE,MAAM,KAAG,UAAU;yBAKf,MAAM;IAI3B,6DAA6D;qBA5CjC,MAAM,YAAW,iBAAiB,KAAQ,OAAO,CAAC,UAAU,CAAC;IA8CzF,8EAA8E;8BACrD,iBAAiB,KAAQ,OAAO,CAAC,UAAU,CAAC;CAQxE,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AAEtD,oHAAoH;AACpH,eAAO,MAAM,MAAM,YAAa,UAAU,WAAW,OAAO,KAAG,UAQ9D,CAAA"}
@@ -1,9 +1,13 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
+ import { pickChat } from "../../resolve.js";
3
+ import { sendGuard } from "../../sends/guard.js";
2
4
  import { SendJournal } from "../../sends/journal.js";
3
5
  import { RecipientList } from "../../sends/recipients.js";
4
6
  import { readSecret } from "../../terminal/prompt.js";
5
7
  import { baseContext, environmentOf } from "../context.js";
8
+ import { terminalAsker } from "../messenger/ask.js";
6
9
  import { asFirstWord } from "../profile.js";
10
+ import { botCopy } from "./copy.js";
7
11
  import { botFiles, ChatRegistry } from "./registry.js";
8
12
  import { BotTokenStore } from "./token.js";
9
13
  /** How the owner types this bot — `max sales bot` — so a refusal names the command that fixes it. */
@@ -16,6 +20,9 @@ export const botContext = (command, bot) => {
16
20
  const files = botFiles(bot.app, profile, env);
17
21
  const tokens = bot.tokenStore?.(command, profile) ?? new BotTokenStore({ app: bot.app, profile, env });
18
22
  const words = botWords(bot, profile);
23
+ const registry = bot.registry?.(command, profile) ?? new ChatRegistry(bot.app, profile, env);
24
+ const recipients = () => new RecipientList(files.recipients, words);
25
+ const journal = () => new SendJournal(files.journal);
19
26
  const connect = async (token, options = {}) => {
20
27
  const adapter = await bot.connect(command, token, options);
21
28
  base.track(adapter);
@@ -26,9 +33,36 @@ export const botContext = (command, bot) => {
26
33
  profile,
27
34
  words,
28
35
  tokens,
29
- registry: bot.registry?.(command, profile) ?? new ChatRegistry(bot.app, profile, env),
30
- recipients: () => new RecipientList(files.recipients, words),
31
- journal: () => new SendJournal(files.journal),
36
+ registry,
37
+ recipients,
38
+ journal,
39
+ /** What this bot has read, sent and received, in the shared store. */
40
+ copy: botCopy(bot.provider),
41
+ /**
42
+ * The profile's guard with this bot's recipient list and journal. `profile` reads as the words
43
+ * a fix is typed with — `max sales bot recipients add …` — and a bot has no hourly limit unless
44
+ * its section sets one.
45
+ */
46
+ guard: () => sendGuard({
47
+ profile: `${asFirstWord(profile)}bot`,
48
+ command: bot.app.command,
49
+ readOnly: settings.readOnly,
50
+ readOnlyFrom: settings.sources.readOnly ?? "default",
51
+ permissions: settings.permissions,
52
+ permissionSources: settings.permissionSources,
53
+ ask: terminalAsker(command),
54
+ sendsPerHour: settings.sendsPerHour,
55
+ journal: journal(),
56
+ recipients: recipients(),
57
+ warn: base.renderer.warn,
58
+ }),
59
+ /** A chat id, `user:<id>`, or the title of a chat this bot has seen — never a guess. */
60
+ chatRef: (typed) => {
61
+ const trimmed = typed.trim();
62
+ if (/^-?\d+$/.test(trimmed) || /^user:\d+$/.test(trimmed))
63
+ return trimmed;
64
+ return pickChat(trimmed, registry.list()).id;
65
+ },
32
66
  readSecret: (prompt) => {
33
67
  const stdin = environmentOf(command).stdin;
34
68
  return bot.readSecret?.(command, prompt) ?? readSecret(prompt, stdin ? { input: stdin } : {});
@@ -45,4 +79,11 @@ export const botContext = (command, bot) => {
45
79
  },
46
80
  };
47
81
  };
82
+ /** `--offline` reads the local copy; a command that has to ask the messenger refuses it rather than ignoring it. */
83
+ export const online = (context, command) => {
84
+ if (context.settings.offline) {
85
+ throw new CliError("validation_error", `--offline reads the local copy; \`${command.name()}\` has to ask the messenger`);
86
+ }
87
+ return context;
88
+ };
48
89
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/bot/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/bot/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Chat, Message, Provider } from "../../domain/models.js";
2
+ import type { AccountKey, IngestedVia, MessageStore, PersonFacts } from "../../store/index.js";
3
+ /**
4
+ * What a bot read, sent or received, kept in the shared store under its own provider and the bot's
5
+ * id, so each bot sees only its own copy. Only a real chat is kept: `user:<id>` is a send address,
6
+ * and stored it would make a chat that does not exist.
7
+ */
8
+ export declare const botCopy: (provider: Provider) => {
9
+ accountOf: (botId: string) => AccountKey;
10
+ keep: (botId: string, messages: readonly Message[], via: IngestedVia, warn: (message: string) => void, senders?: readonly PersonFacts[]) => Promise<boolean>;
11
+ /** Only a chat the messenger has just described in full: the store replaces a title it is not given. */
12
+ keepChat: (botId: string, chat: Chat, warn: (message: string) => void) => Promise<void>;
13
+ /** Messages the bot deleted, kept as tombstones: reads and search stop returning them. */
14
+ forget: (botId: string, chatId: string, messageIds: string[], warn: (message: string) => void) => Promise<boolean>;
15
+ /** For a read the local copy answers: here the store is the answer, so a failure is the command's. */
16
+ read: <T>(read: (store: MessageStore) => Promise<T>) => Promise<T>;
17
+ };
18
+ export type BotCopy = ReturnType<typeof botCopy>;
19
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/cli/bot/copy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AA+B9F;;;;GAIG;AACH,eAAO,MAAM,OAAO,aAAc,QAAQ;uBACd,MAAM,KAAG,UAAU;kBAOlC,MAAM,YACH,SAAS,OAAO,EAAE,OACvB,WAAW,QACV,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,YACtB,SAAS,WAAW,EAAE,KAC9B,OAAO,CAAC,OAAO,CAAC;IAcnB,wGAAwG;sBAChF,MAAM,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAI3E,0FAA0F;oBACpE,MAAM,UAAU,MAAM,cAAc,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAKnG,sGAAsG;WACzF,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;CAczE,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAA"}