@pachca/cli 2026.6.2 → 2026.7.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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.7.0 (7 июля 2026)
4
+
5
+ - **Добавлено** (bots list): Новая команда — список ботов с поиском по имени (`--query`)
6
+ - **Добавлено** (bots delete): Новая команда — удаление бота по его `id`
7
+ - **Добавлено** (bots create): Права доступа бота — параметры `who-can-add` (кто может добавлять бота в чаты), `can-edit` (роли, редактирующие настройки) и `single-chat` (только один чат)
8
+ - **Добавлено** (bots update): Права доступа бота — параметры `who-can-add` (кто может добавлять бота в чаты) и `can-edit` (роли, редактирующие настройки)
9
+ - **Добавлено** (search users): Значение сортировки `--sort creation` — по дате создания
10
+
11
+ ## 2026.6.3 (24 июня 2026)
12
+
13
+ - **Изменено** (files, custom-properties, oauth): Команды реорганизованы по разделам: `common uploads`→`files uploads`, `common direct-url`→`files direct-url`, `common custom-properties`→`custom-properties list`, `common request-export`→`chats request-export`, `common get-exports`→`chats download-export`, `profile get-info`→`oauth token-info`, `link-previews add`→`messages unfurl`. Старые имена продолжают работать (скрытые алиасы)
14
+ - **Добавлено** (bots recreate-token): Новая команда — ротация токена бота по его `id` (нужны права администратора, владельца компании или создателя бота)
15
+ - **Добавлено** (bots recreate-token-self): Новая команда — бот перевыпускает собственный токен своим же токеном
16
+ - **Добавлено** (bots create): Настройки вебхука — параметры `ignore-self-messages` (игнорировать свои сообщения) и `events-history-enabled` (сохранять историю событий)
17
+ - **Добавлено** (bots update): Настройки вебхука — параметры `ignore-self-messages` (игнорировать свои сообщения) и `events-history-enabled` (сохранять историю событий)
18
+
3
19
  ## 2026.6.2 (19 июня 2026)
4
20
 
5
21
  - **Добавлено** (bots create): Настройки входящего вебхука — параметры `template`, `template_engine`, `challenge_key`, `link_preview_enabled`
package/README.md CHANGED
@@ -78,10 +78,14 @@ pachca guide # список всех сценариев
78
78
 
79
79
  | Команда | Описание |
80
80
  |---------|---------|
81
+ | `pachca bots recreate-token-self` | Ротация собственного токена бота |
81
82
  | `pachca bots update-webhook` | Саморегистрация вебхука бота |
83
+ | `pachca bots list` | Список ботов |
82
84
  | `pachca bots create` | Новый бот |
83
85
  | `pachca bots get` | Информация о боте |
84
86
  | `pachca bots update` | Редактирование бота |
87
+ | `pachca bots delete` | Удаление бота |
88
+ | `pachca bots recreate-token` | Ротация токена бота |
85
89
  | `pachca bots list-events` | История событий |
86
90
  | `pachca bots remove-event` | Удаление события |
87
91
 
@@ -91,21 +95,13 @@ pachca guide # список всех сценариев
91
95
  |---------|---------|
92
96
  | `pachca chats create` | Новый чат |
93
97
  | `pachca chats list` | Список чатов |
98
+ | `pachca chats request-export` | Экспорт сообщений |
99
+ | `pachca chats download-export` | Скачать архив экспорта |
94
100
  | `pachca chats get` | Информация о чате |
95
101
  | `pachca chats update` | Редактирование чата |
96
102
  | `pachca chats archive` | Архивация чата |
97
103
  | `pachca chats unarchive` | Разархивация чата |
98
104
 
99
- ### common
100
-
101
- | Команда | Описание |
102
- |---------|---------|
103
- | `pachca common request-export` | Экспорт сообщений |
104
- | `pachca common get-exports` | Скачать архив экспорта |
105
- | `pachca common custom-properties` | Список дополнительных полей |
106
- | `pachca common direct-url` | Загрузка файла |
107
- | `pachca common uploads` | Получение подписи, ключа и других параметров |
108
-
109
105
  ### members
110
106
 
111
107
  | Команда | Описание |
@@ -118,6 +114,19 @@ pachca guide # список всех сценариев
118
114
  | `pachca members remove` | Исключение пользователя |
119
115
  | `pachca members update` | Редактирование роли |
120
116
 
117
+ ### custom-properties
118
+
119
+ | Команда | Описание |
120
+ |---------|---------|
121
+ | `pachca custom-properties list` | Список дополнительных полей |
122
+
123
+ ### files
124
+
125
+ | Команда | Описание |
126
+ |---------|---------|
127
+ | `pachca files direct-url` | Загрузка файла |
128
+ | `pachca files uploads` | Получение подписи, ключа и других параметров |
129
+
121
130
  ### group-tags
122
131
 
123
132
  | Команда | Описание |
@@ -138,15 +147,10 @@ pachca guide # список всех сценариев
138
147
  | `pachca messages get` | Информация о сообщении |
139
148
  | `pachca messages update` | Редактирование сообщения |
140
149
  | `pachca messages delete` | Удаление сообщения |
150
+ | `pachca messages unfurl` | Unfurl (разворачивание ссылок) |
141
151
  | `pachca messages pin` | Закрепление сообщения |
142
152
  | `pachca messages unpin` | Открепление сообщения |
143
153
 
144
- ### link-previews
145
-
146
- | Команда | Описание |
147
- |---------|---------|
148
- | `pachca link-previews add` | Unfurl (разворачивание ссылок) |
149
-
150
154
  ### reactions
151
155
 
152
156
  | Команда | Описание |
@@ -169,11 +173,16 @@ pachca guide # список всех сценариев
169
173
  | `pachca threads list` | Список тредов |
170
174
  | `pachca threads get` | Информация о треде |
171
175
 
176
+ ### oauth
177
+
178
+ | Команда | Описание |
179
+ |---------|---------|
180
+ | `pachca oauth token-info` | Информация о токене |
181
+
172
182
  ### profile
173
183
 
174
184
  | Команда | Описание |
175
185
  |---------|---------|
176
- | `pachca profile get-info` | Информация о токене |
177
186
  | `pachca profile get` | Свой профиль |
178
187
  | `pachca profile update-avatar` | Загрузка своего аватара |
179
188
  | `pachca profile delete-avatar` | Удаление своего аватара |
@@ -6,7 +6,8 @@ export default class BotsCreate extends BaseCommand {
6
6
  static description = "Новый бот";
7
7
  static examples = [
8
8
  "Создать бота через API и получить токен:\n $ pachca bots create",
9
- "Настроить бота с исходящим вебхуком:\n $ pachca bots create"
9
+ "Настроить бота с исходящим вебхуком:\n $ pachca bots create",
10
+ "Найти и удалить бота:\n $ pachca bots list"
10
11
  ];
11
12
  static scope = "bots:write";
12
13
  static apiMethod = "POST";
@@ -50,6 +51,24 @@ export default class BotsCreate extends BaseCommand {
50
51
  description: "Показывать превью ссылок в сообщениях входящего вебхука",
51
52
  allowNo: true,
52
53
  }),
54
+ 'ignore-self-messages': Flags.boolean({
55
+ description: "Игнорировать входящие сообщения, отправленные самим ботом",
56
+ allowNo: true,
57
+ }),
58
+ 'events-history-enabled': Flags.boolean({
59
+ description: "Сохранять историю событий бота для последующего получения через метод истории событий",
60
+ allowNo: true,
61
+ }),
62
+ 'who-can-add': Flags.string({
63
+ description: "Кто может добавлять бота в чаты",
64
+ }),
65
+ 'can-edit': Flags.string({
66
+ description: "Роли, которым, помимо создателя, разрешено редактировать настройки бота. Создатель может редактировать всегда. Пустой массив — редактировать может только создатель.",
67
+ }),
68
+ 'single-chat': Flags.boolean({
69
+ description: "Ограничивает бота одной беседой или каналом: `true` — бота можно добавить только в один такой чат, `false` — в несколько. Личные чаты и треды в ограничение не входят. Задаётся только при создании, при редактировании не меняется.",
70
+ allowNo: true,
71
+ }),
53
72
  };
54
73
  async run() {
55
74
  const { args, flags } = await this.parse(BotsCreate);
@@ -92,6 +111,11 @@ export default class BotsCreate extends BaseCommand {
92
111
  template_engine: flags['template-engine'],
93
112
  challenge_key: flags['challenge-key'],
94
113
  link_preview_enabled: flags['link-preview-enabled'],
114
+ ignore_self_messages: flags['ignore-self-messages'],
115
+ events_history_enabled: flags['events-history-enabled'],
116
+ who_can_add: flags['who-can-add'],
117
+ can_edit: flags['can-edit'] ? this.parseJSON(flags['can-edit'], 'can-edit') : undefined,
118
+ single_chat: flags['single-chat'],
95
119
  } };
96
120
  // Clean undefined fields
97
121
  const inner = body['webhook'];
@@ -0,0 +1,46 @@
1
+ // Auto-generated from openapi.yaml — DO NOT EDIT
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ import * as clack from '@clack/prompts';
5
+ export default class BotsDelete extends BaseCommand {
6
+ static description = "Удаление бота";
7
+ static examples = [
8
+ "Обновить Webhook URL бота:\n $ pachca bots update",
9
+ "Найти и удалить бота:\n $ pachca bots delete"
10
+ ];
11
+ static scope = "bots:write";
12
+ static apiMethod = "DELETE";
13
+ static apiPath = "/bots/{id}";
14
+ static args = {
15
+ id: Args.integer({
16
+ description: "Идентификатор бота (pachca bots list)",
17
+ required: true,
18
+ }),
19
+ };
20
+ static flags = {
21
+ ...BaseCommand.baseFlags,
22
+ force: Flags.boolean({
23
+ description: 'Пропустить подтверждение',
24
+ default: false,
25
+ }),
26
+ };
27
+ async run() {
28
+ const { args, flags } = await this.parse(BotsDelete);
29
+ this.parsedFlags = flags;
30
+ if (!flags.force) {
31
+ if (!this.isInteractive()) {
32
+ this.validationError([{ message: 'Деструктивная операция требует флага --force', flag: 'force' }], { type: 'PACHCA_DESTRUCTIVE_OP_ERROR', hint: "pachca bots delete <id> --force" });
33
+ }
34
+ const confirm = await clack.confirm({ message: 'Вы уверены?' });
35
+ if (clack.isCancel(confirm) || !confirm) {
36
+ process.stderr.write('Отменено.\n');
37
+ this.exit(0);
38
+ }
39
+ }
40
+ const { data } = await this.apiRequest({
41
+ method: 'DELETE',
42
+ path: `/bots/${args.id}`,
43
+ });
44
+ this.success('Удалено');
45
+ }
46
+ }
@@ -4,7 +4,8 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class BotsGet extends BaseCommand {
5
5
  static description = "Информация о боте";
6
6
  static examples = [
7
- "Обновить Webhook URL бота:\n $ pachca bots update"
7
+ "Обновить Webhook URL бота:\n $ pachca bots update",
8
+ "Найти и удалить бота:\n $ pachca bots delete"
8
9
  ];
9
10
  static scope = "bots:read";
10
11
  static apiMethod = "GET";
@@ -0,0 +1,99 @@
1
+ // Auto-generated from openapi.yaml — DO NOT EDIT
2
+ import { Flags } from '@oclif/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ export default class BotsList extends BaseCommand {
5
+ static description = "Список ботов";
6
+ static examples = [
7
+ "Создать бота через API и получить токен:\n $ pachca bots create",
8
+ "Настроить бота с исходящим вебхуком:\n $ pachca bots create",
9
+ "Найти и удалить бота:\n $ pachca bots list"
10
+ ];
11
+ static scope = "bots:read";
12
+ static apiMethod = "GET";
13
+ static apiPath = "/bots";
14
+ static defaultColumns = ["id", "webhook"];
15
+ static args = {};
16
+ static flags = {
17
+ ...BaseCommand.baseFlags,
18
+ 'query': Flags.string({
19
+ description: "Поисковая фраза для фильтрации ботов по имени",
20
+ }),
21
+ limit: Flags.integer({
22
+ description: 'Количество результатов на страницу',
23
+ }),
24
+ cursor: Flags.string({
25
+ description: 'Курсор для следующей страницы',
26
+ }),
27
+ all: Flags.boolean({
28
+ description: 'Загрузить все страницы автоматически',
29
+ default: false,
30
+ }),
31
+ };
32
+ async run() {
33
+ const { args, flags } = await this.parse(BotsList);
34
+ this.parsedFlags = flags;
35
+ if (flags.all) {
36
+ // Auto-pagination
37
+ const allData = [];
38
+ let nextCursor = undefined;
39
+ let pages = 0;
40
+ const seenCursors = new Set();
41
+ while (pages < 500) {
42
+ const query = {
43
+ query: flags['query'],
44
+ limit: flags.limit,
45
+ cursor: nextCursor,
46
+ };
47
+ const response = await this.apiRequest({ method: 'GET', path: '/bots', query });
48
+ const body = response.data;
49
+ const items = body.data;
50
+ if (items)
51
+ allData.push(...items);
52
+ const meta = body.meta;
53
+ const paginate = meta?.paginate;
54
+ nextCursor = paginate?.next_page;
55
+ pages++;
56
+ // Условие конца: списочные методы — has_next === false; методы поиска и /users?query= (без has_next) — пустой data
57
+ const hasNext = paginate?.has_next;
58
+ if (typeof hasNext === 'boolean') {
59
+ if (!hasNext)
60
+ break;
61
+ }
62
+ else if (!items || items.length === 0) {
63
+ break;
64
+ }
65
+ if (process.stderr.isTTY) {
66
+ const total = paginate?.total;
67
+ const progress = total ? `${allData.length} / ${total}` : String(allData.length);
68
+ process.stderr.write(`\r Загружено: ${progress}...`);
69
+ }
70
+ if (!nextCursor)
71
+ break;
72
+ if (seenCursors.has(nextCursor)) {
73
+ process.stderr.write('\n⚠ Обнаружен цикл пагинации, остановка.\n');
74
+ break;
75
+ }
76
+ seenCursors.add(nextCursor);
77
+ }
78
+ if (pages >= 500) {
79
+ process.stderr.write('\n⚠ Достигнут лимит 500 страниц.\n');
80
+ }
81
+ if (process.stderr.isTTY)
82
+ process.stderr.write('\n');
83
+ this.output(allData);
84
+ return;
85
+ }
86
+ const { data } = await this.apiRequest({
87
+ method: 'GET',
88
+ path: '/bots',
89
+ query: {
90
+ query: flags['query'],
91
+ limit: flags.limit,
92
+ cursor: flags.cursor,
93
+ },
94
+ });
95
+ const responseBody = data;
96
+ const items = responseBody.data ?? responseBody;
97
+ this.output(items);
98
+ }
99
+ }
@@ -0,0 +1,26 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class BotsRecreateTokenSelf extends BaseCommand {
3
+ static description = "Ротация собственного токена бота";
4
+ static examples = [
5
+ "Ротация токена бота:\n $ pachca bots recreate-token-self"
6
+ ];
7
+ static scope = "bot_self:write";
8
+ static apiMethod = "POST";
9
+ static apiPath = "/bot/recreate_token";
10
+ static defaultColumns = ["id", "webhook", "access_token"];
11
+ static args = {};
12
+ static flags = {
13
+ ...BaseCommand.baseFlags,
14
+ };
15
+ async run() {
16
+ const { args, flags } = await this.parse(BotsRecreateTokenSelf);
17
+ this.parsedFlags = flags;
18
+ const { data } = await this.apiRequest({
19
+ method: 'POST',
20
+ path: '/bot/recreate_token',
21
+ });
22
+ const responseBody = data;
23
+ const result = responseBody.data ?? responseBody;
24
+ this.output(result);
25
+ }
26
+ }
@@ -0,0 +1,33 @@
1
+ // Auto-generated from openapi.yaml — DO NOT EDIT
2
+ import { Args } from '@oclif/core';
3
+ import { BaseCommand } from '../../base-command.js';
4
+ export default class BotsRecreateToken extends BaseCommand {
5
+ static description = "Ротация токена бота";
6
+ static examples = [
7
+ "Ротация токена бота:\n $ pachca bots recreate-token"
8
+ ];
9
+ static scope = "bots:write";
10
+ static apiMethod = "POST";
11
+ static apiPath = "/bots/{id}/recreate_token";
12
+ static defaultColumns = ["id", "webhook", "access_token"];
13
+ static args = {
14
+ id: Args.integer({
15
+ description: "Идентификатор бота (pachca bots list)",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...BaseCommand.baseFlags,
21
+ };
22
+ async run() {
23
+ const { args, flags } = await this.parse(BotsRecreateToken);
24
+ this.parsedFlags = flags;
25
+ const { data } = await this.apiRequest({
26
+ method: 'POST',
27
+ path: `/bots/${args.id}/recreate_token`,
28
+ });
29
+ const responseBody = data;
30
+ const result = responseBody.data ?? responseBody;
31
+ this.output(result);
32
+ }
33
+ }
@@ -4,7 +4,8 @@ import { BaseCommand } from '../../base-command.js';
4
4
  export default class BotsUpdate extends BaseCommand {
5
5
  static description = "Редактирование бота";
6
6
  static examples = [
7
- "Обновить Webhook URL бота:\n $ pachca bots update"
7
+ "Обновить Webhook URL бота:\n $ pachca bots update",
8
+ "Найти и удалить бота:\n $ pachca bots delete"
8
9
  ];
9
10
  static scope = "bots:write";
10
11
  static apiMethod = "PUT";
@@ -52,6 +53,20 @@ export default class BotsUpdate extends BaseCommand {
52
53
  description: "Показывать превью ссылок в сообщениях входящего вебхука",
53
54
  allowNo: true,
54
55
  }),
56
+ 'ignore-self-messages': Flags.boolean({
57
+ description: "Игнорировать входящие сообщения, отправленные самим ботом",
58
+ allowNo: true,
59
+ }),
60
+ 'events-history-enabled': Flags.boolean({
61
+ description: "Сохранять историю событий бота для последующего получения через метод истории событий",
62
+ allowNo: true,
63
+ }),
64
+ 'who-can-add': Flags.string({
65
+ description: "Кто может добавлять бота в чаты",
66
+ }),
67
+ 'can-edit': Flags.string({
68
+ description: "Роли, которым, помимо создателя, разрешено редактировать настройки бота. Создатель может редактировать всегда. Пустой массив — редактировать может только создатель.",
69
+ }),
55
70
  };
56
71
  async run() {
57
72
  const { args, flags } = await this.parse(BotsUpdate);
@@ -68,6 +83,10 @@ export default class BotsUpdate extends BaseCommand {
68
83
  template_engine: flags['template-engine'],
69
84
  challenge_key: flags['challenge-key'],
70
85
  link_preview_enabled: flags['link-preview-enabled'],
86
+ ignore_self_messages: flags['ignore-self-messages'],
87
+ events_history_enabled: flags['events-history-enabled'],
88
+ who_can_add: flags['who-can-add'],
89
+ can_edit: flags['can-edit'] ? this.parseJSON(flags['can-edit'], 'can-edit') : undefined,
71
90
  } };
72
91
  // Clean undefined fields
73
92
  const inner = body['webhook'];
@@ -3,18 +3,19 @@ import { Args, Flags } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  import { downloadFile } from '../../client.js';
5
5
  import { formatSize } from '../../utils.js';
6
- export default class CommonGetExports extends BaseCommand {
6
+ export default class ChatsDownloadExport extends BaseCommand {
7
7
  static description = "Скачать архив экспорта";
8
8
  static examples = [
9
- "Экспорт истории чата:\n $ pachca common get-exports"
9
+ "Экспорт истории чата:\n $ pachca chats download-export"
10
10
  ];
11
+ static hiddenAliases = ["common:get-exports"];
11
12
  static scope = "chat_exports:read";
12
13
  static plan = "corporation";
13
14
  static apiMethod = "GET";
14
15
  static apiPath = "/chats/exports/{id}";
15
16
  static args = {
16
17
  id: Args.integer({
17
- description: "Идентификатор экспорта",
18
+ description: "Идентификатор экспорта (pachca chats list)",
18
19
  required: true,
19
20
  }),
20
21
  };
@@ -25,7 +26,7 @@ export default class CommonGetExports extends BaseCommand {
25
26
  }),
26
27
  };
27
28
  async run() {
28
- const { args, flags } = await this.parse(CommonGetExports);
29
+ const { args, flags } = await this.parse(ChatsDownloadExport);
29
30
  this.parsedFlags = flags;
30
31
  const { data } = await this.apiRequest({
31
32
  method: 'GET',
@@ -2,11 +2,12 @@
2
2
  import { Flags } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  import * as clack from '@clack/prompts';
5
- export default class CommonRequestExport extends BaseCommand {
5
+ export default class ChatsRequestExport extends BaseCommand {
6
6
  static description = "Экспорт сообщений";
7
7
  static examples = [
8
- "Экспорт истории чата:\n $ pachca common request-export"
8
+ "Экспорт истории чата:\n $ pachca chats request-export"
9
9
  ];
10
+ static hiddenAliases = ["common:request-export"];
10
11
  static scope = "chat_exports:write";
11
12
  static plan = "corporation";
12
13
  static apiMethod = "POST";
@@ -33,7 +34,7 @@ export default class CommonRequestExport extends BaseCommand {
33
34
  }),
34
35
  };
35
36
  async run() {
36
- const { args, flags } = await this.parse(CommonRequestExport);
37
+ const { args, flags } = await this.parse(ChatsRequestExport);
37
38
  this.parsedFlags = flags;
38
39
  const missingRequired = [
39
40
  { flag: 'start-at', label: "Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD", type: 'string' },
@@ -60,7 +61,7 @@ export default class CommonRequestExport extends BaseCommand {
60
61
  }
61
62
  }
62
63
  else {
63
- this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --start-at <string>, --end-at <string>, --webhook-url <string>. pachca introspect common request-export" });
64
+ this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --start-at <string>, --end-at <string>, --webhook-url <string>. pachca introspect chats request-export" });
64
65
  }
65
66
  }
66
67
  const body = {
@@ -2,11 +2,12 @@
2
2
  import { Flags } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  import * as clack from '@clack/prompts';
5
- export default class CommonCustomProperties extends BaseCommand {
5
+ export default class CustomPropertiesList extends BaseCommand {
6
6
  static description = "Список дополнительных полей";
7
7
  static examples = [
8
- "Получить кастомные поля профиля:\n $ pachca common custom-properties"
8
+ "Получить кастомные поля профиля:\n $ pachca custom-properties list"
9
9
  ];
10
+ static hiddenAliases = ["common:custom-properties"];
10
11
  static scope = "custom_properties:read";
11
12
  static apiMethod = "GET";
12
13
  static apiPath = "/custom_properties";
@@ -21,7 +22,7 @@ export default class CommonCustomProperties extends BaseCommand {
21
22
  }),
22
23
  };
23
24
  async run() {
24
- const { args, flags } = await this.parse(CommonCustomProperties);
25
+ const { args, flags } = await this.parse(CustomPropertiesList);
25
26
  this.parsedFlags = flags;
26
27
  const missingRequired = [
27
28
  { flag: 'entity-type', label: "Тип сущности", type: 'string' },
@@ -46,7 +47,7 @@ export default class CommonCustomProperties extends BaseCommand {
46
47
  }
47
48
  }
48
49
  else {
49
- this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --entity-type <string>. pachca introspect common custom-properties" });
50
+ this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --entity-type <string>. pachca introspect custom-properties list" });
50
51
  }
51
52
  }
52
53
  const { data } = await this.apiRequest({
@@ -4,8 +4,9 @@ import { BaseCommand } from '../../base-command.js';
4
4
  import * as clack from '@clack/prompts';
5
5
  import * as fs from 'node:fs';
6
6
  import * as path from 'node:path';
7
- export default class CommonDirectUrl extends BaseCommand {
7
+ export default class FilesDirectUrl extends BaseCommand {
8
8
  static description = "Загрузка файла";
9
+ static hiddenAliases = ["common:direct-url"];
9
10
  static apiMethod = "POST";
10
11
  static apiPath = "/direct_url";
11
12
  static requiredFlags = ["content-disposition", "acl", "policy", "x-amz-credential", "x-amz-algorithm", "x-amz-date", "x-amz-signature", "key"];
@@ -45,7 +46,7 @@ export default class CommonDirectUrl extends BaseCommand {
45
46
  }),
46
47
  };
47
48
  async run() {
48
- const { args, flags } = await this.parse(CommonDirectUrl);
49
+ const { args, flags } = await this.parse(FilesDirectUrl);
49
50
  this.parsedFlags = flags;
50
51
  const missingRequired = [
51
52
  { flag: 'content-disposition', label: "Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)", type: 'string' },
@@ -77,7 +78,7 @@ export default class CommonDirectUrl extends BaseCommand {
77
78
  }
78
79
  }
79
80
  else {
80
- this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --content-disposition <string>, --acl <string>, --policy <string>, --x-amz-credential <string>, --x-amz-algorithm <string>, --x-amz-date <string>, --x-amz-signature <string>, --key <string>. pachca introspect common direct-url" });
81
+ this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --content-disposition <string>, --acl <string>, --policy <string>, --x-amz-credential <string>, --x-amz-algorithm <string>, --x-amz-date <string>, --x-amz-signature <string>, --key <string>. pachca introspect files direct-url" });
81
82
  }
82
83
  }
83
84
  let formData;
@@ -1,9 +1,10 @@
1
1
  import { BaseCommand } from '../../base-command.js';
2
- export default class CommonUploads extends BaseCommand {
2
+ export default class FilesUploads extends BaseCommand {
3
3
  static description = "Получение подписи, ключа и других параметров";
4
4
  static examples = [
5
- "Изменить вложения сообщения:\n $ pachca common uploads"
5
+ "Изменить вложения сообщения:\n $ pachca files uploads"
6
6
  ];
7
+ static hiddenAliases = ["common:uploads"];
7
8
  static scope = "uploads:write";
8
9
  static apiMethod = "POST";
9
10
  static apiPath = "/uploads";
@@ -13,7 +14,7 @@ export default class CommonUploads extends BaseCommand {
13
14
  ...BaseCommand.baseFlags,
14
15
  };
15
16
  async run() {
16
- const { args, flags } = await this.parse(CommonUploads);
17
+ const { args, flags } = await this.parse(FilesUploads);
17
18
  this.parsedFlags = flags;
18
19
  const { data } = await this.apiRequest({
19
20
  method: 'POST',
@@ -2,18 +2,19 @@
2
2
  import { Args, Flags } from '@oclif/core';
3
3
  import { BaseCommand } from '../../base-command.js';
4
4
  import * as clack from '@clack/prompts';
5
- export default class LinkPreviewsAdd extends BaseCommand {
5
+ export default class MessagesUnfurl extends BaseCommand {
6
6
  static description = "Unfurl (разворачивание ссылок)";
7
7
  static examples = [
8
- "Разворачивание ссылок (unfurling):\n $ pachca link-previews add"
8
+ "Разворачивание ссылок (unfurling):\n $ pachca messages unfurl"
9
9
  ];
10
+ static hiddenAliases = ["link-previews:add"];
10
11
  static scope = "link_previews:write";
11
12
  static apiMethod = "POST";
12
13
  static apiPath = "/messages/{id}/link_previews";
13
14
  static requiredFlags = ["link-previews"];
14
15
  static args = {
15
16
  id: Args.integer({
16
- description: "Идентификатор сообщения",
17
+ description: "Идентификатор сообщения (pachca messages list)",
17
18
  required: true,
18
19
  }),
19
20
  };
@@ -24,7 +25,7 @@ export default class LinkPreviewsAdd extends BaseCommand {
24
25
  }),
25
26
  };
26
27
  async run() {
27
- const { args, flags } = await this.parse(LinkPreviewsAdd);
28
+ const { args, flags } = await this.parse(MessagesUnfurl);
28
29
  this.parsedFlags = flags;
29
30
  const missingRequired = [
30
31
  { flag: 'link-previews', label: "`JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.", type: 'string' },
@@ -49,7 +50,7 @@ export default class LinkPreviewsAdd extends BaseCommand {
49
50
  }
50
51
  }
51
52
  else {
52
- this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --link-previews <string>. pachca introspect link-previews add" });
53
+ this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --link-previews <string>. pachca introspect messages unfurl" });
53
54
  }
54
55
  }
55
56
  const body = {
@@ -1,9 +1,10 @@
1
1
  import { BaseCommand } from '../../base-command.js';
2
- export default class ProfileGetInfo extends BaseCommand {
2
+ export default class OauthTokenInfo extends BaseCommand {
3
3
  static description = "Информация о токене";
4
4
  static examples = [
5
- "Проверить свой токен:\n $ pachca profile get-info"
5
+ "Проверить свой токен:\n $ pachca oauth token-info"
6
6
  ];
7
+ static hiddenAliases = ["profile:get-info"];
7
8
  static apiMethod = "GET";
8
9
  static apiPath = "/oauth/token/info";
9
10
  static defaultColumns = ["id", "name", "created_at", "token", "user_id"];
@@ -12,7 +13,7 @@ export default class ProfileGetInfo extends BaseCommand {
12
13
  ...BaseCommand.baseFlags,
13
14
  };
14
15
  async run() {
15
- const { args, flags } = await this.parse(ProfileGetInfo);
16
+ const { args, flags } = await this.parse(OauthTokenInfo);
16
17
  this.parsedFlags = flags;
17
18
  const { data } = await this.apiRequest({
18
19
  method: 'GET',
@@ -20,7 +20,7 @@ export default class SearchListUsers extends BaseCommand {
20
20
  }),
21
21
  'sort': Flags.string({
22
22
  description: "Сортировка результатов",
23
- options: ["by_score", "alphabetical"],
23
+ options: ["by_score", "alphabetical", "creation"],
24
24
  }),
25
25
  'order': Flags.string({
26
26
  description: "Направление сортировки",