← К схеме

Slack

чат-интеграция · знания в мессенджере

Знания компании — в переписке Slack

Сотрудник пишет боту в личных сообщениях — отвечает Query Engine под его доступами, со ссылками на источники. Всё, что умеет веб-чат, не выходя из мессенджера.

Slack — ещё одно тонкое окно в тот же диалог: думает и ищет Query Engine под личностью сотрудника, Slack лишь приносит реплику и уносит ответ. Нового — только края: подключение, мост личности, отложенная доставка. Одна модель диалога на все поверхности →

Три Slack — не путать

→ исходящее Оповещения алёрты в канал через вебхук, безлично Notifications
← входящее Ассистент личный диалог под ACL сотрудника эта страница
← входящее · данные Сбор история каналов в базу знаний (ETL) Harvester
01

Подключение

Admin ставит приложение Achilles в воркспейс один раз — бот-токен и signing secret ложатся в slack_settings, как SMTP у Email. Экран — настройки платформы, один тумблер включает бота.

Модель установки — internal-app: клиент регистрирует приложение в своём воркспейсе сам. Так и должно быть для self-hosted.

02

Личность

Пишущего сводит к учётке identity_mapping (source='slack') — личность входа, отдельная от контент-личности Slack-источника в Knowledge Store. Совпал provisioned-email воркспейса — связали авто; нет — код-привязка: вошедший в веб получает код и возвращает его боту в DM (привязывается вернувший Slack к выдавшей учётке). Учётку заводит только админ (приглашением) — членство в Slack доступа не даёт.

Дальше везде только user_id → роль → ACL.

03

Беседа

Тред — это разговор: ответы в нём продолжают беседу, новое сообщение открывает новую. Контекст усекается по токенам — общий механизм движка, не свой. «Суммируй» — обычный вопрос боту, не команда.

Каналы · @mention · slash-команда — v2.

04

Доставка

Slack ждёт подтверждения за 3 секунды, нейросеть отвечает дольше: приём подтверждает сразу, обработка уходит в очередь interactive, ответ возвращается постом. Переживает рестарт и ретраи.

Повтор события Slack отсекается по event_id; публичный эндпоинт — под rate-limit.

Как это выглядит

Ответ под доступами Максима: что ему не видно — в ответ не попадёт. Продолжение — в треде той же беседы.

Первый контакт — привязка аккаунта кодом:

Код виден только во вошедшем браузере и возвращается в Slack — пересланная ссылка угнать учётку не даёт. Экран привязки →

Что в базе

identity_mapping Auth · правка + source='slack' → мост личности входа
link_tokens Auth · общая одноразовый код привязки (вошёл в веб → вернул в DM)
conversations.meta Query Engine ключ беседы (team, channel, thread_ts)
dedup:job:slack-event-… Cache & Workers идемпотентность повторов событий
slack_settings подключение к воркспейсу · общее ядро singleton · CHECK (id = 1)
id BigInteger PKCHECK всегда 1 · singleton
team Text NULL id воркспейса (T…) · NULL пока не подключён
team_name Text NULL имя воркспейса для UI (company.slack.com) · из auth.test
bot_token_enc Text NULL OAuth bot-токен (xoxb-…), шифротекст AES-256-GCM · → шифрование
signing_secret_enc Text NULL секрет подписи входящих запросов, шифротекст
bot_user_id Text NULL id бота (U…) · отсев своих сообщений и упоминаний
enabled Boolean NOT NULLDEFAULT мастер-выключатель · DEFAULT false · off → бот молчит
last_test_ok Boolean NULL итог последней «Проверить соединение»
last_test_at DateTime(tz) NULL когда проверяли · питает чип статуса на экране
created_at DateTime(tz) DEFAULT server_default=now()
updated_at DateTime(tz) DEFAULT server_default=now() · триггер set_updated_at()

is_available() — свойство модели, не колонка: enabled и заполнены team · bot_token_enc · signing_secret_enc. Зеркало SMTP у Email.

Проверки: подпись Slackack < 3 срезолв личностидедуп ретраевтред = беседаACL-проброснепривязанный пользовательsingleton настроек

API

Вебхук — анонимный по построению: замок — подпись Slack, окно частоты fail-closed.