Каналы
Каналы добавляют командные разговоры в Libre WebUI: публичные и закрытые комнаты, личные сообщения, ветки, реакции, закрепления, непрочитанное, вложения и ответы @model на той же долговечной шифрованной основе чата.
Типы и участники
| Тип | Кто видит | Кто входит |
|---|---|---|
public | Все могут смотреть | Любой вступает сам |
private | Только участники | Владелец приглашает |
dm | Только двое | Автоматически, всегда ровно двое |
Участие — единственное основание доступа: каждое чтение/запись, загрузка вложения и живая доставка проверяют участника. Посторонний получает нераскрывающий 404. Глобальный администратор намеренно не имеет доступа к содержимому.
Создатель публичного/закрытого канала — владелец: переименовывает, архивирует, приглашает, удаляет участников, модерирует и удаляет канал; уходит удалением, не оставлением. DM дедуплицируется для пары.
Хронология
Сообщения — долговечная упорядоченная хронология с keyset-курсорами (created_at и ID) в обе стороны без пропусков/дублей.
- Идемпотентная публикация. Клиент задаёт ID; повтор попадает в ту же запись один раз.
- Удаление с tombstone. Содержимое стирается, запись остаётся, ветки и порядок стабильны. Автор удаляет своё, владелец любое.
- Редактирование только автора с
editedAt. - Ветка одного уровня. Ответ на ответ отклоняется; корень имеет живой счётчик.
- Реакции уникальны для каждой пары пользователя и эмодзи, без дублей.
- Закрепления управляются участниками.
Имена, описания и сообщения шифруются в той же границе, что чат.
Непрочитанное
Участник имеет монотонный курсор. Сервер считает непрочитанное отдельно для каждого канала, собственные сообщения не непрочитаны; POST /api/channels/:channelId/read идёт только вперёд, старый клиент не воскресит прочитанное.
Доставка в реальном времени
Изменения идут в channel:<id> и GET /api/channels/:channelId/events (SSE). Перед доставкой участие проверяется, удаление закрывает поток. SQL авторитетен: пропуск восстанавливается чтением, реестр — доставка, не истина.
Вложения
Файл сначала POST /api/channels/:channelId/attachments, ждёт в общей памяти claims и привязывается при сообщении. Claim одноразовый, истекает через 15 минут. Байтами и квотой владеет загрузивший; скачивание проверяет участие.
Ответы @model
Композитор направляет сообщение модели. Ответ сразу появляется ожидающим и завершается долговечным заданием строго от имени вызвавшего участника: его доступ, учётные данные и маршрут, никогда владельца. Удалённый из канала участник не сохранит очередь: перед генерацией проверка и видимая ошибка. Ошибки показаны в ответе.
Упоминание также доходит до участника по почте, если он включил Упоминания в каналах в Настройки → Уведомления, а администратор настроил сервер исходящей почты (см. Уведомления).
Контекст — до 30 последних сообщений.
Инструменты чата подключены: если упомянувший участник проходит функциональный гейт инструментов и его каталог не пуст, ответ проходит тот же многораундовый цикл инструментов, что и обычный ход чата, — против собственных видимых серверов инструментов и встроенных инструментов этого участника. Канал не привязывает персону, поэтому привязка инструментов персоны каталог не сужает.
За упоминанием никто не следит так, как следят за чатом, поэтому вызов инструмента с побочным эффектом отклоняется сразу, если у участника уже нет действующего разрешения на него. Ответ сообщает об этом и предлагает модели выполнить вызов из чата. Инструменты только для чтения выполняются без вопросов, как в чате. Действующие разрешения привязаны к каналу: решение «разрешить для этого чата» никогда не переходит в канал, а разрешение для канала не утекает ни в другой канал, ни в чат. Поскольку без присмотра может выполняться только чтение, повторная попытка задания на упоминание безопасна.
Ответ несёт ограниченную сводку сделанных вызовов (не более 12, с усечёнными аргументами и превью результатов) — раскрывающийся блок «Использованные инструменты» под сообщением. Поиск по знаниям и веб-поиск по-прежнему не подключены к упоминаниям в каналах.
Ограничения
| Ограничение | Значение |
|---|---|
| Каналов на пользователя | 50 |
| Участников на канал | 200 |
| Сообщений | 50,000 |
| Длина сообщения | 8,000 символов |
| Вложений | 5 × 10 MB |
| Реакций | 200 |
Границы
- Нет присутствия и набора текста.
- Экспорт и хранение следуют правилам резервного копирования инстанции; отдельного экспорта для каждого канала пока нет.
- Упоминания создают уведомления в приложении; отдельных настроек уведомлений для каждого канала, кроме выхода из него, пока нет.