@pachca/cli 2026.8.2 → 2026.9.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.9.0 (9 сентября 2026)
4
+
5
+ - **Добавлено** (views submit-response): Ответ на отправку формы для бота без адреса исходящего вебхука: `view_id` и `submit_id` берутся из события `view_submit` в журнале событий
6
+ - **Добавлено** (security list): Флаг `--event-key` принимает значение `exchange_disabled` — отключена интеграция с Exchange
7
+ - **Исправлено** (api): `api POST /messages --spec` и `api PUT /messages/{id} --spec`: у прикрепляемых файлов показаны пределы длины — `key` до 1000 символов и `name` до 255
8
+ - **Исправлено** (api): `api POST /views/open --spec` и `--docs`: у блока `time` начальное значение принимается и в формате `HH:mm:ss`, секунды отбрасываются
9
+
10
+ ## 2026.8.3 (28 августа 2026)
11
+
12
+ - **Добавлено** (security list): Флаг `--event-key` принимает значение `user_2fa_disabled` — сотрудник отключил себе двухфакторную аутентификацию
13
+ - **Исправлено** (api): `api POST /messages --spec` и `--docs`: размер файла `size` описан 64-битным числом, у ссылки `url` указан срок действия до 7 дней, а у кнопок появились пределы — `url` до 1024 символов и не больше 32 строк в `buttons`
14
+ - **Исправлено** (api): `api POST /views/open --spec` и `--docs`: у радиокнопки блока `radio` изначальный выбор задаётся полем `checked`, как у чекбоксов, а не `selected`. У пункта списка предел `value` — 255 символов, а сам `options` стал обязательным
15
+ - **Исправлено** (api): `api POST /tasks --spec` и `api PUT /tasks/{id} --spec`: у `priority` показаны границы 1–3, которые проверяет API
16
+ - **Исправлено** (api): `api GET /tasks --spec`: у `chat_ids` и `performer_ids` показан предел в 100 идентификаторов, который проверяет API
17
+ - **Добавлено** (api): `api --spec` показывает ответ `409` у методов сотрудника, тега и закрепления сообщения и ответ `429` у `POST /messages` — суточный предел сообщений в чат
18
+
3
19
  ## 2026.8.2 (12 августа 2026)
4
20
 
5
21
  - **Добавлено** (chats list-company): Новая команда — все беседы и каналы пространства, включая закрытые, где вы не состоите. Флаг `--activity` со значением `active` или `archived` оставляет одно состояние, по умолчанию отдаются оба. Нужна роль владельца пространства, тариф «Корпорация» и право `company_chats:read`
package/README.md CHANGED
@@ -231,6 +231,7 @@ pachca guide # список всех сценариев
231
231
  | Команда | Описание |
232
232
  |---------|---------|
233
233
  | `pachca views open` | Открытие представления |
234
+ | `pachca views submit-response` | Ответ на отправку формы |
234
235
 
235
236
  <!-- AUTO:COMMANDS:END -->
236
237
 
@@ -6,7 +6,7 @@ export default class SecurityList extends BaseCommand {
6
6
  static examples = [
7
7
  "Получить журнал аудита событий — Получи журнал аудита:\n $ pachca security list",
8
8
  "Мониторинг подозрительных входов — Получи события неудачных 2FA за период:\n $ pachca security list",
9
- "Экспорт логов за период — Получи все события за период с пагинацией:\n $ pachca security list"
9
+ "Мониторинг подозрительных входов — Повтори запрос с `--event-key=user_2fa_disabled` — отключение второго фактора у сотрудника:\n $ pachca security list"
10
10
  ];
11
11
  static scope = "audit_events:read";
12
12
  static plan = "corporation";
@@ -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_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"],
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"],
28
28
  }),
29
29
  'actor-id': Flags.string({
30
30
  description: "Идентификатор пользователя, выполнившего действие",
@@ -0,0 +1,77 @@
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 ViewsSubmitResponse extends BaseCommand {
6
+ static description = "Ответ на отправку формы";
7
+ static examples = [
8
+ "Обработать отправку формы (view_submission) — Если адрес исходящего вебхука не задан → ответь методом по `view_id` и `submit_id` из события: пустой `errors` закрывает форму, заполненный показывает ошибки полей:\n $ pachca views submit-response"
9
+ ];
10
+ static scope = "views:write";
11
+ static apiMethod = "POST";
12
+ static apiPath = "/views/{view_id}/submit_response";
13
+ static defaultColumns = ["success"];
14
+ static requiredFlags = ["submit-id"];
15
+ static args = {
16
+ view_id: Args.string({
17
+ description: "Идентификатор представления",
18
+ required: true,
19
+ }),
20
+ };
21
+ static flags = {
22
+ ...BaseCommand.baseFlags,
23
+ 'submit-id': Flags.string({
24
+ description: "Идентификатор отправки формы из вебхука `view_submit`",
25
+ }),
26
+ 'errors': Flags.string({
27
+ description: "Ошибки заполнения полей. Ключ — `name` блока, значение — текст ошибки под полем. Без этого поля представление закрывается как успешно отправленное.",
28
+ }),
29
+ };
30
+ async run() {
31
+ const { args, flags } = await this.parse(ViewsSubmitResponse);
32
+ this.parsedFlags = flags;
33
+ const missingRequired = [
34
+ { flag: 'submit-id', label: "Идентификатор отправки формы из вебхука `view_submit`", type: 'string' },
35
+ ].filter((f) => flags[f.flag] === undefined || flags[f.flag] === null);
36
+ if (missingRequired.length > 0) {
37
+ if (this.isInteractive()) {
38
+ for (const field of missingRequired) {
39
+ const value = await clack.text({ message: field.label, validate: (v) => v.length === 0 ? 'Обязательное поле' : undefined });
40
+ if (clack.isCancel(value)) {
41
+ process.stderr.write('Отменено.\n');
42
+ this.exit(0);
43
+ }
44
+ if (field.type === 'integer') {
45
+ flags[field.flag] = Number.parseInt(value, 10);
46
+ }
47
+ else if (field.type === 'boolean') {
48
+ flags[field.flag] = value === 'true';
49
+ }
50
+ else {
51
+ flags[field.flag] = value;
52
+ }
53
+ }
54
+ }
55
+ else {
56
+ this.validationError(missingRequired.map((f) => ({ message: `Обязательный флаг --${f.flag} не передан`, flag: f.flag })), { hint: "Обязательные: --submit-id <string>. pachca introspect views submit-response" });
57
+ }
58
+ }
59
+ const body = {
60
+ submit_id: flags['submit-id'],
61
+ errors: flags['errors'] ? this.parseJSON(flags['errors'], 'errors') : undefined,
62
+ };
63
+ // Clean undefined fields
64
+ for (const [k, v] of Object.entries(body)) {
65
+ if (v === undefined)
66
+ delete body[k];
67
+ }
68
+ const { data } = await this.apiRequest({
69
+ method: 'POST',
70
+ path: `/views/${args.view_id}/submit_response`,
71
+ body,
72
+ });
73
+ const responseBody = (data ?? {});
74
+ const result = responseBody.data ?? responseBody;
75
+ this.output(result);
76
+ }
77
+ }
@@ -76,6 +76,7 @@
76
76
  "users:update-status": "Новый статус сотрудника",
77
77
  "users:remove-status": "Удаление статуса сотрудника",
78
78
  "views:open": "Открытие представления",
79
+ "views:submit-response": "Ответ на отправку формы",
79
80
  "bots:list-events": "История событий",
80
81
  "bots:remove-event": "Удаление события",
81
82
  "skill:pachca-users": "pachca-users",
@@ -1,4 +1,66 @@
1
1
  [
2
+ {
3
+ "version": "2026.9.0",
4
+ "date": "9 сентября 2026",
5
+ "changes": [
6
+ {
7
+ "type": "+",
8
+ "command": "views submit-response",
9
+ "description": "Ответ на отправку формы для бота без адреса исходящего вебхука: `view_id` и `submit_id` берутся из события `view_submit` в журнале событий"
10
+ },
11
+ {
12
+ "type": "+",
13
+ "command": "security list",
14
+ "description": "Флаг `--event-key` принимает значение `exchange_disabled` — отключена интеграция с Exchange"
15
+ },
16
+ {
17
+ "type": "-",
18
+ "command": "api",
19
+ "description": "`api POST /messages --spec` и `api PUT /messages/{id} --spec`: у прикрепляемых файлов показаны пределы длины — `key` до 1000 символов и `name` до 255"
20
+ },
21
+ {
22
+ "type": "-",
23
+ "command": "api",
24
+ "description": "`api POST /views/open --spec` и `--docs`: у блока `time` начальное значение принимается и в формате `HH:mm:ss`, секунды отбрасываются"
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "version": "2026.8.3",
30
+ "date": "28 августа 2026",
31
+ "changes": [
32
+ {
33
+ "type": "+",
34
+ "command": "security list",
35
+ "description": "Флаг `--event-key` принимает значение `user_2fa_disabled` — сотрудник отключил себе двухфакторную аутентификацию"
36
+ },
37
+ {
38
+ "type": "-",
39
+ "command": "api",
40
+ "description": "`api POST /messages --spec` и `--docs`: размер файла `size` описан 64-битным числом, у ссылки `url` указан срок действия до 7 дней, а у кнопок появились пределы — `url` до 1024 символов и не больше 32 строк в `buttons`"
41
+ },
42
+ {
43
+ "type": "-",
44
+ "command": "api",
45
+ "description": "`api POST /views/open --spec` и `--docs`: у радиокнопки блока `radio` изначальный выбор задаётся полем `checked`, как у чекбоксов, а не `selected`. У пункта списка предел `value` — 255 символов, а сам `options` стал обязательным"
46
+ },
47
+ {
48
+ "type": "-",
49
+ "command": "api",
50
+ "description": "`api POST /tasks --spec` и `api PUT /tasks/{id} --spec`: у `priority` показаны границы 1–3, которые проверяет API"
51
+ },
52
+ {
53
+ "type": "-",
54
+ "command": "api",
55
+ "description": "`api GET /tasks --spec`: у `chat_ids` и `performer_ids` показан предел в 100 идентификаторов, который проверяет API"
56
+ },
57
+ {
58
+ "type": "+",
59
+ "command": "api",
60
+ "description": "`api --spec` показывает ответ `409` у методов сотрудника, тега и закрепления сообщения и ответ `429` у `POST /messages` — суточный предел сообщений в чат"
61
+ }
62
+ ]
63
+ },
2
64
  {
3
65
  "version": "2026.8.2",
4
66
  "date": "12 августа 2026",