Skip to content

Ротация токена бота, настройки вебхука и IA-нейминг методов#265

Merged
lookinway merged 7 commits into
mainfrom
api-2026-06-24-token-rotation-ia-renames
Jun 24, 2026
Merged

Ротация токена бота, настройки вебхука и IA-нейминг методов#265
lookinway merged 7 commits into
mainfrom
api-2026-06-24-token-rotation-ia-renames

Conversation

@lookinway

Copy link
Copy Markdown
Collaborator

Новые методы и поля API

  • Ротация токена бота: POST /bots/{id}/recreate_token (scope bots:write, админ/владелец/создатель) и POST /bot/recreate_token (scope bot_self:write, бот сам себе). Прежний токен инвалидируется, новый возвращается один раз. Audit-событие bot_token_recreated.
  • Настройки вебхука бота: ignore_self_messages (анти-луп) и events_history_enabled (история для polling) — в POST/PUT /bots и в ответе.
  • Структурированные коды ошибок: cannot_kick_owner, pin_failed, message_deleted, thread_message, export_file_not_found.
  • Типы аудит-событий: bot_scopes_updated, bot_webhook_settings_updated, bot_token_recreated (+ модели деталей).

IA-нейминг методов (дискаверабилити для агентов)

Методы переразложены по смыслу, URL и slug стали чище:

  • информация о токене → раздел OAuth; unfurl → Messages; экспорт чата → Chats; загрузка файлов и доп. поля → Files/CustomProperties.

Обратная совместимость — ничего не ломается:

  • CLI: новые команды документируются, старые имена продолжают работать скрытыми hiddenAliases.
  • n8n: новые ресурсы (экспорт внутри Chat, unfurl внутри Message, OAuth); роутер принимает старые {resource, operation} из сохранённых workflow.
  • SDK (6 языков): новые сервисы документируются; старые (client.common, client.linkPreviews, client.profile.getTokenInfo) работают как deprecated alias-сервисы, исключённые из примеров.

Пакеты

CLI 2026.6.3, SDK 1.0.25, n8n 2.0.13, generator 1.1.8. Добавлены тесты обратной совместимости (SDK/CLI/n8n); обновлены гайды, скиллы (+pachca-oauth/files/customproperties), редиректы старых URL, e2e.

npx turbo build + npx turbo check — зелёные.

@lookinway
lookinway force-pushed the api-2026-06-24-token-rotation-ia-renames branch from 038c9d4 to 0787a9c Compare June 24, 2026 18:23
Новые методы и поля API:
- Ротация токена бота: POST /bots/{id}/recreate_token (bots:write) и
  POST /bot/recreate_token (bot_self:write); audit-событие bot_token_recreated
- Поля настроек вебхука бота: ignore_self_messages, events_history_enabled
  (в POST/PUT /bots и в ответе)
- Новые коды ошибок: cannot_kick_owner, pin_failed, message_deleted,
  thread_message, export_file_not_found
- Новые типы аудит-событий: bot_scopes_updated, bot_webhook_settings_updated,
  bot_token_recreated (+ модели деталей)

IA-нейминг методов (лучшая дискаверабилити для агентов), с обратной совместимостью:
- token-info -> раздел OAuth; unfurl -> Messages; экспорт чата -> Chats;
  загрузка/доп. поля -> Files/CustomProperties. Чистые URL и slug.
- CLI: новые команды, старые имена работают скрытыми hiddenAliases
- n8n: новые ресурсы (экспорт в Chat, unfurl в Message, OAuth), роутер
  принимает старые resource/operation из сохранённых workflow
- SDK (6 языков): новые сервисы документируются, старые (client.common,
  client.linkPreviews, client.profile.getTokenInfo) работают как
  deprecated alias-сервисы, скрытые из примеров

Сборка/генераторы:
- generate-cli полностью очищает dist/commands перед пересборкой, чтобы
  .js от переименованных команд не протекали в oclif.manifest.json
  как команды-призраки (детерминированный манифест на любой ОС)
- generate-llms сам удаляет осиротевшие скилл-папки (как sweep для .md)

Версии: CLI 2026.6.3, SDK 1.0.25, n8n 2.0.13, generator 1.1.8.
Тесты обратной совместимости (SDK/CLI/n8n); обновлены гайды, скиллы
(+pachca-oauth/files/customproperties), e2e.
@lookinway
lookinway force-pushed the api-2026-06-24-token-rotation-ia-renames branch from 0787a9c to 8b3b18b Compare June 24, 2026 18:47
Уникальный случай IA-переноса: сменился и сервис, и сам глагол метода.
Раньше unfurl в SDK звался client.linkPreviews.createLinkPreviews() —
расходился с CLI/n8n/URL, где он уже unfurl. Теперь единообразно:

- operationId переименован createLinkPreviews -> unfurl (в typespec.tsp),
  поэтому SDK-метод выводится как client.messages.unfurl()
- deprecated-алиас сохраняет СТАРОЕ имя: client.linkPreviews.createLinkPreviews()
  по-прежнему работает (aliasClone получил override старого имени метода)

CLI/n8n/docs-URL не тронуты: они деривят имя из пути (/messages/{id}/link_previews),
а не из operationId, и уже отдают unfurl через свои overrides. SDK — единственный,
кто читает operationId, поэтому правка только в tsp + генераторе SDK.

Тест: канонический Messages.unfurl (primary), Link Previews.createLinkPreviews (alias).
В группе метод-сортировался только по HTTP-методу, а внутри метода порядок
шёл из алфавита пути openapi.yaml. Из-за этого новый эндпоинт самостоятельной
ротации (/bot/recreate_token, ед. число) обгонял создание (/bots, мн. число) —
«Новый бот» оказывался не первым, в отличие от остальных групп.

Добавлен вторичный ключ сортировки по глубине пути: внутри одного метода
корневые операции (POST /bots — create) идут раньше вложенных/self-путей
(POST /bot/recreate_token, POST /bots/{id}/...). Стабильная сортировка
сохраняет порядок спеки внутри одной (метод, глубина).

Общий компаратор compareEndpointsForNav применён в трёх местах единообразно:
сайдбар, групповые редиректы, генерация .md-шпаргалок — чтобы порядок совпадал.

Также долетела пере-генерация updates (формулировка client.messages.unfurl()
из releases.json предыдущего коммита).
…ений)

generate-llms генерит public/updates/*.md из releases.json, но releases.json
не был объявлен во inputs задачи. turbo отдавал кэш при правке только
releases.json → страница обновлений уезжала со стейлом (локально check мог
не поймать, т.к. сравнивал кэш со стейлом; ловилось лишь на холодной сборке CI).
Добавлен data/releases.json во inputs обоих generate-llms — теперь правка
releases.json инвалидирует кэш и страница обновлений перегенерируется.
…чный регистр)

Тег CustomProperties не имел пробела, а tagToProperty разбивает имя сервиса
по пробелам — поэтому аксессор лоуэркейсился целиком: client.customproperties
(неидиоматично в TS и Python). Переименован тег -> "Custom Properties" (как
"Link Previews"), и генератор сам выдаёт правильный регистр по конвенции языка:

- TS:     client.customProperties
- Python: client.custom_properties
- Go:     client.CustomProperties (без изменений)

Риска нет: это новый сервис (раньше — client.common.listProperties()),
им ещё никто не пользовался; старый код через deprecated client.common цел.
Скилл авто-переименовался pachca-customproperties -> pachca-custom-properties
(старый подчищен orphan-sweep'ом). URL /api/custom-properties не тронут.
…Files)

Рукописный MDX генераторы не трогают — две ссылки уехали:
- link-previews.mdx: <ApiCodeExample operationId="...createLinkPreviews"> ->
  "...unfurl" (operationId переименован, пример не находился = пустой)
- sdk/csharp.mdx: пример загрузки файла использовал deprecated client.Common
  -> client.Files (канонический сервис после IA-переноса)

Остальные гайды чисты: file-uploads.mdx уже на client.files, client.profile.getProfile
валиден (переезжал только getTokenInfo), все ApiCodeExample operationId валидны.
Новые коды (export_file_not_found, cannot_kick_owner, pin_failed,
message_deleted, thread_message) были добавлены в enum ValidationErrorCode
с @doc, но НЕ в x-enum-descriptions — а страница берёт описания именно оттуда,
поэтому рендерились голыми чипами без пояснений. Добавлены 5 RU-записей
(EN в overlay.en.yaml уже были — отсюда асимметрия RU/EN на странице).

Системно проверены все 29 enum с x-enum-descriptions: остальные покрыты
(аудит-события — ок, OAuthScope 53/53). Пробел был только здесь.

docs/api-audit.md: пункт про ValidationErrorCode приведён к стандарту секции
AuditEventKey — явно требовать строку в x-enum-descriptions (RU + EN overlay),
иначе чип без описания.
@lookinway
lookinway merged commit dc5bd88 into main Jun 24, 2026
12 checks passed
@lookinway
lookinway deleted the api-2026-06-24-token-rotation-ia-renames branch June 24, 2026 20:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant