y83 code / инструмент

Обновления

Центр управления обновлениями: проверка новой версии приложения, установка APK, обновление окружения (backend, codex, opencode) и — в developer-панели — сборка и выкладка.

раздел реестра
Система
код
2 256 строк в 8 файлах
документ
31-updates.md
Раздел: System
Идентификатор: updates · Экран: ui/updates/ (8 файлов)
Снимок: 2026-10-11

1. Зачем и что это

Это единственный экран, где сходятся сборка, публикация и установка, поэтому он же служит точкой входа для агента: через backend API того же назначения работают MCP-инструменты dev_build, dev_swap, dev_deploy, dev_gate.

2. Как попасть

Хаб инструментов → секция System → карточка «Обновления» (hub_updates_title, подпись «Проверка и установка обновлений приложения и окружения», тайл — «Обновл.»).

Откуда ещёПуть
Чат Codexпункт «Updates» в меню треда
Мостapp_navigate с screen: "updates"

Маршрут: Screen.kt → MainRouter (UpdatesScreen).

3. Экран: элементы и действия

КарточкаЧто делает
Обновление приложенияПроверка манифеста, скачивание APK, кнопка Install
EnvironmentCardОбновление окружения целиком
BackendControlCardСборка, замена и перезапуск backend, очистка
Developer-панельСборка APK, публикация на сервер, backend, codex
InstalledVersionsCardУстановленные версии компонентов
UpdateLogPanelХвост л��га операций и состояние операции

Developer-панель (UpdatesDevCards.kt):

КарточкаКнопкиЧто делает
APK buildBuild APKСборка через backend API; режим debug/release
Release to serverPublishПубликация APK и backend на agent.y83.ru
BackendBuild backend, Replace & restart, CleanupСборка бинаря, smoke → switch → health → rollback, очистка
CodexUpdate codexСкачать бинарь с GitHub и подменить, со smoke и schema diff

4. Возможности подробно

Проверка обновления

Сверка идёт по манифесту на сервере. Экран сравнивает:

  • versionCode манифеста с установленным AppVersion.code;
  • sha256 установленного APK (AppVersion.installedApkSha256()) с sha256 из манифеста.

Второе сравнение ловит особый случай sameCodeRebuild: та же версия, но пересобранный APK. Если sha256 отличается, экран покажет обновление как доступное — иначе пересборка той же версии была бы невидима.

Когда установленная сборка совпадает с доступным релизом, карточка прямо сообщает: «Installed build matches the available release».

Установка APK

installApk():

  1. проверяет Updater.isInstallAllowed(ctx) — разрешение на установку из неизвестных источников; если его нет, открывает настройки и просит повторить;
  2. ищет локальный APK на sdcard: 26 МБ не гоняются по кругу, но файл ставится только при совпадении sha256 с манифестом;
  3. если локального файла нет — скачивает и запускает установщик;
  4. состояние downloading блокирует повторное нажатие.

Кнопка Install всегда ведёт в системный установщик или файловый менеджер — прямая установка через pm install на MIUI не работает (нет права MANAGE_USERS).

Операции окружения

Каждая операция — с состоянием (OpState) и логом. UpdateLogPanel показывает хвост лога операции, подсвечивая активные строки (logLineState).

ОперацияЧто делает
Обновление окруженияPOST /api/v1/env/update + опрос статуса
Сборка APKPOST /api/v1/env/build + опрос build/status
ПубликацияPOST /api/v1/env/deploy + опрос deploy/status
Сборка backenddev_build {target:"backend"}
Замена backendsmoke → switch → health → rollback, с автооткатом
Обновление codexСкачать с GitHub, smoke, schema diff, замена бинаря

Логи и ошибки

Ошибки и сообщения операций показываются на экране и дублируются в лог (FileLog.log), откуда их читает dev_log {source: "deploy" | "swap" | "gate"}.

5. Данные: БД, файлы, настройки

ЧтоГде лежитКак меняетсяКто читает
Установленная версияAppVersion.name / .codeУстановка APKЭкран
Манифест релизаagent.y83.ruПубликацияПроверка обновления
sha256 установленного APKВычисляется на устройстве—Сравнение с манифестом
Логи операцийФайлы (через backend)dev_logЭкран и агент
Версия backendVERSION в репозиторииbuild-backend.shКарточка версий

Версия приложения не попадает в генерируемый BuildConfig.kt — она живёт в app/version-stamp.properties и в рантайме в util/AppVersion.

6. Backend: REST/роуты

Метод и путьНазначениеОбработчик
GET /api/v1/env/versionsверсии компонентовenvHandler.Versions
GET /api/v1/env/statusстатус окруженияenvHandler.Status
GET /api/v1/env/logхвост лога установщикаenvHandler.LogTail
POST /api/v1/env/updateобновить окружениеenvHandler.Update
POST /api/v1/env/buildсобрать APKenvHandler.Build
GET /api/v1/env/build/statusстатус сборки APKenvHandler.BuildStatus
POST /api/v1/env/deployпубликация на продenvHandler.Deploy
GET /api/v1/env/deploy/statusстатус публикацииenvHandler.DeployStatus
GET /api/v1/env/codexтекущая и апстрим-версия codexenvHandler.Codex
POST /api/v1/env/codex/upgradeобновление codexenvHandler.CodexUpgrade
GET /api/v1/env/codex/upgrade/statusстатус обновления codexenvHandler.CodexUpgradeStatus

Роуты: backend/internal/api/v1/routes.go:67–77.

7. Мост и MCP

ИнструментЧто делает
`dev_build {target: "apk"\"backend", mode}`Сборка APK или backend
dev_swap {confirm: true}Замена работающего backend с откатом при неудаче
dev_deploy {confirm: true, skip}Публикация на agent.y83.ru
`dev_gate {mode: "fast"\"full"}`Ворота качества перед «готово»
dev_status {what}Сводка состояния сборки, swap, публикации
`dev_log {source: "deploy"\"swap"\"gate"\"setup"}`Логи операций

Правила проекта: APK собирается только через backend API или dev_build, backend — только через build-backend.sh + swap. Прямой gradle assemble*, go build и запуск supervisord запрещены механически.

8. Настройки, конфиг, квоты и лимиты

ПараметрЗначениеГде задаётся
Режим сборкиdebug / releasesetBuildMode
Время сборкиdebug ~30 с, release ~5 минПодпись карточки
Публикацияagent.y83.rudev_deploy / Updates
Проверка обновленияversionCode + sha256ViewModel

9. Ловушки и ограничения

  • Установка требует разрешения на неизвестные источники. Без него кнопка Install откроет настройки и попросит повторить — это ожидаемо, не ошибка.
  • Локальный APK ставится только при совпадении sha256. Файл с тем же именем, но другой сборкой, будет отвергнут.
  • Прямая установка через pm install не работает на MIUI (нет MANAGE_USERS) — Install всегда открывает системный установщик.
  • Debug-сборка подписана тем же ключом, что и release, поэтому её можно ставить поверх release; обратное — не всегда.
  • Замена backend с откатом: smoke-тест проходит до переключения, а при неудаче бинарь возвращается назад. Поэтому «замена» может выглядеть как ничего не сделавший.
  • Версия не должна попадать в BuildConfig.kt: файл перегенерируется при каждой сборке и тянет за собой полную компиляцию KSP. Версия живёт в app/version-stamp.properties.
  • Обновление codex на dev-машине идёт отдельно — установщик этот шаг пропускает, чтобы не откатить версию из GitHub.
  • Публикация на прод требует подтверждения — действие необратимо.

10. Источники правды

  • app/src/main/java/com/y83/ws/ui/updates/UpdatesScreen.kt — экран.
  • app/src/main/java/com/y83/ws/ui/updates/UpdatesViewModel.kt — проверка, установка, операции.
  • app/src/main/java/com/y83/ws/ui/updates/UpdatesCards.kt, UpdatesDevCards.kt — карточки.
  • app/src/main/java/com/y83/ws/ui/updates/UpdatesOperations.kt — карточки операций, лог, состояния.
  • app/src/main/java/com/y83/ws/ui/updates/UpdateHost.kt, UpdatesFormat.kt — хост обновлений, форматирование.
  • app/src/main/java/com/y83/ws/util/AppVersion.kt — установленная версия и sha256.
  • app/build.gradle.kts, app/version-stamp.properties — версия и её источник.
  • backend/internal/api/v1/routes.go:67–77 — роуты окружения.
  • skills/y83-app/SKILL.md, y83-publish/SKILL.md — workflow сборки и публикации.

Источник: docs/project/hub/31-updates.md · Система · 2 256 строк в 8 файлах. Страница собирается из документации проекта при сборке сайта.