Wiki » History » Version 3
Redmine Admin, 07/22/2026 08:21 PM
| 1 | 2 | Redmine Admin | # Green Chat 0.2.0 — памятка бета-тестера |
|---|---|---|---|
| 2 | 1 | Redmine Admin | |
| 3 | 2 | Redmine Admin | Спасибо, что участвуете в тестировании Green Chat. Эта памятка объясняет, |
| 4 | как подготовиться к бете, что особенно важно проверить в версии 0.2.0 и как |
||
| 5 | составить полезный баг-репорт. |
||
| 6 | 1 | Redmine Admin | |
| 7 | 3 | Redmine Admin | # Green Chat Desktop 0.2.1 — Beta Update |
| 8 | |||
| 9 | Дата выпуска: **22 июля 2026 года**. |
||
| 10 | |||
| 11 | Версия 0.2.1 исправляет проблемы доставки сообщений и уведомлений, |
||
| 12 | обнаруженные во время бета-тестирования 0.2.0. |
||
| 13 | |||
| 14 | ## Главное |
||
| 15 | |||
| 16 | - Доставка больше не зависит только от WebSocket-событий. Клиент сверяет |
||
| 17 | локальное состояние с сервером после подключения, при ошибке live-доставки |
||
| 18 | и каждые две минуты, пока соединение активно. |
||
| 19 | - Пропущенные во время офлайна сообщения автоматически догружаются в |
||
| 20 | правильном порядке вместе с необходимыми MLS-коммитами. |
||
| 21 | - Счётчики непрочитанных, список тредов и сохранённые сообщения обновляются |
||
| 22 | после каждой сверки с сервером. |
||
| 23 | - Для сообщений, полученных через фоновую сверку, показывается одно сводное |
||
| 24 | уведомление вместо серии попапов. Настройки DND, mute, quiet hours и режим |
||
| 25 | уведомлений канала продолжают учитываться. |
||
| 26 | |||
| 27 | ## Исправление личных сообщений после повторного входа |
||
| 28 | |||
| 29 | - Исправлена ситуация, когда после logout и повторного входа личный чат |
||
| 30 | оставался доступен, но новые сообщения фактически шифровались без устройства |
||
| 31 | собеседника. |
||
| 32 | - Клиент автоматически обнаруживает отсутствующее устройство участника и |
||
| 33 | повторно добавляет его в MLS-группу личного чата. |
||
| 34 | - Одновременное восстановление несколькими устройствами защищено коротким |
||
| 35 | серверным lease: проигравший клиент останавливается до изменения локальной |
||
| 36 | MLS-эпохи. |
||
| 37 | - Пока устройство собеседника ещё не восстановлено в личном чате, поле ввода |
||
| 38 | заменяется сообщением о синхронизации, а отправка временно блокируется. |
||
| 39 | Отметка `✓✓` в этом состоянии заменяется честным предупреждением |
||
| 40 | `not delivered`. |
||
| 41 | - После успешного восстановления чат разблокируется по долговременному |
||
| 42 | состоянию клиента, даже если соответствующее WebSocket-событие потерялось. |
||
| 43 | |||
| 44 | ## Надёжность и диагностика |
||
| 45 | |||
| 46 | - Ошибка обработки live-сообщения теперь запускает ускоренную сверку с |
||
| 47 | сервером вместо ожидания следующего переподключения. |
||
| 48 | - Исправлена потеря полной проверки групп, если переподключение совпало по |
||
| 49 | времени с уже выполняющейся фоновой сверкой. |
||
| 50 | - Отложенные reconcile-задачи корректно отменяются при logout. |
||
| 51 | - Desktop-клиент пишет диагностический лог в `glchat.log` в каталоге данных |
||
| 52 | приложения. |
||
| 53 | - Добавлена ротация лога при достижении 5 MiB с сохранением одной предыдущей |
||
| 54 | копии `glchat.log.old`, включая повторную ротацию на Windows. |
||
| 55 | |||
| 56 | ## Сервер |
||
| 57 | |||
| 58 | - Добавлены авторизованные endpoints состояния синхронизации: хвосты сообщений |
||
| 59 | по группам и отсутствующие membership-листы. |
||
| 60 | - Добавлен одноразовый lease-token для безопасного восстановления membership. |
||
| 61 | - Добавлена метрика Prometheus для количества обнаруженных membership gaps. |
||
| 62 | - Добавлена миграция `022_membership_repair_claims.sql`. |
||
| 63 | |||
| 64 | Содержимое сообщений, ключи и настройки уведомлений по-прежнему не передаются |
||
| 65 | серверу в открытом виде. Новые endpoints работают только с уже известными |
||
| 66 | серверу метаданными групп, устройств и последовательностей сообщений. |
||
| 67 | |||
| 68 | ## Обновление |
||
| 69 | |||
| 70 | Для проверки исправлений установите **Green Chat Desktop 0.2.1 на все свои |
||
| 71 | устройства**. Сервер также должен быть обновлён и иметь применённую миграцию |
||
| 72 | `022_membership_repair_claims.sql`. |
||
| 73 | |||
| 74 | Особенно важно повторно проверить: |
||
| 75 | |||
| 76 | 1. получение сообщений после временного отключения сети; |
||
| 77 | 2. непрочитанные, звук и системный попап после фоновой догрузки; |
||
| 78 | 3. личный чат после logout и повторного входа одного из участников; |
||
| 79 | 4. одновременную работу двух устройств одного аккаунта; |
||
| 80 | 5. наличие `glchat.log` после перезапуска desktop-приложения. |
||
| 81 | |||
| 82 | |||
| 83 | |||
| 84 | 2 | Redmine Admin | Полный список изменений находится в |
| 85 | [changelog версии 0.2.0](beta-changelog-0.2.0.md). |
||
| 86 | 1 | Redmine Admin | |
| 87 | 2 | Redmine Admin | ## Перед началом тестирования |
| 88 | 1 | Redmine Admin | |
| 89 | 2 | Redmine Admin | 1. Установите версию **0.2.0 на все свои устройства**. Старые клиенты |
| 90 | несовместимы с новой синхронизацией участников каналов и могут работать |
||
| 91 | некорректно. |
||
| 92 | 2. Проверьте номер версии в **Settings → Profile**. |
||
| 93 | 3. По возможности подготовьте два тестовых аккаунта и два устройства для |
||
| 94 | одного из аккаунтов. Это позволит проверить доставку, роли и |
||
| 95 | мультиустройство. |
||
| 96 | 4. Не используйте единственный рабочий аккаунт для сценариев с выходом из |
||
| 97 | системы: logout безвозвратно удаляет историю на текущем устройстве. |
||
| 98 | 5. Бета-версия может содержать ошибки. Не отправляйте через неё данные, |
||
| 99 | потеря которых будет критичной. |
||
| 100 | 1 | Redmine Admin | |
| 101 | 2 | Redmine Admin | ## Как устроено хранение сообщений |
| 102 | 1 | Redmine Admin | |
| 103 | 2 | Redmine Admin | Green Chat — корпоративный мессенджер со сквозным шифрованием MLS. Сервер |
| 104 | хранит сообщения и файлы в зашифрованном виде и не располагает ключами для |
||
| 105 | их чтения. |
||
| 106 | 1 | Redmine Admin | |
| 107 | 2 | Redmine Admin | Из этого следуют важные ограничения: |
| 108 | 1 | Redmine Admin | |
| 109 | 2 | Redmine Admin | - история расшифровывается и хранится на устройствах пользователя; |
| 110 | - сервер и служба поддержки не могут прочитать переписку или восстановить |
||
| 111 | уничтоженные ключи; |
||
| 112 | - выход из аккаунта очищает локальную историю и ключи на этом устройстве; |
||
| 113 | - если выйти со всех устройств, прежнюю историю восстановить будет нельзя; |
||
| 114 | - для поиска ошибки особенно важны точное время события, участники, канал и |
||
| 115 | последовательность действий. |
||
| 116 | 1 | Redmine Admin | |
| 117 | 2 | Redmine Admin | ## Что особенно важно проверить в версии 0.2.0 |
| 118 | 1 | Redmine Admin | |
| 119 | 2 | Redmine Admin | ### 1. Обычные сообщения и восстановление соединения |
| 120 | 1 | Redmine Admin | |
| 121 | 2 | Redmine Admin | - Отправьте сообщения в канал и личный чат. |
| 122 | - Проверьте доставку текста, эмодзи, форматирования и ответов в треде. |
||
| 123 | - Полностью отключите сеть на одном из устройств на несколько минут, затем |
||
| 124 | включите её обратно. |
||
| 125 | - Убедитесь, что клиент подключился самостоятельно и получил сообщения, |
||
| 126 | отправленные во время офлайна. |
||
| 127 | - Проверьте, что статус online/offline обновляется без повторного открытия |
||
| 128 | канала. |
||
| 129 | 1 | Redmine Admin | |
| 130 | 2 | Redmine Admin | Сообщение со статусом `sent`, которое после восстановления соединения так и |
| 131 | не появилось у получателя, считается важным багом. |
||
| 132 | 1 | Redmine Admin | |
| 133 | 2 | Redmine Admin | ### 2. Треды |
| 134 | 1 | Redmine Admin | |
| 135 | 2 | Redmine Admin | - Создайте несколько тредов в разных каналах. |
| 136 | - Откройте раздел **Threads** и проверьте сортировку по последней активности. |
||
| 137 | - Переключите фильтры **All** и **Unread**. |
||
| 138 | - Нажмите на тред в списке и убедитесь, что открылись правильный канал и |
||
| 139 | исходное сообщение. |
||
| 140 | - Ответьте с `@mention`, добавьте вложение или перетащите файл в область |
||
| 141 | ответа. |
||
| 142 | - При наличии второго устройства проверьте синхронизацию прочитанности |
||
| 143 | тредов. |
||
| 144 | 1 | Redmine Admin | |
| 145 | 2 | Redmine Admin | ### 3. Роли и участники каналов |
| 146 | 1 | Redmine Admin | |
| 147 | 2 | Redmine Admin | Для полноценной проверки нужны минимум три аккаунта: владелец, модератор и |
| 148 | обычный участник. |
||
| 149 | 1 | Redmine Admin | |
| 150 | 2 | Redmine Admin | 1. Создайте приватный канал и пригласите двух участников. |
| 151 | 2. Убедитесь, что создатель отмечен как owner. |
||
| 152 | 3. Назначьте одного участника модератором и затем снимите роль. |
||
| 153 | 4. Проверьте, что owner может приглашать и исключать участников. |
||
| 154 | 5. Проверьте, что moderator может управлять обычными участниками, но не |
||
| 155 | владельцем или другим модератором. |
||
| 156 | 6. Исключите обычного участника: канал должен сразу исчезнуть у него из |
||
| 157 | интерфейса, а новые сообщения не должны быть доступны. |
||
| 158 | 7. Повторно пригласите участника и убедитесь, что устаревшее событие удаления |
||
| 159 | не убирает канал снова. |
||
| 160 | 1 | Redmine Admin | |
| 161 | 2 | Redmine Admin | Дополнительно можно проверить выход из канала: |
| 162 | 1 | Redmine Admin | |
| 163 | 2 | Redmine Admin | - обычный участник и модератор могут выйти самостоятельно; |
| 164 | - owner с другими участниками должен сначала назначить модератора; |
||
| 165 | - при выходе owner владение автоматически переходит назначенному модератору; |
||
| 166 | - из DM выйти нельзя, но его можно скрыть через **Remove for me**; |
||
| 167 | - для публичного канала исключение участника недоступно, поскольку он может |
||
| 168 | вступить обратно самостоятельно. |
||
| 169 | |||
| 170 | ### 4. Профили |
||
| 171 | |||
| 172 | - Заполните аватар, должность, описание и рабочий телефон. |
||
| 173 | - Откройте карточку профиля из сообщения и панели участников. |
||
| 174 | - Проверьте копирование email и телефона. |
||
| 175 | - Измените аватар или данные профиля на одном устройстве и убедитесь, что |
||
| 176 | изменения появились у другого пользователя без перезапуска приложения. |
||
| 177 | |||
| 178 | Поля профиля видны всем пользователям организации — это справочная информация, |
||
| 179 | а не приватная часть переписки. |
||
| 180 | |||
| 181 | ### 5. Поиск и действия с сообщениями |
||
| 182 | |||
| 183 | - Найдите старое сообщение через поиск и перейдите к нему. |
||
| 184 | - Убедитесь, что чат прокрутился к правильному сообщению и выделил его. |
||
| 185 | - Проверьте доступные контекстные действия: ответ, редактирование, сохранение, |
||
| 186 | закрепление и удаление там, где они разрешены. |
||
| 187 | - Отредактируйте длинное сообщение и ответ в треде: поле ввода должно |
||
| 188 | увеличиваться вместе с текстом. |
||
| 189 | - Попробуйте превысить допустимую длину сообщения. Клиент должен показать |
||
| 190 | понятное ограничение, а не зависнуть или молча потерять текст. |
||
| 191 | |||
| 192 | Поиск работает по локально доступной истории устройства. Отсутствие сообщения, |
||
| 193 | которого никогда не было на этом устройстве, само по себе не является багом. |
||
| 194 | |||
| 195 | ### 6. Файлы, изображения и GIF |
||
| 196 | |||
| 197 | - выберите файл через кнопку вложения и убедитесь, что он сначала появился в |
||
| 198 | области подготовки к отправке; |
||
| 199 | - удалите подготовленный файл, не отправляя сообщение; |
||
| 200 | - перетащите файлы в основной чат и отдельно в открытый тред; |
||
| 201 | - вставьте изображение из буфера обмена; |
||
| 202 | - отправьте несколько файлов и проверьте, что они остались в исходном чате, |
||
| 203 | даже если во время загрузки переключиться на другой канал; |
||
| 204 | - откройте изображение во встроенном просмотрщике; |
||
| 205 | - проверьте воспроизведение GIF и отсутствие чрезмерной нагрузки интерфейса; |
||
| 206 | - удалите собственное сообщение с вложением и убедитесь, что файл больше не |
||
| 207 | доступен из чата; |
||
| 208 | - скачайте файл и проверьте его содержимое после расшифровки. |
||
| 209 | |||
| 210 | Ошибки загрузки, повреждённый скачанный файл, вложение в неправильном канале |
||
| 211 | или зависшая подготовка файла считаются багами. |
||
| 212 | |||
| 213 | ### 7. Сохранённые сообщения и загрузки |
||
| 214 | |||
| 215 | - Сохраните сообщения из разных каналов через контекстное меню. |
||
| 216 | - Откройте раздел **Saved**, перейдите из него к исходному сообщению и удалите |
||
| 217 | закладку. |
||
| 218 | - При наличии второго устройства проверьте, что список сохранённых сообщений |
||
| 219 | синхронизировался. |
||
| 220 | - Скачайте несколько файлов и откройте раздел **Downloads**. |
||
| 221 | - Проверьте действия **Open file**, **Show in folder** и |
||
| 222 | **Remove from history**. |
||
| 223 | |||
| 224 | Сохранённые сообщения синхронизируются между устройствами и видны только |
||
| 225 | владельцу аккаунта. История загрузок хранится только на конкретном устройстве. |
||
| 226 | Удаление записи из Downloads не удаляет сам файл с диска. Файлы, скачанные до |
||
| 227 | установки 0.2.0, в историю автоматически не добавляются. |
||
| 228 | |||
| 229 | ### 8. Уведомления и звук |
||
| 230 | |||
| 231 | - В **Settings → Notifications** нажмите **Send test**. |
||
| 232 | - Оставьте окно приложения без фокуса и попросите другого тестера отправить |
||
| 233 | DM — должен появиться системный попап и прозвучать звук. |
||
| 234 | - Проверьте `@mention` в канале. Обычное сообщение без упоминания по умолчанию |
||
| 235 | не показывает попап. |
||
| 236 | - Отключите звук в настройках и убедитесь, что новые сообщения приходят без |
||
| 237 | звукового сигнала. |
||
| 238 | - Проверьте DND, mute канала и quiet hours. |
||
| 239 | - Полностью закройте приложение через tray → **Quit**, отправьте на аккаунт |
||
| 240 | DM и проверьте email-уведомление, если SMTP включён на сервере. |
||
| 241 | |||
| 242 | Попапы показывает запущенное приложение. После полного выхода через **Quit** |
||
| 243 | desktop-клиент не может показать системное уведомление; в этом случае для DM |
||
| 244 | может прийти только email. |
||
| 245 | |||
| 246 | ### 9. Несколько устройств |
||
| 247 | |||
| 248 | - Войдите на второе устройство по паролю или привяжите его по QR-коду. |
||
| 249 | - Создайте приватный канал и пригласите пользователя с несколькими активными |
||
| 250 | устройствами. |
||
| 251 | - Убедитесь, что канал, его название и новые сообщения появились на всех |
||
| 252 | устройствах приглашённого. |
||
| 253 | - Проверьте синхронизацию прочитанности, черновиков, сохранённых сообщений и |
||
| 254 | скрытых чатов. |
||
| 255 | - Измените аватар и убедитесь, что он обновился на других клиентах. |
||
| 256 | - Закройте одно устройство, продолжите работу на втором, затем верните первое |
||
| 257 | в сеть и проверьте восстановление состояния. |
||
| 258 | |||
| 259 | ### 10. Выход со всех устройств |
||
| 260 | |||
| 261 | Этот сценарий выполняйте только на специально созданном тестовом аккаунте. |
||
| 262 | Перед выходом убедитесь, что клиент подключён к серверу. |
||
| 263 | |||
| 264 | 1. Выйдите из аккаунта на последнем активном устройстве и подтвердите |
||
| 265 | предупреждение об удалении истории. |
||
| 266 | 2. У другого пользователя аккаунт должен получить отметку **Logged out** в |
||
| 267 | списке DM, профиле, панели участников и выборе пользователя. |
||
| 268 | 3. В существующем DM история должна остаться читаемой, но поле отправки должно |
||
| 269 | замениться предупреждением. |
||
| 270 | 4. Создание нового DM с вышедшим пользователем должно быть заблокировано. |
||
| 271 | 5. Отправьте в канал сообщение с его персональным `@mention`: сообщение |
||
| 272 | должно отправиться остальным участникам, а автор должен увидеть |
||
| 273 | предупреждение о недоставке упомянутому пользователю. |
||
| 274 | 6. Снова войдите этим аккаунтом. Отметка Logged out должна исчезнуть у других |
||
| 275 | пользователей. |
||
| 276 | |||
| 277 | Повторный вход создаёт новое активное устройство, но не возвращает историю, |
||
| 278 | уничтоженную при logout. |
||
| 279 | |||
| 280 | ## Что обязательно считать багом |
||
| 281 | |||
| 282 | - Падение, зависание или бесконечная загрузка приложения. |
||
| 283 | - Потеря уже отправленного сообщения или его появление в неправильном чате. |
||
| 284 | - Ошибка расшифровки, нечитаемый текст или повреждённый файл. |
||
| 285 | - Получение доступа к чужому каналу, профилю или данным без разрешения. |
||
| 286 | - Возможность обычного участника выполнить действие owner/moderator. |
||
| 287 | - Доступ исключённого участника к новым сообщениям приватного канала. |
||
| 288 | - Расхождение каналов, ролей, сохранённых сообщений или прочитанности между |
||
| 289 | устройствами, которое не исправляется после переподключения. |
||
| 290 | - Отсутствие DM или `@mention`-уведомления при выполненных условиях доставки. |
||
| 291 | - Неправильный адресат, канал или тред у вложения. |
||
| 292 | - Неработающая кнопка, обрезанный интерфейс или нечитаемый текст, особенно в |
||
| 293 | тёмной теме. |
||
| 294 | |||
| 295 | Проблемы безопасности, потерю данных и воспроизводимые падения отмечайте |
||
| 296 | приоритетом **High**. |
||
| 297 | |||
| 298 | ## Известные ограничения беты |
||
| 299 | |||
| 300 | - Вход обычно доступен только по приглашению; вкладки создания свободного |
||
| 301 | аккаунта может не быть. |
||
| 302 | - Автоматического обновления нет — новую версию нужно устанавливать вручную. |
||
| 303 | - Windows может показать SmartScreen с предупреждением о неизвестном |
||
| 304 | издателе. |
||
| 305 | - Неподписанная macOS-сборка может быть заблокирована Gatekeeper. После |
||
| 306 | переноса приложения в `/Applications` выполните: |
||
| 307 | |||
| 308 | ```sh |
||
| 309 | xattr -cr "/Applications/Green Chat.app" |
||
| 310 | ``` |
||
| 311 | |||
| 312 | - На macOS системные попапы бета-сборки могут отображаться от имени |
||
| 313 | **Script Editor**. |
||
| 314 | - На части серверов отправка файлов и email-уведомления могут быть отключены. |
||
| 315 | - Числовой бейдж учитывает DM и упоминания; обычное непрочитанное сообщение в |
||
| 316 | канале отображается точкой. |
||
| 317 | - Сообщение `SPKI pin mismatch` после плановой смены серверного ключа требует |
||
| 318 | повторного входа. Клиент намеренно не принимает новый ключ молча. |
||
| 319 | |||
| 320 | Если поведение не перечислено здесь и выглядит неправильным, лучше отправить |
||
| 321 | репорт. |
||
| 322 | |||
| 323 | ## Как оставить баг-репорт |
||
| 324 | |||
| 325 | Трекер: |
||
| 326 | <https://bug.green-lab.space/projects/greenchat/issues/new>. Регистрация не |
||
| 327 | нужна, репорт можно отправить анонимно. |
||
| 328 | |||
| 329 | ### Что указать |
||
| 330 | |||
| 331 | 1 | Redmine Admin | ```text |
| 332 | 2 | Redmine Admin | Краткое название: что сломалось и где |
| 333 | |||
| 334 | 1 | Redmine Admin | Шаги: |
| 335 | 1. … |
||
| 336 | 2. … |
||
| 337 | 3. … |
||
| 338 | |||
| 339 | Ожидал: … |
||
| 340 | Получил: … |
||
| 341 | |||
| 342 | 2 | Redmine Admin | Окружение: |
| 343 | - Green Chat 0.2.0 |
||
| 344 | - ОС и версия |
||
| 345 | - один или несколько аккаунтов/устройств |
||
| 346 | - название канала или DM |
||
| 347 | - точное время события и часовой пояс |
||
| 348 | 1 | Redmine Admin | |
| 349 | 2 | Redmine Admin | Воспроизводится: всегда / иногда / один раз |
| 350 | Дополнительно: скриншот или короткое видео |
||
| 351 | 1 | Redmine Admin | ``` |
| 352 | |||
| 353 | 2 | Redmine Admin | Для проблем синхронизации укажите ОС и версию клиента **на каждой стороне**, |
| 354 | а также какое устройство было офлайн. |
||
| 355 | 1 | Redmine Admin | |
| 356 | 2 | Redmine Admin | Трекер публичный. Не прикладывайте пароли, invite-коды, ключи, приватные |
| 357 | логи или скриншоты с конфиденциальной перепиской. Перед отправкой замажьте |
||
| 358 | лишние данные. |
||
| 359 | 1 | Redmine Admin | |
| 360 | 2 | Redmine Admin | ### Приоритет |
| 361 | 1 | Redmine Admin | |
| 362 | 2 | Redmine Admin | | Приоритет | Когда использовать | |
| 363 | |---|---| |
||
| 364 | | `Normal` | Большинство ошибок интерфейса и поведения | |
||
| 365 | | `High` | Падение, потеря данных, недоставка сообщений, нарушение прав или безопасности | |
||
| 366 | | `Urgent` / `Immediate` | Не выбирайте без отдельной просьбы команды | |
||
| 367 | 1 | Redmine Admin | |
| 368 | 2 | Redmine Admin | ## Быстрая диагностика уведомлений |
| 369 | 1 | Redmine Admin | |
| 370 | 2 | Redmine Admin | 1. Нажмите **Settings → Notifications → Send test**. |
| 371 | 2. Если тест пришёл, проверьте DND, mute, quiet hours и фокус окна. |
||
| 372 | 3. Для канала используйте персональный `@mention`; обычное сообщение может не |
||
| 373 | создавать попап. |
||
| 374 | 4. Если приложение было закрыто через tray → Quit, системного попапа быть не |
||
| 375 | должно. |
||
| 376 | 5. Если Send test не работает при разрешённых уведомлениях ОС, создайте |
||
| 377 | баг-репорт и обязательно укажите операционную систему. |
||
| 378 | 1 | Redmine Admin | |
| 379 | |||
| 380 | 2 | Redmine Admin | # glchat Desktop 0.2.0 — Beta Update |
| 381 | 1 | Redmine Admin | |
| 382 | 2 | Redmine Admin | Изменения с 9 по 20 июля 2026 года. |
| 383 | |||
| 384 | ## Новые возможности |
||
| 385 | |||
| 386 | - Добавлены роли владельца и модератора канала, управление участниками, выход из канала и локальное скрытие чатов. |
||
| 387 | - Появились карточки профилей с аватаром, должностью, описанием и контактами. |
||
| 388 | - Добавлен единый раздел «Треды» со всеми обсуждениями и фильтром непрочитанных. |
||
| 389 | - Сообщения теперь можно сохранять в личные закладки с синхронизацией между устройствами. |
||
| 390 | - Добавлена локальная история загрузок: файл можно открыть, показать в папке или убрать из списка. |
||
| 391 | - Изображения открываются во встроенном просмотрщике, добавлена безопасная анимация GIF. |
||
| 392 | - Изображения из буфера обмена можно вставлять прямо в сообщение. |
||
| 393 | - Добавлены звуковые уведомления о новых сообщениях и настройка звука. |
||
| 394 | - Пользователи, вышедшие со всех устройств, теперь отмечаются в интерфейсе. Перед отправкой им личного сообщения или упоминания показывается предупреждение. |
||
| 395 | |||
| 396 | ## Улучшения интерфейса |
||
| 397 | |||
| 398 | - Добавлены контекстные действия для сообщений. |
||
| 399 | - Улучшены редакторы сообщений и ответов в тредах. |
||
| 400 | - Добавлены упоминания пользователей в ответах треда. |
||
| 401 | - Улучшена работа с вложениями: предварительная подготовка, drag-and-drop в треды и удаление отправленных файлов. |
||
| 402 | - Поиск теперь прокручивает чат до найденного сообщения и ограничивает слишком тяжёлые запросы. |
||
| 403 | - Улучшены индикаторы присутствия, подсчёт участников и расположение боковых панелей. |
||
| 404 | - После отправки сообщения чат автоматически прокручивается к нему. |
||
| 405 | - Исправлено восстановление окна приложения из системного трея. |
||
| 406 | |||
| 407 | ## Исправления и стабильность |
||
| 408 | |||
| 409 | - Исправлена синхронизация каналов, участников и метаданных между несколькими устройствами. |
||
| 410 | - Восстановлена доставка уведомлений после длительного офлайна. |
||
| 411 | - Статус пользователя обновляется сразу после подключения. |
||
| 412 | - Исправлен учёт непрочитанных сообщений при переключении фокуса окна. |
||
| 413 | - Исключённые каналы сразу удаляются из интерфейса, а устаревшие события больше не удаляют канал после повторного вступления. |
||
| 414 | - Исправлены отображение закреплённых файлов и привязка вложений к исходному чату. |
||
| 415 | - Добавлена корректная обработка максимальной длины сообщений. |
||
| 416 | - Аватары профилей теперь обновляются в реальном времени. |
||
| 417 | - Улучшено восстановление личных чатов после выхода всех участников со всех устройств. |
||
| 418 | - При выходе устройство отзывается на сервере, чтобы не оставлять неактивные устройства и ключи. |
||
| 419 | |||
| 420 | ## Сервер и эксплуатация |
||
| 421 | |||
| 422 | - Добавлены Prometheus-метрики для HTTP, WebSocket, PostgreSQL, Redis и Go runtime. |
||
| 423 | - Подготовлены базовые правила мониторинга и алертов. |
||
| 424 | - Улучшена конфигурация TLS для файлового хранилища. |
||
| 425 | |||
| 426 | Итого: **40 коммитов и 178 изменённых файлов** в ветке `main`. |