Раздел: Codex
Идентификатор:codex_features· Экран:ui/codex/CodexFeaturesScreen.kt(381) +CodexFeatures.kt
Снимок: 2026-10-11
1. Зачем и что это
Фичи приходят из реестра самого app-server (experimentalFeature/list), у каждой есть стадия зрелости (beta, underDevelopment, stable, deprecated) и дефолтное состояние. Приложение скрывает удалённые (removed) фичи и по умолчанию показывает только «экспериментальные» стадии.
2. Как попасть
Хаб инструментов → секция Codex → карточка «Features» (hub_codex_features_title, тайл на главной — «Flags»).
| Откуда ещё | Путь |
|---|---|
| Меню треда Codex | Codex → Features (тот же экран) |
| Мост | app_navigate с screen: "codex_features" |
Маршрут: Screen.kt:141 ("codex_features" -> Screen.CodexFeaturesHub) → MainRouter.kt:323.
3. Экран: элементы и действия
| Элемент | Что делает | Где в коде |
|---|---|---|
| Список фич | FeatureRow на каждую фичу | visibleExperimentalFeatures |
| Тумблер фичи | Вкл/выкл (через consent, если есть риск) | onToggle(feature.name, enabled) |
| Диалог согласия | consent перед включением рискованной фичи | CodexFeaturesScreen:216 |
| Фильтр по стадиям | Чипы beta / in development / stable / deprecated | FeatureFilter.stages |
| Поиск | По имени/описанию/заметке/стадии | FeatureFilter.query |
| «Только включённые» | Фильтр enabledOnly | FeatureFilter |
| Кнопка копирования | Текст состояния всех фич в буфер | experimentalFeaturesStateText |
FeatureBadge | Бейдж стадии/дефолта | FeatureBadge |
FeatureDetail | Раскрытое описание: что, эффект, риск, выведено ли из UI | FeatureDetail |
Заголовок списка показывает количество включённых фич (enabledExperimentalFeaturesCount).
4. Возможности подробно
Разбор реестра
parseExperimentalFeatures(json) читает experimentalFeature/list:
removed— скрывается полностью (включать нечего);- заголовок —
displayName, при пустом — стабильный ключname; defaultEnabledпоказывает, значение фичи дефолтное или пользовательское.
Стадии в порядке «сначала самое свежее»: beta → underDevelopment → stable → deprecated. По умолчанию выбраны DefaultFeatureStages = {beta, underDevelopment} — то есть «экспериментальные» стадии; stable и deprecated видны только если выбраны фильтром.
Фильтрация и сортировка
visibleExperimentalFeatures применяет:
- отсев
removed; - фильтр по стадиям;
- «только включённые»;
- поиск по нескольким токенам (все должны совпасть) в поле: имя, заголовок, описание, стадия, ключевые слова и текст заметки
featureNote(name); - сортировку: включённые сверху → по рангу стадии → по имени.
Заметки о фичах (CodexFeatureNotes.kt)
Отдельный файл на 300 строк хранит FeatureNote для известных фич: what (что делает), effect (на что влияет), risk (риск), noUi (скрыта ли из UI), inferred (описание выведено/предположено), keywords (для поиска).
Для неизвестной фичи возвращается generic-заметка: «Server-side feature flag from the app-server registry. Upstream ships no description for non-beta stages», с inferred = true — то есть приложение честно помечает описание как предположенное, а не выдуманное.
Подтверждение для рискованных фич
Если у фичи в заметке заполнен risk, включение требует явного согласия: экран не переключает тумблер сразу, а показывает диалог (consent = feature). Обратное выключение подтверждения не требует.
Запись и применение
setExperimentalFeature(name, enabled) работает в два шага:
- Рантайм —
experimentalFeature/enablement/set {enablement: {name: enabled}}. Если сервер отклонил — показывается предупреждение «Server rejected the feature toggle», и дальше не идём. - Персистентность —
config/batchWrite {edits: [{keyPath: "features.<name>", mergeStrategy: "upsert", value: enabled}], reloadUserConfig: true}.
Локальное состояние обновляется сразу, а плашка зависит от того, удалась ли запись: «<name> enabled» или `«<name>: runtime only (config write failed)»». Часть фич подхватится только после перезапуска app-server — об этом сказано в KDoc функции.
5. Данные: БД, файлы, настройки
| Что | Где лежит | Как меняется | Кто читает |
|---|---|---|---|
| Состояние фич | Рантайм app-server + ~/.codex/config.toml (features.<name>) | enablement/set + config/batchWrite | app-server |
| Заметки о фичах | Код: CodexFeatureNotes.kt | Правка кода при обновлении фич | Экран |
6. Backend: REST/роуты
Экран ходит не в REST-бэкенд, а в app-server Codex по JSON-RPC:
| Запрос | Что делает |
|---|---|
experimentalFeature/list {limit, cursor?} | реестр фич (с пагинацией) |
experimentalFeature/enablement/set {enablement} | переключить фичу в рантайме |
config/batchWrite {edits, reloadUserConfig} | записать features.<name> в конфиг |
Список грузится с пагинацией: до 5 страниц по 200 элементов, пока не кончится nextCursor.
7. Мост и MCP
| Что | Как | Примечание |
|---|---|---|
| Открыть экран | app_navigate с screen: "codex_features" | BridgeScreenCatalog |
MCP-тулов для переключения фич нет — это прерогатива app-server и экрана.
8. Настройки, конфиг, квоты и лимиты
| Параметр | Значение | Где задаётся |
|---|---|---|
| Стадий в реестре | 4 + removed | FeatureStages |
| Стадий по умолчанию | beta, underDevelopment | DefaultFeatureStages |
| Размер страницы | 200 | loadExperimentalFeatures |
| Максимум страниц | 5 | То же |
| Заметок о фичах | ~300 строк кода | CodexFeatureNotes.kt |
9. Ловушки и ограничения
- Часть фич требует перезапуска app-server. Переключатель меняет рантайм и конфиг, но эффект может наступить не сразу — это указано в KDoc.
- Если запись в конфиг не удалась, фича работает «только в рантайме». Плашка об этом сообщает явно, но после перезапуска настройка потеряется.
removed-фичи скрыты полностью. Если фича удалена в новой версии Codex, в списке её просто нет — найти и отключить нельзя (и не нужно).stableиdeprecatedскрыты по умолчанию. Чтобы увидеть их, нужно расширить фильтр стадий — они не «прячутся» намеренно, а просто не в дефолтной выборке.- Описания части фич — предположения. Поле
inferredчестно помечает описание, которого нет в апстриме (non-beta стадии). Не считайте такие описания документацией. - Рискованная фича требует подтверждения. Если диалог пропустить, тумблер не переключится — это защита от случайного включения.
- Все строки захардкожены по-английски в списках состояния и плашках.
10. Источники правды
app/src/main/java/com/y83/ws/ui/codex/CodexFeaturesScreen.kt— экран.app/src/main/java/com/y83/ws/ui/codex/CodexFeatures.kt— модель, разбор, фильтрация, сортировка.app/src/main/java/com/y83/ws/ui/codex/CodexFeatureNotes.kt— заметки о фичах (what/effect/risk).app/src/main/java/com/y83/ws/ui/codex/CodexPlanActions.kt— загрузка списка и переключение.app/src/main/java/com/y83/ws/ui/codex/CodexConfigScreens.kt,CodexChatToolScreens.kt— встраивание экрана в хаб и тред.