Раздел: Codex
Идентификатор:policies· Экран:ui/tools/PoliciesScreen.kt(381)
Снимок: 2026-10-11
1. Зачем и что это
Экран только для чтения с удалением: он показывает разобранный конфиг и позволяет убрать конкретное правило. Создание и правка политик идут через экран MCP или вручную в конфиге.
Отдельное внимание — системные значения approval_policy и sandbox_mode: они показываются отдельной карточкой «No permission prompts» и удалить их нельзя.
2. Как попасть
Хаб инструментов → секция Codex → карточка «Политики» (hub_policies_title, подпись «Права Codex и поведение песочницы», тайл — «Политики»).
| Откуда ещё | Путь |
|---|---|
| Мост | app_navigate с screen: "policies" |
Маршрут: Screen.kt:136 ("policies" -> Screen.CodexPolicies) → MainRouter.kt:311.
Шапка — терминальная codex@policies :~$, в meta видно «N rules», текущие approval и sandbox.
3. Экран: элементы и действия
| Элемент | Что делает | Где в коде |
|---|---|---|
| Кнопка Refresh | Перечитать конфиг | load() |
| Карточка «No permission prompts» | Системные approval_policy и sandbox_mode | SystemCard |
| Список правил | Сгруппирован по типу | policyGroups(policies) |
| Карточка правила | Тип, детали, значение, кнопка удаления | PolicyCard |
| Диалог удаления | Показывает значение, спрашивает подтверждение | ConfirmDeleteDialog |
| Пустое состояние | «No saved permission rules» | — |
| Карточка ошибки | Текст ошибки + повтор | ErrorState |
Группы и их порядок (policyGroups):
| Тип | Заголовок | Источник в конфиге |
|---|---|---|
project | Trusted projects | [projects."<путь>"] с ключом trust_level |
permissions | Permissions | [permissions] (allow, deny, network) |
exec | Exec policy | [exec_policy] |
mcp | MCP servers | [mcp_servers."<имя>"] с ключом command |
4. Возможности подробно
Разбор конфига
Backend парсит ~/.codex/config.toml построчно (parsePolicies):
- пустые строки и
#-комментарии пропускаются; - строки
[секция]запоминаются как текущая секция; - top-level ключи (
approval_policy,sandbox_mode) отдаются отдельно, не как правила; - секреты фильтруются:
isSecretKeyотбрасывает любой ключ, содержащийtoken,authorization,secret,apikey,api_key— чтобы токены не утекли в список на экране; [permissions]переводит ключи в человеческие названия:allow→ «Allowed tools»,deny→ «Denied tools»,network→ «Network access»;- дедупликация по короткому id (
shortID= sha1 от type|section|key|value); - сортировка по типу, затем по деталям.
Удаление правила
DeletePolicy (DELETE /api/v1/settings/policies) ищет строку точным совпадением section/key/value. Клиент не может подсунуть произвольный путь: совпадение строгое, иначе 404 «политика не найдена».
Особые случаи:
- системные
approval_policyиsandbox_modeудалить нельзя — 400 «системные политики не удаляются»; - файл переписывается атомарно (
atomicWriteFileчерез временный файл с правами0o600); - после записи backend перезапускает codex app-server, чтобы новый конфиг подхватился; ошибка рестарта логируется как Warn, но не отменяет удаление.
Системные значения
Карточка «No permission prompts» показывает approval_policy и sandbox_mode. Пояснение на карточке прямо говорит: approval_policy = "never" означает, что Codex выполняет инструменты и MCP-серверы, не спрашивая разрешения.
5. Данные: БД, файлы, настройки
| Что | Где лежит | Как меняется | Кто читает |
|---|---|---|---|
| Политики | ~/.codex/config.toml | Удаление через backend; правка — вручную или через экран MCP | Codex app-server |
| Права на файл | 0o600 после атомарной записи | atomicWriteFile | Система |
БД не используется: экран — тонкая проекция конфига.
6. Backend: REST/роуты
| Метод и путь | Назначение | Обработчик |
|---|---|---|
GET /api/v1/settings/policies | прочитать конфиг, вернуть approval_policy, sandbox_mode, список правил | wg.Policies, backend/internal/handlers/webget/policies.go:39 |
DELETE /api/v1/settings/policies | удалить одно правило и перезапустить codex | wg.DeletePolicy, там же:73 |
Роуты: backend/internal/api/v1/routes.go:105–106. Ответ GET также содержит path (путь к конфигу) и exists — если файла нет, policies будет пустым, но запрос вернёт 200.
7. Мост и MCP
| Что | Как | Примечание |
|---|---|---|
| Открыть экран | app_navigate с screen: "policies" | BridgeScreenCatalog |
MCP-тулов для чтения политик нет. Агент может прочитать конфиг через config/read (app-server) или через file_read в профиле /mcp.
8. Настройки, конфиг, квоты и лимиты
| Параметр | Значение | Где задаётся |
|---|---|---|
| Групп правил | 4 (project, permissions, exec, mcp) | policyGroups |
| Права на конфиг | 0o600 | atomicWriteFile |
| Системные ключи | approval_policy, sandbox_mode | codexConfigPath |
9. Ловушки и ограничения
- Экран только читает и удаляет. Создать или изменить значение правила здесь нельзя — это делается через экран MCP (
config/value/write) или вручную в конфиге. - Удаление правила перезапускает codex app-server. Активные треды при этом могут прерваться — это цена применения нового конфига.
- MCP-серверы не удаляются. Для типа
mcpстоитremovable: false: там показывается команда запуска, а сам сервер настраивается на экране MCP. - Секреты не показываются. Ключи с
token,secret,apikeyи подобные отфильтрованы на backend — в списке их не будет. - Системные политики удалить нельзя — 400 «системные политики не удаляются».
- Правила без раздела игнорируются парсером: top-level отдаётся отдельными полями, а не карточками.
- После удаления список перечитывается (
load()), поэтому исчезнувшее правило сразу пропадает из экрана.
10. Источники правды
app/src/main/java/com/y83/ws/ui/tools/PoliciesScreen.kt— экран, группировка, карточки.app/src/main/java/com/y83/ws/data/api/ToolsDtos.kt—CodexPolicyDto,DeletePolicyReq.backend/internal/handlers/webget/policies.go—Policies,DeletePolicy,parsePolicies.backend/internal/api/v1/routes.go:105–106— роуты.~/.codex/config.toml— фактическое хранилище политик.