@leemour/max-cli 0.14.0 → 0.16.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.
- package/README.md +43 -9
- package/dist/bot/client.d.ts +7 -1
- package/dist/bot/client.d.ts.map +1 -1
- package/dist/bot/client.js +19 -5
- package/dist/bot/client.js.map +1 -1
- package/dist/bot/input.d.ts.map +1 -1
- package/dist/bot/input.js +7 -4
- package/dist/bot/input.js.map +1 -1
- package/dist/bot/joins.d.ts +26 -0
- package/dist/bot/joins.d.ts.map +1 -0
- package/dist/bot/joins.js +56 -0
- package/dist/bot/joins.js.map +1 -0
- package/dist/bot/keep.d.ts +25 -0
- package/dist/bot/keep.d.ts.map +1 -0
- package/dist/bot/keep.js +97 -0
- package/dist/bot/keep.js.map +1 -0
- package/dist/bot/map.d.ts +5 -2
- package/dist/bot/map.d.ts.map +1 -1
- package/dist/bot/map.js +7 -1
- package/dist/bot/map.js.map +1 -1
- package/dist/bot/registry.d.ts +3 -0
- package/dist/bot/registry.d.ts.map +1 -1
- package/dist/bot/registry.js +27 -10
- package/dist/bot/registry.js.map +1 -1
- package/dist/bot/uploads.d.ts +34 -0
- package/dist/bot/uploads.d.ts.map +1 -0
- package/dist/bot/uploads.js +122 -0
- package/dist/bot/uploads.js.map +1 -0
- package/dist/bot-mcp/instructions.d.ts +9 -0
- package/dist/bot-mcp/instructions.d.ts.map +1 -0
- package/dist/bot-mcp/instructions.js +22 -0
- package/dist/bot-mcp/instructions.js.map +1 -0
- package/dist/bot-mcp/server.d.ts +21 -0
- package/dist/bot-mcp/server.d.ts.map +1 -0
- package/dist/bot-mcp/server.js +199 -0
- package/dist/bot-mcp/server.js.map +1 -0
- package/dist/bot-mcp/tools.d.ts +27 -0
- package/dist/bot-mcp/tools.d.ts.map +1 -0
- package/dist/bot-mcp/tools.js +280 -0
- package/dist/bot-mcp/tools.js.map +1 -0
- package/dist/client.d.ts +44 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +232 -41
- package/dist/client.js.map +1 -1
- package/dist/commands/bot-check.d.ts +11 -0
- package/dist/commands/bot-check.d.ts.map +1 -0
- package/dist/commands/bot-check.js +206 -0
- package/dist/commands/bot-check.js.map +1 -0
- package/dist/commands/bot-comments.d.ts +4 -0
- package/dist/commands/bot-comments.d.ts.map +1 -0
- package/dist/commands/bot-comments.js +97 -0
- package/dist/commands/bot-comments.js.map +1 -0
- package/dist/commands/bot-context.d.ts +9 -3
- package/dist/commands/bot-context.d.ts.map +1 -1
- package/dist/commands/bot-context.js +38 -15
- package/dist/commands/bot-context.js.map +1 -1
- package/dist/commands/bot-mcp.d.ts +3 -0
- package/dist/commands/bot-mcp.d.ts.map +1 -0
- package/dist/commands/bot-mcp.js +69 -0
- package/dist/commands/bot-mcp.js.map +1 -0
- package/dist/commands/bot-members.d.ts +12 -0
- package/dist/commands/bot-members.d.ts.map +1 -0
- package/dist/commands/bot-members.js +136 -0
- package/dist/commands/bot-members.js.map +1 -0
- package/dist/commands/bot-people.d.ts +10 -0
- package/dist/commands/bot-people.d.ts.map +1 -0
- package/dist/commands/bot-people.js +156 -0
- package/dist/commands/bot-people.js.map +1 -0
- package/dist/commands/bot-reads.d.ts.map +1 -1
- package/dist/commands/bot-reads.js +56 -8
- package/dist/commands/bot-reads.js.map +1 -1
- package/dist/commands/bot-sends.d.ts +5 -0
- package/dist/commands/bot-sends.d.ts.map +1 -1
- package/dist/commands/bot-sends.js +56 -11
- package/dist/commands/bot-sends.js.map +1 -1
- package/dist/commands/bot-setup.d.ts +5 -0
- package/dist/commands/bot-setup.d.ts.map +1 -0
- package/dist/commands/bot-setup.js +107 -0
- package/dist/commands/bot-setup.js.map +1 -0
- package/dist/commands/bot-updates.d.ts +3 -0
- package/dist/commands/bot-updates.d.ts.map +1 -0
- package/dist/commands/bot-updates.js +196 -0
- package/dist/commands/bot-updates.js.map +1 -0
- package/dist/commands/bot.d.ts.map +1 -1
- package/dist/commands/bot.js +21 -1
- package/dist/commands/bot.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +19 -6
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/check.d.ts +8 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +64 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/context.d.ts +5 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +5 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/hearing.d.ts +25 -0
- package/dist/commands/hearing.d.ts.map +1 -0
- package/dist/commands/hearing.js +41 -0
- package/dist/commands/hearing.js.map +1 -0
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +19 -3
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +7 -4
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +21 -5
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/paging.d.ts +3 -1
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +4 -1
- package/dist/commands/paging.js.map +1 -1
- package/dist/commands/polls.d.ts +3 -0
- package/dist/commands/polls.d.ts.map +1 -0
- package/dist/commands/polls.js +103 -0
- package/dist/commands/polls.js.map +1 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +5 -7
- package/dist/commands/review.js.map +1 -1
- package/dist/domain/map.d.ts +9 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +57 -0
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +33 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/generated/client.generated.d.ts +2 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +2 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +2 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +2 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +24 -3
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +4 -2
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/confirm.d.ts +6 -2
- package/dist/mcp/confirm.d.ts.map +1 -1
- package/dist/mcp/confirm.js +2 -2
- package/dist/mcp/confirm.js.map +1 -1
- package/dist/mcp/instructions.d.ts +2 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +2 -1
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +5 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +187 -12
- package/dist/mcp/tools.js.map +1 -1
- package/dist/moderation/check.d.ts +105 -0
- package/dist/moderation/check.d.ts.map +1 -0
- package/dist/moderation/check.js +313 -0
- package/dist/moderation/check.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +2 -0
- package/dist/program.js.map +1 -1
- package/dist/rendering/messages.d.ts +6 -1
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +24 -3
- package/dist/rendering/messages.js.map +1 -1
- package/dist/review.d.ts +10 -4
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +35 -53
- package/dist/review.js.map +1 -1
- package/dist/sends/journal.d.ts +1 -1
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/server/server-connection.d.ts +8 -1
- package/dist/server/server-connection.d.ts.map +1 -1
- package/dist/server/server-connection.js +27 -1
- package/dist/server/server-connection.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +2 -1
- package/dist/server/server.js.map +1 -1
- package/dist/server/start.d.ts +1 -1
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js +5 -3
- package/dist/server/start.js.map +1 -1
- package/dist/session/store.d.ts +2 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +2 -0
- package/dist/session/store.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +4 -2
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +3 -1
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/messages.d.ts +13 -3
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +37 -6
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +13 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -1
- package/dist/spec/operations/uploads.js +21 -0
- package/dist/spec/operations/uploads.js.map +1 -1
- package/dist/transcribe/index.d.ts +36 -1
- package/dist/transcribe/index.d.ts.map +1 -1
- package/dist/transcribe/index.js +91 -14
- package/dist/transcribe/index.js.map +1 -1
- package/dist/upload.d.ts +3 -0
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +13 -7
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/voice.d.ts +9 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +36 -0
- package/dist/voice.js.map +1 -0
- package/package.json +6 -2
- package/skills/max-cli/SKILL.md +17 -5
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
Ваши боты [MAX](https://max.ru) и ваш личный аккаунт — в терминале и в ИИ-агентах. `max` —
|
|
8
8
|
программа для терминала и MCP-сервер: пишите от имени бота через официальный Bot API, а в свои
|
|
9
|
-
чаты — сами или руками Claude, Codex, Cursor и других агентов.
|
|
9
|
+
чаты — сами или руками Claude, Codex, Cursor и других агентов. Для групп, которые вы ведёте, —
|
|
10
|
+
вопросы без ответа, новенькие и уборка спама по вашим правилам.
|
|
10
11
|
|
|
11
12
|
```sh
|
|
12
13
|
max sales bot messages send "Команда продаж" "Сборка готова" # от имени бота
|
|
@@ -22,15 +23,21 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
22
23
|
```sh
|
|
23
24
|
max sales bot auth set # токен — в скрытом вводе, MAX его проверит
|
|
24
25
|
max sales bot me # какой это бот
|
|
25
|
-
max sales bot
|
|
26
|
-
max sales bot messages
|
|
27
|
-
max sales bot recipients add
|
|
26
|
+
max sales bot api get-updates --limit 10 # номер группы — в поле chat_id
|
|
27
|
+
max sales bot messages send "Команда продаж" "Сборка готова" --file report.pdf
|
|
28
|
+
max sales bot recipients add "Команда продаж" # писать только сюда
|
|
28
29
|
max bot list --check # все боты на этом компьютере
|
|
29
30
|
```
|
|
30
31
|
|
|
32
|
+
Чат называют по номеру или, когда бот его уже видел, по названию; человеку пишут как
|
|
33
|
+
`user:<номер>`. Где взять номер чата — [docs/bot.md](docs/bot.md#где-взять-номер-чата).
|
|
34
|
+
|
|
31
35
|
- **Сообщения и чаты.** Отправка в чат по номеру, человеку как `user:<номер>` или в чат по
|
|
32
36
|
названию; правка, удаление, чтение, закрепление. `chats list` — чаты, которые бот видел: списка
|
|
33
37
|
чатов бота у MAX нет.
|
|
38
|
+
- **Файлы, участники, комментарии, кнопки, меню команд, вебхуки.** `messages send --file`,
|
|
39
|
+
`members`, `admins`, `comments`, `callbacks answer`, `commands`, `webhooks` — у каждой записи тот
|
|
40
|
+
же список получателей и журнал.
|
|
34
41
|
- **Любая операция API.** Все операции Bot API доступны как `max bot api <операция>` — с флагами
|
|
35
42
|
для параметров и JSON-телом, которое сверяется со схемой до отправки.
|
|
36
43
|
- **Бот не напишет лишнего.** У каждого бота свой список чатов, куда ему можно писать, и журнал
|
|
@@ -76,6 +83,9 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
76
83
|
- **Черновики ответов.** Агент предлагает текст, а отправляете вы — или он сам, если вы разрешили
|
|
77
84
|
писать в этот чат.
|
|
78
85
|
- **Поиск.** «Когда мы договорились о встрече с Иваном?» — ответ с датой и самим сообщением.
|
|
86
|
+
- **Группа, которую вы ведёте.** Какие вопросы висят без ответа, кто вступил за неделю и с каким
|
|
87
|
+
аккаунтом, удалить приглашения в чужие чаты — по вашим правилам и с вашим «да»
|
|
88
|
+
([ниже](#группы-которые-вы-ведёте)).
|
|
79
89
|
|
|
80
90
|
Как это выглядит:
|
|
81
91
|
|
|
@@ -98,6 +108,21 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
98
108
|
агента под каждую задачу — готовые запросы, расписание и ограничения:
|
|
99
109
|
[docs/recipes.md](docs/recipes.md).
|
|
100
110
|
|
|
111
|
+
## Группы, которые вы ведёте
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
max review --chat "Поход" --unanswered # вопросы, на которые сутки никто не ответил
|
|
115
|
+
max chats events "Поход" # кто вступил и вышел за неделю
|
|
116
|
+
max chats members list "Поход" # все участники: когда заведён аккаунт
|
|
117
|
+
max chats rules set "Поход" invites delete # приглашения в чужие чаты — удалять
|
|
118
|
+
max chats check "Поход" --allow-dangerous # проверить группу и сделать, что разрешено
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Проверка сверяет новое в группе с вашими правилами: заблокированные люди, приглашения, ссылки,
|
|
122
|
+
пересланное, флуд, совсем новые аккаунты. По умолчанию она только отмечает. Для каждого действия
|
|
123
|
+
вы решаете сами: никогда, только с флагом, с вашим подтверждением или сразу. Сценарии с агентом,
|
|
124
|
+
все правила и ограничения — [docs/groups.md](docs/groups.md).
|
|
125
|
+
|
|
101
126
|
## Как это работает
|
|
102
127
|
|
|
103
128
|
`max` работает от вашего имени, как ещё одно ваше устройство, а не как бот. Вы входите один раз
|
|
@@ -129,10 +154,12 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
129
154
|
расшифровка голосовых в текст на вашем компьютере, выгрузка переписки в JSONL или Markdown.
|
|
130
155
|
- **Искать.** Сообщения — по тексту всего прочитанного, без подключения к MAX. Чаты и контакты —
|
|
131
156
|
по части названия или имени.
|
|
132
|
-
- **Писать.** Текст и разметка, ответы,
|
|
157
|
+
- **Писать.** Текст и разметка, ответы, фото, видео, файлы и голосовые, правка, пересылка, закрепление, реакции,
|
|
133
158
|
отложенная отправка, удаление — у себя или у всех.
|
|
134
159
|
- **Вести группы и каналы.** Создать группу, вступить по ссылке, выйти, участники и админы,
|
|
135
|
-
название и настройки, заявки на вступление, ссылка-приглашение, папки.
|
|
160
|
+
название и настройки, заявки на вступление, ссылка-приглашение, папки. Для админа — вопросы без
|
|
161
|
+
ответа, кто вступил и вышел, все участники с возрастом аккаунта, правила и проверка группы по ним
|
|
162
|
+
([docs/groups.md](docs/groups.md)).
|
|
136
163
|
- **Контакты и аккаунт.** Найти человека по номеру, добавить, удалить, импортировать из файла;
|
|
137
164
|
изменить профиль; посмотреть и завершить другие сеансы.
|
|
138
165
|
- **Входить удобным способом.** QR-код прямо в терминале, QR-код или SMS через web.max.ru в
|
|
@@ -145,6 +172,10 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
145
172
|
- **Агент не напишет лишнего.** Есть профиль только для чтения, список чатов, в которые можно
|
|
146
173
|
писать, и лимит сообщений в час. MCP-сервер может показывать вам каждое действие до того, как его выполнить.
|
|
147
174
|
Если имя подходит к двум чатам, `max` не выбирает сам, а показывает оба.
|
|
175
|
+
- **Модерация по вашим правилам, а не по чужим.** Проверка группы по умолчанию только отмечает.
|
|
176
|
+
Удалить сообщение или человека она может, только если вы разрешили: для каждого действия —
|
|
177
|
+
никогда, с флагом, с вашим подтверждением или сразу. Не больше 10 действий за раз, и ничего не
|
|
178
|
+
следит за группой в фоне.
|
|
148
179
|
- **Сообщение не уйдёт дважды.** Если связь оборвалась во время отправки, `max` прямо говорит, что
|
|
149
180
|
не знает, дошло ли сообщение, и даёт команду для повтора. MAX узнаёт повтор и второго сообщения не
|
|
150
181
|
создаёт.
|
|
@@ -192,9 +223,11 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
192
223
|
| удаление сообщений — у себя или у всех, с лимитом | ✅ | ✅ | — |
|
|
193
224
|
| отметка «прочитано» по запросу | ✅ | ✅ | — |
|
|
194
225
|
| группы и каналы: создать, вступить, участники, админы | ✅ | ✅ | чтение каналов |
|
|
226
|
+
| для админа группы: вопросы без ответа, новенькие, проверка по правилам | ✅ | — | — |
|
|
195
227
|
| контакты, профиль, другие сеансы | ✅ | ✅ | — |
|
|
196
|
-
| отправка видео
|
|
197
|
-
| отправка
|
|
228
|
+
| отправка видео | ✅ | ✅ | — |
|
|
229
|
+
| отправка кружков | — | ✅ | — |
|
|
230
|
+
| отправка голосовых | ✅ | ⚠️ в 2.4.1 не проходит ([#102](https://github.com/MaxApiTeam/PyMax/issues/102), [#103](https://github.com/MaxApiTeam/PyMax/issues/103)) | — |
|
|
198
231
|
| опросы | — | ✅ | — |
|
|
199
232
|
| пароль и двухфакторный вход, фото профиля | — | ✅ | — |
|
|
200
233
|
|
|
@@ -205,6 +238,7 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
|
|
|
205
238
|
|
|
206
239
|
- [Бот](#бот)
|
|
207
240
|
- [Личный аккаунт](#личный-аккаунт)
|
|
241
|
+
- [Группы, которые вы ведёте](#группы-которые-вы-ведёте)
|
|
208
242
|
- [Установка](#установка)
|
|
209
243
|
- [Вход](#вход)
|
|
210
244
|
- [Использование](#использование)
|
|
@@ -380,6 +414,7 @@ max chats list --json
|
|
|
380
414
|
- [docs/sessions.md](docs/sessions.md) — токен, хранилище паролей, профили
|
|
381
415
|
- [docs/configuration.md](docs/configuration.md) — настройки, переменные, порядок разрешения
|
|
382
416
|
- [docs/mcp.md](docs/mcp.md) — MCP-сервер: подключение, отправка, соединение с MAX
|
|
417
|
+
- [docs/groups.md](docs/groups.md) — группы, которые вы ведёте: сценарии с агентом, правила, проверка
|
|
383
418
|
- [docs/recipes.md](docs/recipes.md) — рецепты для агентов: сводки, отчёты, долги, напоминания, расписание
|
|
384
419
|
- [docs/diagnostics.md](docs/diagnostics.md) — `--trace`, `--record`, `max runs`
|
|
385
420
|
- [docs/ROADMAP.md](docs/ROADMAP.md) — что планируется
|
|
@@ -412,7 +447,6 @@ pnpm generate # переписать сгенериро
|
|
|
412
447
|
|
|
413
448
|
Ближайшее:
|
|
414
449
|
|
|
415
|
-
- голосовые сообщения и видео;
|
|
416
450
|
- опросы: показывать при чтении и голосовать;
|
|
417
451
|
- локальная копия по желанию — можно работать совсем без неё.
|
|
418
452
|
|
package/dist/bot/client.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ManifestOperation } from "@leemour/cli-core/codegen";
|
|
2
2
|
import type { Chat, Message } from "@leemour/cli-messaging";
|
|
3
|
+
import type { PersonFacts } from "@leemour/cli-messaging/store";
|
|
3
4
|
import type { BotInfo as BotInfoType } from "./generated/types.js";
|
|
4
5
|
import { type CallInput, type TransportOptions } from "./transport.js";
|
|
5
6
|
/** Every operation of the committed schema, as the manifest describes it. */
|
|
@@ -11,10 +12,15 @@ export declare class BotApiClient {
|
|
|
11
12
|
me(): Promise<BotInfoType>;
|
|
12
13
|
chat(chatId: string): Promise<Chat>;
|
|
13
14
|
message(messageId: string, selfId?: string): Promise<Message>;
|
|
14
|
-
/**
|
|
15
|
+
/** Oldest first, like `max messages list`; MAX answers newest first (`BUG-59`). */
|
|
15
16
|
messages(chatId: string, count: number, selfId?: string): Promise<Message[]>;
|
|
16
17
|
/** A message from any answer — a send's result, an update — decoded the same way as a read. */
|
|
17
18
|
decodeMessage(raw: unknown, selfId?: string): Message;
|
|
19
|
+
/**
|
|
20
|
+
* Who wrote the messages decoded since the last call, with the username and bot flag a `Message`
|
|
21
|
+
* has no field for — for the local copy.
|
|
22
|
+
*/
|
|
23
|
+
takeSenders(): PersonFacts[];
|
|
18
24
|
call(operation: ManifestOperation, input: CallInput): Promise<unknown>;
|
|
19
25
|
}
|
|
20
26
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/bot/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAI/D,OAAO,KAAK,EAAE,OAAO,IAAI,WAAW,EAAyB,MAAM,sBAAsB,CAAA;AAEzF,OAAO,EAAgB,KAAK,SAAS,EAAa,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE/F,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,SAAS,iBAAiB,EAAe,CAAA;AAUrE,wEAAwE;AACxE,qBAAa,YAAY;;IAIvB,YAAY,OAAO,EAAE,gBAAgB,EAEpC;IAEK,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC,CAU/B;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxC;IAEK,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlE;IAED,mFAAmF;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAKjF;IAED,+FAA+F;IAC/F,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD;IAED;;;OAGG;IACH,WAAW,IAAI,WAAW,EAAE,CAI3B;IAED,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAErE;CA6CF"}
|
package/dist/bot/client.js
CHANGED
|
@@ -2,7 +2,7 @@ import { CliError } from "@leemour/cli-core";
|
|
|
2
2
|
import * as v from "valibot";
|
|
3
3
|
import { operations } from "./generated/manifest.js";
|
|
4
4
|
import { BotInfo, Chat as ChatSchema, Message as MessageSchema } from "./generated/schemas.js";
|
|
5
|
-
import { toChat, toMessage } from "./map.js";
|
|
5
|
+
import { toChat, toMessage, toPerson } from "./map.js";
|
|
6
6
|
import { BotTransport, plainJson } from "./transport.js";
|
|
7
7
|
/** Every operation of the committed schema, as the manifest describes it. */
|
|
8
8
|
export const botOperations = operations;
|
|
@@ -16,6 +16,7 @@ const required = (id) => {
|
|
|
16
16
|
/** The one door to the Bot API: generated operations stay behind it. */
|
|
17
17
|
export class BotApiClient {
|
|
18
18
|
#transport;
|
|
19
|
+
#senders = new Map();
|
|
19
20
|
constructor(options) {
|
|
20
21
|
this.#transport = new BotTransport(options);
|
|
21
22
|
}
|
|
@@ -38,17 +39,26 @@ export class BotApiClient {
|
|
|
38
39
|
const answer = await this.#transport.call(required("getMessageById"), { path: { messageId } });
|
|
39
40
|
return this.#message(answer, selfId);
|
|
40
41
|
}
|
|
41
|
-
/**
|
|
42
|
+
/** Oldest first, like `max messages list`; MAX answers newest first (`BUG-59`). */
|
|
42
43
|
async messages(chatId, count, selfId) {
|
|
43
44
|
const answer = (await this.#transport.call(required("getMessages"), {
|
|
44
45
|
query: { chat_id: chatId, count: String(count) },
|
|
45
46
|
}));
|
|
46
|
-
return (answer?.messages ?? []).map((raw) => this.#message(raw, selfId));
|
|
47
|
+
return (answer?.messages ?? []).map((raw) => this.#message(raw, selfId)).reverse();
|
|
47
48
|
}
|
|
48
49
|
/** A message from any answer — a send's result, an update — decoded the same way as a read. */
|
|
49
50
|
decodeMessage(raw, selfId) {
|
|
50
51
|
return this.#message(raw, selfId);
|
|
51
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Who wrote the messages decoded since the last call, with the username and bot flag a `Message`
|
|
55
|
+
* has no field for — for the local copy.
|
|
56
|
+
*/
|
|
57
|
+
takeSenders() {
|
|
58
|
+
const senders = [...this.#senders.values()];
|
|
59
|
+
this.#senders.clear();
|
|
60
|
+
return senders;
|
|
61
|
+
}
|
|
52
62
|
call(operation, input) {
|
|
53
63
|
return this.#transport.call(operation, input);
|
|
54
64
|
}
|
|
@@ -68,8 +78,12 @@ export class BotApiClient {
|
|
|
68
78
|
*/
|
|
69
79
|
#message(raw, selfId) {
|
|
70
80
|
const parsed = v.safeParse(MessageSchema, raw);
|
|
71
|
-
if (parsed.success)
|
|
72
|
-
|
|
81
|
+
if (parsed.success) {
|
|
82
|
+
const message = parsed.output;
|
|
83
|
+
if (message.sender)
|
|
84
|
+
this.#senders.set(message.sender.user_id, toPerson(message.sender));
|
|
85
|
+
return toMessage(message, selfId);
|
|
86
|
+
}
|
|
73
87
|
const loose = plainJson(raw);
|
|
74
88
|
return {
|
|
75
89
|
id: String(loose.body?.mid ?? "unknown"),
|
package/dist/bot/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bot/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bot/client.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/bot/input.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/bot/input.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAQ/F,eAAO,MAAM,MAAM,SAAU,MAAM,KAAG,MAKpB,CAAA;AAElB,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,MAC0C,CAAA;AAWnF,eAAO,MAAM,cAAc,SAAU,MAAM,QAAQ,UAAU,OAAO,MAAM,KAAG,MAAM,GAAG,SA2BrF,CAAA;AAED,eAAO,MAAM,QAAQ,YAAa;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,MAAM,GAAG,SAOjF,CAAA;AAED,eAAO,MAAM,SAAS,cAAe,iBAAiB,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAkC3F,CAAA"}
|
package/dist/bot/input.js
CHANGED
|
@@ -4,10 +4,13 @@ import { identifier } from "@leemour/cli-core/codegen";
|
|
|
4
4
|
import { LosslessNumber, parse } from "lossless-json";
|
|
5
5
|
import * as v from "valibot";
|
|
6
6
|
import { schemas } from "./generated/schemas.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
/** `--timeout` is the program's own deadline: a parameter spelled like it would never reach MAX (`BUG-61`). */
|
|
8
|
+
const RENAMED = { timeout: "poll-timeout" };
|
|
9
|
+
export const flagOf = (name) => RENAMED[name] ??
|
|
10
|
+
name
|
|
11
|
+
.replace(/_/g, "-")
|
|
12
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
13
|
+
.toLowerCase();
|
|
11
14
|
export const optionKey = (name) => flagOf(name).replace(/-([a-z0-9])/g, (_, letter) => letter.toUpperCase());
|
|
12
15
|
const DIGITS = /^-?\d+$/;
|
|
13
16
|
/** A flag's text as the JSON value it stands for, so a generated schema can judge it. */
|
package/dist/bot/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/bot/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAA2C,MAAM,2BAA2B,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAC7C,IAAI;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/bot/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface JoinEntry {
|
|
2
|
+
chatId: string;
|
|
3
|
+
userId: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
event: "add" | "remove";
|
|
6
|
+
/** ms since 1970, as the update's `timestamp`. */
|
|
7
|
+
at: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* **Who joined and left, as `bot updates watch` saw it** (`NEED-338` «C»). MAX hands each update to
|
|
11
|
+
* one reader only, so `bot chats check` cannot read joins itself; `watch` keeps them here instead.
|
|
12
|
+
* State, not cache: a lost entry is a join the check never judges.
|
|
13
|
+
*/
|
|
14
|
+
export declare class JoinLog {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
constructor(path: string);
|
|
17
|
+
/** Beside the marker of `updates watch`, which writes it. */
|
|
18
|
+
static for(profile: string, env?: NodeJS.ProcessEnv): JoinLog;
|
|
19
|
+
read(): JoinEntry[];
|
|
20
|
+
/** Whether the log has anything at all — none means `watch` never ran for this bot here. */
|
|
21
|
+
kept(): boolean;
|
|
22
|
+
add(entries: JoinEntry[], now?: number): void;
|
|
23
|
+
}
|
|
24
|
+
/** `user_added` and `user_removed` from a batch of raw updates; everything else is not a join. */
|
|
25
|
+
export declare const joinsOf: (updates: unknown[]) => JoinEntry[];
|
|
26
|
+
//# sourceMappingURL=joins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joins.d.ts","sourceRoot":"","sources":["../../src/bot/joins.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAA;IACvB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAA;CACX;AAKD;;;;GAIG;AACH,qBAAa,OAAO;IACN,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC,6DAA6D;IAC7D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEzE;IAED,IAAI,IAAI,SAAS,EAAE,CAIlB;IAED,4FAA4F;IAC5F,IAAI,IAAI,OAAO,CAEd;IAED,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,SAAa,GAAG,IAAI,CAIhD;CACF;AAKD,kGAAkG;AAClG,eAAO,MAAM,OAAO,YAAa,OAAO,EAAE,KAAG,SAAS,EAgBlD,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { writeSecurely } from "@leemour/cli-core";
|
|
4
|
+
import { botsDirectory } from "./registry.js";
|
|
5
|
+
/** Past this, a join is too old for any check; the log does not grow for ever. */
|
|
6
|
+
const KEEP_MS = 30 * 86_400_000;
|
|
7
|
+
/**
|
|
8
|
+
* **Who joined and left, as `bot updates watch` saw it** (`NEED-338` «C»). MAX hands each update to
|
|
9
|
+
* one reader only, so `bot chats check` cannot read joins itself; `watch` keeps them here instead.
|
|
10
|
+
* State, not cache: a lost entry is a join the check never judges.
|
|
11
|
+
*/
|
|
12
|
+
export class JoinLog {
|
|
13
|
+
path;
|
|
14
|
+
constructor(path) {
|
|
15
|
+
this.path = path;
|
|
16
|
+
}
|
|
17
|
+
/** Beside the marker of `updates watch`, which writes it. */
|
|
18
|
+
static for(profile, env = process.env) {
|
|
19
|
+
return new JoinLog(join(botsDirectory(env), "joins", `${profile}.json`));
|
|
20
|
+
}
|
|
21
|
+
read() {
|
|
22
|
+
if (!existsSync(this.path))
|
|
23
|
+
return [];
|
|
24
|
+
const parsed = JSON.parse(readFileSync(this.path, "utf8"));
|
|
25
|
+
return Array.isArray(parsed.joins) ? parsed.joins : [];
|
|
26
|
+
}
|
|
27
|
+
/** Whether the log has anything at all — none means `watch` never ran for this bot here. */
|
|
28
|
+
kept() {
|
|
29
|
+
return existsSync(this.path);
|
|
30
|
+
}
|
|
31
|
+
add(entries, now = Date.now()) {
|
|
32
|
+
if (entries.length === 0 && this.kept())
|
|
33
|
+
return;
|
|
34
|
+
const joins = [...this.read(), ...entries].filter((entry) => now - entry.at < KEEP_MS);
|
|
35
|
+
writeSecurely(this.path, `${JSON.stringify({ joins })}\n`, 0o600);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const nameOf = (user) => [user.first_name, user.last_name].filter((part) => typeof part === "string" && part !== "").join(" ") || null;
|
|
39
|
+
/** `user_added` and `user_removed` from a batch of raw updates; everything else is not a join. */
|
|
40
|
+
export const joinsOf = (updates) => updates.flatMap((raw) => {
|
|
41
|
+
const update = (raw ?? {});
|
|
42
|
+
const event = update.update_type === "user_added" ? "add" : update.update_type === "user_removed" ? "remove" : undefined;
|
|
43
|
+
const user = (update.user ?? {});
|
|
44
|
+
if (!event || update.chat_id === undefined || user.user_id === undefined)
|
|
45
|
+
return [];
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
chatId: String(update.chat_id),
|
|
49
|
+
userId: String(user.user_id),
|
|
50
|
+
name: nameOf(user),
|
|
51
|
+
event,
|
|
52
|
+
at: typeof update.timestamp === "number" ? update.timestamp : Date.now(),
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=joins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joins.js","sourceRoot":"","sources":["../../src/bot/joins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Chat, Message } from "@leemour/cli-messaging";
|
|
2
|
+
import { type AccountKey, type IngestedVia, type MessageStore, type PersonFacts } from "@leemour/cli-messaging/store";
|
|
3
|
+
import type { ChatRegistry } from "./registry.js";
|
|
4
|
+
/** How a bot's messages are told apart from a personal account's in the shared store and its locators. */
|
|
5
|
+
export declare const PROVIDER = "max-bot";
|
|
6
|
+
export declare const accountOf: (botId: string) => AccountKey;
|
|
7
|
+
export declare const keep: (botId: string, messages: readonly Message[], via: IngestedVia, warn: (message: string) => void, senders?: readonly PersonFacts[]) => Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Only a chat MAX has just described in full: the store replaces a title it is not given
|
|
10
|
+
* (`RISK-53`), and the partial facts stay in the registry, which merges them.
|
|
11
|
+
*/
|
|
12
|
+
export declare const keepChat: (botId: string | undefined, chat: Chat, warn: (message: string) => void) => Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* A message MAX says was deleted. The store keeps it as a tombstone: reads, `--offline` and
|
|
15
|
+
* search stop returning it.
|
|
16
|
+
*/
|
|
17
|
+
export declare const forget: (botId: string, removals: readonly {
|
|
18
|
+
chatId: string;
|
|
19
|
+
messageId: string;
|
|
20
|
+
}[], warn: (message: string) => void) => Promise<boolean>;
|
|
21
|
+
/** A send's answer names the bot as its sender, so the store needs no `me()` to know whose it is. */
|
|
22
|
+
export declare const keepSent: (registry: ChatRegistry, sent: unknown, warn: (message: string) => void) => Promise<void>;
|
|
23
|
+
/** For `--offline` and `search`: here the store is the answer, so a failure is the command's failure. */
|
|
24
|
+
export declare const fromStore: <T>(read: (store: MessageStore) => T) => Promise<T>;
|
|
25
|
+
//# sourceMappingURL=keep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep.d.ts","sourceRoot":"","sources":["../../src/bot/keep.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EAEjB,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,0GAA0G;AAC1G,eAAO,MAAM,QAAQ,YAAY,CAAA;AAIjC,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,UAAsD,CAAA;AAkChG,eAAO,MAAM,IAAI,UACR,MAAM,YACH,SAAS,OAAO,EAAE,OACvB,WAAW,QACV,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,YACtB,SAAS,WAAW,EAAE,KAC9B,OAAO,CAAC,OAAO,CAUjB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAiB,MAAM,GAAG,SAAS,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,kBAEpG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,UACV,MAAM,YACH,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,QACpD,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAC9B,OAAO,CAAC,OAAO,CAMjB,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,QAAQ,aAAoB,YAAY,QAAQ,OAAO,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,kBAKpG,CAAA;AAED,yGAAyG;AACzG,eAAO,MAAM,SAAS,GAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,KAAG,OAAO,CAAC,CAAC,CAY9E,CAAA"}
|
package/dist/bot/keep.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { openStore, } from "@leemour/cli-messaging/store";
|
|
3
|
+
/** How a bot's messages are told apart from a personal account's in the shared store and its locators. */
|
|
4
|
+
export const PROVIDER = "max-bot";
|
|
5
|
+
const CHAT_ID = /^-?\d+$/;
|
|
6
|
+
export const accountOf = (botId) => ({ provider: PROVIDER, account: botId });
|
|
7
|
+
/**
|
|
8
|
+
* Only a real chat and a real message: the fallback decoder says `unknown`, and `user:<id>` is a
|
|
9
|
+
* send address — stored, either would make a chat that does not exist (`RISK-54`).
|
|
10
|
+
*/
|
|
11
|
+
const storable = (message) => CHAT_ID.test(message.chatId) && message.id.startsWith("mid.");
|
|
12
|
+
/** The reason, never the path — a home directory is nobody else's business. */
|
|
13
|
+
const reasonOf = (error) => {
|
|
14
|
+
const code = error?.code;
|
|
15
|
+
if (typeof code === "string")
|
|
16
|
+
return code;
|
|
17
|
+
return error instanceof Error ? error.name : "an unknown problem";
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* **A store that fails never fails the command** — MAX answered, and the answer is printed either
|
|
21
|
+
* way; the reason goes to stderr. Returns whether it was saved, for `updates watch`, which must not
|
|
22
|
+
* move its marker past what it failed to keep.
|
|
23
|
+
*/
|
|
24
|
+
const quietly = async (write, warn) => {
|
|
25
|
+
let store;
|
|
26
|
+
try {
|
|
27
|
+
store = await openStore();
|
|
28
|
+
write(store);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
warn(`the local copy was not updated: ${reasonOf(error)}`);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
store?.close();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
export const keep = async (botId, messages, via, warn, senders = []) => {
|
|
40
|
+
const byChat = new Map();
|
|
41
|
+
for (const message of messages.filter(storable)) {
|
|
42
|
+
byChat.set(message.chatId, [...(byChat.get(message.chatId) ?? []), message]);
|
|
43
|
+
}
|
|
44
|
+
if (byChat.size === 0)
|
|
45
|
+
return true;
|
|
46
|
+
return quietly((store) => {
|
|
47
|
+
for (const [chatId, chatMessages] of byChat)
|
|
48
|
+
store.saveMessages(accountOf(botId), chatId, chatMessages, { via });
|
|
49
|
+
store.savePeople(PROVIDER, [...senders]);
|
|
50
|
+
}, warn);
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Only a chat MAX has just described in full: the store replaces a title it is not given
|
|
54
|
+
* (`RISK-53`), and the partial facts stay in the registry, which merges them.
|
|
55
|
+
*/
|
|
56
|
+
export const keepChat = async (botId, chat, warn) => {
|
|
57
|
+
if (botId && CHAT_ID.test(chat.id))
|
|
58
|
+
await quietly((store) => store.saveChats(accountOf(botId), [chat]), warn);
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* A message MAX says was deleted. The store keeps it as a tombstone: reads, `--offline` and
|
|
62
|
+
* search stop returning it.
|
|
63
|
+
*/
|
|
64
|
+
export const forget = async (botId, removals, warn) => {
|
|
65
|
+
const known = removals.filter((removal) => CHAT_ID.test(removal.chatId));
|
|
66
|
+
if (known.length === 0)
|
|
67
|
+
return true;
|
|
68
|
+
return quietly((store) => {
|
|
69
|
+
for (const { chatId, messageId } of known)
|
|
70
|
+
store.markDeleted(accountOf(botId), [messageId], { chatId });
|
|
71
|
+
}, warn);
|
|
72
|
+
};
|
|
73
|
+
/** A send's answer names the bot as its sender, so the store needs no `me()` to know whose it is. */
|
|
74
|
+
export const keepSent = async (registry, sent, warn) => {
|
|
75
|
+
const message = sent;
|
|
76
|
+
if (typeof message?.senderId !== "string" || typeof message.id !== "string")
|
|
77
|
+
return;
|
|
78
|
+
registry.rememberBot(message.senderId);
|
|
79
|
+
await keep(message.senderId, [message], "send", warn);
|
|
80
|
+
};
|
|
81
|
+
/** For `--offline` and `search`: here the store is the answer, so a failure is the command's failure. */
|
|
82
|
+
export const fromStore = async (read) => {
|
|
83
|
+
let store;
|
|
84
|
+
try {
|
|
85
|
+
store = await openStore();
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new CliError("configuration_error", `the local copy cannot be opened: ${reasonOf(error)}`);
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
return read(store);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
store.close();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=keep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keep.js","sourceRoot":"","sources":["../../src/bot/keep.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/map.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type { Chat, Message } from "@leemour/cli-messaging";
|
|
2
|
-
import type {
|
|
1
|
+
import type { Chat, ChatKind, Message } from "@leemour/cli-messaging";
|
|
2
|
+
import type { PersonFacts } from "@leemour/cli-messaging/store";
|
|
3
|
+
import type { Chat as BotChat, Message as BotMessage, User } from "./generated/types.js";
|
|
4
|
+
export declare const KINDS: Record<string, ChatKind>;
|
|
5
|
+
export declare const toPerson: (user: User) => PersonFacts;
|
|
3
6
|
/**
|
|
4
7
|
* A direct chat is addressed by the other person's user id in the Bot API; `user:<id>` keeps it
|
|
5
8
|
* apart from a group's chat id, which is a different number space.
|
package/dist/bot/map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/bot/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,IAAI,
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/bot/map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAiB,MAAM,wBAAwB,CAAA;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,KAAK,EAEV,IAAI,IAAI,OAAO,EACf,OAAO,IAAI,UAAU,EAErB,IAAI,EACL,MAAM,sBAAsB,CAAA;AAG7B,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAA2D,CAAA;AAQtG,eAAO,MAAM,QAAQ,SAAU,IAAI,KAAG,WAKpC,CAAA;AAmCF;;;GAGG;AACH,eAAO,MAAM,OAAO,cAAe,UAAU,CAAC,WAAW,CAAC,KAAG,MACuB,CAAA;AAEpF,qGAAqG;AACrG,eAAO,MAAM,SAAS,YAAa,UAAU,WAAW,MAAM,KAAG,OAmBhE,CAAA;AAED,eAAO,MAAM,MAAM,SAAU,OAAO,KAAG,IAQrC,CAAA"}
|
package/dist/bot/map.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
const PROVIDER_KINDS = { image: "photo", audio: "voice" };
|
|
2
|
-
const KINDS = { dialog: "dialog", chat: "group", channel: "channel" };
|
|
2
|
+
export const KINDS = { dialog: "dialog", chat: "group", channel: "channel" };
|
|
3
3
|
const iso = (milliseconds) => milliseconds === undefined || milliseconds === null ? null : new Date(Number(milliseconds)).toISOString();
|
|
4
4
|
const nameOf = (user) => user ? [user.first_name, user.last_name].filter(Boolean).join(" ") || null : null;
|
|
5
|
+
export const toPerson = (user) => ({
|
|
6
|
+
id: user.user_id,
|
|
7
|
+
name: nameOf(user),
|
|
8
|
+
username: user.username ?? null,
|
|
9
|
+
isBot: user.is_bot,
|
|
10
|
+
});
|
|
5
11
|
const attachmentOf = (attachment) => {
|
|
6
12
|
if (attachment.type === "inline_keyboard")
|
|
7
13
|
return undefined;
|
package/dist/bot/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/bot/map.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/bot/map.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/registry.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ export declare class ChatRegistry {
|
|
|
15
15
|
#private;
|
|
16
16
|
constructor(profile: string, env?: NodeJS.ProcessEnv);
|
|
17
17
|
list(): SeenChat[];
|
|
18
|
+
/** The bot's own user id, once any command has learned it — the key its messages are stored under. */
|
|
19
|
+
botId(): string | undefined;
|
|
20
|
+
rememberBot(id: string): void;
|
|
18
21
|
/** Makes this bot known to `max bot list` before it has seen any chat. */
|
|
19
22
|
touch(): void;
|
|
20
23
|
/** Newer facts win; a chat seen only as an id keeps the title it had. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/bot/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,8FAA8F;AAC9F,eAAO,MAAM,aAAa,SAAS,MAAM,CAAC,UAAU,KAAiB,MACS,CAAA;AAE9E;;;;;GAKG;AACH,qBAAa,YAAY;;IAGvB,YAAY,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAEhE;IAED,IAAI,IAAI,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/bot/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAElD,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,8FAA8F;AAC9F,eAAO,MAAM,aAAa,SAAS,MAAM,CAAC,UAAU,KAAiB,MACS,CAAA;AAE9E;;;;;GAKG;AACH,qBAAa,YAAY;;IAGvB,YAAY,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAEhE;IAED,IAAI,IAAI,QAAQ,EAAE,CAGjB;IAED,sGAAsG;IACtG,KAAK,IAAI,MAAM,GAAG,SAAS,CAG1B;IAED,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAG5B;IAED,0EAA0E;IAC1E,KAAK,IAAI,IAAI,CAEZ;IAED,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,CAuBxF;CAeF;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,SAAS,MAAM,CAAC,UAAU,KAAiB,MAAM,EAO7E,CAAA"}
|