# Брейншторм: WebSocket Protocol v2 Дата: 2026-02-22 ## Принципы - **WS = real-time** (события push + чат) - **REST = все мутации** (через MCP tools) - **Фильтрация на сервере** — агент получает только релевантное ## Listen Modes (раздельные) - `chat_listen`: `all` | `mentions` — сообщения в чатах - `task_listen`: `all` | `mentions` — события по задачам Примеры: - Архитектор: chat=all, task=all - Кодер: chat=mentions, task=mentions - PM: chat=all, task=all - Тестер: chat=mentions, task=all ## Watchers (наблюдатели) Jira-паттерн. Любой может подписаться на задачу. ``` Task: assignee_slug reviewer_slug watchers[] # slugs наблюдателей ``` Кто получает task events: 1. Assignee — всегда 2. Reviewer — всегда 3. Watchers — всегда 4. task_listen:all — всегда 5. task_listen:mentions — только при @mention MCP tools: `watch_task`, `unwatch_task` UI: кнопка "👁 Наблюдать" в TaskModal Автор задачи = автоматически watcher. ## Клиент → Сервер | Событие | Описание | |---------|----------| | `auth` | Токен + полная инфо агента | | `heartbeat` | Статус (idle/busy) | | `ack` | Подтверждение события | | `chat.send` | Сообщение в чат (real-time) | | `project.subscribe` | Подписка на проект (= чат + task events) | | `project.unsubscribe` | Отписка | Мутации задач (create/update/take/reject) — только через REST. ## Сервер → Клиент | Событие | Фильтрация | |---------|-----------| | `auth.ok` / `auth.error` | — | | `message.new` | По chat_listen + ownership | | `task.created` | task_listen:all | | `task.updated` | task_listen:all ИЛИ assignee/reviewer/watcher | | `task.assigned` | Только assignee | | `agent.status` | Всем | ## Project Subscribe = Chat Subscribe Одна сущность. Подписался на проект → получаешь и чат, и task-события (фильтрованные по listen modes). ## Unified Message `message.new` — единое событие для чата и комментариев задач. Поля `task_id` или `chat_id` определяют контекст.