dsh-qa-integrations
Verified@yadsh/dsh-qa-integrations · v0.1.1 · MIT · Web UI
Principal-scoped, encrypted user integrations for DSH QA Surface
Install
dsh plugin add @yadsh/dsh-qa-integrations Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
dsh-qa-integrations
Персональные интеграции для @yadsh/dsh-qa-surface. MVP подключает Bitrix24 через URL входящего вебхука и предоставляет агенту только четыре read-only tool:
bitrix_search_crmbitrix_get_crm_itembitrix_search_chatsbitrix_get_chat_messages
Плагин добавляет в пользовательские настройки QA отдельный раздел «Интеграции». Токен вводится один раз, шифруется на Host и никогда не возвращается браузеру. Выбор пользователя, integration id, secret id или токена отсутствует в model-visible схемах.
Граница доверия
Интеграционный principal получается только из QA Surface:
- браузер аутентифицируется штатным account token QA Surface;
secureSessionпроверяет владельца DSH-сессии;- интеграционный principal закрепляется только если текущий пользователь и владелец совпадают;
- администраторский просмотр чужого чата, неаттестованная сессия и subagent не получают principal;
- broker находит подключение по паре
ownerUserId + providerи только внутри себя расшифровывает credential.
В логах и audit сохраняются только provider, operation, result и source session id. Тела CRM/чатов, HTTP-заголовки и секреты не журналируются. Постоянный cache данных провайдера отсутствует.
Подготовка master key
Создайте отдельный 256-битный ключ вне БД и репозитория. Docker secret по умолчанию должен быть доступен Host как:
/run/secrets/qa_integrations_master_key
Файл может содержать ровно 32 случайных байта, 64 hex-символа или base64 от 32 байт. Пример для Linux:
umask 077
openssl rand -base64 32 > qa_integrations_master_key
Пример для PowerShell:
$keyBytes = [Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
[Convert]::ToBase64String($keyBytes) | Set-Content -NoNewline qa_integrations_master_key
Не меняйте файл ключа поверх существующего deployment: старые записи перестанут расшифровываться. KeyProvider и SecretStore.rewrap() поддерживают контролируемую ротацию с одновременной доступностью старой и новой версии; операционный CLI ротации оставлен для hardening-фазы.
Конфигурация
Плагин безопасно выключен в bundle patch, пока не смонтирован master key:
- update:
id: qa-integrations
config:
enabled: true
dataPath: /var/lib/dsh/qa-integrations.json
masterKeyPath: /run/secrets/qa_integrations_master_key
masterKeyVersion: 1
timeoutMs: 15000
maxResponseBytes: 2000000
allowedPortalSuffixes:
- .bitrix24.ru
- .bitrix24.com
- .bitrix24.eu
bitrix24:
enabled: true
crmRead: true
chatRead: true
dataPath по умолчанию — $DSH_HOME/qa-integrations.json. На Unix новый файл создаётся с mode 0600. Разрешён только HTTPS URL вида https://company.bitrix24.ru/rest/<user>/<secret> без query, fragment, custom port или credentials в authority. Список доменных суффиксов задаётся оператором, а не пользователем.
Пользовательский сценарий
- В Bitrix24 создайте входящий вебхук только с необходимыми read scopes (
crm,im). - Откройте QA → Настройки → Интеграции.
- Вставьте полный URL вебхука и нажмите «Сохранить и проверить».
- После сохранения поле исчезнет: существующий токен нельзя показать или скопировать.
- Отдельно разрешите/запретите агенту чтение CRM и чатов.
Отключение атомарно удаляет локальный encrypted secret; дальнейшие tool calls получают IntegrationNotConnected. Запись и generic REST/MCP вызовы в MVP отсутствуют. OAuth и confirmation-based writes намеренно остаются следующими фазами спецификации.
Проверка пакета
pnpm --filter @yadsh/dsh-qa-integrations check
Unit/integration набор проверяет AEAD, неверный ключ, rewrap, SSRF-ограничение webhook URL, redaction, отсутствие model-visible identity/secret selectors, отказ unowned/subagent-сессии и параллельную изоляцию Alice/Bob.