@pachca/cli 2026.9.0 → 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 +32 -0
- package/README.md +23 -2
- package/dist/base-command.js +35 -0
- package/dist/client.js +23 -8
- 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/list.js +2 -2
- package/dist/commands/chats/mark-unread.js +44 -0
- package/dist/commands/chats/remove-avatar.js +45 -0
- package/dist/commands/chats/request-export.js +7 -8
- package/dist/commands/chats/update-avatar.js +54 -0
- package/dist/commands/drafts/create.js +98 -0
- package/dist/commands/drafts/delete.js +45 -0
- package/dist/commands/drafts/get.js +30 -0
- package/dist/commands/drafts/list.js +107 -0
- package/dist/commands/drafts/update.js +66 -0
- package/dist/commands/files/get.js +43 -0
- package/dist/commands/group-tags/list.js +1 -1
- package/dist/commands/members/leave.js +1 -1
- package/dist/commands/messages/create.js +5 -5
- package/dist/commands/messages/update.js +1 -1
- package/dist/commands/profile/update-status.js +1 -1
- package/dist/commands/reactions/add.js +2 -2
- package/dist/commands/reactions/remove.js +2 -2
- package/dist/commands/search/list-chats.js +1 -0
- package/dist/commands/security/list.js +3 -3
- package/dist/commands/tasks/create.js +2 -2
- package/dist/commands/tasks/list.js +1 -1
- package/dist/commands/tasks/update.js +3 -3
- package/dist/commands/threads/list.js +2 -2
- package/dist/commands/users/create.js +1 -1
- package/dist/commands/users/update-status.js +1 -1
- package/dist/commands/users/update.js +1 -1
- package/dist/data/alternatives.json +18 -2
- package/dist/data/changelog.json +140 -0
- package/dist/data/endpoints.json +1 -1
- package/dist/data/workflows.json +76 -5
- package/dist/oauth.js +28 -3
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
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 DraftsList extends BaseCommand {
|
|
5
|
+
static description = "Список черновиков";
|
|
6
|
+
static scope = "drafts:read";
|
|
7
|
+
static apiMethod = "GET";
|
|
8
|
+
static apiPath = "/drafts";
|
|
9
|
+
static defaultColumns = ["id", "content", "created_at", "entity_type", "entity_id"];
|
|
10
|
+
static args = {};
|
|
11
|
+
static flags = {
|
|
12
|
+
...BaseCommand.baseFlags,
|
|
13
|
+
'type': Flags.string({
|
|
14
|
+
description: "Что возвращать: `regular` — обычные черновики, `scheduled` — отложенные сообщения, `all` — и те и другие",
|
|
15
|
+
options: ["regular", "scheduled", "all"],
|
|
16
|
+
default: "regular",
|
|
17
|
+
}),
|
|
18
|
+
'entity-type': Flags.string({
|
|
19
|
+
description: "Тип чата для фильтра по одному чату. Указывается вместе с `entity_id`: если прислать только один из двух, ответ будет `422`.",
|
|
20
|
+
options: ["discussion", "thread", "user"],
|
|
21
|
+
}),
|
|
22
|
+
'entity-id': Flags.integer({
|
|
23
|
+
description: "Идентификатор того, что названо в `entity_type`. Указывается вместе с ним.",
|
|
24
|
+
}),
|
|
25
|
+
limit: Flags.integer({
|
|
26
|
+
description: 'Количество результатов на страницу',
|
|
27
|
+
}),
|
|
28
|
+
cursor: Flags.string({
|
|
29
|
+
description: 'Курсор для следующей страницы',
|
|
30
|
+
}),
|
|
31
|
+
all: Flags.boolean({
|
|
32
|
+
description: 'Загрузить все страницы автоматически',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
async run() {
|
|
37
|
+
const { args, flags } = await this.parse(DraftsList);
|
|
38
|
+
this.parsedFlags = flags;
|
|
39
|
+
if (flags.all) {
|
|
40
|
+
// Auto-pagination
|
|
41
|
+
const allData = [];
|
|
42
|
+
let nextCursor = undefined;
|
|
43
|
+
let pages = 0;
|
|
44
|
+
const seenCursors = new Set();
|
|
45
|
+
while (pages < 500) {
|
|
46
|
+
const query = {
|
|
47
|
+
type: flags['type'],
|
|
48
|
+
'entity_type': flags['entity-type'],
|
|
49
|
+
'entity_id': flags['entity-id'],
|
|
50
|
+
limit: flags.limit,
|
|
51
|
+
cursor: nextCursor,
|
|
52
|
+
};
|
|
53
|
+
const response = await this.apiRequest({ method: 'GET', path: '/drafts', query });
|
|
54
|
+
const body = response.data;
|
|
55
|
+
const items = body.data;
|
|
56
|
+
if (items)
|
|
57
|
+
allData.push(...items);
|
|
58
|
+
const meta = body.meta;
|
|
59
|
+
const paginate = meta?.paginate;
|
|
60
|
+
nextCursor = paginate?.next_page;
|
|
61
|
+
pages++;
|
|
62
|
+
// Условие конца: списочные методы — has_next === false; методы поиска и /users?query= (без has_next) — пустой data
|
|
63
|
+
const hasNext = paginate?.has_next;
|
|
64
|
+
if (typeof hasNext === 'boolean') {
|
|
65
|
+
if (!hasNext)
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
else if (!items || items.length === 0) {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (process.stderr.isTTY) {
|
|
72
|
+
const total = paginate?.total;
|
|
73
|
+
const progress = total ? `${allData.length} / ${total}` : String(allData.length);
|
|
74
|
+
process.stderr.write(`\r Загружено: ${progress}...`);
|
|
75
|
+
}
|
|
76
|
+
if (!nextCursor)
|
|
77
|
+
break;
|
|
78
|
+
if (seenCursors.has(nextCursor)) {
|
|
79
|
+
process.stderr.write('\n⚠ Обнаружен цикл пагинации, остановка.\n');
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
seenCursors.add(nextCursor);
|
|
83
|
+
}
|
|
84
|
+
if (pages >= 500) {
|
|
85
|
+
process.stderr.write('\n⚠ Достигнут лимит 500 страниц.\n');
|
|
86
|
+
}
|
|
87
|
+
if (process.stderr.isTTY)
|
|
88
|
+
process.stderr.write('\n');
|
|
89
|
+
this.output(allData);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const { data } = await this.apiRequest({
|
|
93
|
+
method: 'GET',
|
|
94
|
+
path: '/drafts',
|
|
95
|
+
query: {
|
|
96
|
+
type: flags['type'],
|
|
97
|
+
'entity_type': flags['entity-type'],
|
|
98
|
+
'entity_id': flags['entity-id'],
|
|
99
|
+
limit: flags.limit,
|
|
100
|
+
cursor: flags.cursor,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const responseBody = (data ?? {});
|
|
104
|
+
const items = responseBody.data ?? responseBody;
|
|
105
|
+
this.output(items);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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 DraftsUpdate extends BaseCommand {
|
|
5
|
+
static description = "Редактирование черновика";
|
|
6
|
+
static scope = "drafts:write";
|
|
7
|
+
static apiMethod = "PUT";
|
|
8
|
+
static apiPath = "/drafts/{id}";
|
|
9
|
+
static defaultColumns = ["id", "content", "created_at", "entity_type", "entity_id"];
|
|
10
|
+
static args = {
|
|
11
|
+
id: Args.integer({
|
|
12
|
+
description: "Идентификатор черновика",
|
|
13
|
+
required: true,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
static flags = {
|
|
17
|
+
...BaseCommand.baseFlags,
|
|
18
|
+
'content': Flags.string({
|
|
19
|
+
description: "Текст черновика. До 40 000 байт в UTF-8, а у отложенного сообщения в пространстве с продвинутым шифрованием — до 27 000.",
|
|
20
|
+
}),
|
|
21
|
+
'parent-message-id': Flags.integer({
|
|
22
|
+
description: "Идентификатор сообщения, ответом на которое уйдёт черновик. `null` снимает ответ.",
|
|
23
|
+
}),
|
|
24
|
+
'files': Flags.string({
|
|
25
|
+
description: "Прикрепляемые файлы, не больше десяти. Переданный массив заменяет прежний состав: пустой снимает все вложения, а чтобы сохранить уже прикреплённый файл, передайте его с `id`. Без этого поля вложения остаются как были.",
|
|
26
|
+
}),
|
|
27
|
+
'schedule': Flags.string({
|
|
28
|
+
description: "Расписание отправки. У обычного черновика оно превращает его в отложенное сообщение. У отложенного расписание можно изменить, но не снять: `null` в ответ даст `422` с кодом `draft_type_change_forbidden`.",
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
async run() {
|
|
32
|
+
const { args, flags } = await this.parse(DraftsUpdate);
|
|
33
|
+
this.parsedFlags = flags;
|
|
34
|
+
// Read from stdin if --content not provided and stdin is not TTY
|
|
35
|
+
if (!flags['content'] && !process.stdin.isTTY) {
|
|
36
|
+
const chunks = [];
|
|
37
|
+
for await (const chunk of process.stdin) {
|
|
38
|
+
chunks.push(chunk);
|
|
39
|
+
}
|
|
40
|
+
flags['content'] = Buffer.concat(chunks).toString('utf-8').trimEnd();
|
|
41
|
+
}
|
|
42
|
+
const body = { draft: {
|
|
43
|
+
content: flags['content'],
|
|
44
|
+
parent_message_id: flags['parent-message-id'],
|
|
45
|
+
files: flags['files'] ? this.parseJSON(flags['files'], 'files') : undefined,
|
|
46
|
+
schedule: flags['schedule'] ? this.parseJSON(flags['schedule'], 'schedule') : undefined,
|
|
47
|
+
} };
|
|
48
|
+
// Clean undefined fields
|
|
49
|
+
const inner = body['draft'];
|
|
50
|
+
for (const [k, v] of Object.entries(inner)) {
|
|
51
|
+
if (v === undefined)
|
|
52
|
+
delete inner[k];
|
|
53
|
+
}
|
|
54
|
+
if (Object.keys(inner).length === 0) {
|
|
55
|
+
this.validationError([{ message: 'Не указаны поля для обновления' }], { type: 'PACHCA_USAGE_ERROR' });
|
|
56
|
+
}
|
|
57
|
+
const { data } = await this.apiRequest({
|
|
58
|
+
method: 'PUT',
|
|
59
|
+
path: `/drafts/${args.id}`,
|
|
60
|
+
body,
|
|
61
|
+
});
|
|
62
|
+
const responseBody = (data ?? {});
|
|
63
|
+
const result = responseBody.data ?? responseBody;
|
|
64
|
+
this.output(result);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 { formatSize } from '../../utils.js';
|
|
6
|
+
export default class FilesGet extends BaseCommand {
|
|
7
|
+
static description = "Скачивание файла";
|
|
8
|
+
static scope = "files:read";
|
|
9
|
+
static apiMethod = "GET";
|
|
10
|
+
static apiPath = "/files/{id}";
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.integer({
|
|
13
|
+
description: "Идентификатор файла из поля `id` вложения",
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
...BaseCommand.baseFlags,
|
|
19
|
+
'target': Flags.string({
|
|
20
|
+
description: "Что отдать вместо исходного файла: `pdf_preview` — документ, переведённый в PDF, `pdf_first_page` — первая страница картинкой, `thumb` — уменьшенная копия изображения, `image` — изображение как есть. Без параметра приходит исходный файл. Вариант, которого у этого файла нет, приводит к `400`.",
|
|
21
|
+
options: ["pdf_preview", "pdf_first_page", "thumb", "image"],
|
|
22
|
+
}),
|
|
23
|
+
save: Flags.string({
|
|
24
|
+
description: 'Путь для сохранения файла',
|
|
25
|
+
required: true,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async run() {
|
|
29
|
+
const { args, flags } = await this.parse(FilesGet);
|
|
30
|
+
this.parsedFlags = flags;
|
|
31
|
+
const { data } = await this.apiRequest({
|
|
32
|
+
method: 'GET',
|
|
33
|
+
path: `/files/${args.id}`,
|
|
34
|
+
query: {
|
|
35
|
+
target: flags['target'],
|
|
36
|
+
},
|
|
37
|
+
isBinary: true,
|
|
38
|
+
});
|
|
39
|
+
const fileBody = Buffer.isBuffer(data) ? data : Buffer.from(String(data ?? ''));
|
|
40
|
+
fs.writeFileSync(flags.save, fileBody);
|
|
41
|
+
this.success(`Сохранено: ${flags.save} (${formatSize(fileBody.length)})`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Flags } from '@oclif/core';
|
|
3
3
|
import { BaseCommand } from '../../base-command.js';
|
|
4
4
|
export default class GroupTagsList extends BaseCommand {
|
|
5
|
-
static description = "Список тегов
|
|
5
|
+
static description = "Список тегов";
|
|
6
6
|
static examples = [
|
|
7
7
|
"Получить всех сотрудников тега/департамента — Найди тег по названию, возьми `id`:\n $ pachca group-tags list"
|
|
8
8
|
];
|
|
@@ -3,7 +3,7 @@ import { Args, Flags } from '@oclif/core';
|
|
|
3
3
|
import { BaseCommand } from '../../base-command.js';
|
|
4
4
|
import * as clack from '@clack/prompts';
|
|
5
5
|
export default class MembersLeave extends BaseCommand {
|
|
6
|
-
static description = "Выход из
|
|
6
|
+
static description = "Выход из чата";
|
|
7
7
|
static examples = [
|
|
8
8
|
"Архивация и управление чатом — Покинуть чат:\n $ pachca members leave"
|
|
9
9
|
];
|
|
@@ -21,10 +21,10 @@ export default class MessagesCreate extends BaseCommand {
|
|
|
21
21
|
description: "Тип сущности. Регистр значения не учитывается. Значение вне списка возвращает `400` с кодом `invalid`.",
|
|
22
22
|
}),
|
|
23
23
|
'entity-id': Flags.integer({
|
|
24
|
-
description: "Идентификатор
|
|
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 символов)",
|
|
@@ -62,8 +62,8 @@ export default class MessagesCreate extends BaseCommand {
|
|
|
62
62
|
flags['content'] = Buffer.concat(chunks).toString('utf-8').trimEnd();
|
|
63
63
|
}
|
|
64
64
|
const missingRequired = [
|
|
65
|
-
{ flag: 'entity-id', label: "Идентификатор
|
|
66
|
-
{ flag: 'content', label: "Текст сообщения. Поддерживает упоминания: `@nickname` или `<@user_id>` (будет автоматически преобразовано в `@nickname`).", type: 'string' },
|
|
65
|
+
{ flag: 'entity-id', label: "Идентификатор того, что названо в `entity_type`: беседы или канала, треда либо сотрудника.", type: 'integer' },
|
|
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: "Прикрепляемые файлы",
|
|
@@ -22,7 +22,7 @@ export default class ProfileUpdateStatus extends BaseCommand {
|
|
|
22
22
|
description: "Текст статуса (макс. 50 символов)",
|
|
23
23
|
}),
|
|
24
24
|
'expires-at': Flags.string({
|
|
25
|
-
description: "Срок жизни статуса (ISO-8601
|
|
25
|
+
description: "Срок жизни статуса (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Сюда идёт срок, названный словами: «до трёх» это значение поля, а не часть подписи.",
|
|
26
26
|
}),
|
|
27
27
|
'is-away': Flags.boolean({
|
|
28
28
|
description: "Режим «Нет на месте»",
|
|
@@ -21,7 +21,7 @@ export default class ReactionsAdd extends BaseCommand {
|
|
|
21
21
|
static flags = {
|
|
22
22
|
...BaseCommand.baseFlags,
|
|
23
23
|
'code': Flags.string({
|
|
24
|
-
description: "Emoji символ
|
|
24
|
+
description: "Emoji символ реакции. Именно символ: текстовые записи вроде `+1` или `:+1:` отклоняются как неизвестный эмодзи.",
|
|
25
25
|
}),
|
|
26
26
|
'name': Flags.string({
|
|
27
27
|
description: "Текстовое имя эмодзи (используется для кастомных эмодзи)",
|
|
@@ -31,7 +31,7 @@ export default class ReactionsAdd extends BaseCommand {
|
|
|
31
31
|
const { args, flags } = await this.parse(ReactionsAdd);
|
|
32
32
|
this.parsedFlags = flags;
|
|
33
33
|
const missingRequired = [
|
|
34
|
-
{ flag: 'code', label: "Emoji символ
|
|
34
|
+
{ flag: 'code', label: "Emoji символ реакции. Именно символ: текстовые записи вроде `+1` или `:+1:` отклоняются как неизвестный эмодзи.", type: 'string' },
|
|
35
35
|
].filter((f) => flags[f.flag] === undefined || flags[f.flag] === null);
|
|
36
36
|
if (missingRequired.length > 0) {
|
|
37
37
|
if (this.isInteractive()) {
|
|
@@ -20,7 +20,7 @@ export default class ReactionsRemove extends BaseCommand {
|
|
|
20
20
|
static flags = {
|
|
21
21
|
...BaseCommand.baseFlags,
|
|
22
22
|
'code': Flags.string({
|
|
23
|
-
description: "Emoji символ
|
|
23
|
+
description: "Emoji символ реакции. Именно символ: текстовые записи вроде `+1` или `:+1:` отклоняются как неизвестный эмодзи.",
|
|
24
24
|
}),
|
|
25
25
|
'name': Flags.string({
|
|
26
26
|
description: "Текстовое имя эмодзи (используется для кастомных эмодзи)",
|
|
@@ -34,7 +34,7 @@ export default class ReactionsRemove extends BaseCommand {
|
|
|
34
34
|
const { args, flags } = await this.parse(ReactionsRemove);
|
|
35
35
|
this.parsedFlags = flags;
|
|
36
36
|
const missingRequired = [
|
|
37
|
-
{ flag: 'code', label: "Emoji символ
|
|
37
|
+
{ flag: 'code', label: "Emoji символ реакции. Именно символ: текстовые записи вроде `+1` или `:+1:` отклоняются как неизвестный эмодзи.", type: 'string' },
|
|
38
38
|
].filter((f) => flags[f.flag] === undefined || flags[f.flag] === null);
|
|
39
39
|
if (missingRequired.length > 0) {
|
|
40
40
|
if (this.isInteractive()) {
|
|
@@ -5,6 +5,7 @@ export default class SearchListChats extends BaseCommand {
|
|
|
5
5
|
static description = "Поиск чатов";
|
|
6
6
|
static examples = [
|
|
7
7
|
"Найти чат по имени и отправить сообщение — Найди чат по названию через поиск:\n $ pachca search list-chats",
|
|
8
|
+
"Отправить сообщение позже или по расписанию — Найди чат, в который нужно написать:\n $ pachca search list-chats",
|
|
8
9
|
"Найти чат по названию — Полнотекстовый поиск по чатам:\n $ pachca search list-chats"
|
|
9
10
|
];
|
|
10
11
|
static scope = "search:chats";
|
|
@@ -17,14 +17,14 @@ export default class SecurityList extends BaseCommand {
|
|
|
17
17
|
static flags = {
|
|
18
18
|
...BaseCommand.baseFlags,
|
|
19
19
|
'start-time': Flags.string({
|
|
20
|
-
description: "Начальная метка
|
|
20
|
+
description: "Начальная метка времени, включительно (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Значение, которое не удалось разобрать, фильтр снимает — ответ придёт полным, без ошибки.",
|
|
21
21
|
}),
|
|
22
22
|
'end-time': Flags.string({
|
|
23
|
-
description: "Конечная метка
|
|
23
|
+
description: "Конечная метка времени, включительно (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Значение, которое не удалось разобрать, фильтр снимает — ответ придёт полным, без ошибки.",
|
|
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", "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,10 +21,10 @@ 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
|
-
description: "Срок выполнения напоминания (ISO-8601)
|
|
27
|
+
description: "Срок выполнения напоминания (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Секунды отбрасываются: срок встаёт на начало минуты. Исключение — ровно 23:59:59: такое напоминание создаётся на весь день, без указания времени.",
|
|
28
28
|
}),
|
|
29
29
|
'priority': Flags.integer({
|
|
30
30
|
description: "Приоритет: 1, 2 (важно) или 3 (очень важно)",
|
|
@@ -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,10 +23,10 @@ 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
|
-
description: "Срок выполнения напоминания (ISO-8601)
|
|
29
|
+
description: "Срок выполнения напоминания (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Секунды отбрасываются: срок встаёт на начало минуты. Исключение — ровно 23:59:59: такое напоминание создаётся на весь день, без указания времени.",
|
|
30
30
|
}),
|
|
31
31
|
'priority': Flags.integer({
|
|
32
32
|
description: "Приоритет: 1, 2 (важно) или 3 (очень важно)",
|
|
@@ -42,7 +42,7 @@ export default class TasksUpdate extends BaseCommand {
|
|
|
42
42
|
allowNo: true,
|
|
43
43
|
}),
|
|
44
44
|
'done-at': Flags.string({
|
|
45
|
-
description: "Дата и время выполнения напоминания (ISO-8601
|
|
45
|
+
description: "Дата и время выполнения напоминания (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Значение, которое не удалось разобрать, отметку о выполнении снимает: ответ придёт успешный, а в нём `done_at` будет `null`.",
|
|
46
46
|
}),
|
|
47
47
|
'custom-properties': Flags.string({
|
|
48
48
|
description: "Задаваемые дополнительные поля",
|
|
@@ -15,10 +15,10 @@ export default class ThreadsList extends BaseCommand {
|
|
|
15
15
|
static flags = {
|
|
16
16
|
...BaseCommand.baseFlags,
|
|
17
17
|
'last-message-at-after': Flags.string({
|
|
18
|
-
description: "Фильтрация по времени последнего сообщения в
|
|
18
|
+
description: "Фильтрация по времени последнего сообщения в треде: вернутся треды, где оно позже указанного. Значение в ISO-8601, смещение вида `+03:00` учитывается, время без смещения считается UTC.",
|
|
19
19
|
}),
|
|
20
20
|
'last-message-at-before': Flags.string({
|
|
21
|
-
description: "Фильтрация по времени последнего сообщения в
|
|
21
|
+
description: "Фильтрация по времени последнего сообщения в треде: вернутся треды, где оно раньше указанного. Значение в ISO-8601, смещение вида `+03:00` учитывается, время без смещения считается UTC.",
|
|
22
22
|
}),
|
|
23
23
|
limit: Flags.integer({
|
|
24
24
|
description: 'Количество результатов на страницу',
|
|
@@ -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` параметр обязателен и должен содержать ровно один активный чат.",
|
|
@@ -27,7 +27,7 @@ export default class UsersUpdateStatus extends BaseCommand {
|
|
|
27
27
|
description: "Текст статуса (макс. 50 символов)",
|
|
28
28
|
}),
|
|
29
29
|
'expires-at': Flags.string({
|
|
30
|
-
description: "Срок жизни статуса (ISO-8601
|
|
30
|
+
description: "Срок жизни статуса (ISO-8601). Смещение вида `+03:00` учитывается, время без смещения считается UTC. Сюда идёт срок, названный словами: «до трёх» это значение поля, а не часть подписи.",
|
|
31
31
|
}),
|
|
32
32
|
'is-away': Flags.boolean({
|
|
33
33
|
description: "Режим «Нет на месте»",
|
|
@@ -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,20 +22,29 @@
|
|
|
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
|
-
"members:leave": "Выход из
|
|
29
|
+
"members:leave": "Выход из чата",
|
|
21
30
|
"members:list": "Список участников чата",
|
|
22
31
|
"members:add": "Добавление пользователей",
|
|
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": "Список дополнительных полей",
|
|
29
39
|
"files:direct-url": "Загрузка файла",
|
|
40
|
+
"drafts:create": "Новый черновик",
|
|
41
|
+
"drafts:list": "Список черновиков",
|
|
42
|
+
"drafts:get": "Информация о черновике",
|
|
43
|
+
"drafts:update": "Редактирование черновика",
|
|
44
|
+
"drafts:delete": "Удаление черновика",
|
|
45
|
+
"files:get": "Скачивание файла",
|
|
30
46
|
"group-tags:create": "Новый тег",
|
|
31
|
-
"group-tags:list": "Список тегов
|
|
47
|
+
"group-tags:list": "Список тегов",
|
|
32
48
|
"group-tags:get": "Информация о теге",
|
|
33
49
|
"group-tags:update": "Редактирование тега",
|
|
34
50
|
"group-tags:delete": "Удаление тега",
|