Codex App Server - это протокольный слой, поверх которого строят собственные клиенты. Если SDK даёт готовый интерфейс для языка, то App Server - это уровень ниже: сам протокол, к которому можно подключиться из чего угодно. Он доступен через JSONL поверх stdio, WebSocket и Unix-сокет. Важная оговорка с самого начала: документация помечает команду как экспериментальную, поэтому сгенерированный клиент должен быть version-aware - учитывать версию протокола, а не полагаться на её неизменность.
Транспорты App Server покрывают разные сценарии подключения. Полезно один раз увидеть их рядом. Ниже - запуск с JSONL поверх stdio по умолчанию, локальный WebSocket на 127.0.0.1 и Unix-сокет. stdio удобен для дочернего процесса, Unix-сокет - для локального межпроцессного взаимодействия, WebSocket - для сетевого клиента. Выбор транспорта - это выбор того, как клиент подключается, и у каждого своя область применения и своя граница безопасности.
WebSocket-транспорт открывает сеть, и здесь проходит серьёзная граница риска. Нелокальный WebSocket-listener без аутентификации - это открытая дверь: кто угодно, дотянувшийся до порта, получает доступ к выполнению. Локальный слушатель на 127.0.0.1 ограничен машиной, но нелокальный требует защиты обязательно. Это не деталь конфигурации, а вопрос того, кто вообще может подключиться к вашему App Server и, через него, выполнять действия.
Полезно один раз увидеть защищённый запуск для удалённых клиентов. Ниже - WebSocket с --ws-auth capability-token и --ws-token-file, указывающим на файл с токеном в защищённом пути. Связка проста: слушатель требует токен, токен лежит в файле с ограниченным доступом, а не в командной строке или логе. Для любого нелокального клиента это минимум: без аутентификации нелокальный listener поднимать нельзя, а токен держат там, откуда его не утащат.
Жизненный цикл клиента - это то, что отличает игрушечный прототип от production-клиента. Полезно понимать его целиком. Production-клиент обязан корректно обрабатывать инициализацию, создание и возобновление thread, старт и отмену turn, потоковые items, approvals и вызовы инструментов. Каждый из этих этапов - не опциональная деталь, а часть контракта: клиент, который не умеет отменить turn или обработать approval, будет вести себя непредсказуемо ровно тогда, когда это важнее всего.
Streaming и approvals в жизненном цикле требуют особого внимания. Потоковые items означают, что результат приходит постепенно, и клиент должен уметь их накапливать и отображать, а не ждать одного финального сообщения. Approvals означают, что выполнение может остановиться и запросить решение - и клиент обязан это решение уметь запросить и передать. Клиент, игнорирующий approvals, либо зависнет на запросе, либо, что хуже, обойдёт точку контроля, которую протокол предусмотрел намеренно.
Смысл App Server - дать полный контроль над клиентом там, где SDK недостаточно. Это выбор для тех, кто строит собственный интерфейс к Codex: свой UI, свою интеграцию, свой протокольный мост. За полный контроль платят ответственностью: version-awareness из-за экспериментального статуса, аутентификация транспорта, корректная обработка всего жизненного цикла. App Server - это фундамент для клиента, а не готовый клиент, и строить на нём стоит, понимая, что контракт протокола придётся соблюдать целиком.
Типичные провалы вокруг App Server предсказуемы. Сгенерировать клиент, не учитывающий версию, и сломаться на изменении экспериментального протокола. Поднять нелокальный WebSocket-listener без аутентификации и открыть выполнение в сеть. Держать токен в командной строке или логе вместо защищённого файла. И обработать не весь жизненный цикл, проигнорировав отмену turn или approvals. Делайте клиент version-aware, защищайте нелокальные транспорты токеном из файла и реализуйте весь контракт жизненного цикла, а не его удобную часть.
# JSONL поверх stdio по умолчанию
codex app-server --listen stdio://
# локальный WebSocket
codex app-server --listen ws://127.0.0.1:4500
# Unix-сокет по умолчанию
codex app-server --listen unix://
# команда помечена как experimental - клиент должен быть version-aware# Защищённый WebSocket для remote clients
codex app-server \
--listen ws://127.0.0.1:4500 \
--ws-auth capability-token \
--ws-token-file /secure/path/app-server.token
# нелокальный listener без auth - серьёзная граница риска
# жизненный цикл: init, thread create/resume, turn start/cancel, streaming, approvals, tool calls