@pachca/cli 2026.9.1 → 2026.10.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 +23 -0
- package/README.md +10 -0
- package/dist/base-command.js +35 -0
- package/dist/commands/auth/login.js +4 -4
- package/dist/commands/bots/create-token.js +84 -0
- package/dist/commands/bots/create.js +32 -5
- package/dist/commands/bots/delete-token.js +46 -0
- package/dist/commands/bots/delete.js +1 -1
- package/dist/commands/bots/get.js +1 -1
- package/dist/commands/bots/list-scopes.js +32 -0
- package/dist/commands/bots/list-tokens.js +94 -0
- package/dist/commands/bots/list.js +1 -1
- package/dist/commands/bots/recreate-token-self.js +1 -1
- package/dist/commands/bots/recreate-token.js +2 -2
- package/dist/commands/bots/reissue-token.js +37 -0
- package/dist/commands/bots/rotate-client-secret.js +30 -0
- package/dist/commands/bots/update-token.js +60 -0
- package/dist/commands/bots/update.js +35 -6
- package/dist/commands/chats/mark-unread.js +44 -0
- package/dist/commands/chats/remove-avatar.js +45 -0
- package/dist/commands/chats/update-avatar.js +54 -0
- package/dist/commands/drafts/create.js +1 -1
- package/dist/commands/drafts/update.js +1 -1
- package/dist/commands/messages/create.js +3 -3
- package/dist/commands/messages/update.js +1 -1
- package/dist/commands/security/list.js +1 -1
- package/dist/commands/tasks/create.js +1 -1
- package/dist/commands/tasks/list.js +1 -1
- package/dist/commands/tasks/update.js +1 -1
- package/dist/commands/users/create.js +1 -1
- package/dist/commands/users/update.js +1 -1
- package/dist/data/alternatives.json +10 -0
- package/dist/data/changelog.json +105 -0
- package/dist/data/endpoints.json +1 -1
- package/dist/data/workflows.json +54 -3
- package/dist/oauth.js +28 -3
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Auto-generated from openapi.yaml — DO NOT EDIT
|
|
2
|
+
import { Args, Flags } from '@oclif/core';
|
|
3
|
+
import { BaseCommand } from '../../base-command.js';
|
|
4
|
+
export default class BotsUpdateToken extends BaseCommand {
|
|
5
|
+
static description = "Изменение токена бота";
|
|
6
|
+
static scope = "bots:write";
|
|
7
|
+
static apiMethod = "PUT";
|
|
8
|
+
static apiPath = "/bots/{id}/tokens/{token_id}";
|
|
9
|
+
static defaultColumns = ["id", "name", "created_at", "token", "user_id"];
|
|
10
|
+
static args = {
|
|
11
|
+
id: Args.integer({
|
|
12
|
+
description: "Идентификатор бота (pachca bots list)",
|
|
13
|
+
required: true,
|
|
14
|
+
}),
|
|
15
|
+
token_id: Args.integer({
|
|
16
|
+
description: "Идентификатор токена",
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...BaseCommand.baseFlags,
|
|
22
|
+
'name': Flags.string({
|
|
23
|
+
description: "Новое имя токена (макс. 255 символов)",
|
|
24
|
+
}),
|
|
25
|
+
'scopes': Flags.string({
|
|
26
|
+
description: "Новые права токена. Список заменяется целиком и действует сразу, перевыпускать токен не нужно.",
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
async run() {
|
|
30
|
+
const { args, flags } = await this.parse(BotsUpdateToken);
|
|
31
|
+
this.parsedFlags = flags;
|
|
32
|
+
const validationErrors = [];
|
|
33
|
+
if (flags['name'] && String(flags['name']).length > 255) {
|
|
34
|
+
validationErrors.push({ message: `--name: максимум 255 символов (передано: ${String(flags['name']).length})`, flag: 'name' });
|
|
35
|
+
}
|
|
36
|
+
if (validationErrors.length > 0) {
|
|
37
|
+
this.validationError(validationErrors);
|
|
38
|
+
}
|
|
39
|
+
const body = {
|
|
40
|
+
name: flags['name'],
|
|
41
|
+
scopes: flags['scopes'] ? this.parseJSON(flags['scopes'], 'scopes') : undefined,
|
|
42
|
+
};
|
|
43
|
+
// Clean undefined fields
|
|
44
|
+
for (const [k, v] of Object.entries(body)) {
|
|
45
|
+
if (v === undefined)
|
|
46
|
+
delete body[k];
|
|
47
|
+
}
|
|
48
|
+
if (Object.keys(body).length === 0) {
|
|
49
|
+
this.validationError([{ message: 'Не указаны поля для обновления' }], { type: 'PACHCA_USAGE_ERROR' });
|
|
50
|
+
}
|
|
51
|
+
const { data } = await this.apiRequest({
|
|
52
|
+
method: 'PUT',
|
|
53
|
+
path: `/bots/${args.id}/tokens/${args.token_id}`,
|
|
54
|
+
body,
|
|
55
|
+
});
|
|
56
|
+
const responseBody = (data ?? {});
|
|
57
|
+
const result = responseBody.data ?? responseBody;
|
|
58
|
+
this.output(result);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -4,12 +4,14 @@ 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 бота — Пользовательским токеном (с правом редактировать бота) — обнови URL по `id` бота. Пустая строка отключает вебхук:\n $ pachca bots update"
|
|
7
|
+
"Обновить Webhook URL бота — Пользовательским токеном (с правом редактировать бота) — обнови URL по `id` бота. Пустая строка отключает вебхук:\n $ pachca bots update",
|
|
8
|
+
"Включить боту авторизацию от имени сотрудника — Пользовательским токеном (создатель бота или администратор, если бот открыт администраторам) включи авторизацию: где хранится секрет, адреса возврата и права, которые бот попросит у сотрудника. Права бери из `pachca bots list-scopes`:\n $ pachca bots update",
|
|
9
|
+
"Включить боту авторизацию от имени сотрудника — Чтобы бот появился в витрине, добавь описание и опубликуй страницу:\n $ pachca bots update"
|
|
8
10
|
];
|
|
9
11
|
static scope = "bots:write";
|
|
10
12
|
static apiMethod = "PUT";
|
|
11
13
|
static apiPath = "/bots/{id}";
|
|
12
|
-
static defaultColumns = ["id", "
|
|
14
|
+
static defaultColumns = ["id", "name", "created_at", "nickname", "avatar_url"];
|
|
13
15
|
static args = {
|
|
14
16
|
id: Args.integer({
|
|
15
17
|
description: "Идентификатор бота (pachca bots list)",
|
|
@@ -53,7 +55,7 @@ export default class BotsUpdate extends BaseCommand {
|
|
|
53
55
|
allowNo: true,
|
|
54
56
|
}),
|
|
55
57
|
'ignore-self-messages': Flags.boolean({
|
|
56
|
-
description: "
|
|
58
|
+
description: "Не присылать боту события о его собственных сообщениях и реакциях",
|
|
57
59
|
allowNo: true,
|
|
58
60
|
}),
|
|
59
61
|
'events-history-enabled': Flags.boolean({
|
|
@@ -66,6 +68,22 @@ export default class BotsUpdate extends BaseCommand {
|
|
|
66
68
|
'can-edit': Flags.string({
|
|
67
69
|
description: "Роли, которым, помимо создателя, разрешено редактировать настройки бота. Создатель может редактировать всегда. Пустой массив — редактировать может только создатель.",
|
|
68
70
|
}),
|
|
71
|
+
'single-chat': Flags.boolean({
|
|
72
|
+
description: "Ограничивает бота одной беседой или каналом: `true` — бота можно добавить только в один такой чат, `false` — в несколько. Личные чаты и треды в ограничение не входят.",
|
|
73
|
+
allowNo: true,
|
|
74
|
+
}),
|
|
75
|
+
'kind': Flags.string({
|
|
76
|
+
description: "Источник входящего вебхука. Если у бота входящего вебхука не было, он включается.",
|
|
77
|
+
}),
|
|
78
|
+
'unfurl-domains': Flags.string({
|
|
79
|
+
description: "Домены, ссылки на которые бот разворачивает, не больше 5. Работают вместе с событием `message_link_shared`.",
|
|
80
|
+
}),
|
|
81
|
+
'oauth-client': Flags.string({
|
|
82
|
+
description: "Настройки авторизации от имени сотрудника. Если авторизация выключена, объект её включает, а `null` выключает: выданные сотрудниками авторизации отзываются, страница в витрине удаляется.",
|
|
83
|
+
}),
|
|
84
|
+
'promo': Flags.string({
|
|
85
|
+
description: "Страница бота в витрине. Доступна, только когда у бота включена авторизация.",
|
|
86
|
+
}),
|
|
69
87
|
};
|
|
70
88
|
async run() {
|
|
71
89
|
const { args, flags } = await this.parse(BotsUpdate);
|
|
@@ -80,7 +98,8 @@ export default class BotsUpdate extends BaseCommand {
|
|
|
80
98
|
if (validationErrors.length > 0) {
|
|
81
99
|
this.validationError(validationErrors);
|
|
82
100
|
}
|
|
83
|
-
const body = {
|
|
101
|
+
const body = {
|
|
102
|
+
webhook: {
|
|
84
103
|
name: flags['name'],
|
|
85
104
|
nickname: flags['nickname'],
|
|
86
105
|
outgoing_url: flags['outgoing-url'],
|
|
@@ -96,14 +115,24 @@ export default class BotsUpdate extends BaseCommand {
|
|
|
96
115
|
events_history_enabled: flags['events-history-enabled'],
|
|
97
116
|
who_can_add: flags['who-can-add'],
|
|
98
117
|
can_edit: flags['can-edit'] ? this.parseJSON(flags['can-edit'], 'can-edit') : undefined,
|
|
99
|
-
|
|
118
|
+
single_chat: flags['single-chat'],
|
|
119
|
+
kind: flags['kind'],
|
|
120
|
+
unfurl_domains: flags['unfurl-domains'] ? this.parseJSON(flags['unfurl-domains'], 'unfurl-domains') : undefined,
|
|
121
|
+
},
|
|
122
|
+
oauth_client: flags['oauth-client'] ? this.parseJSON(flags['oauth-client'], 'oauth-client') : undefined,
|
|
123
|
+
promo: flags['promo'] ? this.parseJSON(flags['promo'], 'promo') : undefined,
|
|
124
|
+
};
|
|
100
125
|
// Clean undefined fields
|
|
101
126
|
const inner = body['webhook'];
|
|
102
127
|
for (const [k, v] of Object.entries(inner)) {
|
|
103
128
|
if (v === undefined)
|
|
104
129
|
delete inner[k];
|
|
105
130
|
}
|
|
106
|
-
|
|
131
|
+
for (const [k, v] of Object.entries(body)) {
|
|
132
|
+
if (k !== 'webhook' && v === undefined)
|
|
133
|
+
delete body[k];
|
|
134
|
+
}
|
|
135
|
+
if (Object.keys(inner).length === 0 && Object.keys(body).length === 1) {
|
|
107
136
|
this.validationError([{ message: 'Не указаны поля для обновления' }], { type: 'PACHCA_USAGE_ERROR' });
|
|
108
137
|
}
|
|
109
138
|
const { data } = await this.apiRequest({
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Auto-generated from openapi.yaml — DO NOT EDIT
|
|
2
|
+
import { Args, Flags } from '@oclif/core';
|
|
3
|
+
import { BaseCommand } from '../../base-command.js';
|
|
4
|
+
export default class ChatsMarkUnread extends BaseCommand {
|
|
5
|
+
static description = "Отметка чата непрочитанным";
|
|
6
|
+
static scope = "chats:mark_unread";
|
|
7
|
+
static apiMethod = "PUT";
|
|
8
|
+
static apiPath = "/chats/{id}/unread";
|
|
9
|
+
static args = {
|
|
10
|
+
id: Args.integer({
|
|
11
|
+
description: "Идентификатор чата или треда (pachca chats list)",
|
|
12
|
+
required: true,
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
static flags = {
|
|
16
|
+
...BaseCommand.baseFlags,
|
|
17
|
+
'message-id': Flags.integer({
|
|
18
|
+
description: "Идентификатор сообщения, с которого чат становится непрочитанным: оно и все сообщения после него. Если не передать, непрочитанным становится последнее сообщение. (pachca messages list)",
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
async run() {
|
|
22
|
+
const { args, flags } = await this.parse(ChatsMarkUnread);
|
|
23
|
+
this.parsedFlags = flags;
|
|
24
|
+
const body = {
|
|
25
|
+
message_id: flags['message-id'],
|
|
26
|
+
};
|
|
27
|
+
// Clean undefined fields
|
|
28
|
+
for (const [k, v] of Object.entries(body)) {
|
|
29
|
+
if (v === undefined)
|
|
30
|
+
delete body[k];
|
|
31
|
+
}
|
|
32
|
+
if (Object.keys(body).length === 0) {
|
|
33
|
+
this.validationError([{ message: 'Не указаны поля для обновления' }], { type: 'PACHCA_USAGE_ERROR' });
|
|
34
|
+
}
|
|
35
|
+
const { data } = await this.apiRequest({
|
|
36
|
+
method: 'PUT',
|
|
37
|
+
path: `/chats/${args.id}/unread`,
|
|
38
|
+
body,
|
|
39
|
+
});
|
|
40
|
+
const responseBody = (data ?? {});
|
|
41
|
+
const result = responseBody.data ?? responseBody;
|
|
42
|
+
this.output(result);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 ChatsRemoveAvatar extends BaseCommand {
|
|
6
|
+
static description = "Удаление аватара чата";
|
|
7
|
+
static examples = [
|
|
8
|
+
"Поставить или убрать аватар чата — Чтобы убрать аватар, удали его:\n $ pachca chats remove-avatar"
|
|
9
|
+
];
|
|
10
|
+
static scope = "chats:update";
|
|
11
|
+
static apiMethod = "DELETE";
|
|
12
|
+
static apiPath = "/chats/{id}/avatar";
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.integer({
|
|
15
|
+
description: "Идентификатор чата (pachca chats list)",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...BaseCommand.baseFlags,
|
|
21
|
+
force: Flags.boolean({
|
|
22
|
+
description: 'Пропустить подтверждение',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
async run() {
|
|
27
|
+
const { args, flags } = await this.parse(ChatsRemoveAvatar);
|
|
28
|
+
this.parsedFlags = flags;
|
|
29
|
+
if (!flags.force) {
|
|
30
|
+
if (!this.isInteractive()) {
|
|
31
|
+
this.validationError([{ message: 'Деструктивная операция требует флага --force', flag: 'force' }], { type: 'PACHCA_DESTRUCTIVE_OP_ERROR', hint: "pachca chats remove-avatar <id> --force" });
|
|
32
|
+
}
|
|
33
|
+
const confirm = await clack.confirm({ message: 'Вы уверены?' });
|
|
34
|
+
if (clack.isCancel(confirm) || !confirm) {
|
|
35
|
+
process.stderr.write('Отменено.\n');
|
|
36
|
+
this.exit(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const { data } = await this.apiRequest({
|
|
40
|
+
method: 'DELETE',
|
|
41
|
+
path: `/chats/${args.id}/avatar`,
|
|
42
|
+
});
|
|
43
|
+
this.success('Удалено');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
export default class ChatsUpdateAvatar extends BaseCommand {
|
|
7
|
+
static description = "Загрузка аватара чата";
|
|
8
|
+
static examples = [
|
|
9
|
+
"Поставить или убрать аватар чата — Загрузи аватар беседы или канала:\n $ pachca chats update-avatar"
|
|
10
|
+
];
|
|
11
|
+
static scope = "chats:update";
|
|
12
|
+
static apiMethod = "PUT";
|
|
13
|
+
static apiPath = "/chats/{id}/avatar";
|
|
14
|
+
static defaultColumns = ["image_url"];
|
|
15
|
+
static args = {
|
|
16
|
+
id: Args.integer({
|
|
17
|
+
description: "Идентификатор чата (pachca chats list)",
|
|
18
|
+
required: true,
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
static flags = {
|
|
22
|
+
...BaseCommand.baseFlags,
|
|
23
|
+
file: Flags.string({
|
|
24
|
+
description: "Файл изображения для аватара",
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { args, flags } = await this.parse(ChatsUpdateAvatar);
|
|
29
|
+
this.parsedFlags = flags;
|
|
30
|
+
let formData;
|
|
31
|
+
if (flags.file) {
|
|
32
|
+
formData = new FormData();
|
|
33
|
+
if (flags.file === '-') {
|
|
34
|
+
const chunks = [];
|
|
35
|
+
for await (const chunk of process.stdin)
|
|
36
|
+
chunks.push(chunk);
|
|
37
|
+
const blob = new Blob([Buffer.concat(chunks)]);
|
|
38
|
+
formData.append('image', blob, 'stdin');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const blob = new Blob([fs.readFileSync(flags.file)]);
|
|
42
|
+
formData.append('image', blob, path.basename(flags.file));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const { data } = await this.apiRequest({
|
|
46
|
+
method: 'PUT',
|
|
47
|
+
path: `/chats/${args.id}/avatar`,
|
|
48
|
+
formData,
|
|
49
|
+
});
|
|
50
|
+
const responseBody = (data ?? {});
|
|
51
|
+
const result = responseBody.data ?? responseBody;
|
|
52
|
+
this.output(result);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -22,7 +22,7 @@ export default class DraftsCreate extends BaseCommand {
|
|
|
22
22
|
description: "Идентификатор того, что названо в `entity_type`: беседы или канала, треда либо сотрудника (pachca chats list | pachca users list)",
|
|
23
23
|
}),
|
|
24
24
|
'content': Flags.string({
|
|
25
|
-
description: "Текст черновика. Можно не передавать, если есть вложения, но пустым черновик быть не может.",
|
|
25
|
+
description: "Текст черновика. Можно не передавать, если есть вложения, но пустым черновик быть не может. До 40 000 байт в UTF-8, а у отложенного сообщения в пространстве с продвинутым шифрованием — до 27 000.",
|
|
26
26
|
}),
|
|
27
27
|
'parent-message-id': Flags.integer({
|
|
28
28
|
description: "Идентификатор сообщения, ответом на которое уйдёт черновик. Сообщение должно быть в том же чате.",
|
|
@@ -16,7 +16,7 @@ export default class DraftsUpdate extends BaseCommand {
|
|
|
16
16
|
static flags = {
|
|
17
17
|
...BaseCommand.baseFlags,
|
|
18
18
|
'content': Flags.string({
|
|
19
|
-
description: "Текст
|
|
19
|
+
description: "Текст черновика. До 40 000 байт в UTF-8, а у отложенного сообщения в пространстве с продвинутым шифрованием — до 27 000.",
|
|
20
20
|
}),
|
|
21
21
|
'parent-message-id': Flags.integer({
|
|
22
22
|
description: "Идентификатор сообщения, ответом на которое уйдёт черновик. `null` снимает ответ.",
|
|
@@ -24,7 +24,7 @@ export default class MessagesCreate extends BaseCommand {
|
|
|
24
24
|
description: "Идентификатор того, что названо в `entity_type`: беседы или канала, треда либо сотрудника. (pachca chats list | pachca users list)",
|
|
25
25
|
}),
|
|
26
26
|
'content': Flags.string({
|
|
27
|
-
description: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`).",
|
|
27
|
+
description: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`). У мульти-гостя `<@user_id>` недоступного ему сотрудника остаётся в тексте как есть. До 40 000 байт в UTF-8, для кириллицы это около 20 000 символов. В пространстве с продвинутым шифрованием — до 27 000 байт.",
|
|
28
28
|
}),
|
|
29
29
|
'files': Flags.string({
|
|
30
30
|
description: "Прикрепляемые файлы",
|
|
@@ -33,7 +33,7 @@ export default class MessagesCreate extends BaseCommand {
|
|
|
33
33
|
description: "Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке.",
|
|
34
34
|
}),
|
|
35
35
|
'parent-message-id': Flags.integer({
|
|
36
|
-
description: "Идентификатор сообщения, на которое
|
|
36
|
+
description: "Идентификатор сообщения, на которое вы отвечаете с цитатой. Ответить можно на сообщение в любом чате, в том числе в треде: ответ отправляют в тот же чат или тред, где лежит это сообщение, иначе запрос вернёт ошибку `422`. Чтобы написать в тред под сообщением, укажите `entity_type: \"thread\"` и идентификатор треда в `entity_id`.",
|
|
37
37
|
}),
|
|
38
38
|
'display-avatar-url': Flags.string({
|
|
39
39
|
description: "Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)",
|
|
@@ -63,7 +63,7 @@ export default class MessagesCreate extends BaseCommand {
|
|
|
63
63
|
}
|
|
64
64
|
const missingRequired = [
|
|
65
65
|
{ flag: 'entity-id', label: "Идентификатор того, что названо в `entity_type`: беседы или канала, треда либо сотрудника.", type: 'integer' },
|
|
66
|
-
{ flag: 'content', label: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`).", type: 'string' },
|
|
66
|
+
{ flag: 'content', label: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`). У мульти-гостя `<@user_id>` недоступного ему сотрудника остаётся в тексте как есть. До 40 000 байт в UTF-8, для кириллицы это около 20 000 символов. В пространстве с продвинутым шифрованием — до 27 000 байт.", type: 'string' },
|
|
67
67
|
].filter((f) => flags[f.flag] === undefined || flags[f.flag] === null);
|
|
68
68
|
if (missingRequired.length > 0) {
|
|
69
69
|
if (this.isInteractive()) {
|
|
@@ -21,7 +21,7 @@ export default class MessagesUpdate extends BaseCommand {
|
|
|
21
21
|
static flags = {
|
|
22
22
|
...BaseCommand.baseFlags,
|
|
23
23
|
'content': Flags.string({
|
|
24
|
-
description: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`).",
|
|
24
|
+
description: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`). У мульти-гостя `<@user_id>` недоступного ему сотрудника остаётся в тексте как есть. До 40 000 байт в UTF-8, для кириллицы это около 20 000 символов. В пространстве с продвинутым шифрованием — до 27 000 байт.",
|
|
25
25
|
}),
|
|
26
26
|
'files': Flags.string({
|
|
27
27
|
description: "Прикрепляемые файлы",
|
|
@@ -24,7 +24,7 @@ export default class SecurityList extends BaseCommand {
|
|
|
24
24
|
}),
|
|
25
25
|
'event-key': Flags.string({
|
|
26
26
|
description: "Фильтр по конкретному типу события",
|
|
27
|
-
options: ["user_login", "user_logout", "user_2fa_fail", "user_2fa_success", "user_2fa_disabled", "user_created", "user_deleted", "user_role_changed", "user_updated", "tag_created", "tag_deleted", "user_added_to_tag", "user_removed_from_tag", "chat_created", "chat_renamed", "chat_permission_changed", "user_chat_join", "user_chat_leave", "tag_added_to_chat", "tag_removed_from_chat", "message_updated", "message_deleted", "message_created", "reaction_created", "reaction_deleted", "thread_created", "access_token_created", "access_token_updated", "access_token_destroy", "kms_encrypt", "kms_decrypt", "audit_events_accessed", "company_chats_accessed", "company_bots_accessed", "dlp_violation_detected", "search_users_api", "search_chats_api", "search_messages_api", "bot_scopes_updated", "bot_webhook_settings_updated", "bot_token_recreated", "bot_deleted", "bot_oauth_client_updated", "oauth_authorization_granted", "oauth_authorization_revoked", "oauth_device_authorization_approved", "oauth_device_authorization_denied", "video_call_started", "video_call_finished", "video_call_recording_ready", "exchange_disabled"],
|
|
27
|
+
options: ["user_login", "user_logout", "user_2fa_fail", "user_2fa_success", "user_2fa_disabled", "user_created", "user_deleted", "user_role_changed", "user_updated", "tag_created", "tag_deleted", "user_added_to_tag", "user_removed_from_tag", "chat_created", "chat_renamed", "chat_permission_changed", "user_chat_join", "user_chat_leave", "tag_added_to_chat", "tag_removed_from_chat", "message_updated", "message_deleted", "message_created", "reaction_created", "reaction_deleted", "thread_created", "access_token_created", "access_token_updated", "access_token_destroy", "kms_encrypt", "kms_decrypt", "audit_events_accessed", "company_chats_accessed", "company_bots_accessed", "dlp_violation_detected", "search_users_api", "search_chats_api", "search_messages_api", "bot_scopes_updated", "bot_webhook_settings_updated", "bot_token_recreated", "bot_deleted", "bot_oauth_client_updated", "bot_oauth_client_disabled", "bot_oauth_client_secret_rotated", "bot_oauth_client_secret_issued", "bot_token_created", "bot_token_updated", "bot_token_reissued", "bot_token_deleted", "oauth_authorization_granted", "oauth_authorization_revoked", "oauth_token_revoked", "oauth_device_authorization_approved", "oauth_device_authorization_denied", "video_call_started", "video_call_finished", "video_call_recording_ready", "exchange_disabled"],
|
|
28
28
|
}),
|
|
29
29
|
'actor-id': Flags.string({
|
|
30
30
|
description: "Идентификатор пользователя, выполнившего действие",
|
|
@@ -21,7 +21,7 @@ export default class TasksCreate extends BaseCommand {
|
|
|
21
21
|
description: "Тип",
|
|
22
22
|
}),
|
|
23
23
|
'content': Flags.string({
|
|
24
|
-
description: "
|
|
24
|
+
description: "Описание, по умолчанию — название типа. До 40 000 байт в UTF-8.",
|
|
25
25
|
}),
|
|
26
26
|
'due-at': Flags.string({
|
|
27
27
|
description: "Срок выполнения напоминания (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Секунды отбрасываются: срок встаёт на начало минуты. Исключение — ровно 23:59:59: такое напоминание создаётся на весь день, без указания времени.",
|
|
@@ -20,7 +20,7 @@ export default class TasksList extends BaseCommand {
|
|
|
20
20
|
options: ["done", "undone"],
|
|
21
21
|
}),
|
|
22
22
|
'chat-ids': Flags.string({
|
|
23
|
-
description: "Фильтр по чатам, к которым привязаны напоминания. Доступными считаются чаты, где вы состоите участником, открытые беседы и каналы пространства, а также треды, доступные вам по родительскому чату. Остальные переданные идентификаторы игнорируются без ошибки. Не более 100 идентификаторов." + " (через запятую)",
|
|
23
|
+
description: "Фильтр по чатам, к которым привязаны напоминания. Доступными считаются чаты, где вы состоите участником, открытые беседы и каналы пространства, а также треды, доступные вам по родительскому чату. Мульти-гостю открытые беседы и каналы доступны, только если он в них участник. Остальные переданные идентификаторы игнорируются без ошибки. Не более 100 идентификаторов." + " (через запятую)",
|
|
24
24
|
}),
|
|
25
25
|
'performer-ids': Flags.string({
|
|
26
26
|
description: "Фильтр по ответственным за напоминание. Не более 100 идентификаторов." + " (через запятую)",
|
|
@@ -23,7 +23,7 @@ export default class TasksUpdate extends BaseCommand {
|
|
|
23
23
|
description: "Тип",
|
|
24
24
|
}),
|
|
25
25
|
'content': Flags.string({
|
|
26
|
-
description: "
|
|
26
|
+
description: "Описание. До 40 000 байт в UTF-8.",
|
|
27
27
|
}),
|
|
28
28
|
'due-at': Flags.string({
|
|
29
29
|
description: "Срок выполнения напоминания (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Секунды отбрасываются: срок встаёт на начало минуты. Исключение — ровно 23:59:59: такое напоминание создаётся на весь день, без указания времени.",
|
|
@@ -46,7 +46,7 @@ export default class UsersCreate extends BaseCommand {
|
|
|
46
46
|
allowNo: true,
|
|
47
47
|
}),
|
|
48
48
|
'list-tags': Flags.string({
|
|
49
|
-
description: "Массив тегов, привязываемых к
|
|
49
|
+
description: "Массив названий тегов, привязываемых к сотруднику. Значение, которое не является массивом непустых строк, игнорируется.",
|
|
50
50
|
}),
|
|
51
51
|
'chat-ids': Flags.string({
|
|
52
52
|
description: "Идентификаторы чатов, в которые сотрудник будет добавлен сразу при создании. Для роли `guest` параметр обязателен и должен содержать ровно один активный чат.",
|
|
@@ -48,7 +48,7 @@ export default class UsersUpdate extends BaseCommand {
|
|
|
48
48
|
allowNo: true,
|
|
49
49
|
}),
|
|
50
50
|
'list-tags': Flags.string({
|
|
51
|
-
description: "Массив тегов, привязываемых к
|
|
51
|
+
description: "Массив названий тегов, привязываемых к сотруднику. Список заменяет прежний целиком, пустой снимает все теги. Значение, которое не является массивом непустых строк, игнорируется: теги сотрудника не меняются.",
|
|
52
52
|
}),
|
|
53
53
|
'custom-properties': Flags.string({
|
|
54
54
|
description: "Задаваемые дополнительные поля",
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
"bots:update": "Редактирование бота",
|
|
9
9
|
"bots:delete": "Удаление бота",
|
|
10
10
|
"bots:recreate-token": "Ротация токена бота",
|
|
11
|
+
"bots:rotate-client-secret": "Ротация секрета клиента",
|
|
12
|
+
"bots:list-scopes": "Каталог прав бота",
|
|
13
|
+
"bots:list-tokens": "Список токенов бота",
|
|
14
|
+
"bots:create-token": "Новый токен бота",
|
|
15
|
+
"bots:update-token": "Изменение токена бота",
|
|
16
|
+
"bots:delete-token": "Удаление токена бота",
|
|
17
|
+
"bots:reissue-token": "Перевыпуск токена бота",
|
|
11
18
|
"chats:create": "Новый чат",
|
|
12
19
|
"chats:list": "Список чатов",
|
|
13
20
|
"chats:request-export": "Экспорт сообщений",
|
|
@@ -15,6 +22,8 @@
|
|
|
15
22
|
"chats:get": "Информация о чате",
|
|
16
23
|
"chats:update": "Редактирование чата",
|
|
17
24
|
"chats:archive": "Архивация чата",
|
|
25
|
+
"chats:update-avatar": "Загрузка аватара чата",
|
|
26
|
+
"chats:remove-avatar": "Удаление аватара чата",
|
|
18
27
|
"members:add-group-tags": "Добавление тегов",
|
|
19
28
|
"members:remove-group-tag": "Исключение тега",
|
|
20
29
|
"members:leave": "Выход из чата",
|
|
@@ -23,6 +32,7 @@
|
|
|
23
32
|
"members:remove": "Исключение пользователя",
|
|
24
33
|
"members:update": "Редактирование роли",
|
|
25
34
|
"chats:unarchive": "Разархивация чата",
|
|
35
|
+
"chats:mark-unread": "Отметка чата непрочитанным",
|
|
26
36
|
"bots:list-company": "Список ботов пространства",
|
|
27
37
|
"chats:list-company": "Список чатов пространства",
|
|
28
38
|
"custom-properties:list": "Список дополнительных полей",
|
package/dist/data/changelog.json
CHANGED
|
@@ -1,4 +1,109 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "2026.10.0",
|
|
4
|
+
"date": "13 октября 2026",
|
|
5
|
+
"changes": [
|
|
6
|
+
{
|
|
7
|
+
"type": "+",
|
|
8
|
+
"command": "bots list-tokens, bots create-token, bots update-token, bots reissue-token, bots delete-token",
|
|
9
|
+
"description": "Новые команды — токены бота: у бота может быть несколько токенов, у каждого своё имя и права. Значение токена показывается один раз, при выпуске и перевыпуске."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "+",
|
|
13
|
+
"command": "bots list-scopes",
|
|
14
|
+
"description": "Новая команда — каталог прав, которые можно выдать боту: его токенам и авторизации от имени сотрудника"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"type": "+",
|
|
18
|
+
"command": "bots rotate-client-secret",
|
|
19
|
+
"description": "Новая команда — новый `client_secret` для авторизации от имени сотрудника. Прежний секрет перестаёт работать сразу."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "+",
|
|
23
|
+
"command": "bots create, bots update",
|
|
24
|
+
"description": "Флаги `--oauth-client` и `--promo` включают авторизацию от имени сотрудника и заполняют страницу бота в витрине, `--kind` выбирает источник входящего вебхука, а `--unfurl-domains` задаёт домены для разворачивания ссылок. У `bots create` появился `--empty` для бота без токена, у `bots update` — `--single-chat`."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "+",
|
|
28
|
+
"command": "chats mark-unread",
|
|
29
|
+
"description": "Новая команда — отметка чата непрочитанным для владельца токена"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "+",
|
|
33
|
+
"command": "chats update-avatar, chats remove-avatar",
|
|
34
|
+
"description": "Новые команды — аватар беседы или канала: загрузка файла флагом `--file` и удаление. В выводе команд с чатами появилось поле `avatar_url`."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"type": "+",
|
|
38
|
+
"command": "security list",
|
|
39
|
+
"description": "Флаг `--event-key` принимает значения `bot_token_created`, `bot_token_updated`, `bot_token_reissued`, `bot_token_deleted`, `bot_oauth_client_secret_issued`, `bot_oauth_client_secret_rotated`, `bot_oauth_client_disabled` и `oauth_token_revoked`"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "-",
|
|
43
|
+
"command": "search users, search chats, search messages, users list",
|
|
44
|
+
"description": "В справке описан ответ `504` с кодом `timeout`, если поиск не уложился по времени"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "-",
|
|
48
|
+
"command": "messages create, messages update, drafts create, drafts update",
|
|
49
|
+
"description": "У файлов в справке указан предел голосового сообщения в 30 минут"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "+",
|
|
53
|
+
"command": "auth login",
|
|
54
|
+
"description": "Вход через браузер передаёт серверу имя устройства, по которому вход узнаётся в списке токенов CLI: имя машины, а у профиля не по умолчанию ещё и имя профиля в скобках, например `macbook (ci)`"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"type": "~",
|
|
58
|
+
"description": "После ответа `401` CLI подсказывает, что делать дальше: войти заново, если вход через браузер отозван или завершён, или сохранить новый токен. В подсказку подставлен профиль, с которым запускалась команда, например `pachca auth login --profile ci`"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "-",
|
|
62
|
+
"command": "views open",
|
|
63
|
+
"description": "В справке у блоков `radio` и `checkbox` до 20 вариантов"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"type": "-",
|
|
67
|
+
"command": "bots create, bots update",
|
|
68
|
+
"description": "Справка к `--ignore-self-messages` говорит, что настройка не присылает боту и его собственные реакции"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "-",
|
|
72
|
+
"command": "guide",
|
|
73
|
+
"description": "Сценарии разворачивания ссылок и поллинга описывают раздел «Интеграции»: событие ссылок с доменами вместо отдельного типа бота и история событий без Webhook URL флагом `--events-history-enabled`, который попал и в примеры `bots update`"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "-",
|
|
77
|
+
"command": "messages create, messages update, tasks list",
|
|
78
|
+
"description": "Подсказки к `--content` и `--chat-ids` описывают, что меняется для мульти-гостя"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"type": "-",
|
|
82
|
+
"command": "messages create, messages update, drafts create, drafts update, tasks create, tasks update",
|
|
83
|
+
"description": "В справке к `--content` указан предел длины текста: 40 000 байт, а в пространстве с продвинутым шифрованием 27 000"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "-",
|
|
87
|
+
"command": "messages create, threads add, threads create, threads get, threads list",
|
|
88
|
+
"description": "Подсказка к `--parent-message-id` описывает ответ с цитатой в любом чате, в том числе в треде. В описаниях тредов сказано, какой идентификатор куда передавать: `id` — чтобы написать в тред, `chat_id` — чтобы прочитать его сообщения."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"type": "-",
|
|
92
|
+
"command": "bots list-events",
|
|
93
|
+
"description": "В справке у события отправки формы сказано, что `chat_id` фиксируется при открытии формы, а не при её отправке"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"type": "-",
|
|
97
|
+
"command": "chats create, members add, users update",
|
|
98
|
+
"description": "В справке описаны отказы для бота с настройкой «Ограничить одним чатом» — `single_chat_bot_occupied`, если он уже состоит в другой беседе или канале, и `single_chat_bot_tag_denied` при добавлении в тег. У `users update` сказано, что у бота меняются только имя, ник, теги и `suspended`."
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"type": "-",
|
|
102
|
+
"command": "tasks get",
|
|
103
|
+
"description": "В справке сказано, что напоминание видят все, кому доступен его чат, по тому же правилу, что у фильтра `--chat-ids` в `tasks list`"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
2
107
|
{
|
|
3
108
|
"version": "2026.9.1",
|
|
4
109
|
"date": "16 сентября 2026",
|