Каналы
Каналы добавляют командные разговоры в 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 последних сообщений. Это единичные дополнения: инструменты, знания и веб-поиск пока не подключены.
Ограничения
| Ограничение | Значение |
|---|---|
| Каналов на пользователя | 50 |
| Участников на канал | 200 |
| Сообщений | 50,000 |
| Длина сообщения | 8,000 символов |
| Вложений | 5 × 10 MB |
| Реакций | 200 |
Границы
- Нет присутствия и набора текста.
- Экспорт и хранение следуют правилам резервного копирования инстанции; отдельного экспорта для каждого канала пока нет.
- Упоминания создают уведомления в приложении; отдельных настроек уведомлений для каждого канала, кроме выхода из него, пока нет.