Skip to content

Chat Sharing

shaerware edited this page Feb 21, 2026 · 1 revision

Chat Sharing (Совместный доступ к чатам)

Функция совместного доступа позволяет делиться чат-сессиями между пользователями системы. Владелец чата может предоставить другим пользователям доступ на чтение или запись, а получатель может создать собственную копию (форк) расшаренного чата.

Концепция

В многопользовательской системе часто возникает потребность в совместной работе над диалогами с ИИ. Chat Sharing решает эту задачу:

  • Совместная работа — несколько пользователей могут работать с одним чатом
  • Два уровня доступаread (только просмотр) и write (просмотр + отправка сообщений)
  • Привязка к ветке — при расшаривании фиксируется текущая ветка диалога (branch_message_id), получатель видит только сообщения до этой точки
  • Форк — получатель может создать глубокую копию чата к себе, чтобы продолжить диалог независимо
  • Только admin-чаты — расшарить можно только сессии с source=admin (чаты из админ-панели), боты (Telegram, WhatsApp, Widget) не расшариваются

Как поделиться чатом

Открытие диалога

  1. Откройте нужный чат в разделе Chat
  2. Нажмите кнопку Share в заголовке чата (или в контекстном меню сессии)
  3. Откроется модальное окно ChatShareDialog

Выбор пользователя

В верхней части диалога:

  1. Поле поиска — начните вводить имя пользователя или отображаемое имя
  2. Выпадающий список — отфильтрованные пользователи (автоматически исключаются те, кому уже предоставлен доступ, и вы сами)
  3. Выбор правread (чтение) или write (запись) через <select>
  4. Кнопка добавления (UserPlus) — добавить выбранного пользователя

Управление существующими шарами

Под формой добавления отображается список пользователей, имеющих доступ:

Элемент Описание
Имя пользователя display_name или username, с подписью @username
Бейдж прав read (синий) или write (жёлтый) — клик переключает между уровнями
Удалить Кнопка Trash2 — отзыв доступа

Индикация в списке чатов

  • Счётчик шаров — у расшаренных чатов отображается количество получателей
  • Метка — чаты, к которым вам предоставлен доступ, помечены как is_shared_with_me
  • Уровень доступа — поле share_permission показывает ваши права: owner, read или write

Управление доступом

Кто может расшаривать

Роль Может расшаривать Примечание
admin Да, любые сессии Полный доступ ко всем чатам
user Да, свои сессии Только чаты с owner_id = user.id
web Да, свои сессии Аналогично user
guest Нет Гости не могут расшаривать

Кому можно расшарить

Список кандидатов (GET /admin/chat/shareable-users) включает:

  • Всех активных пользователей (is_active=True)
  • С ролями admin, user или web (гости исключены)
  • Текущий пользователь исключён из списка (нельзя расшарить себе)

Что видит получатель

  • read — может просматривать сообщения расшаренной ветки, но не может отправлять новые сообщения и удалять сессию
  • write — может просматривать сообщения и отправлять новые в расшаренную ветку
  • Получатель не может удалить расшаренную сессию — только владелец или admin
  • Получатель видит только сообщения в пределах зафиксированной ветки (branch_message_id)

Привязка к ветке (Branch Snapshot)

При расшаривании система автоматически:

  1. Определяет последнее активное сообщение в текущей ветке
  2. Записывает его id в поле branch_message_id записи шара
  3. Получатель видит только сообщения от корня до этой точки ветвления
  4. Переключение ветки (switch_branch) для расшаренных пользователей ограничено видимой областью

Форк сессии

Любой пользователь с доступом (кроме guest) может создать глубокую копию чата:

  1. Вызвать POST /admin/chat/sessions/{id}/fork с опциональным title
  2. Система создаёт полную копию сессии (сообщения, промпт, контекстные файлы)
  3. Новый чат принадлежит вызвавшему пользователю (owner_id = user.id)
  4. Дальнейшие изменения в оригинале и форке независимы

API эндпоинты

Метод Путь Описание
GET /admin/chat/sessions/{id}/shares Список шаров сессии (owner/admin)
POST /admin/chat/sessions/{id}/shares Расшарить сессию пользователю
PUT /admin/chat/sessions/{id}/shares/{user_id} Изменить уровень доступа (read/write)
DELETE /admin/chat/sessions/{id}/shares/{user_id} Отозвать доступ
POST /admin/chat/sessions/{id}/fork Форк (глубокое копирование) сессии
GET /admin/chat/shareable-users Список пользователей для расшаривания

Тело запроса: POST .../shares

{
  "user_id": 2,
  "permission": "read"
}

permission"read" (по умолчанию) или "write".

Тело запроса: PUT .../shares/{user_id}

{
  "permission": "write"
}

Тело запроса: POST .../fork

{
  "title": "Копия чата (необязательно)"
}

Ответы

  • GET .../shares{ "shares": [{ id, session_id, user_id, permission, shared_by, shared_at, username, display_name }] }
  • POST .../shares{ "share": { ... } }
  • PUT .../shares/{user_id}{ "status": "ok" }
  • DELETE .../shares/{user_id}{ "status": "ok" }
  • POST .../fork{ "session": { id, title, ... } }

RBAC

Действия по ролям

Действие admin user web guest
Расшарить свой чат Да Да Да Нет
Расшарить чужой чат Да Нет Нет Нет
Изменить права шара Да (любой) Да (свой) Да (свой) Нет
Удалить шар Да (любой) Да (свой) Да (свой) Нет
Форк расшаренного чата Да Да Да Нет
Просмотр расшаренного чата Да Да Да Нет
Удаление расшаренной сессии Да Только своей Только своей Нет

Модель данных

Таблица chat_session_shares:

Поле Тип Описание
id INTEGER PK Первичный ключ
session_id VARCHAR(50) FK Ссылка на chat_sessions.id (CASCADE)
user_id INTEGER FK Ссылка на users.id (CASCADE) — получатель
permission VARCHAR(10) "read" или "write"
shared_by INTEGER FK Ссылка на users.id — кто расшарил (SET NULL)
shared_at DATETIME Время расшаривания
branch_message_id VARCHAR(50) ID последнего сообщения ветки на момент шара

Уникальный индекс: (session_id, user_id) — один пользователь может иметь только одну запись доступа к сессии.


Chat | Settings

Clone this wiki locally