Web Client (браузер)
|
| HTTPS + WebSocket
v
Orbit / Control Plane (Cloudflare или Deno)
|
| WebSocket relay (исходящее подключение с локальной машины)
v
Anchor (локальный bridge: macOS/Linux/Windows)
|
| JSON-RPC over stdio
v
codex app-server
Что делает:
- запускает и сопровождает процесс
codex app-server - проксирует JSON-RPC между web client и
app-server - отправляет ввод пользователя (в т.ч. интерактивный)
- пересылает запросы на подтверждение действий
- выполняет локальные helper-методы (
anchor.*) для git/config/file/image/release операций
Технологии:
- Bun runtime
- JSONL/JSON-RPC по stdio
- WebSocket к control plane
- device access tokens (основной путь) + legacy JWT secret (обратная совместимость)
Что делает:
- аутентифицирует web client (passkey/TOTP; для FastAPI также basic-режим)
- выпускает пользовательские токены и refresh токены
- обслуживает device-code flow для Anchor
- валидирует подключения
/ws/clientи/ws/anchor - маршрутизирует сообщения по
threadIdмежду Anchor и клиентами
Провайдеры:
services/orbit: Cloudflare Worker + Durable Objects + D1services/orbit-deno: Deno Deploy runtime + Deno KVservices/control-plane: FastAPI-реализация для лёгкого self-host
Что делает:
- вход пользователя (passkey/TOTP/device authorisation)
- список тредов, история и потоковые обновления
- отправка команд, подтверждений и пользовательского ввода
- автоматическое восстановление соединения
Технологии:
- Svelte + Vite
- WebSocket с логикой переподключения
- статический деплой (Cloudflare Pages, Deno Deploy, Vercel и др.)
- Клиент вызывает auth endpoint’ы (
/auth/register/*,/auth/login/*) - Control plane возвращает
token+refreshToken - Клиент хранит токены и обновляет access token через
/auth/refresh - Для завершения сессии вызывается
/auth/logout
- Anchor запрашивает код через
POST /auth/device/code - Пользователь подтверждает код в браузере через
POST /auth/device/authorise - Anchor опрашивает
POST /auth/device/token - После авторизации Anchor получает
anchorAccessToken+anchorRefreshToken(или legacy secret) - При истечении Anchor обновляет токен через
POST /auth/device/refresh
- Web client подключается к
/ws/client?token=<jwt> - Anchor подключается к
/ws/anchor?token=<anchor-token> - Клиент подписывается на тред через
orbit.subscribe - RPC
thread/*иturn/*идут через control plane в Anchor - Anchor передаёт вызовы в
codex app-server - Нотификации и результаты возвращаются назад подписанным клиентам
codex app-serverотправляетitem/*/requestApproval- Anchor/Orbit доставляют запрос в клиент
- Клиент отвечает JSON-RPC результатом с
decision - Ответ возвращается в
app-server
Основной протокол - JSON-RPC-подобный формат поверх WebSocket.
- Бизнес-сообщения: методы
thread/*,turn/*,item/* - Control-frame Orbit:
orbit.hello,orbit.subscribe,orbit.unsubscribe,orbit.list-anchors,orbit.anchors,orbit.anchor-connected,orbit.anchor-disconnected,ping/pong - Anchor metadata:
anchor.hello
TypeScript-схемы для клиентской интеграции можно генерировать через:
codex app-server generate-ts --out DIRGET /ws/client- сокет web clientGET /ws/anchor- сокет Anchor
GET /healthGET /auth/sessionPOST /auth/register/*POST /auth/login/*POST /auth/refreshPOST /auth/logoutPOST /auth/device/codePOST /auth/device/tokenPOST /auth/device/authorisePOST /auth/device/refresh
Примечание: точный набор register/login endpoint’ов зависит от провайдера и режима AUTH_MODE.
- Cloudflare-провайдер хранит состояние relay в Durable Object на пользователя
- Deno/FastAPI-провайдеры реализуют эквивалентную маршрутизацию по
threadId - Основная цель во всех вариантах: доставка сообщений только в релевантные подписанные сокеты
- пользовательская аутентификация через passkey/TOTP (и basic в FastAPI-режиме)
- access/refresh токены с серверной проверкой сессии и отзыва
- отдельные токены/секреты для web и anchor контекстов
- TLS для внешнего трафика
Детали см. в auth.md и security.md.