@leemour/max-cli 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +92 -14
  2. package/dist/bot/auth.d.ts +23 -0
  3. package/dist/bot/auth.d.ts.map +1 -0
  4. package/dist/bot/auth.js +36 -0
  5. package/dist/bot/auth.js.map +1 -0
  6. package/dist/bot/client.d.ts +20 -0
  7. package/dist/bot/client.d.ts.map +1 -0
  8. package/dist/bot/client.js +91 -0
  9. package/dist/bot/client.js.map +1 -0
  10. package/dist/bot/generated/manifest.d.ts +3 -0
  11. package/dist/bot/generated/manifest.d.ts.map +1 -0
  12. package/dist/bot/generated/manifest.js +1232 -0
  13. package/dist/bot/generated/manifest.js.map +1 -0
  14. package/dist/bot/generated/schemas.d.ts +271 -0
  15. package/dist/bot/generated/schemas.d.ts.map +1 -0
  16. package/dist/bot/generated/schemas.js +869 -0
  17. package/dist/bot/generated/schemas.js.map +1 -0
  18. package/dist/bot/generated/types.d.ts +1088 -0
  19. package/dist/bot/generated/types.d.ts.map +1 -0
  20. package/dist/bot/generated/types.js +5 -0
  21. package/dist/bot/generated/types.js.map +1 -0
  22. package/dist/bot/input.d.ts +10 -0
  23. package/dist/bot/input.d.ts.map +1 -0
  24. package/dist/bot/input.js +88 -0
  25. package/dist/bot/input.js.map +1 -0
  26. package/dist/bot/keep.d.ts +25 -0
  27. package/dist/bot/keep.d.ts.map +1 -0
  28. package/dist/bot/keep.js +96 -0
  29. package/dist/bot/keep.js.map +1 -0
  30. package/dist/bot/map.d.ts +11 -0
  31. package/dist/bot/map.d.ts.map +1 -0
  32. package/dist/bot/map.js +76 -0
  33. package/dist/bot/map.js.map +1 -0
  34. package/dist/bot/permissions.d.ts +14 -0
  35. package/dist/bot/permissions.d.ts.map +1 -0
  36. package/dist/bot/permissions.js +53 -0
  37. package/dist/bot/permissions.js.map +1 -0
  38. package/dist/bot/registry.d.ts +30 -0
  39. package/dist/bot/registry.d.ts.map +1 -0
  40. package/dist/bot/registry.js +85 -0
  41. package/dist/bot/registry.js.map +1 -0
  42. package/dist/bot/russian-trusted-root.d.ts +8 -0
  43. package/dist/bot/russian-trusted-root.d.ts.map +1 -0
  44. package/dist/bot/russian-trusted-root.js +41 -0
  45. package/dist/bot/russian-trusted-root.js.map +1 -0
  46. package/dist/bot/transport.d.ts +41 -0
  47. package/dist/bot/transport.d.ts.map +1 -0
  48. package/dist/bot/transport.js +200 -0
  49. package/dist/bot/transport.js.map +1 -0
  50. package/dist/bot/uploads.d.ts +34 -0
  51. package/dist/bot/uploads.d.ts.map +1 -0
  52. package/dist/bot/uploads.js +122 -0
  53. package/dist/bot/uploads.js.map +1 -0
  54. package/dist/client.d.ts +39 -3
  55. package/dist/client.d.ts.map +1 -1
  56. package/dist/client.js +168 -23
  57. package/dist/client.js.map +1 -1
  58. package/dist/commands/bot-comments.d.ts +4 -0
  59. package/dist/commands/bot-comments.d.ts.map +1 -0
  60. package/dist/commands/bot-comments.js +97 -0
  61. package/dist/commands/bot-comments.js.map +1 -0
  62. package/dist/commands/bot-context.d.ts +27 -0
  63. package/dist/commands/bot-context.d.ts.map +1 -0
  64. package/dist/commands/bot-context.js +82 -0
  65. package/dist/commands/bot-context.js.map +1 -0
  66. package/dist/commands/bot-members.d.ts +12 -0
  67. package/dist/commands/bot-members.d.ts.map +1 -0
  68. package/dist/commands/bot-members.js +136 -0
  69. package/dist/commands/bot-members.js.map +1 -0
  70. package/dist/commands/bot-reads.d.ts +7 -0
  71. package/dist/commands/bot-reads.d.ts.map +1 -0
  72. package/dist/commands/bot-reads.js +145 -0
  73. package/dist/commands/bot-reads.js.map +1 -0
  74. package/dist/commands/bot-sends.d.ts +17 -0
  75. package/dist/commands/bot-sends.d.ts.map +1 -0
  76. package/dist/commands/bot-sends.js +270 -0
  77. package/dist/commands/bot-sends.js.map +1 -0
  78. package/dist/commands/bot-setup.d.ts +5 -0
  79. package/dist/commands/bot-setup.d.ts.map +1 -0
  80. package/dist/commands/bot-setup.js +107 -0
  81. package/dist/commands/bot-setup.js.map +1 -0
  82. package/dist/commands/bot-updates.d.ts +3 -0
  83. package/dist/commands/bot-updates.d.ts.map +1 -0
  84. package/dist/commands/bot-updates.js +182 -0
  85. package/dist/commands/bot-updates.js.map +1 -0
  86. package/dist/commands/bot.d.ts +3 -0
  87. package/dist/commands/bot.d.ts.map +1 -0
  88. package/dist/commands/bot.js +160 -0
  89. package/dist/commands/bot.js.map +1 -0
  90. package/dist/commands/chats.d.ts.map +1 -1
  91. package/dist/commands/chats.js +79 -2
  92. package/dist/commands/chats.js.map +1 -1
  93. package/dist/commands/check.d.ts +8 -0
  94. package/dist/commands/check.d.ts.map +1 -0
  95. package/dist/commands/check.js +64 -0
  96. package/dist/commands/check.js.map +1 -0
  97. package/dist/commands/context.d.ts +15 -1
  98. package/dist/commands/context.d.ts.map +1 -1
  99. package/dist/commands/context.js +5 -1
  100. package/dist/commands/context.js.map +1 -1
  101. package/dist/commands/hearing.d.ts +25 -0
  102. package/dist/commands/hearing.d.ts.map +1 -0
  103. package/dist/commands/hearing.js +41 -0
  104. package/dist/commands/hearing.js.map +1 -0
  105. package/dist/commands/inbox.d.ts.map +1 -1
  106. package/dist/commands/inbox.js +19 -3
  107. package/dist/commands/inbox.js.map +1 -1
  108. package/dist/commands/mcp.d.ts +1 -0
  109. package/dist/commands/mcp.d.ts.map +1 -1
  110. package/dist/commands/mcp.js +7 -4
  111. package/dist/commands/mcp.js.map +1 -1
  112. package/dist/commands/messages.d.ts.map +1 -1
  113. package/dist/commands/messages.js +21 -5
  114. package/dist/commands/messages.js.map +1 -1
  115. package/dist/commands/paging.d.ts +3 -1
  116. package/dist/commands/paging.d.ts.map +1 -1
  117. package/dist/commands/paging.js +4 -1
  118. package/dist/commands/paging.js.map +1 -1
  119. package/dist/commands/review.d.ts.map +1 -1
  120. package/dist/commands/review.js +22 -8
  121. package/dist/commands/review.js.map +1 -1
  122. package/dist/commands/rules.d.ts +7 -0
  123. package/dist/commands/rules.d.ts.map +1 -0
  124. package/dist/commands/rules.js +69 -0
  125. package/dist/commands/rules.js.map +1 -0
  126. package/dist/domain/map.d.ts +6 -1
  127. package/dist/domain/map.d.ts.map +1 -1
  128. package/dist/domain/map.js +34 -1
  129. package/dist/domain/map.js.map +1 -1
  130. package/dist/domain/models.d.ts +55 -0
  131. package/dist/domain/models.d.ts.map +1 -1
  132. package/dist/domain/models.js.map +1 -1
  133. package/dist/generated/client.generated.d.ts +1 -0
  134. package/dist/generated/client.generated.d.ts.map +1 -1
  135. package/dist/generated/client.generated.js +1 -0
  136. package/dist/generated/client.generated.js.map +1 -1
  137. package/dist/generated/opcodes.generated.d.ts +1 -0
  138. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  139. package/dist/generated/opcodes.generated.js +1 -0
  140. package/dist/generated/opcodes.generated.js.map +1 -1
  141. package/dist/generated/operations.generated.d.ts +16 -1
  142. package/dist/generated/operations.generated.d.ts.map +1 -1
  143. package/dist/generated/operations.generated.js +2 -1
  144. package/dist/generated/operations.generated.js.map +1 -1
  145. package/dist/mcp/instructions.d.ts +2 -1
  146. package/dist/mcp/instructions.d.ts.map +1 -1
  147. package/dist/mcp/instructions.js +2 -1
  148. package/dist/mcp/instructions.js.map +1 -1
  149. package/dist/mcp/server.d.ts +2 -1
  150. package/dist/mcp/server.d.ts.map +1 -1
  151. package/dist/mcp/server.js +4 -1
  152. package/dist/mcp/server.js.map +1 -1
  153. package/dist/mcp/tools.d.ts +5 -1
  154. package/dist/mcp/tools.d.ts.map +1 -1
  155. package/dist/mcp/tools.js +160 -13
  156. package/dist/mcp/tools.js.map +1 -1
  157. package/dist/moderation/check.d.ts +98 -0
  158. package/dist/moderation/check.d.ts.map +1 -0
  159. package/dist/moderation/check.js +306 -0
  160. package/dist/moderation/check.js.map +1 -0
  161. package/dist/moderation/rules.d.ts +56 -0
  162. package/dist/moderation/rules.d.ts.map +1 -0
  163. package/dist/moderation/rules.js +138 -0
  164. package/dist/moderation/rules.js.map +1 -0
  165. package/dist/program.d.ts.map +1 -1
  166. package/dist/program.js +18 -3
  167. package/dist/program.js.map +1 -1
  168. package/dist/protocol/connection.d.ts.map +1 -1
  169. package/dist/protocol/connection.js +12 -1
  170. package/dist/protocol/connection.js.map +1 -1
  171. package/dist/review.d.ts +32 -5
  172. package/dist/review.d.ts.map +1 -1
  173. package/dist/review.js +82 -45
  174. package/dist/review.js.map +1 -1
  175. package/dist/sends/journal.d.ts +1 -1
  176. package/dist/sends/journal.d.ts.map +1 -1
  177. package/dist/session/store.d.ts +2 -0
  178. package/dist/session/store.d.ts.map +1 -1
  179. package/dist/session/store.js +2 -0
  180. package/dist/session/store.js.map +1 -1
  181. package/dist/spec/index.d.ts.map +1 -1
  182. package/dist/spec/index.js +2 -1
  183. package/dist/spec/index.js.map +1 -1
  184. package/dist/spec/operations/chats.d.ts +4 -1
  185. package/dist/spec/operations/chats.d.ts.map +1 -1
  186. package/dist/spec/operations/chats.js +10 -4
  187. package/dist/spec/operations/chats.js.map +1 -1
  188. package/dist/spec/operations/messages.d.ts.map +1 -1
  189. package/dist/spec/operations/messages.js +9 -4
  190. package/dist/spec/operations/messages.js.map +1 -1
  191. package/dist/spec/operations/uploads.d.ts +13 -0
  192. package/dist/spec/operations/uploads.d.ts.map +1 -1
  193. package/dist/spec/operations/uploads.js +21 -0
  194. package/dist/spec/operations/uploads.js.map +1 -1
  195. package/dist/transcribe/index.d.ts +36 -1
  196. package/dist/transcribe/index.d.ts.map +1 -1
  197. package/dist/transcribe/index.js +91 -14
  198. package/dist/transcribe/index.js.map +1 -1
  199. package/dist/upload.d.ts +3 -0
  200. package/dist/upload.d.ts.map +1 -1
  201. package/dist/upload.js +13 -7
  202. package/dist/upload.js.map +1 -1
  203. package/dist/version.d.ts +1 -1
  204. package/dist/version.js +1 -1
  205. package/dist/voice.d.ts +9 -0
  206. package/dist/voice.d.ts.map +1 -0
  207. package/dist/voice.js +36 -0
  208. package/dist/voice.js.map +1 -0
  209. package/package.json +17 -6
  210. package/skills/max-cli/SKILL.md +23 -2
package/README.md CHANGED
@@ -4,13 +4,59 @@
4
4
 
5
5
  # max-cli
6
6
 
7
- Ваш личный аккаунт мессенджера [MAX](https://max.ru) в терминале и в ИИ-агентах. `max` — программа для терминала и
8
- MCP-сервер: читайте и пишите в чаты сами или поручите это Claude, Codex, Cursor и другим агентам.
7
+ Ваши боты [MAX](https://max.ru) и ваш личный аккаунт — в терминале и в ИИ-агентах. `max` —
8
+ программа для терминала и MCP-сервер: пишите от имени бота через официальный Bot API, а в свои
9
+ чаты — сами или руками Claude, Codex, Cursor и других агентов. Для групп, которые вы ведёте, —
10
+ вопросы без ответа, новенькие и уборка спама по вашим правилам.
9
11
 
10
- > ⚠️ **max-cli использует неофициальный внутренний API MAX.** API может измениться без
11
- > предупреждения, а использование инструмента может нарушать условия сервиса. Вы используете
12
- > max-cli на свой риск; авторы и контрибьюторы не несут ответственности за блокировки аккаунтов,
13
- > потерю данных или другие последствия.
12
+ ```sh
13
+ max sales bot messages send "Команда продаж" "Сборка готова" # от имени бота
14
+ max messages send "Иван Петров" "Опаздываю на 15 минут" # от вашего имени
15
+ ```
16
+
17
+ ## Бот
18
+
19
+ `max bot` работает с ботом через **официальный** [Bot API MAX](https://dev.max.ru/docs-api) по токену
20
+ бота. Ботов может быть несколько: каждый хранится под именем, которое вы выбираете, и это имя —
21
+ первое слово команды.
22
+
23
+ ```sh
24
+ max sales bot auth set # токен — в скрытом вводе, MAX его проверит
25
+ max sales bot me # какой это бот
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 "Команда продаж" # писать только сюда
29
+ max bot list --check # все боты на этом компьютере
30
+ ```
31
+
32
+ Чат называют по номеру или, когда бот его уже видел, по названию; человеку пишут как
33
+ `user:<номер>`. Где взять номер чата — [docs/bot.md](docs/bot.md#где-взять-номер-чата).
34
+
35
+ - **Сообщения и чаты.** Отправка в чат по номеру, человеку как `user:<номер>` или в чат по
36
+ названию; правка, удаление, чтение, закрепление. `chats list` — чаты, которые бот видел: списка
37
+ чатов бота у MAX нет.
38
+ - **Файлы, участники, комментарии, кнопки, меню команд, вебхуки.** `messages send --file`,
39
+ `members`, `admins`, `comments`, `callbacks answer`, `commands`, `webhooks` — у каждой записи тот
40
+ же список получателей и журнал.
41
+ - **Любая операция API.** Все операции Bot API доступны как `max bot api <операция>` — с флагами
42
+ для параметров и JSON-телом, которое сверяется со схемой до отправки.
43
+ - **Бот не напишет лишнего.** У каждого бота свой список чатов, куда ему можно писать, и журнал
44
+ всего, что он отправил, — без текста. Профиль только для чтения и `allow` действуют и на бота.
45
+ - **Токен не в файле.** Токен бота — в системном хранилище паролей, отдельно от вашего.
46
+
47
+ Бота создают на [business.max.ru](https://business.max.ru/self); MAX выдаёт их подтверждённым
48
+ организациям, ИП и самозанятым. Полностью — [docs/bot.md](docs/bot.md).
49
+
50
+ ## Личный аккаунт
51
+
52
+ `max` без слова `bot` работает с вашим личным аккаунтом: как ещё одно ваше устройство, со всеми
53
+ чатами, историей, группами и контактами.
54
+
55
+ > ⚠️ **Для личного аккаунта max-cli использует неофициальный внутренний API MAX.** API может
56
+ > измениться без предупреждения, а использование инструмента может нарушать условия сервиса. Вы
57
+ > используете max-cli на свой риск; авторы и контрибьюторы не несут ответственности за блокировки
58
+ > аккаунтов, потерю данных или другие последствия. Бот работает через официальный API, и к нему
59
+ > это не относится.
14
60
 
15
61
  ```sh
16
62
  max chats list --limit 5
@@ -18,6 +64,8 @@ max messages list "Иван Петров"
18
64
  max messages send "Иван Петров" "Опаздываю на 15 минут"
19
65
  ```
20
66
 
67
+ Всё ниже, до раздела «Установка», — про личный аккаунт. Полностью — [docs/usage.md](docs/usage.md).
68
+
21
69
  ## Как это использовать
22
70
 
23
71
  Самое полезное — поручить переписку агенту: Claude, Codex или другому. Он читает чаты через `max`
@@ -35,6 +83,9 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
35
83
  - **Черновики ответов.** Агент предлагает текст, а отправляете вы — или он сам, если вы разрешили
36
84
  писать в этот чат.
37
85
  - **Поиск.** «Когда мы договорились о встрече с Иваном?» — ответ с датой и самим сообщением.
86
+ - **Группа, которую вы ведёте.** Какие вопросы висят без ответа, кто вступил за неделю и с каким
87
+ аккаунтом, удалить приглашения в чужие чаты — по вашим правилам и с вашим «да»
88
+ ([ниже](#группы-которые-вы-ведёте)).
38
89
 
39
90
  Как это выглядит:
40
91
 
@@ -57,6 +108,21 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
57
108
  агента под каждую задачу — готовые запросы, расписание и ограничения:
58
109
  [docs/recipes.md](docs/recipes.md).
59
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
+
60
126
  ## Как это работает
61
127
 
62
128
  `max` работает от вашего имени, как ещё одно ваше устройство, а не как бот. Вы входите один раз
@@ -88,10 +154,12 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
88
154
  расшифровка голосовых в текст на вашем компьютере, выгрузка переписки в JSONL или Markdown.
89
155
  - **Искать.** Сообщения — по тексту всего прочитанного, без подключения к MAX. Чаты и контакты —
90
156
  по части названия или имени.
91
- - **Писать.** Текст и разметка, ответы, фото и файлы, правка, пересылка, закрепление, реакции,
157
+ - **Писать.** Текст и разметка, ответы, фото, видео, файлы и голосовые, правка, пересылка, закрепление, реакции,
92
158
  отложенная отправка, удаление — у себя или у всех.
93
159
  - **Вести группы и каналы.** Создать группу, вступить по ссылке, выйти, участники и админы,
94
- название и настройки, заявки на вступление, ссылка-приглашение, папки.
160
+ название и настройки, заявки на вступление, ссылка-приглашение, папки. Для админа — вопросы без
161
+ ответа, кто вступил и вышел, все участники с возрастом аккаунта, правила и проверка группы по ним
162
+ ([docs/groups.md](docs/groups.md)).
95
163
  - **Контакты и аккаунт.** Найти человека по номеру, добавить, удалить, импортировать из файла;
96
164
  изменить профиль; посмотреть и завершить другие сеансы.
97
165
  - **Входить удобным способом.** QR-код прямо в терминале, QR-код или SMS через web.max.ru в
@@ -104,6 +172,10 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
104
172
  - **Агент не напишет лишнего.** Есть профиль только для чтения, список чатов, в которые можно
105
173
  писать, и лимит сообщений в час. MCP-сервер может показывать вам каждое действие до того, как его выполнить.
106
174
  Если имя подходит к двум чатам, `max` не выбирает сам, а показывает оба.
175
+ - **Модерация по вашим правилам, а не по чужим.** Проверка группы по умолчанию только отмечает.
176
+ Удалить сообщение или человека она может, только если вы разрешили: для каждого действия —
177
+ никогда, с флагом, с вашим подтверждением или сразу. Не больше 10 действий за раз, и ничего не
178
+ следит за группой в фоне.
107
179
  - **Сообщение не уйдёт дважды.** Если связь оборвалась во время отправки, `max` прямо говорит, что
108
180
  не знает, дошло ли сообщение, и даёт команду для повтора. MAX узнаёт повтор и второго сообщения не
109
181
  создаёт.
@@ -151,17 +223,22 @@ max messages send "Иван Петров" "Опаздываю на 15 минут
151
223
  | удаление сообщений — у себя или у всех, с лимитом | ✅ | ✅ | — |
152
224
  | отметка «прочитано» по запросу | ✅ | ✅ | — |
153
225
  | группы и каналы: создать, вступить, участники, админы | ✅ | ✅ | чтение каналов |
226
+ | для админа группы: вопросы без ответа, новенькие, проверка по правилам | ✅ | — | — |
154
227
  | контакты, профиль, другие сеансы | ✅ | ✅ | — |
155
- | отправка видео и кружков | — | ✅ | — |
156
- | отправка голосовых | — | ⚠️ в 2.4.1 не проходит ([#102](https://github.com/MaxApiTeam/PyMax/issues/102), [#103](https://github.com/MaxApiTeam/PyMax/issues/103)) | — |
228
+ | отправка видео | ✅ | ✅ | — |
229
+ | отправка кружков | — | ✅ | — |
230
+ | отправка голосовых | ✅ | ⚠️ в 2.4.1 не проходит ([#102](https://github.com/MaxApiTeam/PyMax/issues/102), [#103](https://github.com/MaxApiTeam/PyMax/issues/103)) | — |
157
231
  | опросы | — | ✅ | — |
158
232
  | пароль и двухфакторный вход, фото профиля | — | ✅ | — |
159
233
 
160
- Если нужен бот со своим аккаунтом, а не ваш личный аккаунт, — это официальный
161
- [Bot API MAX](https://dev.max.ru/docs).
234
+ Для бота есть `max bot` — через официальный Bot API, отдельно от личного аккаунта
235
+ ([docs/bot.md](docs/bot.md)). Таблица выше — про личный аккаунт.
162
236
 
163
237
  ## Содержание
164
238
 
239
+ - [Бот](#бот)
240
+ - [Личный аккаунт](#личный-аккаунт)
241
+ - [Группы, которые вы ведёте](#группы-которые-вы-ведёте)
165
242
  - [Установка](#установка)
166
243
  - [Вход](#вход)
167
244
  - [Использование](#использование)
@@ -332,10 +409,12 @@ max chats list --json
332
409
  ## Документация
333
410
 
334
411
  - [docs/installation.md](docs/installation.md) — установка, обновление, куда что ложится
335
- - [docs/usage.md](docs/usage.md) — вход, чтение, отправка, машинный режим
412
+ - [docs/bot.md](docs/bot.md) — бот: токен, несколько ботов, сообщения, чаты, список получателей, любая операция API
413
+ - [docs/usage.md](docs/usage.md) — личный аккаунт: вход, чтение, отправка, машинный режим
336
414
  - [docs/sessions.md](docs/sessions.md) — токен, хранилище паролей, профили
337
415
  - [docs/configuration.md](docs/configuration.md) — настройки, переменные, порядок разрешения
338
416
  - [docs/mcp.md](docs/mcp.md) — MCP-сервер: подключение, отправка, соединение с MAX
417
+ - [docs/groups.md](docs/groups.md) — группы, которые вы ведёте: сценарии с агентом, правила, проверка
339
418
  - [docs/recipes.md](docs/recipes.md) — рецепты для агентов: сводки, отчёты, долги, напоминания, расписание
340
419
  - [docs/diagnostics.md](docs/diagnostics.md) — `--trace`, `--record`, `max runs`
341
420
  - [docs/ROADMAP.md](docs/ROADMAP.md) — что планируется
@@ -368,7 +447,6 @@ pnpm generate # переписать сгенериро
368
447
 
369
448
  Ближайшее:
370
449
 
371
- - голосовые сообщения и видео;
372
450
  - опросы: показывать при чтении и голосовать;
373
451
  - локальная копия по желанию — можно работать совсем без неё.
374
452
 
@@ -0,0 +1,23 @@
1
+ import { type CredentialSource, type KeyringStore } from "@leemour/cli-core";
2
+ export interface BotTokenStoreOptions {
3
+ profile: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ keyring?: KeyringStore;
6
+ configDir?: string;
7
+ }
8
+ /**
9
+ * A bot token per profile, beside — never inside — the personal session: keyring account
10
+ * `bot:<profile>`, environment variable `MAX_BOT_TOKEN`, then a 0600 file (`NEED-295`).
11
+ */
12
+ export declare class BotTokenStore {
13
+ #private;
14
+ readonly profile: string;
15
+ constructor({ profile, env, keyring, configDir }: BotTokenStoreOptions);
16
+ read(): {
17
+ token: string;
18
+ source: CredentialSource;
19
+ } | undefined;
20
+ write(token: string): CredentialSource;
21
+ remove(): CredentialSource[];
22
+ }
23
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/bot/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAGlB,MAAM,mBAAmB,CAAA;AAI1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAIxB,YAAY,EAAE,OAAO,EAAE,GAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAanF;IAED,IAAI,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAAG,SAAS,CAG9D;IAED,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAErC;IAED,MAAM,IAAI,gBAAgB,EAAE,CAE3B;CACF"}
@@ -0,0 +1,36 @@
1
+ import { Credentials, pathsAreOverridden, resolvePaths, } from "@leemour/cli-core";
2
+ const APP = "max-cli";
3
+ /**
4
+ * A bot token per profile, beside — never inside — the personal session: keyring account
5
+ * `bot:<profile>`, environment variable `MAX_BOT_TOKEN`, then a 0600 file (`NEED-295`).
6
+ */
7
+ export class BotTokenStore {
8
+ profile;
9
+ #account;
10
+ #credentials;
11
+ constructor({ profile, env = process.env, keyring, configDir }) {
12
+ const paths = resolvePaths({ appName: APP, prefix: "MAX", env });
13
+ this.profile = profile;
14
+ this.#account = `bot:${profile}`;
15
+ this.#credentials = new Credentials({
16
+ configDir: configDir ?? paths.config,
17
+ service: APP,
18
+ envVar: "MAX_BOT_TOKEN",
19
+ isolated: pathsAreOverridden({ appName: APP, prefix: "MAX", env }),
20
+ ...(keyring ? { keyring } : {}),
21
+ env,
22
+ warn: (message) => process.stderr.write(`${message}\n`),
23
+ });
24
+ }
25
+ read() {
26
+ const stored = this.#credentials.read(this.#account);
27
+ return stored ? { token: stored.secret, source: stored.source } : undefined;
28
+ }
29
+ write(token) {
30
+ return this.#credentials.write(this.#account, token);
31
+ }
32
+ remove() {
33
+ return this.#credentials.remove(this.#account);
34
+ }
35
+ }
36
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/bot/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAEX,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAA;AAE1B,MAAM,GAAG,GAAG,SAAS,CAAA;AASrB;;;GAGG;AACH,MAAM,OAAO,aAAa;IACf,OAAO,CAAQ;IACf,QAAQ,CAAQ;IAChB,YAAY,CAAa;IAElC,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAwB;QAClF,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,OAAO,EAAE,CAAA;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CAAC;YAClC,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,MAAM;YACpC,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,eAAe;YACvB,QAAQ,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG;YACH,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAChD,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { ManifestOperation } from "@leemour/cli-core/codegen";
2
+ import type { Chat, Message } from "@leemour/cli-messaging";
3
+ import type { BotInfo as BotInfoType } from "./generated/types.js";
4
+ import { type CallInput, type TransportOptions } from "./transport.js";
5
+ /** Every operation of the committed schema, as the manifest describes it. */
6
+ export declare const botOperations: readonly ManifestOperation[];
7
+ /** The one door to the Bot API: generated operations stay behind it. */
8
+ export declare class BotApiClient {
9
+ #private;
10
+ constructor(options: TransportOptions);
11
+ me(): Promise<BotInfoType>;
12
+ chat(chatId: string): Promise<Chat>;
13
+ message(messageId: string, selfId?: string): Promise<Message>;
14
+ /** Oldest first, like `max messages list`; MAX answers newest first (`BUG-59`). */
15
+ messages(chatId: string, count: number, selfId?: string): Promise<Message[]>;
16
+ /** A message from any answer — a send's result, an update — decoded the same way as a read. */
17
+ decodeMessage(raw: unknown, selfId?: string): Message;
18
+ call(operation: ManifestOperation, input: CallInput): Promise<unknown>;
19
+ }
20
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +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;AAI3D,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;;IAGvB,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,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAErE;CAyCF"}
@@ -0,0 +1,91 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import * as v from "valibot";
3
+ import { operations } from "./generated/manifest.js";
4
+ import { BotInfo, Chat as ChatSchema, Message as MessageSchema } from "./generated/schemas.js";
5
+ import { toChat, toMessage } from "./map.js";
6
+ import { BotTransport, plainJson } from "./transport.js";
7
+ /** Every operation of the committed schema, as the manifest describes it. */
8
+ export const botOperations = operations;
9
+ const operationById = new Map(operations.map((operation) => [operation.id, operation]));
10
+ const required = (id) => {
11
+ const operation = operationById.get(id);
12
+ if (!operation)
13
+ throw new CliError("configuration_error", `the generated manifest has no operation ${id}`);
14
+ return operation;
15
+ };
16
+ /** The one door to the Bot API: generated operations stay behind it. */
17
+ export class BotApiClient {
18
+ #transport;
19
+ constructor(options) {
20
+ this.#transport = new BotTransport(options);
21
+ }
22
+ async me() {
23
+ const answer = await this.#transport.call(required("getMyInfo"));
24
+ const parsed = v.safeParse(BotInfo, answer);
25
+ if (!parsed.success) {
26
+ throw new CliError("invalid_response", "MAX answered getMyInfo in a shape this version does not know", {
27
+ operation: "getMyInfo",
28
+ fields: parsed.issues.map((issue) => v.getDotPath(issue) ?? "(root)"),
29
+ });
30
+ }
31
+ return parsed.output;
32
+ }
33
+ async chat(chatId) {
34
+ const answer = await this.#transport.call(required("getChat"), { path: { chatId } });
35
+ return toChat(this.#decode(ChatSchema, answer, "getChat"));
36
+ }
37
+ async message(messageId, selfId) {
38
+ const answer = await this.#transport.call(required("getMessageById"), { path: { messageId } });
39
+ return this.#message(answer, selfId);
40
+ }
41
+ /** Oldest first, like `max messages list`; MAX answers newest first (`BUG-59`). */
42
+ async messages(chatId, count, selfId) {
43
+ const answer = (await this.#transport.call(required("getMessages"), {
44
+ query: { chat_id: chatId, count: String(count) },
45
+ }));
46
+ return (answer?.messages ?? []).map((raw) => this.#message(raw, selfId)).reverse();
47
+ }
48
+ /** A message from any answer — a send's result, an update — decoded the same way as a read. */
49
+ decodeMessage(raw, selfId) {
50
+ return this.#message(raw, selfId);
51
+ }
52
+ call(operation, input) {
53
+ return this.#transport.call(operation, input);
54
+ }
55
+ #decode(schema, answer, operation) {
56
+ const parsed = v.safeParse(schema, answer);
57
+ if (!parsed.success) {
58
+ throw new CliError("invalid_response", `MAX answered ${operation} in a shape this version does not know`, {
59
+ operation,
60
+ fields: parsed.issues.map((issue) => v.getDotPath(issue) ?? "(root)"),
61
+ });
62
+ }
63
+ return parsed.output;
64
+ }
65
+ /**
66
+ * One message MAX added something new to (an attachment type newer than the schema, `RISK-51`)
67
+ * still shows its text and time rather than failing the whole list.
68
+ */
69
+ #message(raw, selfId) {
70
+ const parsed = v.safeParse(MessageSchema, raw);
71
+ if (parsed.success)
72
+ return toMessage(parsed.output, selfId);
73
+ const loose = plainJson(raw);
74
+ return {
75
+ id: String(loose.body?.mid ?? "unknown"),
76
+ chatId: String(loose.recipient?.chat_id ?? "unknown"),
77
+ senderId: null,
78
+ senderName: null,
79
+ timestamp: new Date(Number(loose.timestamp ?? 0)).toISOString(),
80
+ editedAt: null,
81
+ text: loose.body?.text ?? "",
82
+ outgoing: null,
83
+ attachments: [],
84
+ replyTo: null,
85
+ forwardedFrom: null,
86
+ reactions: null,
87
+ providerMetadata: { unparsed: parsed.issues.map((issue) => v.getDotPath(issue) ?? "(root)") },
88
+ };
89
+ }
90
+ }
91
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bot/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ManifestOperation } from "@leemour/cli-core/codegen";
2
+ export declare const operations: readonly ManifestOperation[];
3
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/bot/generated/manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAElE,eAAO,MAAM,UAAU,EAAE,SAAS,iBAAiB,EA4tClD,CAAA"}