y83 code / журнал

Журнал релизов 0.8: часть 5 из 9

Полная ветка 0.8 из журнала проекта. Записи идут от свежих к старым, текст взят из CHANGELOG.md без правок — это тот же журнал, что читают разработчик и агент.

записей в ветке
251
приложение
185
бэкенд
59
архив сборок
7
период
19 августа 2026 — 24 октября 2026
страниц
5 из 9

журнал

Релизы ветки 0.8

Здесь записи 121–150 из 251: релизы приложения и бэкенда плюс записи архива сборок — каждая запись со своим набором правок.

backend 0.8.192

5 октября 2026бэкенд

Added

  • Продуктовые browser-MCP инструменты. browser_open, navigate, get_state, content, click, type, execute_js, console, reload, clear_data и wait вызывают существующий bridge внутри backend; агенту не нужны raw-имена browser_overlay_*. browser_shot получил waitFor для ожидания idle/page-load/selector непосредственно перед снимком.
  • Продуктовый скилл y83-browser-product. Публикуется в agent-архив и описывает штатный рабочий цикл без dev-команд.

Fixed

  • Remote Codex переведён на 0.160.0. Setup ставит локально проверенную версию в пользовательский npm prefix, а все remote-проверки и E2E явно используют ~/.local/bin/codex вместо старого глобального бинаря.
  • Reverse-туннель переехал с занятого порта 9000 на 19000. Конфиг роутера/MCP, health-check и скрипты используют один общий порт; это устраняет tcpip-forward request denied by peer на сервере home.
  • Product/dev MCP разделены. dev_*, exec и raw bridge_command показываются только на машине с dev-marker; продуктовый /mcp/codex больше не выглядит как dev-окружение y83-ws.
  • SKIP_APK больше не подменяет прод-APK. Частичная выкладка backend и skills сохраняет текущий APK/manifest на раздаче.

0.8.107

2 октября 2026

Added

  • Полный хаб записи экрана. Настройки становятся общими для UI и app_record_start: 720p/1080p, 30/60 fps, 4/8/12 Мбит/с, микрофон, системный звук или оба источника, отсчёт и проверка места/заряда. Статус системной опции «Show taps» открывает «Параметры разработчика», история получила длительность, открытие, share, копирование и удаление, а recorder корректно завершает сессию по лимиту/отзыву проекции и публикует только целый .mp4.
  • Лимиты аккаунта Codex читаются из canonical-снапшота. После подключения app-server запрашивает account/rateLimits/read; sparse-нотификации объединяются с предыдущими значениями, а смена аккаунта или login запускает тихий повторный запрос без ложных нулей.
  • Переходы в видеоредакторе. Каждая граница клипа получает 10 эффектов xfade и длительность 0.1–2 с; без переходов экспорт остаётся быстрым Media3, а с переходами идёт через новый POST /api/v1/media/jobs и FFmpeg с живым прогрессом, отменой, защищённой схемой и атомарной публикацией.

Changed

  • Видеоредактор стал понятнее с первого экрана. Кнопка импорта появляется в пустом превью и рядом с таймлайном, маркеры переходов кликабельны, перетаскиваемый клип видно вместе с линией назначения, масштаб таймлайна сохраняется, а выбор скорости/холста/перехода использует SelectChip.
  • Экран видеоредактора перестроен в компактный NLE. Превью, транспорт и панель действий закреплены над таймлайном; клип, переходы, холст, экспорт и записи экрана открываются отдельными вкладками вместо одной длинной ленты.
  • Импортированные видео становятся локальными файлами проекта. content:// атомарно копируется в project/sources, поэтому превью и backend-рендер используют один и тот же проверяемый исходник.

Fixed

  • Свежий вопрос Codex больше не склеивается с карточкой прошлой сессии. requestId сервера уникален только внутри соединения (app-server нумерует запросы с нуля), поэтому номер повторялся у разных вопросов, а дедуп по одному номеру приклеивал новый вопрос к уже отвеченной карточке старого хода — карточка не появлялась в ленте, и ход висел в «waiting for answer» до перезахода в тред (06.10.2026). Теперь вопрос склеивается только внутри своего хода (sameQuestionCard), а живой серверный запрос сверяется с карточкой по номеру и turnId; коллизия пишется в лог как question id collision.
  • Вопрос модели больше не теряется на пересборке ленты. Пересборка (auto-resync, страница thread/turns/list, догрузка старых, конец хода) снимала снимок полного списка до конца сборки, и вопрос, пришедший в это окно, из ленты выпадал — карточка оставалась только в Room-снапшоте, и её показывал лишь перезаход в тред (05.10.2026). Открытые вопросы сессии теперь живут в реестре карточек и возвращаются в полный список перед каждой сборкой окна; в codex_state видно openQuestions (в ленте/в окне ли) и счётчик questionsRestored.
  • Открытые вопросы Codex появляются в ленте сразу. Активный request_user_input включается в видимое suffix-окно даже при позиции выше хвоста, а in-place resync серверной страницы сохраняет локальную pending- карточку до ответа и serverRequest/resolved.
  • Перемотка и границы клипов больше не прыгают. Ручной seek временно останавливает тикер позиции, ExoPlayer позиционируется внутри clipping-окна клипа, а после правки плейлист восстанавливает позицию по исходной точке.
  • Обрезка получила отдельные широкие ручки. Короткие клипы рендерятся с минимальной видимой шириной, зоны IN/OUT не перекрывают длинное нажатие, а пауза/продолжение на границе переключает правильный медиа-элемент.
  • Экспорт без переходов снова запускается. Убрана рекурсия Media3-пути; без xfade вызывается VideoExporter, с переходами — FFmpeg-джоба.
  • Video editor временно выключен в хабе. Карточка остаётся на месте, отображается серым состоянием OFF и не открывает ещё нестабильный экран.

0.8.106

2 октября 2026

Fixed

  • Guardian-ревью корректно разбирает Codex 0.160. Карточка использует targetItemId и официальный статус review.status; отказ, таймаут или отмена больше не отображаются как одобрение, а autoApprovalReview/strictReviewRequired показывает отдельное предупреждение.

0.8.105

1 октября 2026

Added

  • Статусы доставки user-сообщений. Оптимистичная реплика показывает Sending, Waiting, Unconfirmed или Failed до подтверждения сервером; безопасные сообщения повторяются после реконнекта, неоднозначные сначала сверяются по clientId, а в пузырь добавлены Retry и защита от действий, требующих уже созданный ход.
  • Item-anchor catch-up Codex 0.159.3. thread/items/list теперь получает turnId, типизированный курсор {type:"item",itemId} и asc-направление; catch-up активного хода идёт только после последнего известного серверного элемента, а старый desc-путь остаётся fallback'ом.
  • Batch image generation 1–4. MCP image_generate принимает batch_size, возвращает совместимые url/path и полные массивы urls[]/paths[]; backend скачивает отдельные файлы {id}-{n}.png.

Changed

  • Mockups в карточке Image Generation тише. Из плейсхолдеров убраны иконки, пульсация заменена на медленным (2.4 с) узким бликом по фактической ширине карточки; при выключенных системных анимациях фон статичный.
  • Лента не дёргается при догрузке картинок. Высота превью теперь решается по метаданным и не меняется после загрузки битмапа; анимация плейсхолдера больше не запускается для уже закэшированных изображений.
  • Кэш изображений вырос вдвое, повторные загрузки объединяются. Герой и миниатюра одного пути больше не скачивают файл дважды; между миниатюрами добавлен отступ 8dp.
  • Batch image cards and viewer redesigned. A single result keeps the full adaptive preview; 2–4 results show a hero image with centered numbered thumbnails and no View/Download footer. The fullscreen viewer opens at the selected index, supports reliable swipe at 1×, translucent 48dp edge arrows, zoom/pan and selectable per-image metadata; Share/Download/Copy/Open always target the current image. Known dimensions reserve the preview before decode, and adjacent results are prefetched for smoother paging.
  • Image info is ordered semantically. Request and result fields no longer follow JSON/alphabetical order: prompt, model, adjacent dimensions, generation parameters, seed, human-readable timing, status, job and locations stay in a predictable sequence.
  • Chat previews adapt to common aspect ratios. Images from 16:9 through 9:16 inclusive fill the card width, including provider-rounded boundary files such as 768×1368; more extreme formats retain the height limit. Compact attachment thumbnails keep their fixed size.
  • Active image cards are quieter. Running and the duplicate bottom progress blocks are removed; the header status icon rotates while the job is active and the subtitle shows elapsed time plus the live percentage once it arrives.
  • Generation mockups reserve the final layout before results exist. The image card derives image count and dimensions from request arguments, immediately renders animated pending slots, and crossfades them into the finished gallery without a size jump.
  • Krea skill no longer performs automatic vision checks. After generation the agent returns url and path without an extra ai_vision call; explicit user-requested image analysis remains separate.
  • Coil requests are remembered instead of rebuilt. Note cards, the note image viewer and the video timeline strip keep one ImageRequest per picture (and per timeline frame) instead of allocating a fresh request on every recomposition.

Fixed

  • Fullscreen viewer no longer blanks out while pinching. The transformed image is clipped in the draw phase instead of through a parent clipToBounds() RenderNode, which could cull the scaled layer in the dialog. Pan limits are computed from the real fitted image rectangle, non-finite gesture values are ignored, and the image request stays stable after open, so neither geometry nor Coil restarts can blank the picture.
  • Fullscreen viewer loads a picture once instead of three times. Coil owns display and its cache; AgentImageCache no longer re-downloads the same URL on open, and the local copy is materialised lazily only for Share/Save/Open.
  • Image attachment cards match generation cards. The View/Download row is gone (tap opens the viewer, actions live in fullscreen) and the bottom padding is the same 16dp as in Image generation.
  • Batch generation has an automatic MCP fallback. If a stale Codex tool schema rejects batch_size, the image skill repeats the same backend tools/call directly instead of splitting the order or asking for a manual launch.
  • Batch image status сохраняет все варианты. Legacy /api/v1/jobs возвращает image_paths[], поэтому image_status нормализует каждый путь, а не только первый: urls[] и paths[] содержат все 1–4 изображения.
  • Image progress notifications no longer depend on a second SSE Accept negotiation. When Codex supplies _meta.progressToken, image jobs stream progress even if the request only advertises JSON. The card now renders the real percentage from those notifications — the parser existed but no card ever called it. Codex still discards the notifications upstream, so the number appears only once forwarding works; until then the header icon keeps spinning.
  • Автозапуск backend после перезагрузки восстановлен в установщике. setup.sh снова пишет идемпотентный fallback в ~/.bashrc для ~/.termux/boot/start-services.sh; обновлённые устройства стартуют ws-backend и без сохранённого старого hook'а на dev-машине.
  • Хронология сообщений без turnId. Legacy user-реплики, отправленные во время обрыва Codex, возвращаются на временные границы групп ленты и больше не собираются пачкой в конце после завершённых ходов.
  • Огромный вывод bash больше не вешает UI Codex. Высокочастотные outputDelta коалесцируются до Dispatchers.Main, сохраняют FIFO-порядок относительно завершения команды, а preview вывода в ленте ограничен хвостом 4000 символов; сама команда по-прежнему выполняется в Codex app-server.

0.8.104

25 сентября 2026

Added

  • Agent-first генерация изображений Krea 2 Turbo. Tools хранит URL и маскированный токен, MCP image_generate/image_status возвращают rich-статус, стримят живой процент через progress-уведомления, скачивают локальную копию PNG и сохраняют компактный url/path в карточке чата для превью после перезапуска.
  • Image-карточки получили единый полноэкранный просмотрщик. MCP-генерации, приложенные картинки и обычные image-card открывают общий gallery-viewer с zoom/pan, share, сохранением в Downloads, копированием источника, открытием URL и информацией о prompt/размерах/seed/времени; кнопка «Повторить» готовит редактируемый запрос в чате с исходными параметрами генерации.
  • Search Hub в Instruments. Раздел AI & Agents → Search настраивает движок, linear/bounded-стратегию, глубину, deadline и model chain (основной/страховщик/verify); конфиг хранится на бэкенде и читают те же web_search/research, короткая проверка возвращает engine_stats.
  • Search Hub стал самообъяснимым. В списке остаются только активные WebAI/API-модели, каждый раздел получил подсказку, а тест выбирает режим current, all_engines или research и показывает найденные ссылки, статусы движков, answer/sources/citation-check.
  • Bounded research для deep. Один planner выбирает максимум 4 уже разрешённые ссылки и/or одну новую выдачу, затем идёт синтез; ответ получил status, rounds, visited, follow_ups и детерминированный citation_check.
  • Password Vault в Tools. Локальное зашифрованное хранилище логинов: master password + опциональная биометрия, поиск, генератор паролей, экспорт/импорт encrypted backup, автолок, FLAG_SECURE и автоочистка чувствительного буфера обмена; vault исключён из Android backup.
  • Auto on/off для Services в Processes. Чип на карточке и действие в шторке меняют svreg autoStart через существующий PATCH /api/v1/servers/{id}, блокируют повторные нажатия и показывают результат/ошибку.
  • Search Hub получил явный режим модели. Primary/fallback хранят независимые thinking/effort: WebAI получает thinking on/off, provider — effort auto/low/medium/high/max/none; нативный DeepSeek search остаётся automatic по фазам research.
  • ai_ask всегда думает. Поле thinking сохранено для совместимости, но MCP-вызов всегда выполняет thinking=true; includeThinking только решает, возвращать ли текст рассуждений. В skills добавлен рецепт быстрого search=true + thinking=true через DeepSeek.
  • Мост умеет снимать временно открытый экран. app_screen_capture открывает любой экран хаба по id, ждёт два кадра, делает PixelCopy и восстанавливает исходный navigation stack даже при ошибке/таймауте.
  • Прямой UI-мост работает без спецразрешений. Команды app_navigate/app_back/app_ui_state/tree/find/action/wait ходят по существующему WebSocket-мосту, читают Compose semantics, а tap/long-press отправляют реальный touch в собственное окно по bounds элемента; root и AccessibilityService не нужны, а фоновое состояние возвращается явно через foreground:false и понятную ошибку. Старый ControlBridgeService, карточка «UI bridge», MCP control_* и /api/v1/control/* отключены.
  • UI-мост видит отдельные Dialog/Popup-окна. UiWindows объединяет Activity, зарегистрированный host FullScreenWindow и корни окон локального процесса, поэтому app_ui_state/tree/find/action/wait работают с меню и полноэкранными окнами; app_screenshot композитит открытый overlay поверх кадра Activity и по-прежнему проходит общий ScreenshotImagePreparer.
  • Скриншоты приложения проходят общую нормализацию. app_screenshot и app_screen_capture используют ScreenshotImagePreparer внутреннего браузера до записи/vision: лимит пикселей, длинной стороны, байтов и JPEG качества; ответ содержит original/processed размеры, format, bytes и resized.
  • Vision получила единую вторую нормализацию. Перед любым источником Describe ограничивает картинку до 3 МП, 3072 px и 3 MiB, не перекодируя уже подходящие файлы; ai_vision, browser_look, screen_look и экран Vision возвращают метаданные normalized/resized/recompressed, размеры и байты.
  • Vision получил region. ai_vision, browser_look, screen_look и POST /api/v1/vision/describe принимают {x,y,w,h} и кропают исходник до нормализации/отправки; ответ показывает фактический crop и исходные размеры.
  • MCP browser_audit. Один JSON-вызов прогоняет desktop/mobile viewport и возвращает horizontal overflow с виновниками, tap-targets, headings/h1, lang, console/page/network errors без ручного переизобретения audit-скрипта.
  • MCP browser_shot с crop/tiles/diff. Overlay/видимый браузер отдаёт снимок, кроп или манифест плиток; baseline сравнивает кадры и возвращает PNG-diff с changed, changedPercent и dimensionMismatch.
  • Browser-тулы одинаковы локально и в remote. /mcp/remote получает browser_look|shot|audit, но не raw bridge_command; артефакты browser_shot push-ятся по SSH в ~/.y83-ws/browser-artifacts Ubuntu-сервера как remotePath.
  • Диагностика Codex стала одной командой. codex_health объединяет backend/bridge/Codex WS/watchdog, codex_sync_stats считает причины resync и state_db_mismatch, а codex_turn_errors отдаёт структурированные ошибки прерванных ходов, MCP-инструментов и команд.

Changed

  • Карточки субагентов приведены к единому протоколу. subAgentActivity и collabAgentToolCall теперь используют общий codec в live, истории и Room-кеше: сохраняются kind/status/prompt/model/reasoningEffort/agentsStates и raw payload, статусы нормализуются, а тап по карточке открывает child-thread. Порядок ленты стабилизируется по journal sequence и не меняет порядок внутри одного turn.
  • Субагенты получили читаемую иерархию. Lifecycle одного agentThreadId схлопывается в одну карточку без регрессии terminal-состояния; канонический /root/... путь humanized в заголовке и остаётся в details, а child-thread отмечен чипом SUBAGENT и breadcrumb-ссылкой на parent.
  • MCP-лимиты больше не зависят от одного маркера. Для сервера y83 применяется поинструментный ledger: новые инструменты получают default только при отсутствии значения, существующие custom-лимиты не затираются, а явно удалённый позже default не восстанавливается автоматически.
  • Skills явно различает глобальный и проектный scope. Секции переименованы в «глобальные/проектные», на каждой карточке появился scope-бейдж, шапка показывает текущий проект, а поиск понимает русские подписи scope.
  • PyJHora-скиллы стали project-scope. Они лежат в .agents/skills, не запускаются неявно и активируются чипом «Прикрепить» или $имя; глобальный MCP остаётся выключенным, project-слой включает его только в pyjhora.
  • Единый Markdown-рендерер для просмотрщиков. Планы, содержимое скиллов и WebAI используют тот же блочный рендерер, что и Codex-чат: таблицы получают общий viewport с горизонтальным скроллом, нумерованные списки сохраняют исходный стартовый номер, а ссылки кликабельны во всех блоках.
  • Shell Chat переименован в Shell и стал только терминалом. Из экрана удалены режимы «Чат | Терминал», лента, поиск, поле ввода и чатовые настройки; picker сессий, ExtraKeys, история панели, TUI и remote-статусы остались. Bridge screen id сменился shell_chat → shell, внутренние имена ui.shellchat/ShellChatScreen сохранены.
  • Remote Codex закреплён на 0.156.1. Setup ставит @openai/codex@0.156.1 в пользовательский npm prefix ~/.local, systemd unit запускает ~/.local/bin/codex, а status больше не зависит от старого глобального /usr/bin/codex или stale standalone-пути.
  • Instruments получил универсальные описания. Карточки WebAI Accounts, WebAI Chat и Vision больше не называют конкретного провайдера, Files и Shell описывают локальную и remote-работу без жёсткой привязки к Termux; Password Vault перенесён в Security & Network, Theme — в App.
  • Default fork стал DDG + Google overlay + AgentSearch. Yandex больше не входит в дефолт и остаётся ручным движком; web_search возвращает JSON с engine_stats, а overlay-индикатор показывает прогресс 1/2.
  • Имена Codex-тредов больше не прыгают между ID и сообщением. Список показывает явное имя, а без него — первое сообщение; ID остаётся только внутренним ключом. Rename открывается общим полноэкранным редактором с большим полем, живым превью и возвратом к первому сообщению; фальшивый Rename with AI и автоматическая запись обрезанного имени удалены.
  • Home скрывает ещё не готовых агентов. Qwen и другие disabled-агенты больше не занимают место на главной и в Home Settings; рабочие Codex и OpenCode остаются на месте.
  • Codex Projects получил полное состояние загрузки. Первый вход показывает индикатор, ошибке есть Retry, notice закреплён под шапкой; экран обновляется при resume, remote-контекст инициализируется до чтения проектов, а удаление тредов идёт с прогрессом и Cancel.
  • Codex Projects больше не запускает полный scan на каждом входе. Обычный вход/resume/reconnect читает Room и быстрый state-DB индекс (limit=25, useStateDbOnly=true); полный scan-and-repair остаётся для Refresh, archived, archive/delete и fallback по пустому/неполному fast-ответу. Архивирование активного треда заблокировано в меню, VM и bridge-команде до остановки хода.
  • Страница проектов opencode стала как Codex. Терминальная шапка с + и Refresh, секция // projects, карточки с числом сессий и меню Edit / Remove project label / Delete N sessions; роли и Databases убраны.
  • Добавление проекта opencode начинается с файлов. Кнопка + сразу открывает локальный picker папок: существующая папка открывает проект, новая создаёт проект по имени папки; фильтр и одна строка new folder используют общий файловый менеджер.
  • Страница сессий opencode стала как Codex. Терминальная шапка opencode@sessions, поиск, pull-to-refresh, группы по датам и карточки с меню Rename / Archive / Show subagents / Delete; + сразу создаёт и открывает сессию без формы роли, а Git, Stats и Services доступны в общем меню.
  • Добавление проекта в Codex начинается с файлов. Кнопка «+» сразу открывает пикер папок (локально и на remote), выбор папки создаёт проект с её именем, существующий проект открывается; пункт «Server files» и шит нового проекта убраны.
  • Меню проектов и файловый менеджер стали компактнее. В шапке Projects прямая кнопка Refresh вместо ⋮-меню, пункт Databases убран из карточки проекта (экран остался в Instruments), фильтр файлов сворачивается кнопкой в шапке, а дубль «new folder» в пикере убран.
  • Services стали единым визуальным языком в Processes и тредах. Общая карточка, статусы running/stopped/error/pending, фильтры и метрики; пункты и подписи Servers в тредах переименованы в Services, внутренние маршруты и API сохранены.
  • Нижние уведомления обходят navigation bar. Snackbar с auto-операциями получает динамический нижний inset для жестовой и трёхкнопочной навигации.
  • Системные inset-ы больше не дублируются. Кастомные TerminalHeader/ HomeTopBar/WebAiHeader владеют верхом, постоянные нижние панели — низом; навбар и клавиатура в нижних панелях объединяются через union, а контент без bottomBar получает безопасную нижнюю зону.
  • Шторки и уведомления выровнены по системным барам. У ModalBottomSheet убраны внутренние дубли navigation/IME padding, а Snackbar на экранах без собственного bottomBar поднимается над navigation bar.

Fixed

  • Remote-терминал Shell подключается ключом, а не зависает на password. Приложение сначала материализует общий asset-key, передаёт keyPath для remote и использует publickey,password без keyboard-interactive.
  • Remote Shell идёт через живой VPN SOCKS5. Пакет приложения исключён из маршрута VPN, поэтому JSch берёт локальный 127.0.0.1:1080 hysteria2 proxy для remote-таргета; Local/backend-соединения остаются прямыми.
  • Смена target заново показывает терминал. Видимость PTY ключится по activeTargetId, поэтому переход Local → remote публикует вьюпорт новой сессии и htop/TUI работают на выбранном сервере.
  • Проверка Search Hub больше не обрывается на 8-й секунде. search/test использует отдельный HTTP-клиент до 7 минут: current, all_engines и research успевают дождаться синхронного ответа бэкенда.
  • Search diagnostics больше не врут о verify и времени чтения. Bounded research накапливает fetch_ms, а отсутствующий verify сообщает «не запускался или истёк TTL», а не утверждает, что TTL уже истёк.
  • research_verify больше не выдаёт неподтверждённый independent search. method="search" присваивается только при реально собранных model_sources, TTL истекает даже при малом реестре, а verify_timeout_s ограничен 600 сек.
  • Research снова превращает голые [N] в кликабельные inline-ссылки. Перед проверкой цитат валидные номера из тела ответа дополняются URL из прочитанных страниц; невалидные ссылки по-прежнему видны в citation_check.
  • Смена API-ключа провайдера больше не смешивает usage-статистику. Сохранение нового ключа сбрасывает кэш лимитов и начинает новую историю OpenCode Go; завершившийся старый запрос не может записать устаревший результат, а сохранение маскированного или неизменённого ключа историю не трогает.
  • Remote-скриншоты теперь проходят Vision и видны в ленте. ai_vision читает imagePath с Ubuntu-сервера по serverID per-server токена, сохраняет локальную копию на телефоне и возвращает path/remotePath; MCP-карточка показывает preview без base64 и без миграции Room.
  • Повторные триггеры resync больше не плодят параллельные resume. Перечитывание треда стало single-flight с coalescing, отдельно учитываются debounce/skip, page miss, fallback open и thread/list state_db_mismatch.
  • Ошибки WebAI/DeepSeek классифицируются явно. Invalid challenge 40003 помечает аккаунт broken, backend_web_deepseek возвращает auth_invalid/quota/timeout/network, а deploy verdict считается только по последней выкладке, не по старому ERROR: в общем append-логе.
  • dev_check op=changed проверяет все изменённые Kotlin-файлы. Команда берёт пути из git status и запускает check-syntax.sh + imports.py, снижая вероятность отложить компиляционную ошибку до конца хода.
  • Архив Codex-тредов снова виден и не «переезжает» в другие чаты. thread/list archived=true сохраняет отдельный признак archived, поэтому Show archived показывает все архивные треды и переживает перезапуск; подтверждение archive/unarchive выводится на списке тредов, а не появляется позднее в случайно открытом чате. Существующий Room-индекс мигрируется без удаления истории.
  • На входе в Home больше не мигает ложное Backend offline. Пока идёт единственная health-проверка, шапка показывает checking… без красного баннера; офлайн-появление возможно только после подтверждённого ответа.
  • Refresh восстанавливает соединение с backend. Повторный запуск при offline снова проверяет health endpoint, а startup использует общий статус вместо параллельных запросов.
  • Remote tunnels честно показывают состояние. Подключение/отключение получают connecting/disconnecting, ошибки не маскируются под offline, а карточка блокирует повторные нажатия во время операции.
  • Reasoning effort в Codex-чате применяется к активному треду. Смена effort сразу уходит в thread/settings/update и turn/settings/update; перед turn/steer текущий уровень синхронизируется повторно. Уровни Big Pickle и Mimo берутся из одной таблицы modelcaps, без разрыва каталога и нормализации запроса.
  • Карточки Codex стали less noisy. У завершённого Explored убрана служебная галочка, а у раскрытых Thinking и Bash — кнопка копирования; копирование остальных карточек сохранено.
  • Новый тред переживает сворачивание без ложного Retry. Свежий пустой тред сразу получает валидный локальный кеш и при возврате из фона идёт через in-place resync; stale-ретраи отменяются при создании и переключении треда.
  • Долгий connecting… на Codex Projects стал честным и быстрее. При входе сбрасывается ожидающий WS-backoff (1/2/4/…30s), в шапке виден реальный интервал повтора, а не бесконечный общий статус; двойной PATCH провайдера больше не запускает два параллельных sync/restart Codex.
  • Меню Codex Projects больше не показывает несуществующие действия. Synthetic/derived-проекты не имеют Edit/Remove (в Room нет записи), при этом удаление их тредов остаётся доступным; мёртвый транслитератор убран.
  • Композер opencode-чата больше не уходит под системный навбар. Нижняя колонка объединяет navigationBars и IME без двойного отступа, клавиатура скрывается при входе и тапе по ленте; нижний ряд остаётся компактным при активной генерации, а кнопка «к последнему сообщению» использует общую пилюлю.
  • Live-элементы в чате Codex перестали теряться. mergeLiveDuplicate исчерпывающий: обновление применяется для любого типа карточки (раньше Plan/Request/TurnDiff/ServiceItem молча отбрасывались), а текст берётся у более полной копии — догоняются дельты, пропавшие при обрыве WS. События item/* и дельты без threadId больше не игнорируются (THREADID_FALLBACK).
  • Орфан-дельты больше не висят молча. Пока ход активен — повторяются с бэкоффом; на конце хода буфер освобождается явно (DELTA_DROPPED). Раньше после 15 попыток ретрай прекращался, буфер оставался в памяти, а текст не появлялся в ленте.
  • Автоскролл стал предсказуемым. Намерение жеста больше не теряется на DragInteraction.Cancel (лента больше не утаскивается к низу, когда человек читает историю), программные скроллы помечены отдельно, пин хвоста ждёт остановки вместо молчаливого выхода и выключен во время догрузки истории.
  • Позиция чтения истории не прыгает. Анкер запоминается на каждой остановке скролла (а не только при смене index/offset), а восстановление во время драга/флинга откладывается до остановки, а не отбрасывается.
  • Возврат из фона и реконнект больше не сбрасывают чат. resyncThread стал in-place: thread/resume и страница сверки накладываются поверх текущего окна, элементы активного хода догоняются из thread/items/list; полный переоткрытие остался только на Retry. На новом сокете resume идёт без дебаунса — иначе подписка могла не восстановиться и live переставал приходить.
  • Окно снова строгий суффикс полного списка: пустые placeholder'ы ответа снимаются и из полного списка со сдвигом windowStartPosition, поэтому live-вставки встают на свою позицию.
  • Plan Bar снова получает предложение после возврата из фона. Карточка plan-хода нормализуется в конец содержательной части хода (перед TurnSummary), поэтому поздние steer/reasoning не остаются визуальным хвостом и не скрывают Reject/Start; build-mode и позиция видимого окна сохраняются.

0.8.103

25 сентября 2026

Added

  • Библиотека заготовок промптов (Prompts). Экран в хабе (AI & Agents → Prompts) и пункт Prompts… в меню композера сразу после Skills…: список с поиском, чипами тегов и счётчиком использований, полноэкранная форма с полями и предпросмотром готового текста. Из чата кнопка вставляет текст в поле ввода (не отправляет), из хаба — копирует в буфер.
  • 13 встроенных заготовок. Девять под этот репо (багфикс с воспроизведением, UI-правка по y83-ux, сборка APK → Install, ревью, разведка подсистемы, план крупной задачи, разбиение монолит-файла, разбор «зависло/пропали шаги» через мост, релиз на прод) и четыре универсальные (фича по образцу, починка сборки/теста, объяснение кода, исследование темы). Все собраны по официальным четырём элементам промпта Codex (Goal / Context / Constraints / Done when) и требуют проверяемую приёмку.
  • Один источник правды — ~/.y83-ws/prompts.json. REST (GET/PUT /api/v1/prompts, POST /api/v1/prompts/seed, POST /api/v1/prompts/{id}/used) для приложения и MCP-инструменты prompt_list / prompt_get / prompt_save для агентов: заготовку можно пополнить и из чата, и агентом.
  • Экспорт и импорт. Меню «⋯» на экране копирует JSON всей библиотеки в буфер и принимает её обратно из буфера — с той же валидацией, что у сохранения.

Changed

  • Правило «где что писать» зафиксировано в docs/tech/prompts-library.md: всегда применимое — в AGENTS.md, процедуры — в скилл, формулировка задачи на один ход — в заготовку. Прятать в шаблон то, что должно работать всегда, нельзя (замер Vercel: AGENTS.md 100% против 79% у skills).

Fixed

  • Оверлей-поиск перестал зависать и просвечивать в чате. На страницу введён жёсткий бюджет 40 с (headless + Activity вместе), на весь сеанс — 40 с × N; окно с alpha=0.02 гасится на любом выходе из загрузки, а не живёт до пятиминутного teardown, и индикатор в чате сбрасывается в finally после ошибки.
  • Логи оверлея стали видны в приложении. HeadlessFetcher, OverlayFetch, FetchOverlayActivity и команды browser_fetch_overlay(s) пишут в FileLog длительность, бюджет и результат — их теперь видно на экране Logs и в dev_log {source:"app"}.

0.8.102

25 сентября 2026

Added

  • Shell-чат: консольная лента и юзабилити. Строка ленты — гаттер времени, промпт $, вывод без переноса (сетка та же, что в терминале) и строка меты «статус · длительность · exit · число строк» с меню «⋯»: копировать вывод, копировать команду, повторить, вставить в поле ввода, открыть целиком. Тап по выводу открывает полный просмотр, лонг-тап по тексту — системное выделение, тап по команде подставляет её в поле ввода.
  • Поиск по ленте. Иконка в шапке открывает строку поиска: подсветка совпадений (в выводе — подчёркиванием, ANSI-цвета не трогаем), счётчик и переход ↑/↓.
  • Многострочный ввод (heredoc, скрипты). Чип ⏎ включает режим: Enter переносит строку, отправка — кнопкой. ShellChatParser съедает эхо всех строк вставки (включая промпты PS2 > ) и закрывает команду по последнему D-маркеру, exit-код — последней строки. Если эхо строки потерялось, команда закрывается по тишине — ввод не блокируется.
  • cwd в промпте шапки. Проба tmux отдаёт pane_current_path и $HOME: промпт показывает y83@shell:~/y83-ws$, мета-строка — сессию, tmux, сетку панели (96×54), источник вывода и статус.
  • Клавиши Tab и Esc в панели ввода рядом с Ctrl+C / Ctrl+D.
  • Пустая сессия — баннер // сессия готова — введите команду с чипами быстрых команд.

Changed

  • Шапка shell-чата — терминальная (TerminalHeader, как у y83@code и y83@logs): градиентная вуаль, промпт с кареткой статуса, строка метрик.
  • Переключатель режимов — чипы «Чат» / «Терминал» (SelectChip) с подписями, сессия — кнопкой «Сессия ▾»; пикер сессии и настройки — полноэкранные окна с терминальной шапкой (y83@shell:servers, y83@shell:set) вместо нижних листов.
  • Лента дышит: вывод больше не липнет к краям экрана (отступ 12dp и выравнивание по промпту), старые пары сворачиваются в одну консольную строку, кнопка «вниз» — ScrollToBottomPill со счётчиком непрочитанного.
  • Просмотр вывода (Hist, «ещё N строк») получил ту же терминальную шапку.

Fixed

  • Команда из очереди больше не дублируется в ленте. Отправка второй команды до завершения первой добавляла вторую строку с тем же id, что ломало ключи LazyColumn; теперь строка Pending обновляется на месте.

Data

  • shell_transcript.finishedAt (AgentDb 12 → 13): длительность команды сохраняется и видна после перезахода в тред.

0.8.101

25 сентября 2026

Added

  • API Providers: пресеты одним селектом. В Edit раздел // preset вместо ряда чипов — выпадающий список (ToolSelectField), и рядом с используемыми провайдерами добавлен облачный OpenAI-совместимый набор: OpenAI, Google Gemini, xAI Grok, Mistral, Together, Fireworks, Cerebras, Moonshot/Kimi, Z.ai GLM, DashScope Qwen, Perplexity (модели подтягиваются кнопкой Discover). Тем же селектом выбирается тестовая модель в шаге // test.
  • Usage OpenCode Go: сброс по каждому окну и история. Под каждым баром (5 hours / Week / Month) — конец периода и отсчёт до сброса иконками (часы и круговая стрелка) вместо слов, единицы английские; в листе Usage добавлен спарклайн истории окна (серверное кольцо снапшотов).

Changed

  • Единая геометрия заголовков доведена до раздела API Providers. Список (// codex, // qwen, // opencode), форма (// preset, // connection, // wire, // api key, // models, // test) и листы (// usage, // models, // actions) теперь держат ту же геометрию, что главная, Projects и Threads: 16dp до первого заголовка, строка заголовка 48dp, 8dp до первого элемента и 16dp между секциями.
  • Меньше дублей на карточке провайдера: сводная строка «next reset» убрана (её заменили метки под барами), недоступный usage показывается одной строкой без повтора текста ошибки — полная ошибка остаётся в листе Usage.

Fixed

  • Тред создаётся, даже если папка проекта пропала. thread/start теперь проверяет cwd (backend /fs/stat, для SSH-агентов — remote stat): удалённый проект подменяется Home (remote — /var/www) с предупреждением, а сам проект остаётся в списке. Если codex отвечает no such file or directory, показывается диалог «Continue in new» с сохранением текста сообщения.
  • App-server с удалённой рабочей папкой больше не висит. svreg смотрит /proc/<pid>/cwd: удалённый cwd делает сервис нездоровым → рестарт, а запись cwd встроенных сервисов чинится на $HOME. setup.sh при обновлении перезапускает битый демон и убирает мёртвые projects[]. Рестарт дополнительно убивает непрямой PGID процесс напрямую, не считает zombie живым и не обрывает длинный ожидаемый рестарт по лимиту 10 с.
  • Единая геометрия секционных заголовков. На главной, Projects и Threads теперь одинаковые 16dp до первого заголовка, 8dp к первому элементу и 16dp между секциями; шестерёнка Quick access больше не меняет высоту и отступы строки относительно остальных заголовков.
  • Длинный снимок (fullPage) больше не выходит белым. Причина: View.draw() аппаратно ускоренного WebView отдаёт пустой кадр после прокрутки страницы — получался только первый экран. Скрытая сессия теперь рендерится программно (LAYER_TYPE_SOFTWARE), видимый браузер переключается на программный слой только на время съёмки, и перед каждым тайлом вью принудительно инвалидируется.
  • Лимиты «резалки» из вызова уважаются. browser_overlay_screenshot брал для склейки глобальные настройки, а fullPageMaxPages/Side/Pixels из самого запроса игнорировал — теперь кадр планируется ровно по ним.
  • Один геометрический ресайз вместо двух. Длинный кадр масштабировался при склейке и повторно в оптимизаторе — двойное сжатие съедало читаемость мелкого текста. Оптимизатор сначала снижает качество в рамках maxBytes и только если этого мало — дожимает геометрию.
  • browser_overlay_state отдаёт свежие счётчики сети и консоли (шина дренируется перед ответом), а журнал сети не дублирует один запрос строками webview и js: пара склеивается в source: "webview+js" с длительностью и размером.
  • Кадр скрытой сессии видно агенту: файл дополнительно кладётся в Download/y83ws/screenshots/ (поле shared в ответе) — этот путь читают Termux и vision (ai_vision {imagePath}), тогда как filesDir закрыт.

0.8.100

24 сентября 2026

Added

  • Скрытое тестирование сайтов: диагностика и взаимодействие. Скрытая WebView-сессия (browser_overlay_*) получила консоль (browser_overlay_console), сеть (browser_overlay_network — ресурсы JS-шины + HTTP/SSL-ошибки WebView), честный network idle (browser_overlay_wait_idle), журнал и политику диалогов (dialogs/dialog_answer), cookies/storage/clear_data, фреймы и обход Shadow DOM (frames, frame в командах), заряд файлов для input[type=file], скачивания в filesDir/browser_downloads/, политику разрешений, light/dark-схему и browser_overlay_reload.
  • Desktop-профиль доведён до монитора: зависимость androidx.webkit ставит document-start скрипт — devicePixelRatio=1, screen 1920×1080, maxTouchPoints=0, без ontouchstart, (pointer: coarse) → false; отключается spoof:false, факт применения виден в state.spoofApplied.
  • Настоящий full page: вместо ошибки «not supported yet» — прокрутка страницы шагами и склейка в один снимок (pageHeight/capturedHeight/tiles/ truncated/scaled); у длинных кадров отдельные бюджеты fullPageMaxPages/fullPageMaxSide/fullPageMaxPixels/fullPageMaxBytes, меняются на лету через browser_overlay_screenshot_config.
  • Загрузка файлов в скрытом input[type=file]: файлы подставляются на странице через DataTransfer + событие change (selector в browser_overlay_file_upload), потому что реального жеста у скрытой сессии нет и input.click() WebView игнорирует; заряд для системного пикера остался фолбэком.
  • MCP browser_look {diagnostics:true}: к описанию страницы добавляется сводка состояния, ошибок консоли и упавших запросов скрытой сессии.
  • Персистентный индекс тредов: Room хранит полный список по scope локального агента или remote-сервера, поэтому перезапуск и временный сбой thread/list не превращают экран в пустой список.
  • Безопасное создание треда: durable-маркер thread/start пишется через commit() до отправки; recovery читает все страницы и не отправляет второй запрос после неоднозначного таймаута.
  • Per-tool лимиты MCP по умолчанию: при первом открытии экрана MCP для сервера y83 записываются 6000 токенов, тяжёлые структурные выводы — 10000; web_search, web_fetch, research, ai_ask и ai_export остаются без автоматического лимита. Глобальный fallback не используется.
  • Единая пагинация large-list: limit/cursor + hasMore/nextCursor для логов, git/repo, тредов, кеша, файлов, сессий, задач, планов и SQLite; legacy offset/skip/before продолжает работать.
  • MCP-страницы защищены от изменения источника: несовпадение fingerprint возвращает cursorStale, а не молчаливый пропуск или дубль.
  • Скрытое тестирование сайтов: постоянная невидимая WebView-сессия browser_overlay_* (open/navigate/find/click/type/select/scroll/JS/waits/ screenshot/close) тестирует сайт без открытия экрана браузера; окно alpha=0 + NOT_FOCUSABLE/NOT_TOUCHABLE, сессия сама закрывается после 5 минут простоя.
  • Профили вьюпорта в CSS-пикселях: desktop — 1920×1080 при плотности 1:1 (devicePixelRatio=1, снимок ровно 1920×1080), mobile — реальный viewport устройства (394×853 при физических 1280×2772); width/height задаются в CSS-пикселях, физический размер окна считается как width×density.
  • browser_overlay_find: поиск элементов скрытой страницы по тексту (mode=text) или CSS-селектору (mode=selector) с готовым selector, text и rect — агент не угадывает селекторы.
  • Оптимизатор скриншотов с runtime-настройками: единый ScreenshotImagePreparer (raw bitmap → resize → PNG/JPEG в бюджет байт), quality/maxPixels/maxSide/maxBytes/format меняются командой browser_overlay_screenshot_config без пересборки; снимки видимого браузера проходят через тот же оптимизатор.

Changed

  • Вложения WebAI Chat готовятся как в Codex: исходник принимается до 10 МБ, изображение ужимается до 3 МП/3072 px (JPEG q95, lossless-PNG до 3 МБ), а имя, MIME и расширение синхронизируются с итоговыми байтами. Документы отправляются без ресайза, а DeepSeek продолжает нативно обрабатывать картинку выбранной моделью аккаунта.
  • Codex usage-строка пересобрана: слева показываются текущий context/window и cache последнего запроса, по центру — context-percent на широком экране, справа — estimated cost текущего хода; все числа и нижняя полоска анимируются, пустая строка скрывается, а Tokens-окно и стрелка удалены. Browser-fetch overlay сохраняет приоритет.
  • Стоимость хода считается по тарифам cache read/write: usage накапливается по turnId через разницу thread total, replay не удваивает расход, смена модели внутри хода учитывается отдельными сегментами; тарифы применяются на 1M токенов, отсутствие прайса скрывает cost, y83_router показывается как ~$.
  • Rate limits скрыты в нормальном состоянии: warning-строка появляется только с 70%, без постоянного блока в обычном состоянии.
  • Первый заголовок главной, проектов и тредов использует общий inset: расстояние от divider шапки до первого SectionHeader унифицировано через общий 16.dp; локальные компенсации первого заголовка удалены.
  • Поиск тредов скрыт по умолчанию: иконка в шапке переключает поле, закрытие очищает запрос, а фильтр по имени/preview сохраняет регистронезависимый поиск.
  • Шапка Thread settings получила градиент terminal-стиля: обычная полноэкранная шапка использует тот же terminalHeaderBrush и hairline, что и шапки Codex-экранов.
  • Порядок тредов использует recencyAt: открытие и metadata-bump больше не поднимают старый тред выше реально последнего письма; серверный запрос и все локальные списки сортированы одним ключом.
  • Проекты разделены на безопасные операции: «Remove project label» не трогает треды, а «Delete N threads» удаляет их только после подтверждения сервера; пути проектов канонизируются без дублей local/remote.
  • Room-чтение тредов ограничено нужными ходами: ingest загружает только кандидатов страницы, вход материализует достигнутый хвост, а очистка кэша выполняется единой транзакцией.
  • MCP UI различает default, override и лимит ∞, а диалог получил действие «Вернуть default» и явное «Без лимита».
  • file_read отдаёт структурный JSON с content, hasMore и nextCursor; session_messages использует штатный before/X-Next-Cursor opencode serve.
  • Setup rev4: doctor теперь полностью read-only, dev-машина без точного Y83_FORCE_BACKEND=1 не трогает backend/supervisord/registry/migrate/boot, а неудачный backend health автоматически возвращает предыдущий symlink.
  • Agent-скиллы безопасно ограничены: публикуются только рабочие y83-webai, y83-websearch, y83-research и y83-repair; development-скрипты, dev_* и bridge-команды исключены, а архив проверяется до выкладки.
  • Атомарный deploy: APK/backend/setup/skills загружаются как .new, проверяются по SHA, затем публикуются одним проходом; manifest.txt меняется последним и получает manager=4 и sha256_skills.
  • Карточка MCP показывает только статус и args: result, «выполняется…» и кнопка копирования убраны; ошибка ограничена тремя строками.
  • MCP result отфильтровывается на ingress приложения: JSON-проекция выполняется до Room/UI, поэтому большие выводы не кешируются и не попадают в ленту; provider-история и function-call output не изменяются.
  • Thinking ограничен 240.dp внутренним скроллом, автоскролл работает только когда пользователь уже внизу; заголовок отделён от тела divider'ом, обратный жест останавливает follow, а возврат к низу снова включает его.
  • Exploring/Explored переделан в понятную операцию: компакт — одна строка со статусом, числом операций и первым basename; expanded — плоский список Read/List/Search с basename/query и полным путём, без сырой команды и вывода. Роли подагентов остаются бейджем [explorer].
  • Event-карточки выровнены: Thinking, Explore, Command, ReadFile, Changed files, MCP, TurnDiff и ImageCard используют radius 16.dp, padding 12/8.dp и общие шрифтовые роли event-стиля.
  • Сообщения пользователя и ассистента стали полноширинными: их фон и текст начинаются по той же горизонтальной оси, что и карточки событий.
  • Шрифты и Markdown унифицированы: заголовки MCP/reasoning/changed files используют общий event-стиль, inline code и code-blocks наследуют шрифт чата.

Fixed

  • Parallel streaming tool-calls больше не склеиваются: отсутствующий index не превращается в 0; accumulator ключуется по call id/новому вызову, добавлен регрессионный тест для параллельных вызовов без index.
  • Классификация чтения переживает перезаход: журнал сохраняет commandActions, cwd, status, duration и source, а reducer снова собирает чистое чтение в ReadFile вместо обычной команды.
  • Новый пустой тред открывается сразу после thread/start: валидная summary-страница с пустым data принимается даже при отсутствии отдельной page-записи или наличии cursor; настоящая ошибка сети остаётся ошибкой и получает диагностический лог.
  • Треды и проекты не теряются при неполной синхронизации: status-refresh только обновляет записи, полный refresh удаляет лишь после успешного чтения всех страниц; старый prefs-кэш на 400 cwd удалён.
  • AgentDb больше не пересоздаётся destructive-fallback'ом: миграция 11→12 создаёт индекс, схема экспортируется, а ошибка миграции сохраняет исходную базу для ремонта.
  • Codex usage-hint действительно отключён: usage_hint_enabled в текущей версии ignored, поэтому вместо него заданы пустые root/subagent/mode-hint тексты; multi_agent_v2 остаётся включённым без ошибочной подсказки functions.exec.
  • Видимый браузер больше не выдаёт фейковый full page: browser_screenshot {fullPage:true} растягивал холст, рисуя лишь видимый кусок, — теперь это та же честная склейка, что в скрытой сессии (FullPageCapture).
  • browser_look {fullPage:true} уходит в честный снимок, а не в этот растянутый кадр; cookies скрытой сессии сбрасываются на диск (flush) после загрузки страницы, запись/очистка cookies и storage тоже.

backend 0.8.151

25 сентября 2026бэкенд

Added

  • Логи поиска и команд моста. web_search (engine=fork), батчи research overlay и каждый вызов Hub.RunCommand пишут в slog длительность, число страниц/результатов и причину обрыва — таймаут оверлея виден в dev_log {source:"backend"}.

Changed

  • Таймауты оверлея считаются из бюджета страницы. Бэкенд передаёт в приложение budgetMs: одиночная страница — 40 с + 5 с на ack, сеанс — 40 с × N + 10 с, и всегда не больше остатка ctx. Раньше сервер ждал 90/45/35 с, пока телефон мог работать до 400 с.
  • После таймаута сеанса fork больше не обходит движки по одному. Двойное ожидание убрано: откат на одиночные запросы остался только для старых APK, которые не знают browser_fetch_overlays.

backend 0.8.144

25 сентября 2026бэкенд

Added

  • browser_look {diagnostics:true}: после съёмки бэкенд добавляет к ответу сводку состояния скрытой сессии, ошибок консоли и упавших запросов, поэтому «почему страница пустая» видно из одного вызова, без ручных browser_overlay_console/browser_overlay_network.

backend 0.8.143

25 сентября 2026бэкенд

Added

  • MCP browser_look умеет скрытую сессию: hidden:true снимает кадр скрытой WebView-сессии (browser_overlay_*) и отдаёт его в vision-цепочку, не открывая видимый браузер и не перекрывая чат; base64-кадр декодируется на бэкенде.

backend 0.8.142

25 сентября 2026бэкенд

Changed

  • Локальный JSON-канал файлов разрешает 10 МБ: предел fs.Read* и fs.Write* увеличен с 5 до 10 МБ, текст ошибки выводится из общего константного лимита; потоковый remote FS и MCP file_write сохраняют прежние ограничения.

backend 0.8.137

24 сентября 2026бэкенд

Changed

  • Релизный backend собран из текущего исходника и проверен на dev через smoke-test + swap: health отвечает 0.8.137, autoStart-сервисы пережили перезапуск.
  • Remote Codex-config отключает все multi-agent hints: вместо ignored usage_hint_enabled генерируются пустые root/subagent/mode-hint тексты.

backend 0.8.135

24 сентября 2026бэкенд

Added

  • Backend MCP получил cursor-контракт для session_find, session_messages, log_grep, plan_list, task_status, dev_repo, dev_git и dev_log.
  • Реестр задач поддерживает offset, поэтому страницы задач не упираются в старый cap 50.

Fixed

  • Изменяемые источники не выдают нестабильные страницы: логи/файлы/сессии проверяют версию cursor после чтения и отвечают cursorStale.

0.8.99

24 сентября 2026

Changed

  • MCP args и result декодируются перед показом: внешние JSON-кавычки, escape-последовательности и вложенные JSON-строки раскрываются, затем объекты и массивы выводятся pretty с подсветкой.
  • В результате ровно один блок: убран отдельный raw-режим и кнопка Показать raw JSON, которая дублировала уже показанный JSON.
  • Длинный result не раздувает ленту: тело ограничено 480.dp и прокручивается внутри карточки; args ограничен 240.dp.
  • Выключенные MCP-серверы уходят в отдельную свёрнутую секцию: основной список содержит только включённые серверы, поиск показывает совпавшие выключенные для включения.

Fixed

  • MCP envelope распаковывается корректно: content[].text и structuredContent превращаются в канонический результат вместо сырой обёртки с двойными escape.
  • Аргументы больше не получают лишние внешние кавычки: primitive arguments читается через contentOrNull, старые снапшоты декодируются рекурсивно.

backend 0.8.134

24 сентября 2026бэкенд

Fixed

  • Tool-output обрезка больше не рушит prefix cache: незащищённые выводы нормализуются одинаково с первого запроса, включая текущий ход; call_id, тип элемента и порядок истории сохраняются, повторный проход идемпотентен.
  • Search/WebAI не попадают под generic-обрезку: web_search, web_fetch, research, research_verify, ai_ask и webget_* проходят целиком, а полнота управляется их собственными параметрами.
  • Request-time prune инструкций выключен по умолчанию: повторное удаление ранних AGENTS/инструкций больше не меняет уже отправленный префикс; можно включить явно через Y83_PRUNE_INSTRUCTIONS=1.

0.8.98

24 сентября 2026

Added

  • Vision-тест показывает путь цепочки: итоговый источник и латентность дополнены списком попыток — видно, какой источник упал, сколько времени он потратил и какой страховщик дал ответ.
  • Чипы img объясняют состояние: авто-модели помечены img auto, ручной флаг подписан img on/off, а слот спиннера фиксирован — во время сохранения строка и чип не прыгают.

Changed

  • Vision-список больше не показывает мусор: невыбранные выключенные источники скрыты; отключённый Gemini остаётся только в API для диагностики и в цепочке, если его туда выбрали.
  • Подпись Vision в хабе актуальна: только WebAI DeepSeek и vision-модели провайдеров, без устаревшего local server.
  • Названия WebAI-источников унифицированы: DeepSeek, Qwen, Kimi, Z.ai — одинаково в цепочке, тесте и попытках vision.
  • Сохранение img видно внутри шторки моделей: «сохраняем / сохранено / ошибка» не прячется за ModalBottomSheet, а тап по названию модели по-прежнему запускает тест.

Fixed

  • Чип img мгновенно показывает новое состояние: шторка читает живого провайдера, флаг переключается оптимистично и откатывается при ошибке.
  • Одно нажатие — один PUT: во время сохранения чип блокируется, быстрые повторные тапи больше не переключают флаг туда-обратно.

backend 0.8.130

24 сентября 2026бэкенд

Fixed

  • Авто vision-модель провайдера реально вызывается: выполнение provider-vision использует тот же VisionCapable, что и список источников. Раньше deepseek-v4-flash-vision-exp попадал в цепочку, но запрос отклонялся с «модель не помечена как vision».
  • Провайдерный Vision отправляет x-opencode-session: одиночный vision-вызов теперь получает стабильный session id шлюза opencode.ai и больше не падает с MissingSessionID; probe провайдера использует тот же единый генератор.
  • dev_status.versions.apk показывает установленный APK: вместо устаревшей записи из versions.txt берётся версия из hello дебаг-моста; без подключённого приложения остаётся прежний fallback.

0.8.97

23 сентября 2026

Added

  • Экран Vision в хабе инструментов (y83@vision): цепочка «основной → страховщик» из WebAI DeepSeek и vision-моделей провайдеров, доступность источников и проверка цепочки на встроенной картинке. На экране прямо написано, что пиксели в модель не уходят.
  • MCP screen_look {question?, source?} — снимок экрана приложения через мост и ответ той же цепочкой: {path, description, source}. По path можно уточнять вопросы повторным ai_vision, не внося картинку в контекст модели.
  • Один пункт Attach в меню композера: тип определяется по MIME, картинка сразу показывает миниатюру из content://, текст и бинарь получают путь.

Changed

  • Вложение больше не ждёт vision. Раньше describe шёл до загрузки (20–30 с) и падал 502 — файл не сохранялся, чип умирал красным. Теперь подготовка (до 3 МП — без перекодирования, дальше — до 3 МП/3072 px, PNG lossless, JPEG q95), мгновенная загрузка в uploads/, а «посмотреть» решает агент: ai_vision / browser_look / screen_look.
  • Нативная отправка (local_image) убрана из обычного пути: картинка не платит vision-токенами на каждом следующем ходе — в контекст попадает текст.
  • Флаг vision у модели стал бейджем img: автоопределение по имени модели, ручной чип — только когда автоопределение не сработало.
  • Шрифт ошибки в чипе: первая строка — дружелюбное имя («Изображение») и размер, вторая — реальное имя файла; ниже текст ошибки и «нажми, чтобы повторить».

Fixed

  • DeepSeek снова принимает картинки: имя файла всегда получает расширение, определяемое по магическим байтам. Раньше basename без расширения давал unsupported file type.
  • Qwen больше не подсовывается молча: старый фолбэк deepseek → qwen в webai.Service.Vision удалён — порядок источников задаёт только цепочка.
  • Чип ошибки — не тупик: крестик убирает вложение, нажатие на красный чип повторяет загрузку.

backend 0.8.128

23 сентября 2026бэкенд

Added

  • MCP screen_look: снимок экрана приложения через мост (app_screenshot) → файл в downloads/screenshots → цепочка vision → {path, description, source}; есть фолбэк на inline base64, если файл не сохранился.
  • Автоопределение vision-моделей (providers.VisionCapable / LooksVisionID): провайдерские /models отдают только идентификаторы, теперь deepseek-v4-flash-vision-exp и семейства вроде gemini-*, gpt-4o, *-vl* попадают в цепочку без ручной отметки.
  • Поле vision/visionAuto в API провайдеров: раньше ModelDto не отдавал и не сохранял флаг — ручная отметка модели терялась при сохранении.

Changed

  • Список источников vision = WebAI DeepSeek + vision-модели провайдеров: Qwen и локальный сервер убраны из Sources() и авто-цепочки.
  • ai_vision возвращает path — агент может уточнять вопросы по той же картинке, не читая её заново.
  • Имя файла нормализуется на стороне сервера (normalizeImageName): расширение берётся из магических байтов, .ws в …_com.y83.ws больше не принимается за расширение.

Fixed

  • Убран legacy-фолбэк deepseek → qwen в webai.Service.Vision: цепочка с экрана Vision больше не перебивается молча чужим провайдером (капча x5sec Qwen больше не приходит под видом ошибки DeepSeek).
  • Multipart-загрузка DeepSeek отдаёт явный Content-Type картинки и filename с расширением.
  • Пустой файл даёт внятную ошибку 400 вместо no image to inspect.

backend 0.8.124

23 сентября 2026бэкенд

Added

  • Цепочка vision-источников (GET/PUT /api/v1/vision/config, POST /api/v1/vision/describe): веб-ИИ аккаунты (DeepSeek/Qwen), провайдерские vision-модели и локальный OpenAI-совместимый сервер; основной источник и страховщик, авто-подбор при пустой цепочке, диагностика попыток.
  • MCP browser_look: снимает скриншот встроенного браузера и описывает его цепочкой — одна цепочка вместо ручного browser_screenshot (его base64 обрезается в выводе) плюс ai_vision; опционально сначала открывает url.
  • Флаг vision у моделей провайдера: каталог Codex пишет input_modalities: ["text","image"] вместо жёсткого ["text"].

Changed

  • ai_vision ходит по цепочке и принимает source (webai:deepseek, webai:qwen, provider:<id>/<model>, local); старый provider=… остаётся рабочим синонимом.

Fixed

  • Роутер больше не теряет картинки. Части input_image из Responses-запроса конвертируются в image_url для chat-провайдеров — до этого view_image и local_image уходили в пустоту.

0.8.96

23 сентября 2026

Added

  • Поиск и фильтры Changelog: строка Search releases и переключатели All / App / Backend работают по версии, дате, типу и тексту изменений; пустой результат показывает действие сброса фильтров.
  • Маркеры релизов: первая запись каждого типа помечается LATEST, установленная версия — INSTALLED, backend-релизы — BACKEND.

Changed

  • Хаб инструментов стал командной строкой: секции получили номера (// 01 tools), пункты — стабильные индексы [01], иконки, описания и hairline-разделители вместо одинаковых залитых карточек.
  • Changelog получил терминальную шапку (y83@changelog:~$), счётчики релизов, закреплённые контролы и консольные заголовки изменений ([+] Added, [x] Fixed, [~] Changed), даты релизов отображаются по-английски.

Fixed

  • Полный вывод MCP/WebAI и ровные отступы. Карточка результата теперь показывает структурированный ответ (ai_ask, поиск, generic JSON), полный raw JSON и копирование без обрезки; кеш не режет MCP-поля до 40K, а сообщения AI/пользователя получили отступ 12dp, совпадающий с thinking.
  • Записи changelog больше не показывают сырые Markdown-маркеры. Жирный текст, код и ссылки рендерятся через существующий Markdown- рендерер; бессмысленная всегда активная анимация карточек удалена.

0.8.95

23 сентября 2026

Fixed

  • Тумблеры больше не «прыгают». На экранах Skills и MCP при записи в строку вставлялся «…», и сам переключатель сдвигался влево; вдобавок после тумблера скилл уезжал в свёрнутую секцию «выключено». Со стороны это выглядело как прыжок и «непонятно, что переключилось». Теперь слева от Switch всегда занят слот спиннера (позиция тумблера не меняется), состояние подписано словом («в промпте»/«выключен», «вкл»/«выкл»), а список не перестраивается.
  • Отклик виден при любом скролле. Сообщения экранов Skills и MCP были элементом списка — при прокрутке они оставались за экраном, а на успешную запись сообщения не было вовсе. Теперь строка статуса закреплена под терминальной шапкой: «… записано в config.toml», причина отказа, «Отменить».
  • Двойная перезагрузка каталога скиллов. После тумблера список перечитывался принудительно (forceReload) и одновременно приходила нотификация skills/changed — каталог мигал. Теперь forceReload только по кнопке «обновить», а нотификация обрабатывается тихо и с дебаунсом.
  • Гонка при быстрых тапах. skillsBusy/mcpBusy были одной строкой на экран: вторая запись затирала спиннер первой. Теперь это множества ключей — спиннер стоит на своей строке, остальные строки остаются рабочими.
  • Выключенный скилл оставался прикреплённым к следующему сообщению: теперь он открепляется, а строка статуса сообщает об этом и предлагает «Отменить».

Added

  • «Использовать» у скилла — вставляет interface.default_prompt в поле ввода (пустое поле — просто текст, иначе с новой строки) и закрывает экран.
  • Предупреждения по зависимостям: если скиллу нужен MCP-инструмент, а сервер выключен или не настроен (dependencies.tools[] из agents/openai.yaml + config/read), карточка помечается значком, а в раскрытой — строка с причиной.
  • Метаданные скиллов в репе (skills/<имя>/agents/openai.yaml): short_description, default_prompt и dependencies.tools[] — короткая подпись на карточке вместо длинного описания, рабочая кнопка «Использовать» и предупреждения. scripts/sync-skills.sh теперь раздаёт и этот файл.

Changed

  • Экран MCP — по-русски: состояния (подключён / не запущен / запускается / нужна авторизация / ошибка / отменён / выключен / готов), «инструменты (N)», «Войти», «лимит ∞», диалоги («Вызов», «Выполнить», «Отмена», «Лимит», «Авторизация», «Копировать состояние»).
  • Один список серверов вместо секций «servers»/«disabled»: выключенный сервер остаётся на месте, гаснет и помечается «выключен»; порядок алфавитный, поэтому тумблер ничего не перемещает.
  • Один список скиллов секциями по scope (личные → проектные → встроенные): секции «в промпте»/«выключено» убраны, выключенный скилл остаётся на своём месте.
  • Удалены мёртвые параметры skills/skillsLoading/onSkillToggle в CodexInputBar (остались от удалённой шторки), «Cancel» в диалогах → «Отмена».

0.8.94

23 сентября 2026

Added

  • Экран Skills — полноэкранный, с терминальной шапкой (codex@skills: $). Открывается из меню треда («Skills») и из меню композера («Skills…») — это один и тот же экран; шторка SkillsSheet удалена.
  • Секция «ошибки загрузки»: errors[] из skills/list больше не теряются. Битый SKILL.md (например chart-drawing без frontmatter) теперь виден — раньше скилл просто не появлялся в списке без объяснений.
  • Карточка скилла: тап раскрывает детали (полное описание, путь, scope, зависимости-инструменты, pluginId); чип «Прикрепить» кладёт скилл в следующее сообщение, тумблер справа — попадание скилла в промпт.
  • Содержимое скилла: SKILL.md и файлы его каталога (references/, scripts/) открываются как markdown в отдельном окне (codex@skill: $). Читаем через app-server (fs/readDirectory + fs/readFile → base64): ~/.codex — приватный каталог Termux, приложению он недоступен.
  • Настройки каталога на экране ([skills] в config.toml): skills.include_instructions, skills.max_context_tokens (бюджет каталога в токенах, дефолт — 2% контекста с капом 10k) и skills.bundled.enabled (встроенные скиллы Codex) — с записью через config/value/write и сверкой применения.

Fixed

  • Тумблер скилла не возвращается молча: после skills/config/write сверяются effectiveEnabled из ответа и enabled из перечитанного списка; расхождение показывается строкой внутри экрана (снакбар чата за полноэкранным окном не виден).
  • Сбой перечитывания больше не стирает каталог: неудачный skills/list оставлял пустой список («No skills found») — теперь список остаётся прежним, а причина видна в строке сообщения.
  • Попытка прикрепить выключенный скилл больше не игнорируется молча: экран говорит «выключен — сначала включите тумблер».

Changed

  • Порядок карточек — по scope (личные → проектные → встроенные), затем по имени: тумблер больше не переставляет карточку в списке.

0.8.93

23 сентября 2026

Fixed

  • Тумблеры MCP не переключались. Состояние сервера бралось из runtimeStatus, а mcpServerStatus/list без threadId отдаёт runtimeStatus: null у всех серверов (MCP поднимается по требованию треда): тумблер сервера всегда показывал «вкл» и после перечитывания конфига возвращался назад, а выключенный pyjhora (enabled=false) висел в списке включённых. Теперь статусы спрашиваются для открытого треда (threadId), а тумблер сервера читает enabled из config/read — то, что сам и пишет; состояние рантайма показывается отдельно (on · connected, off · disabled).
  • Ошибки MCP были не видны. Сообщения о неудачной записи конфига, отказе config/mcpServer/reload и «тестовый вызов требует открытый тред» уходили в снакбар чата — за полноэкранным диалогом MCP его не видно. Теперь у экрана своё сообщение (mcpNotice): строка внутри экрана, снимается крестиком.
  • Тихий отказ правки больше не молчит. Если запись в конфиг прошла, а перечитанный конфиг её не отразил, экран MCP показывает предупреждение («не применился — проверьте ~/.codex/config.toml») вместо тумблера, который молча возвращается назад.

Changed

  • Карточки серверов раскрыты по умолчанию — тумблеры инструментов и бюджет вывода видны сразу, без тапа по «Show tools» (явное сворачивание запоминается).
  • Пояснение на экране MCP: состояние сервера относится к открытому треду, MCP поднимается по требованию, поэтому до первого хода возможен «not started».

0.8.92

23 сентября 2026

Added

  • Управление инструментами MCP из приложения. В карточке сервера у каждого инструмента тумблер (mcp_servers.<name>.disabled_tools) и чип бюджета вывода (mcp_servers.<name>.tools.<tool>.output_token_limit): правки идут в ~/.codex/config.toml через app-server (config/value/write, upsert; снятие — value: null) и применяются config/mcpServer/reload без перезапуска. Выключенный инструмент не исчезает из списка — он помечен «не попадает в промпт» и возвращается тумблером (каталог сервера склеивается с конфигом, data/codex/CodexMcpSettings.kt).
  • Форма тестового вызова по inputSchema. Поля строятся из схемы инструмента: обязательные помечены и блокируют Run, enum — чипами, boolean — тумблером; сырой JSON остался фолбэком.

Changed

  • Терминальные шапки у диалогов Codex. FullScreenWindow умеет рисовать шапку как у экранов-маршрутов: codex@mcp: $, codex@features: $, codex@review: $, codex@terminals: $ — промпт с кареткой статуса, строка метрик и стрелка назад вместо заголовка с крестиком.
  • Экран MCP: одно обновление вместо двух, читаемый текст. Две одинаковые иконки «Reload config» и «Refresh statuses» слиты в одно действие (перечитать конфиг + статусы); объяснение «Как это работает» — карточка с пунктами контентного цвета (onSurface), описания серверов и инструментов больше не сливаются с фоном.

Fixed

  • Вводные тексты диалогов Codex не читались: MCP, Experimental features, Code review и Background terminals переведены с bodySmall + onSurfaceVariant на bodyMedium + onSurface (контраст WCAG AA).

0.8.91

23 сентября 2026

Added

  • Экран MCP в Codex-чате. Пункт меню треда открывает полноценный экран вместо диалога: серверы с состоянием, транспортом, версией и описанием из serverInfo, инструменты с описаниями и поиском, секция Disabled для выключенных серверов, тумблер mcp_servers.<name>.enabled (запись в config.toml через app-server + config/mcpServer/reload), Sign in для OAuth (mcpServer/oauth/login, ссылка копируется), тестовый вызов инструмента (mcpServer/tool/call) и раздел «What is MCP» с объяснением, как инструменты попадают в модель.

Changed

  • MCP: сервер y83, инструменты без префикса. serverInfo.name — y83 (был ws-backend), конфиг Codex — [mcp_servers.y83], имена инструментов — <группа>_<действие> без y83_: web_search, web_fetch, ai_ask, ai_vision, ai_export, ai_import, research, research_verify, status, bridge_command, dev_*. В модели видно mcp__y83__web_search вместо mcp__y83ws__y83_webget_search. Старые имена не поддерживаются: скиллы, доки и AGENTS.md обновлены, конфиг для удалённого туннеля генерируется как [mcp_servers.y83].
  • Мост: имена по пространствам. agents_config/agents_reload → chat_agents_config/chat_agents_reload, project_dbs/project_db_add/ project_db_remove → sqlite_dbs/sqlite_db_add/sqlite_db_remove (старые имена остались алиасами). Алиас cache ведёт на cache_dump (как bridge.sh cache), send — на codex_send (как bridge.sh send). app_commands стал полным: все 53 browser_* и прежде скрытые backend_control, vpn_restart, vpn_retry. Реестр имён вынесен в bridge/BridgeCommands.kt, инварианты держит BridgeCommandsTest.

Fixed

  • MCP-экран больше не показывает мусор. Выключенный сервер (pyjhora, enabled = false) уезжает в секцию Disabled вместо общего списка, а сервер, убранный из config.toml, исчезает из UI — раньше список склеивался со старым состоянием и записи висели до перезапуска. Инструменты читаются с описаниями, мёртвые модели CodexMcpStatusUi удалены.

backend 0.8.123

23 сентября 2026бэкенд

Changed

  • MCP-сервер представляется как y83 (serverInfo.name, было ws-backend), инструменты переименованы без дублирующего префикса: web_search, web_fetch, ai_ask, ai_vision, ai_export, ai_import, research, research_verify, status, bridge_command, dev_*. Старые имена отвечают подсказкой «инструмент переименован». Инвариант (нет y83_ в именах, serverInfo.name == "y83") держит internal/handlers/mcp/naming_test.go.

backend 0.8.122

23 сентября 2026бэкенд

Changed

  • English WebAI backend messages. Handler, chat metadata, attachment, folder/template and provider-facing errors are now English; legacy Russian error patterns remain recognized for classification.
  • Language-aware automatic titles. The title prompt explicitly follows the language of the first user message (Russian first message → Russian title), while manual and existing titles remain untouched.