Удалённое управление и мобильный клиент
Control Center — приложение для компьютера, но работа, за которой оно следит,
не останавливается, когда вы отходите от стола. Удалённое управление
привязывает ваш телефон к cc_server через
Remote — приложение-компаньон на
remote.usectrl.dev, — чтобы вы могли следить за флотом оттуда: читать
сообщения и тикеты, отвечать агенту, разбирать ленту новостей, при этом аудио,
транскрипция, исходный код и учётные данные, которые хранятся на сервере,
никогда его не покидают.
Считайте его компаньоном к рабочему столу, предназначенным в основном для чтения. Он не призван заменить полноценный клиент для компьютера.
Транспорт
Заголовок раздела «Транспорт»Телефон добирается до cc_server по WebSocket: либо прямым соединением
(loopback, локальная сеть, tailnet или wss://), либо через комнату по
приглашению на сигнальном брокере, который ретранслирует запечатанные кадры.
Канала данных напрямую между устройствами нет.
Что умеет телефон
Заголовок раздела «Что умеет телефон»Сопряжённый телефон получает доступ к небольшому, намеренно ограниченному срезу возможностей сервера:
- Читать тикеты, агентов, пространства, их сообщения и вашу ленту новостей
- Отвечать: отправлять сообщение в пространстве, обновлять или назначать тикет, отмечать статью прочитанной или сохранённой
- Запускать плейбук: инстанцировать сохранённый шаблон плана с его параметрами. Это лишь предлагает план: ничего не выполняется и не тратится, пока оператор не утвердит его в Plan Studio в полном клиенте
- Переключать рабочие пространства — из собственного средства выбора на телефоне
На этом список почти исчерпан. Телефон — субъект с меньшими привилегиями, чем полный клиент. Он не может запускать процессы, тратить бюджет LLM, отправлять изменения в GitHub или создавать рабочие пространства. О том, как это обеспечивается на деле, а не только задумано, см. модель доступа.
Как устроено соединение
Заголовок раздела «Как устроено соединение»Соединение идёт через реле с брокером: сервер как владелец заходит в одну
комнату по приглашению на брокере wss://, и каждый сопряжённый клиент —
компьютер, веб, телефон — заходит в ту же комнату с токеном допуска,
ограниченным по времени. Здесь сходятся три части:
| Часть | Роль |
|---|---|
| Remote (приложение для телефона) | Веб-приложение-компаньон, по умолчанию размещённое на remote.usectrl.dev, либо развёрнутое самостоятельно. Загружается в браузере, хранит запись сопряжения в IndexedDB. |
| Брокер-реле | Реле wss:// без состояния (cc_signaling_server), обслуживающее комнаты на N участников. Оно переносит только непрозрачные кадры: каждая полезная нагрузка запечатана сквозным шифрованием между телефоном и сервером, поэтому брокер никогда не видит данные приложения или секрет сопряжения и не интерпретирует то, что пересылает. |
cc_server |
Владелец комнаты. Он отвечает на вызовы телефона через тот же диспетчер, которым пользуются все остальные клиенты. |
Предложение сопряжения несёт дескриптор подключения со списком всех путей к
серверу (локальная сеть, tailnet, публичный wss://, реле) и отпечатком
идентичности сервера. Резолвер на телефоне выбирает наилучший доступный путь и
закрепляет отпечаток при первом подключении (TOFU); реле гарантирует связность,
даже когда прямого пути нет, и при этом никогда не может прочитать трафик.
Что представляет собой полезная нагрузка сопряжения
Заголовок раздела «Что представляет собой полезная нагрузка сопряжения»Сопряжение создаётся в приложении и доставляется как глубокая ссылка; порядок действий описан в разделе Привязать устройство. Здесь важно, из чего она состоит.
https://<pwa-host>/#<payload>Полезная нагрузка едет во фрагменте URL — той части после #, которую
браузеры никогда не отправляют на сервер, поэтому HTTPS-хост PWA её не видит. В
ней есть всё, что нужно телефону, чтобы добраться до сервера и подтвердить, кто
он: дескриптор подключения (все пути плюс отпечаток идентичности), только что
созданный идентификатор устройства, 32-байтовый предварительно распределённый
ключ и отметка о сроке действия. Телефон её декодирует, сохраняет запись
сопряжения локально и удаляет фрагмент, чтобы секрет ушёл из URL.
Форм полезной нагрузки две, и они не взаимозаменяемы. QR-код для телефона,
созданный на панели сопряжения в приложении, — это описанный выше v2
PairingPayload, нацеленный на хост PWA Remote. Команда
cc_server pair --client-url выдаёт другую, более старую ссылку v1
({s, i, k} — URL сервера, идентификатор устройства, ключ), предназначенную
только для веб-клиента.
Различаются они и сроком жизни, в чём легко ошибиться:
| Чем создано | Срок действия учётных данных |
|---|---|
Панель сопряжения в приложении (pairing.mint) |
30 дней, всегда |
cc_server pair в командной строке |
Нет — учётные данные не истекают |
Модель доступа
Заголовок раздела «Модель доступа»Сопряжённое устройство аутентифицировано, но не является доверенным. Несколько независимых барьеров не дают одобренному (или утёкшему) сопряжению превратиться в полный контроль над сервером.
1. Граница — членство, а не сопряжение
Заголовок раздела «1. Граница — членство, а не сопряжение»Действительный ключ сопряжения доказывает, какое именно устройство перед вами. Что вам можно читать или менять, решают ваша роль в рабочем пространстве, заново определяемая при каждом отдельном вызове, и разрешения на уровне репозитория для всего, что раскрывает содержимое репозитория. Устройству с вполне исправным ключом, но принадлежащему пользователю, который не состоит в указанном рабочем пространстве, отказывают с сообщением “Not a member of this workspace”.
Минимальная роль выводится из вида операции, если операция не объявляет свою:
для чтения нужна роль guest, для изменений — member, для разрушительных
операций — admin.
2. Телефон — более низкий уровень сессии
Заголовок раздела «2. Телефон — более низкий уровень сессии»Помимо проверки роли, сессия телефона несёт меньший набор возможностей, чем сессия компьютера или веб-клиента. Операции, объявленные доступными только полному клиенту, отклоняются для телефона до запуска обработчика, как бы привилегирован ни был стоящий за ним пользователь: создание, перечисление, переименование и отзыв сопряжений устройств; чтение и настройка подключения через туннель; резервное копирование сервера и экспорт/импорт рабочего пространства; обнаружение и завершение процессов; проверки адаптеров; настройки сервера; администрирование SSO; управление флотом; а также перехват или возврат работающего агента.
3. Список разрешённых инструментов с запретом по умолчанию
Заголовок раздела «3. Список разрешённых инструментов с запретом по умолчанию»Для набора инструментов MCP в частности (tools/call) тем, какие инструменты
телефон может вызывать, управляет список разрешённых, работающий по принципу
«запрещено по умолчанию». Всё, чего в нём нет, отклоняется до запуска. Список
тяготеет к чтению и наблюдению, плюс несколько локальных операций записи —
сообщение, обновление тикета, пометка статьи, — которые не тратят бюджет LLM,
не запускают процессы и не трогают внешние системы.
Запрещено, например: обращаться к агенту, запускать ИИ-проверку, завершать агента, публиковать ревью в GitHub, нанимать или увольнять агентов, создавать рабочее пространство.
4. Привязка к рабочему пространству при каждом вызове
Заголовок раздела «4. Привязка к рабочему пространству при каждом вызове»На сервере нет «текущего рабочего пространства». Он по замыслу не хранит
состояния: каждый вызов, привязанный к рабочему пространству, обязан назвать
свой целевой workspace_id в аргументах, и диспетчер отклоняет вызов сразу,
если тот отсутствует или называет рабочее пространство, которое сервер не
зарегистрировал, — до того, как что-либо откроет базу данных. Поэтому телефон
никогда не может унаследовать область другого клиента или незаметно в неё
съехать, и указание чужого рабочего пространства тоже не помогает, потому что
проверка членства из барьера 1 всё равно срабатывает. Это тот же инвариант
изоляции рабочих пространств,
который обеспечивает остальная часть продукта.
5. Кадры, запечатанные сквозным шифрованием на предварительно распределённом ключе
Заголовок раздела «5. Кадры, запечатанные сквозным шифрованием на предварительно распределённом ключе»Каждый кадр между телефоном и сервером запечатан ключом сопряжения; токен допуска лишь впускает клиента в комнату и ничего не расшифровывает. Брокер передаёт шифротекст и никогда не видит ключ. У отозванного устройства учётных данных уже нет, поэтому при повторном подключении оно безопасно отказывает.
Учётные данные, созданные в приложении, ограничены сроком в 30 дней; после этого барьер подключения их отклоняет, и телефон должен пройти сопряжение заново. Отзыв применяется немедленно: сервер следит за таблицей устройств и разрывает открытые сессии отозванного устройства за секунды, не дожидаясь его следующего подключения.
6. Ограничение частоты запросов на субъект
Заголовок раздела «6. Ограничение частоты запросов на субъект»Ограничитель со скользящим окном держит удалённый трафик инструментов на уровне 120 вызовов в минуту, с более жёстким дополнительным порогом в 30 вызовов в минуту для изменяющих операций. Бюджет принадлежит субъекту, а не сессии: три ваших устройства черпают из одного лимита, поэтому захваченный клиент не может выторговать себе запас, открывая новые сессии, а один шумный участник не может заморить остальных.
7. Брокер, который ничего не узнаёт
Заголовок раздела «7. Брокер, который ничего не узнаёт»Брокер-реле намеренно прост: он обслуживает комнаты, пересылает запечатанные кадры и не хранит ни учётных записей, ни данных приложений, ни ключей. Комнаты доступны по приглашению и недолговечны. Данные приложения, аудио, транскрипция, исходный код и учётные данные остаются на сервере.
Живые обновления
Заголовок раздела «Живые обновления»После сопряжения телефон получает живые обновления в виде кадров-уведомлений — новые сообщения агентов, назначенные вам тикеты, изменения статуса, — повторяя собственные уведомления приложения для компьютера. Сервер рассылает эти кадры всем подключённым сессиям, а фильтр рабочего пространства применяется на стороне клиента, поэтому вы видите только то, что относится к открытому у вас рабочему пространству.
Где это живёт
Заголовок раздела «Где это живёт»| Место | Что показывает |
|---|---|
Настройки → Вы → Ваши устройства (/workspaces/:workspaceId/settings/you/devices) |
Сопряжённые клиенты с живым статусом, а также Привязать новый клиент (веб-браузер, приложение для компьютера или телефон) и отзыв |
Та же панель создаёт сопряжения и для второго браузера или приложения для компьютера, не только для телефонов: порядок действий один и тот же, различается только глубокая ссылка.
См. также
Заголовок раздела «См. также»- Рабочие пространства и изоляция: привязка к рабочему пространству при каждом вызове, на которую это опирается
- Совместная работа — идентичность, членство и присутствие: роли, членство и разрешения на уровне репозиториев
- Развёртывание и клиенты: место удалённого управления среди уровней клиентов
- Архитектура: место удалённого управления в стеке
- Привязать устройство