Agent Protocol » History » Version 1
Hardelele User, 02/18/2026 11:34 AM
Initial content — agent protocol specification
| 1 | 1 | Hardelele User | h1. Agent Protocol |
|---|---|---|---|
| 2 | |||
| 3 | Протокол взаимодействия между *Rust Agent* (на Windows-машинах) и *NestJS API* (Control Plane). |
||
| 4 | |||
| 5 | h2. Транспорт |
||
| 6 | |||
| 7 | * *Протокол:* WebSocket (WSS) |
||
| 8 | * *Endpoint:* @wss://app.reckue.com/ws/agent@ |
||
| 9 | * *Формат сообщений:* JSON |
||
| 10 | |||
| 11 | h2. Аутентификация |
||
| 12 | |||
| 13 | * Агент подключается с машинным токеном (JWT) |
||
| 14 | * Токен передаётся при WebSocket handshake в заголовке @Authorization: Bearer <token>@ |
||
| 15 | * Токен выдаётся при регистрации агента через API |
||
| 16 | |||
| 17 | h2. Типы сообщений |
||
| 18 | |||
| 19 | h3. Agent -> Server |
||
| 20 | |||
| 21 | |_. Тип |_. Описание |_. Payload | |
||
| 22 | | @register@ | Регистрация агента при подключении | @{ hostname, os, version, capabilities }@ | |
||
| 23 | | @heartbeat@ | Подтверждение активности | @{ timestamp, cpu_usage, memory_usage }@ | |
||
| 24 | | @session_output@ | Вывод терминальной сессии | @{ session_id, data (base64) }@ | |
||
| 25 | | @session_status@ | Статус сессии изменился | @{ session_id, status: "started" / "stopped" / "error", exit_code? }@ | |
||
| 26 | |||
| 27 | h3. Server -> Agent |
||
| 28 | |||
| 29 | |_. Тип |_. Описание |_. Payload | |
||
| 30 | | @session_start@ | Запустить новую терминальную сессию | @{ session_id, shell?, cols?, rows? }@ | |
||
| 31 | | @session_stop@ | Остановить сессию | @{ session_id }@ | |
||
| 32 | | @session_input@ | Ввод пользователя в сессию | @{ session_id, data (base64) }@ | |
||
| 33 | | @workspace_init@ | Инициализировать рабочее пространство | @{ workspace_id, config }@ | |
||
| 34 | |||
| 35 | h2. Формат сообщения |
||
| 36 | |||
| 37 | Каждое сообщение — JSON-объект: |
||
| 38 | |||
| 39 | <pre> |
||
| 40 | { |
||
| 41 | "type": "message_type", |
||
| 42 | "id": "uuid-v4", |
||
| 43 | "timestamp": "2026-01-15T12:00:00Z", |
||
| 44 | "payload": { ... } |
||
| 45 | } |
||
| 46 | </pre> |
||
| 47 | |||
| 48 | h2. Heartbeat |
||
| 49 | |||
| 50 | * Агент отправляет @heartbeat@ каждые *30 секунд* |
||
| 51 | * Если сервер не получает heartbeat в течение *90 секунд*, агент считается оффлайн |
||
| 52 | * Сервер может отправить @ping@, агент должен ответить @pong@ |
||
| 53 | |||
| 54 | h2. Reconnect (переподключение) |
||
| 55 | |||
| 56 | Стратегия: *exponential backoff* |
||
| 57 | |||
| 58 | |_. Попытка |_. Задержка | |
||
| 59 | | 1 | 1 секунда | |
||
| 60 | | 2 | 2 секунды | |
||
| 61 | | 3 | 4 секунды | |
||
| 62 | | 4 | 8 секунд | |
||
| 63 | | 5 | 16 секунд | |
||
| 64 | | 6 | 32 секунды | |
||
| 65 | | 7+ | 60 секунд (максимум) | |
||
| 66 | |||
| 67 | * После успешного подключения счётчик сбрасывается |
||
| 68 | * При переподключении агент повторно отправляет @register@ |
||
| 69 | |||
| 70 | h2. Пример сценария |
||
| 71 | |||
| 72 | # Агент запускается на Windows-машине |
||
| 73 | # Агент подключается к @wss://app.reckue.com/ws/agent@ с JWT-токеном |
||
| 74 | # Агент отправляет @register@ с информацией о машине |
||
| 75 | # Сервер подтверждает регистрацию |
||
| 76 | # Агент начинает отправлять @heartbeat@ каждые 30 секунд |
||
| 77 | # Пользователь в браузере открывает терминал |
||
| 78 | # Сервер отправляет агенту @session_start@ |
||
| 79 | # Агент создаёт PTY-процесс и отправляет @session_status: started@ |
||
| 80 | # Пользователь вводит команды -> сервер отправляет @session_input@ -> агент пишет в PTY |
||
| 81 | # PTY выдаёт вывод -> агент отправляет @session_output@ -> сервер передаёт в браузер |
||
| 82 | # Пользователь закрывает терминал -> сервер отправляет @session_stop@ |
||
| 83 | # Агент завершает PTY-процесс и отправляет @session_status: stopped@ |
||
| 84 | |||
| 85 | h2. Безопасность |
||
| 86 | |||
| 87 | * Все соединения через WSS (TLS) |
||
| 88 | * JWT-токены с ограниченным сроком действия |
||
| 89 | * Каждый агент привязан к конкретному пользователю/организации |
||
| 90 | * Данные сессий передаются в base64 (бинарный контент) |