@pachca/cli 2026.8.3 → 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,12 @@
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
+
3
10
  ## 2026.8.3 (28 августа 2026)
4
11
 
5
12
  - **Добавлено** (security list): Флаг `--event-key` принимает значение `user_2fa_disabled` — сотрудник отключил себе двухфакторную аутентификацию
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
 
@@ -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", "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,30 @@
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
+ },
2
28
  {
3
29
  "version": "2026.8.3",
4
30
  "date": "28 августа 2026",