y83 code / журнал

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

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

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

журнал

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

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

0.8.63

21 сентября 2026

Changed

  • Раздел «Заметки» переехал на общий язык приложения: терминальные шапки с градиентом (y83@notes, y83@notes/new, y83@notes/edit), моно-мета, секции // pinned, // notes, // actions, // sort, // tags, // attachments, английские подписи как в VPN и браузере
  • Список заметок: поиск с подсветкой совпадений и счётчиком найденных, чипы категорий, шторка фильтров (сортировка, теги, «только с вложениями»), карточки с монограммой, превью текста и первой картинки, mono-мета (#work · today 12:40 · 2 files · 128 words), пустые состояния с действием, действия — в шторке // actions вместо контекстного меню на карточке
  • Редактор: категория — чипы SelectChip вместо диалога, панель Photo · File · Checklist над клавиатурой и системным баром, вложения в секции // attachments, в шапке — состояние сохранения и счётчики слов/символов
  • Просмотр изображений: подложка scrim, шапка // viewer · 2/5, панель страниц и кнопки на токенах темы (без захардкоженного чёрного и белого)

Added

  • Автосохранение заметок: правки пишутся на диск через 1.5 с после последней правки, при уходе с экрана и по сворачиванию приложения — системный «назад» больше не теряет текст (раньше сохраняла только стрелка в шапке); индикатор в шапке: saving… / saved 12:34:05 / draft
  • Markdown-превью с интерактивными чек-листами: переключатель в шапке, тап по пункту - [ ] меняет состояние и сохраняет заметку; кнопка Checklist дописывает пункт в конец, курсор встаёт туда же
  • Теги из #хэштегов: выводятся из заголовка и текста, доступны в фильтрах
  • Экспорт и импорт: экспорт всех заметок в zip (notes/<date>-<slug>.md с front matter и папкой вложений), импорт zip/md/json через файловый менеджер (SAF); импорт всегда создаёт новые заметки
  • Send to agent: заметка открывается черновиком в поле ввода нового треда Codex (шит выбора агента, если их несколько); текст включает пути вложений, отправляет пользователь сам

Fixed

  • Удаление заметки отменяется: свайп влево и меню удаляют с снэкбарой Note deleted · Undo, файлы вложений стираются только после скрытия снэкбары
  • Кнопка «новая заметка» больше не уезжает под системный бар: FAB заменён на действие в шапке, список и пустые состояния учитывают навигационный бар
  • Метрики заметок не зависят от локали (today 12:40, 1.5 MB)
  • Превью картинок в списке декодируется с ограничением размера (без полного файла)

0.8.62

21 сентября 2026

Changed

  • Раздел VPN переехал на общий язык приложения: терминальные шапки с градиентом на всех экранах (промпты y83@vpn, y83@vpn/servers, y83@vpn/add, y83@vpn/edit, y83@vpn/apps, каретка = состояние соединения, мета «сервер · трафик · статус»); секции // server, // mode, // options, // settings, // import link
  • Главный экран VPN: вместо центрированного щита — компактная карточка-статус (LED, сервер, одна моноширинная строка метрик ↓/↑/аптайм из состояния сервиса, без локального таймера) и кнопка Connect/Disconnect, закреплённая над системным баром; режимы — чипы SelectChip; выбор сервера — bottom sheet с быстрым переходом к «Manage»
  • Список серверов: кнопка Add в шапке вместо FAB, карточки с монограммой и меню действий (Set as default / Copy link / Edit / Delete), пустое состояние с действием; Add/Edit — общая форма полей, Save закреплён над клавиатурой
  • Выбор приложений: выбранное читается бирюзовым бордером и галочкой (заливка primaryContainer убрана), счётчики групп 3/120, буквенный плейсхолдер иконок

Added

  • Индикатор живости туннеля: последняя проба через локальный SOCKS (tunnel: ok · 412 ms / no route) с ручным обновлением, пока экран активен и VPN подключён (раз в 20 секунд, без фонового шума)
  • Копирование hysteria2-ссылки сервера: VpnLinkParser.build (обратная к parse, roundtrip), long-press строки сервера, меню в списке и кнопка в шапке Edit

Fixed

  • Числа метрик больше не зависят от локали (точка вместо запятой), аптайм в терминальном виде MM:SS / H:MM:SS
  • Кнопка Connect/Disconnect и Save не уезжают под системный бар и клавиатуру (navigationBarsPadding + imePadding)

0.8.61

21 сентября 2026

Changed

  • Браузер переехал на общий язык приложения: терминальная шапка с градиентом как на главной (промпт y83@web, мигающая каретка состояния, мета-строка «домен · вкладки · загрузка»), нижняя пилюля адреса с замком и встроенным прогрессом, шиты с секциями // page, // search, // link, // data, // reset
  • Стартовая страница новой вкладки: монограмма, поисковая пилюля, плитки частых сайтов (3×2, из истории, при пустой истории — шесть сайтов по умолчанию) и закладки
  • Меню браузера вместо текстового «⋮»: desktop-режим, размер текста (85–130%), поисковик (Google / DuckDuckGo / Yandex), закладки, история с фильтром, сессии, очистка истории и cookies с подтверждением

Added

  • Copy link / Share / Open in browser — действия со ссылкой текущей страницы
  • Размер текста страницы (WebSettings.textZoom) и desktop-режим (UA настольного Chrome) — применяются ко всем вкладкам и запоминаются в prefs

Fixed

  • Нижний бар больше не уезжает под системный бар и поднимается над клавиатурой (navigationBars ∪ ime); контент страницы не заходит под бар (Scaffold без двойных инсетов)
  • Переключение вкладок реально меняет страницу: у каждой вкладки свой WebView, который не уничтожается при переключении (раньше на экране оставалась страница прежней вкладки), новая вкладка открывается на стартовой странице
  • target="_blank" и window.open открывают новую вкладку (раньше ссылка терялась)
  • browser_navigate по вкладке без WebView больше не теряет URL: он грузится при подключении вкладки; browser_get_state включает startPage/desktopMode/textZoom

Removed

  • Мёртвые импорты и код экрана браузера; pull-to-refresh убран (жест не доходил до WebView), обновление — кнопкой в пилюле и в шапке

0.8.60

21 сентября 2026

Added

  • Databases — полноценный SQLite-браузер: правка ячейки по rowid/первичному ключу (раньше WHERE собирался по первой колонке и менял не ту строку), догрузка строк, поиск по колонке с задержкой, вставка и удаление строк (с подтверждением), индексы и DDL в «Структуре», история SQL-запросов, экспорт CSV/JSON/SQL-INSERT файлом в Download/y83ws/db/
  • Свои базы приложения: y83-ws.db и y83-chat.db в секции // app — открываются локально и только для чтения (бэкенд их не видит), у каждой базы свой статус: размер, число таблиц, «нет доступа»
  • Тумблер read-only: встроенные базы (backend, opencode) открываются на чтение, добавленные вручную — на правку; выбор запоминается по пути

Changed

  • Список баз в стиле хаба: секции // built-in, // app, // saved, метрики в строке, поиск по списку, добавление базы с выбором файла в дереве Termux и проверкой до сохранения
  • Меню «Databases» в проектах Codex и opencode раньше ничего не открывало — теперь ведёт на общий экран баз

Removed

  • Diagnostics: раздел убран из хаба инструментов — «Check for updates» и «Export log» дублировали Updates и Logs, а статусы opencode/codex живут в Processes → Services

Fixed

  • Удаление — только после подтверждения: выбранные файлы, задачи и журнал планировщика, API-провайдеры, VPN/SSH-серверы (включая удаление свайпом), закладки и сессии браузера, изображения заметок; в SQL-табе DELETE/DROP/ALTER/UPDATE без WHERE спрашивают отдельно

0.8.59

21 сентября 2026

Changed

  • Токен-бар без лишних слов: в чате Codex подпись стала «42% · 54.0K/128.0K» — «Context» и «used» убраны, цифры те же
  • План не мелькает в ленте: пока ход выполняется, карточки плана в ленте нет (прогресс — в нижней полоске); она появляется готовой — с бейджем «Pending approval» в plan-режиме, компактом и «View plan» после хода
  • Окно «View plan» — до низа экрана: план открывается в окне, прижатом к низу и растянутом почти на всю высоту, тело скроллится (потолок 520dp убран)

Fixed

  • update_plan нового хода больше не клеится к плану прошлой задачи: шаги принимает только карточка одобренного плана, пока её ход не завершён; закрытый план новых шагов не тянет — у каждого плана своя карточка

0.8.58

21 сентября 2026

Changed

  • Шапка Codex-чата — градиентная: та же вуаль primary → surface и тонкий разделитель снизу, что на главной и в хабе инструментов (без плоской плиты)
  • Тумблеры build/steer у поля ввода больше не переносятся: ширина считается по самой широкой подписи при текущем шрифте и размере и общая для обоих тумблеров — «build» не уезжает на вторую строку, сосед не прыгает

0.8.57

20 сентября 2026

Added

  • Хаб инструментов в стиле главной: терминальная шапка y83@instruments с кареткой и строкой «N tools · M sections», секции в стиле // tools, // ai & agents, // security & network, // system, // app
  • Database: SQLite-браузер стал доступен из UI — экран Databases со встроенной ссылкой на backend-базу (~/.y83-ws/ws-backend.db) и списком добавленных баз, тап открывает таблицы, строки и экспорт
  • Tasks: реестр задач бэкенда — статусы running/completed/error/aborted, фильтры, pull-to-refresh, «Rescan registry» и Resume задачи с текстом
  • Tunnels: состояние reverse-туннелей по всем серверам сразу (локальный порт, reverse-канал, daemon codex, ошибка) + Open/Reconnect/Close, автообновление раз в 5 секунд
  • Diagnostics доступна из хаба (раньше — только long-press на главной)

Changed

  • Тайлы главной и хаб — один маршрут: quick access больше не держит свою таблицу переходов, любой пункт каталога открывается общим instrumentScreen(id) — новый инструмент не может «молча ничего не открыть»
  • Диалог добавления БД вынесен из экрана проекта в общий компонент, быстрые пути выбираются контуром primary (SelectChip) вместо заливки

0.8.56

20 сентября 2026

Changed

  • Главная без пилюль в шапке: статусы агентов, VPN и туннелей больше не удлиняют шапку — высота снова совпадает с остальными экранами, а сами состояния живут в меню «…» строками с точкой (появляются только когда есть что показать)
  • «Включено» — точкой и иконкой, без заливки: активные тайлы и карточки больше не заливаются бирюзовым — фон остаётся нейтральным, состояние читается цветной точкой статуса и акцентной иконкой (главная, VPN, проекты Codex); выбор сервера/режима в VPN — бирюзовый контур 2 dp без смены фона
  • Карточки агентов в два раза плотнее: убраны описание и ряд чипов, осталась одна строка tagline, паддинг 12 dp — Codex и OpenCode помещаются на экран
  • Спокойные кнопки действий: Start/Stop и Connect/Disconnect — контурные вместо цветных заливок; смена бэкенда/туннеля по-прежнему читается по точке статуса

Added

  • Секция «// agents» на главной — единый стиль с quick access и remote agents
  • Пустое состояние главной: если в настройках скрыто всё, вместо пустого экрана подсказка с переходом в Home settings
  • Анимация нажатия карточек: тайлы, карточки агентов и remote-серверов «вдавливаются» с единой пружиной

Removed

  • Мёртвый hero-блок главной (показывался только при полностью пустой сетке и дублировал метрики шапки)

0.8.55

20 сентября 2026

Changed

  • Главная: «включено» — заливкой, а не рамкой: активный тайл (VPN) и карточка запущенного агента подсвечиваются мягкой тональной заливкой без бирюзового контура, статус читается точкой и подписью; тот же язык — на экранах VPN и в списке проектов Codex
  • Quick access: крупные иконки без плашек: иконка тайла 22 → 32 dp, высота тайла 96 → 88 dp; у неактивных тайлов осталась только тонкая нейтральная рамка
  • Шапка главной: статусные пилюли: агенты, VPN и туннели вынесены из строки метрик в пилюли с точкой состояния; в меню «…» добавлен пункт Home settings
  • Один баннер вместо пяти красных «OFF»: при недоступном бэкенде тайлы больше не красятся, над сеткой появляется строка «Backend offline» с кнопкой Setup

0.8.54

20 сентября 2026

Fixed

  • Терминал больше не угадывает жест: в обычном shell свайп снова листает локальный буфер termlib (плавно, с инерцией; выделение — долгим тапом, с лупой и Copy). Раньше перехват на Initial-проходе с consume() скрывал движение от termlib: он принимал свайп за тап (вылезала клавиатура) и при удержании включал своё выделение — отсюда «копирование строки», плашка [N/M] и хаос с tmux copy-mode
  • Артефакты при входе и клавиатуре: сетка эмулятора синхронизирована с PTY — в чат-режиме tmux больше не рисует 50 строк в старую сетку терминала и не забивает скроллбек мусором; window-change уходит с коалесингом (первый сразу, промежуточные — нет), после смены размера tmux получает refresh-client — полный репеинт клиента без обрывков прежней отрисовки
  • Клавиатура не трясёт терминал: в терминальном режиме нижний IME-инсет применяется «по затишью» (~140 мс) — высота меняется один раз вместо кадров анимации, tmux и сетка не ресайзятся десятки раз

Changed

  • Скролл в TUI — программе: при активной TUI (mc, htop, less) поверх терминала слой жестов, который владеет свайпом целиком: колесо с координатой клетки под пальцем + инерция после отпускания; без tmux (bare sshd) — PgUp/PgDn. Локальный скролл в TUI не конфликтует с программой
  • Диагностика моста: app_shell {action:"pane"|"scroll"|"repaint"} — геометрия панели и эмулятора, copy-mode, колесо с клеткой, полный репеинт
  • Окружение раздачи: opencode 1.18.31 (кеш транспайлера Bun отключён в launcher’е), codex 0.155.1, backend свежей сборки (автоинкремент); в deploy.sh добавлена публикация env-компонентов (scripts/publish-opencode.sh, scripts/publish-codex.sh) — один Release to server заливает всё

0.8.53

20 сентября 2026

Changed

  • Шапка тредов — codex@threads: $ — как в проектах, но без имени проекта в шапке: промпт с мигающей кареткой, метрика N threads (плюс состояние offline / connecting… / agent disabled); справа только + и меню ⋯
  • Меню ⋯ в шапке вместо ряда иконок — обновление, архив (переключатель с галочкой), Git и Servers; в проектах меню из Refresh и Server files; плавающая кнопка + убрана — создание треда/проекта в шапке, обновление ещё и жестом pull-to-refresh
  • Карточки тредов в стиле проектов — сквиркл-плитка 44dp с буквой, статус хода в плитке (спиннер / ⏳ ждёт ответа / ⚠ stuck) вместо нижней полоски прогресса, мета updated 5m · working и превью строкой ↳ …
  • Чистка — удалён неиспользуемый ThreadMonogram и slug промпта, глиф плитки общий для проектов и тредов (tileGlyph)

0.8.52

20 сентября 2026

Changed

  • Раздел «Проекты» Codex — шапка как на главной — вместо TopAppBar промпт codex@projects: $ с мигающей кареткой (зелёная при живом app-server, янтарная connecting…, красная offline), метрика 25 threads · 4 projects; отдельный ряд «● N threads» под шапкой убран — счётчик переехал в шапку
  • Список проектов в терминальном стиле — слим-заголовок // projects · N, проекты с работающими тредами поднимаются наверх, карточки: сквиркл-глиф (~ для домашней папки), моно-имя, путь через ~, метрики 12 threads · updated 5m, LED-пульс N running, превью строкой ↳ …
  • Список тредов проекта — шапка codex@<проект>: $ с метрикой N threads · <проект>, моно-секции // today · 3, слим-поле поиска, карточки-ряды с LED и статусом WORKING вместо мигающей точки
  • Общие компоненты — TerminalHeader/TerminalCaret/PulsingLed и SectionHeader вынесены в ui/components; главная и разделы Codex используют одну шапку

0.8.51

20 сентября 2026

Changed

  • Шапка главной: статус — кареткой — плашка online/offline убрана; каретка после y83@code:~$ мигает зелёным при живом бэкенде, янтарным во время setup и красным без соединения; в строке метрик состояние дублируется текстом offline / setting up… (не только цветом)
  • Главная в стиле терминала — Quick access без внешней карточки: слим-заголовок // quick access, плоские тайлы 4 в ряд (сквиркл-иконки, моно-подписи, статус только по делу: VPN ON, OFF при обрыве бэкенда), воздух от шапки 16dp
  • Блоки агентов и Remote на главной — единый язык: LED-статус (RUNNING · PID, CONNECTED), моно-имена в сквирклах, иконочные Start/Stop, описание агента в 2 строки, у Remote убраны бейджи ON/OFF, секция // remote agents

0.8.50

19 сентября 2026

Fixed

  • Ходы не теряют команды и user-сообщения — уведомление turn/completed у app-server 0.154 приходит без тела: приложение больше не затирает живой состав тонким серверным, а дотягивает канонический ход со страницы thread/turns/list itemsView=full (полный состав и серверный порядок). Богатое тело никогда не понижается, WAL чистится только после канона
  • Счётчики «Done» совпадают с лентой — сводка пересчитывается из фактического состава блока: read-команды считаются reads, а не cmds (было «33 cmds» при 24 командах и 9 чтениях)

Changed

  • Карточка плана: закрытые планы (Done/Closed) — компактная шапка (название + бейдж + View plan), план открывается в окне (markdown, чеклист, Copy); счётчики шагов из шапки убраны, неотмеченные шаги — строкой в окне; фон карточки тёмный у всех статусов

0.8.49

19 сентября 2026

Fixed

  • Git: галки в Changes теперь решают состав коммита — коммит шёл git commit -a и нёс все tracked-изменения, снятые галки ничего не меняли. Теперь выбранные файлы идут в git add, снятые (уже лежавшие в индексе) — в git reset, сам коммит — без -a
  • Git: список изменений больше не теряет застейдженные файлы — список строится по git status --porcelain=v1 -z -uall, а не по git diff --numstat (тот видел только unstaged); файл, куда только дописали строки, больше не попадает в раздел «Added» (раздел определяется XY-статусом, а не эвристикой)
  • Git: diff-вьюер оформлен как git diff — номера строк берутся из заголовков хунков (пусто вместо «0»), знак +/- больше не дублируется, хунки — отдельными полосами, один горизонтальный скролл на весь список (длинные строки не режутся), служебные строки свёрнуты в шапку (new file / deleted file / mode / binary)
  • Git: untracked-файлы открываются — содержимое показывается как diff «нового файла» (git diff --no-index, индекс не трогается); обычный и застейдженный файл открывается через git diff HEAD (fallback --cached для репозитория без коммитов)

Added

  • Git: кнопки выбора в шапках разделов — «Add all» у untracked, «All/None» у Modified/Added/Deleted; выбранные строки подсвечиваются, внизу счётчик «N из M выбрано», в шите коммита — список выбранных файлов
  • Git: кнопка «О репозитории» рядом с веткой: путь (с копированием), корень репозитория, ветка + upstream и ahead/behind, remote URL с маскировкой креденшелов, последний коммит, число коммитов, сводка изменений и stash. Путь убран из шапки — она снова двухстрочная, как в остальных экранах
  • Git: раздел Conflicts — конфликты видны отдельно, коммит при них заблокирован
  • Git: «Показать ещё 30» во вкладке Commits; файлы коммита разбираются через --numstat + --name-status (пробелы в путях больше не ломают список)

Changed

  • Git: секции и бейджи на тематических токенах (success/warning/error/diff, контраст ≥ 4.5:1) вместо жёстко заданных hex-цветов

0.8.48

19 сентября 2026

Fixed

  • VPN больше не «умирает тихо»: реконнект обёрнут в try/catch + CoroutineExceptionHandler, после быстрых попыток (1/2/4/8/16 с) включается медленный режим (раз в 60 с) — сервис не останавливается и не пропадает из UI (разбор логов 18.09: :vpn умирал после сетевого перехода и ждал ручного подключения)
  • Готовность туннеля вместо «процесс запущен»: после старта hysteria2 проверяются SOCKS5 и реальный трафик через туннель; раньше «connected» ставился сразу после exec(), отсюда ложные «auto-reconnected successfully» и шторм рестартов каждые ~3 с («no such host», лог 17.09)
  • WiFi-флап больше не рвёт туннель: при смене сети сначала проба — если туннель жив, ничего не перезапускается; реконнект стал мягким (перезапускается только hysteria2, TUN и tun2socks остаются поднятыми — утечек нет, соединения не рвутся)
  • Пре-флайт DNS: перед стартом ждём validated-сеть и резолв хоста сервера — убирает «lookup info.y83.ru: no such host» при переключении WiFi
  • Устаревший watcher процесса hysteria2 игнорируется (поколения) — убирает лишний реконнект сразу после успешного восстановления

Changed

  • Kill switch без root убран: ip rule/ip route на устройстве не работают (Permission denied), в лог писалось «activated»; теперь роль kill switch выполняет постоянно поднятый TUN — при обрыве трафик не утекает
  • Состояние Reconnecting (номер попытки + причина) вместо красного Error и кнопка Retry now на экране VPN
  • Восстановление после перезапуска сервиса системой: START_STICKY + сохранённое «желаемое состояние» — VPN поднимается сам (в т.ч. при always-on VPN)
  • Ядро hysteria2 обновлено v2.5.1 → v2.12.3 (upstream помечал апдейт urgent)
  • Логи разделены: процесс :vpn пишет в log-vpn.txt, читается через app_log {file:"vpn"} — строки двух процессов больше не перемешиваются

Added

  • Команды моста vpn_retry и vpn_restart (мягкий рестарт hysteria2) для диагностики

0.8.47

19 сентября 2026

Changed

  • Шапка главной в стиле terminal prompt: моноширинный промпт y83@code:~$ с мигающей кареткой и чипом статуса (online/offline/setting up), ниже строка метрик — версия, версия бэкенда, агенты, VPN, туннели; каретка мигает только на активном экране и уважает reduce motion
  • Хаб инструментов — единый реестр: состав и порядок разделов задаёт InstrumentCatalog (Tools → AI & Agents → Security & Network → System → App); Browser, Файлы и Shell Chat переехали из верхнего меню в хаб (раздел Tools), Policies — к агентам, Changelog появился в хабе
  • Новые итемы хаба автоматически попадают на главную: тайлы и список Home Settings строятся из каталога, названия и иконки больше не хранятся в конфиге — переименование пункта подтягивается само
  • Шестерёнка в карточке тайлов работает: открывает Home Settings (раньше была декоративной); сама карточка больше не дублирует статус

Removed

  • Иконки Browser/Файлы/Shell Chat из верхней панели главной (доступ — хаб и тайлы)
  • Пункт «Instruments» из меню ⋮ (в шапке осталась кнопка хаба)

Fixed

  • Статусные цвета (онлайн/в процессе) больше не хардкодятся: токены темы semanticSuccess/semanticWarning с контрастом ≥ 4.5:1 в тёмной и светлой теме

0.8.46

19 сентября 2026

Changed

  • Ответы инструментов больше не обрезаются: веб-ИИ (webai_ask) и поиск (webget_*) отдают полный текст — жёсткие лимиты убраны (раньше терялась середина ответа, а JSON ломался)
  • Логи читаются хвостом: app_log {lines=200, q, skip} — по умолчанию последние 200 строк, skip уходит вглубь истории; в ответе totalLines, fileBytes, returned — сразу видно масштаб лога
  • Чат форматирует вывод под ширину карточки: размер панели tmux задаётся явно (window-size manual + resize-window) — раньше клиентский window-change не доходил, панель оставалась 75–80 колонок, и ls рвался в ленте на 1–2 файла в строке
  • Терминал: свайп листает историю: mouse on + колесо в SGR — shell уходит в tmux copy-mode, TUI-программы (mc/htop) скроллятся сами; плашка «↑ N/M» с кнопкой «вниз» (выход из copy-mode)
  • Вывод шире бабла не переносится: горизонтальный скролл внутри карточки (переключатель «Перенос» в настройках остался; старый дефолт мигрируется один раз)

Fixed

  • Палитра ANSI под тему: базовые 16 цветов (ls, git) затемняются/осветляются под фон карточки — контраст ≥ 4.5:1 (WCAG AA)
  • Лента не тормозит на больших выводах: рендер строк кэшируется по данным и теме
  • Буфер вывода 800 → 5000 строк + плашка «вывод большой — сохранены последние»
  • Промпт не протекает в ленту: фильтр ловит и user@host:~$ команда без OSC 133-маркера
  • «Hist» в панели доп. клавиш: история панели (2000 строк) в общем вьюере вывода
  • Ход больше не обрывается сам: svreg не убивает живой codex app-server — занятый порт либо принимается на сопровождение (adopt), либо старт отказывается; выход/своп бэкенда не останавливает автостарт-сервисы; при быстрых падениях анти-шторм (три подряд → пауза 5 мин), health-проба не убивает сервис с одного промаха
  • Send у карточки вопроса работает: один requestId — одна карточка (дубли «кадр + нотификация» схлопываются, async-вопросы больше не занимают живой id=0); ответ уходит кадром, пока requestId живой; повторные тапы не превращаются в пачку сообщений (было 29 дублей); Dismiss закрывает все копии
  • Лента не «откатывается» посреди хода: план/сводка встают в блок хода хронологически (команды больше не оказываются сверху карточки); порядок не меняется при апдейте снапшотов (сохраняется время первого появления); вход в тред всегда на хвосте (анкер и «заморозка» — в границах треда); стадия в WorkingBar считается по полной ленте; дельты без карточки ретраятся
  • Adopt не цепляет чужой процесс: пид-файл принимается только если живой процесс совпадает с командой сервера (переиспользованный PID больше не «усыновляется»); у свапа бэкенда есть жёсткий режим SWAP_STOP_MODE=kill9 — обновление бэкенда не рвёт живую сессию агента (проверено: codex пережил свап, adopted=true, рестартов 0)

0.8.45

19 сентября 2026

Changed

  • Лента shell-чата — «минимал-терминал»: команда — компактный чип справа ($ в primary, monospace, до 4 строк), вывод — карточка слева без мета-чипов («N строк», «exit 0», «нет вывода» больше не показываются); статус — иконкой: спиннер / ✓ / ✗ с кодом только при ошибке / «прервано»; пустой успешный вывод не рендерится; отступы по сетке 4dp (16/12/8)
  • TUI больше не сыплет сырой экран в ленту: mc/htop показываются плашкой «TUI — вывод в терминале» с кнопкой «Открыть»; в транскрипт сохраняется пометка, а не скроллбек (старые записи чистятся кнопкой «Очистить чат»)
  • Автоскролл: пока пользователь у низа, лента догоняет новые строки и рост живого вывода без анимации; отлистал вверх — слежение выключается, FAB показывает счётчик новых строк; отправка команды и вход в чат — сразу к низу
  • Режимы «Чат/Терминал» — иконки-сегменты вместо текстовых чипов (выбранная — бирюзовый бордер primary); точка на иконке терминала при активной TUI; индикатор pipe/pty убран из бара (остался в настройках)

Fixed

  • «Показать все» учитывает системный навбар: контент и FAB не залезают под нижнюю панель (WindowInsets.safeDrawing); «Перенос» переехал в шапку иконкой; FAB «в начало/в конец» показываются по необходимости; шапка — «N строк · выполняется… · код N»
  • Скролл в TUI (mc/htop) работает: tmux больше не отдаёт клиенту границы alt-screen (smcup@/rmcup@) — TUI рисуется в панели, а жест скролла листает скроллбек терминала; override досыпается и на живой сервер tmux
  • Вывод в чате переносится ровно по баблу: колонки PTY считаются от ширины карточки (Row/Surface/Column), а не от ширины экрана, — ls больше не ломает столбцы двойным переносом
  • Публикация ленты не гоняется с reader-потоком SSH: методы AnsiTextBuffer синхронизированы — ConcurrentModificationException в snapshot() больше не рвёт вывод

0.8.44

19 сентября 2026

Added

  • Экран вывода вместо нижнего листа: «показать все» открывает отдельный полноэкранный экран (назад, «Перенос», «Копировать всё», к началу/в конец); горизонтальную прокрутку держит один контейнер — конфликты скролла ушли, живой вывод обновляется из ViewModel, пока команда выполняется
  • zsh-подобный ввод: ghost-подсказка из истории (серый суффикс, кнопка «→»), история команд хранится по target (200 записей, без подряд идущих дубликатов) и переживает перезапуск приложения; подсветка ввода: команда/флаги/кавычки/ операторы/переменные/пути
  • Мост: app_shell {action:"feed"} — лента из Room, action:"history" — история команд target (E2E-проверки без ручных действий)

Changed

  • Лента: вход в чат сразу показывает последние сообщения; кнопка «вниз» со счётчиком новых; у команд время и статус, упавшие — на errorContainer; чипы «N строк» и «exit N»; старые пары (кроме последних 6) сворачиваются в одну строку и разворачиваются тапом

0.8.43

19 сентября 2026

Fixed

  • Чат не включался (pipe-pane никогда не вставал): bootstrap запускал tmux new-session -d -A — на существующей сессии -A игнорирует -d и аттачится, блокируя exec-канал: pipe-pane, attach и exit 0 не выполнялись, чат жил на PTY-фолбэке. Теперь has-session → сессия создаётся только при отсутствии, pipe-pane переустанавливается на каждом коннекте (повторный вызов заменяет пайп), лог чата усекается — лента стартует с чистого листа
  • Команда навсегда «running» после выхода из mc/htop: маркер 133;D приходил от PROMPT_COMMAND раньше, чем проба (раз в 1 с) замечала выход из TUI, и глотался на паузе парсера. Теперь маркеры читаются и при активном TUI, плюс страховка: тишина 2.5 с после выхода из TUI закрывает команду
  • Промпт [user@host ~]$ больше не течёт в ленту: CR-перерисовки tmux (CR без LF) сбрасывают строку промпта; после пустой строки эхо-фильтр не съедает следующий вывод
  • Health-check pipe-pane: если проба видит pane_pipe=0, пайп переустанавливается автоматически (кулдаун 15 с) — без фолбэка на PTY
  • Переносы ls в чате: ширина символа калибруется замером Compose-текста тем же стилем, что рендерит бабл (android.graphics.Paint давал расхождение); убран мёртвый дубликат resizeForTerminal
  • Кнопка «вниз» докручивает циклом с ожиданием кадра — до конца длинного бабла, а не до его верха

Changed

  • Полноэкранный просмотр вывода: «показать все» открывает лист на 92% высоты с выделением и копированием текста, кнопкой «Копировать всё» и тумблером «Перенос»; в режиме без переноса строки скроллятся синхронно
  • Доп. клавиши: первый ряд закреплён (Esc, Tab, Ctrl, Alt, стрелки, Enter — делят ширину поровну), второй прокручивается (Shift, клавиатура, F1–F12, PgUp/PgDn, Home/End, C-c/C-d/C-z/C-l, Paste); снизу — тонкий переключатель «свернуть/развернуть»

0.8.42

19 сентября 2026

Fixed

  • Чат: вывод команды больше не разъезжается — tmux съедает OSC 133-маркеры (проверено: напрямую bash их отдаёт, через tmux в PTY они не приходят), поэтому чат жил без маркеров: в ленту попадала строка промпта [user@host ~]$, «done» определялся таймаутом 3 с, exit-код терялся. Теперь чат читает поток панели: bootstrap включает tmux pipe-pane -O → chat.log, приложение читает его через tail -F (отдельный долгоживущий exec-канал). Маркеры, цвета и echo приходят как есть, без перерисовок экрана
  • Кривые переносы ls: ширина PTY в чате была жёстко 200 колонок, а бабл показывает ~45 — вывод форматировался под 200 колонок и ломался и в чате, и потом в терминале. Теперь ширина PTY считается по ширине бабла и шрифту (Авто/80/120/200 в настройках), а при входе в терминал размер принудительно синхронизируется с вьюпортом
  • Кнопка «вниз» не доскролливала до конца: animateScrollToItem(last) ставил верх последнего (длинного) бабла. Теперь скролл добирает остаток по layoutInfo — и в авто-скролле, и в кнопке
  • Фолбэк чата на PTY: активность pipe-pane проверяется пробой (#{pane_pipe}), а не таймаутом — долгая команда без вывода больше не переключает источник
  • Строка промпта без маркера (перерисовка tmux) больше не попадает в вывод чата

Changed

  • Длинный вывод в чате сворачивается до 12 строк с кнопкой «ещё N строк · показать все» (полноэкранный просмотр); восстановленные из истории баблы тоже ограничены — лента не растягивается на экраны
  • В строке режима — бейдж источника вывода: pipe (поток панели) или pty (фолбэк, маркеры могут теряться)
  • Настройки shell-чата (шестерёнка рядом с «Обновить»): шрифт чата 10–16sp, ширина вывода (Авто/80/120/200), перенос длинных строк, шрифт терминала 7–24sp (сохраняется), клавиатура при входе, статус sshd/ключа, «Подготовить Termux», «Перезапустить tmux», «Очистить ленту», «Копировать лог»
  • Ротация chat.log: в TUI раз в минуту, в чат-режиме при перерасходе 20 МБ

Added

  • Мост: app_shell {action:"chat_source"} и {action:"restart_tmux"} для E2E
  • Тесты парсера: поток tmux pipe-pane и строка промпта без маркера (перерисовка)

0.8.41

18 сентября 2026

Fixed

  • Панель доп. клавиш: модификаторы больше не залипают навсегда — CTRL/ALT/SHIFT после тапа действуют на одну следующую клавишу и сбрасываются (как в termlib KeyboardHandler). Раньше после тапа CTRL все клавиши уходили с модификатором (ESC[1;5A и т.п.), TUI-программы такие последовательности игнорируют — и выглядело это как «кнопки не работают». Долгое нажатие фиксирует модификатор (рамка primary + подсказка «Зафиксировано: CTRL» в строке режима)
  • Ложный tui=true сразу после коннекта/реконнекта: проба tmux различает «tmux нет вовсе» (notmux) и «tmux есть, сессия ещё поднимается» (waiting). Раньше no server running уводило сессию в фолбэк на alt-screen, а smcup самого tmux-attach давал ложный TUI и переключение экрана туда-обратно
  • Мигание «чат↔терминал» при живом TUI: переход «TUI завершился» применяется только после двух одинаковых чтений пробы — одиночный сбой пробы больше не гасит TUI-режим
  • Команда из чата при активном TUI больше не уходит в TUI-программу как нажатия: поле ввода блокируется с подсказкой «Идёт TUI-программа — ввод в терминале», а сессия помечает такую команду статусом TUI

Changed

  • Панель доп. клавиш удобнее: чипы 40dp вместо 30dp, порядок Esc/Tab/CTRL/ALT/SHIFT/стрелки/Enter/КЛАВ, авто-повтор стрелок при удержании, тактильный отклик, кнопка «КЛАВ» (показать/скрыть экранную клавиатуру) и сворачивание панели в один ряд (выбор запоминается)
  • При возврате из TUI в чат сетка эмулятора возвращается к чат-размеру вместе с PTY — эмулятор и PTY больше не расходятся до первого ресайза

Added

  • Отладочные действия моста app_shell {action:"emukey"} и app_shell {action:"emuchar"} — отправка клавиши/символа через эмулятор termlib (тот же путь, что у кнопок панели) для E2E-проверки из моста

0.8.40

18 сентября 2026

Added

  • Shell Chat: терминал переведён на org.connectbot:termlib (libvterm) — полноценный TUI вместо самописного ANSI-эмулятора: mc, htop, vim, less рисуются и принимают ввод; скроллбек, выделение с лупой, зум и гиперссылки — средствами termlib
  • Панель доп. клавиш терминала: Esc/Tab/стрелки/PgUp-PgDn/Home/End/F1–F12 и Ctrl-сочетания (C-c/C-d/C-z/C-l/C-a/C-e), залипающие CTRL/ALT/SHIFT
  • Долгоживущая проба tmux (alternate_on|pane_current_command) определяет TUI внутри tmux-сессии; без tmux — по alt-screen. Пока TUI активен, чат-парсер на паузе — кадры TUI не сыплются в ленту

Changed

  • Shell Chat — единственный экран shell: отдельный экран Terminal убран с главной (тайл дашборда «Shell Chat» ведёт в чат); переключатель «Чат | Терминал» и текущая сессия вынесены в отдельную строку под топбаром
  • Нижние панели Shell Chat учитывают системный навбар и IME (WindowInsets.safeDrawing): поле ввода поднимается над клавиатурой, доп. клавиши не уезжают под системную панель; мягкая клавиатура в терминале показывается по тапу, а не при входе
  • Авто-скролл ленты — только когда список у нижнего края (плюс кнопка «вниз»); выход из shell/tmux переоткрывает сессию без красной ошибки «Соединение закрыто (код 1)»

Fixed

  • Ложный tui=true после реконнекта (tmux-attach шлёт alt-screen) и залипание в терминале при отказе пробы: проба переоткрывается с backoff, при недоступности — fallback на alt-screen сканер
  • JSchException: channel request: timeout от частых exec-каналов пробы: теперь один долгоживущий канал на сессию вместо канала на каждый опрос

0.8.39

18 сентября 2026

Changed

  • Тулчейн обновлён до актуального: Kotlin 2.0.21 → 2.4.20, AGP 8.5.2 → 9.3.3, Gradle 8.10.2 → 9.6.1, KSP 2.0.21-1.0.28 → 2.3.12, Compose BOM 2024.09.03 → 2026.09.00 (ui 1.7.3 → 1.12.1, material3 1.3.0 → 1.4.0)
  • compileSdk/targetSdk 34 → 37; в манифест добавлен ACCESS_LOCAL_NETWORK (доступ к LAN-устройствам по HTTP/SSH; loopback 127.0.0.1 разрешения не требует), явный enableEdgeToEdge() в MainActivity
  • ACCESS_LOCAL_NETWORK запрашивается в рантайме только если платформа его реально объявляет (getPermissionInfo + protection level): на Android 16 «local network protection» включена не на всех сборках, там разрешение не dangerous и запрос возвращает мгновенный отказ без диалога — в этом случае приложение молчит, LAN не ограничен
  • Room 2.7.1 → 2.8.5, kotlinx-serialization-json 1.7.3 → 1.11.0, activity-compose 1.9.3 → 1.13.0, lifecycle 2.8.7 → 2.11.0, core-ktx 1.13.1 → 1.19.0
  • kotlinOptions { jvmTarget } → kotlin { compilerOptions { … } } (DSL KGP 2.4)
  • AGP 9: временные opt-out android.newDsl=false, android.builtInKotlin=false (снимаются отдельным этапом); org.gradle.configureondemand убран

Fixed

  • Убран недостижимый бранч is CodeBlockSpan внутри when (span.style) в ui/chat/Markdown.kt: Kotlin 2.4 сделал «check for instance is always false» ошибкой компиляции. Поведение не менялось — код был мёртвым (span.style: Int)

0.8.38

18 сентября 2026

Fixed

  • Stop больше не стирает содержимое хода: сервер отдаёт interrupted-ход без тела (items пустые/частичные), и материализация заменяла им живой ход, а журнал чистился — «нажал стоп, и всё пропало». Теперь при пустом/бедном серверном составе (и статусе не completed) блок хода собирается из локального (лента/журнал): preferLocalTurnBody, маркер TURN_BLOCK_LOCAL; страница turns/list тоже не подменяет такой блок более бедной версией
  • Updates показывает Install и при том же versionCode: раньше условие было manifest.versionCode > installed — пересборка внутри тех же суток (versionCode не растёт, чтобы не выбивать configuration cache) была неустанавливаемой. Теперь кнопка появляется и когда versionCode тот же, но sha256 установленного APK ≠ sha256 из манифеста (строка «rebuilt, same versionCode»)

Changed

  • docs/tech/codex-turn-blocks.md §9 — прерванный ход и локальная канонизация состава

0.8.37

18 сентября 2026

Changed

  • Вход в тред не перекачивает то, что уже в Room: сверка идёт дешёвой thread/turns/list {itemsView:"summary"} (~2 КБ/ход, 60 ходов): ходы, которые уже канонично лежат в Room (turnId+status блока), не тянутся, inProgress ведёт live-слой. Курсор «показать старые» берётся из позиционирующей summary-страницы длиной prefix — он встаёт ровно на границе загруженного, поэтому дыры в ленте невозможны
  • Страница измеряется бюджетом элементов, а не «восемью ходами»: на длинных ходах 8 ходов перелетали окно в разы (замер 18.09.2026: 843 КБ там, где окну нужно ~300 элементов). Вход добирает до ENTRY_ITEM_BUDGET = 400 элементов (кап 8 ходов), «показать старые» — до 100 элементов (кап 3 хода), лимит считается по факту: первая страница — 1 ход, дальше по средним элементам на ход. Короткое окно при живом Room добирается локальной гидрацией, сеть для этого не нужна
  • Диагностика: маркер PAGE_FETCH {prefix, unknown, pages, turns, items, needItems, cursor} в timeline; OLDER_FETCH/OLDER_PREFETCH показывают ходы и элементы, а не только страницы
  • Решение по thread/items/list: полный переход на поэлементную пагинацию не делаем — замер показал тот же объём байтов, а ходов-гигантов в базе нет (максимум ≈250 элементов). Триггер возврата зафиксирован в docs/tech/codex-turn-blocks.md §6

0.8.36

18 сентября 2026

Changed

  • Текстовые фолбэки user-эха убраны: замер 18.09.2026 показал, что живое эхо userMessage всегда несёт наш clientId (u-… при отправке и steer, a-… при ответе-сообщением), поэтому копия ищется только по точному id — в том числе в полном списке (сообщение, отправленное при замороженном окне). Удалены pendingAnswerEchoes (фильтр эха ответов по тексту) и подстановка echoCid по lastUserText в журнал событий
  • Диагностика: маркер USER_ECHO_NO_CID в timeline и логе — если сервер когда-нибудь пришлёт user-эхо без clientId

0.8.35

18 сентября 2026

Changed

  • Активный ход сеется настоящими id: thread/resume для незавершённого хода отдаёт позиционные item-N, а thread/items/list — те же элементы с настоящими id (rs_resp_*, call_*), и это ровно те id, что приходят в live-событиях. При входе элементы активного хода теперь берутся из items/list, поэтому привязка страница↔live по тексту и remapSyntheticToLive удалены; liveAlias остался только для эха user-сообщения и склейки reasoning-чанков
  • Диагностика: маркеры SEED_ITEMS/SEED_MISS в timeline вместо ITEM_REMAP/ALIAS_MISS; codex_state больше не показывает счётчики контентного матча

0.8.34

18 сентября 2026

Changed

  • Live-лента без полного пересбора на каждом событии: карточка Turn changes, сводка хода и план больше не прогоняют ленту через commitItems (дедуп + порядок + склейка) — карточка обновляется на месте или один раз вставляется в конец блока своего хода, а инвариант «окно — непрерывный суффикс» держат чистые функции (CodexFeedWindow.kt). Полный пересбор остался только на сборке ленты: вход в тред, догрузка старых, откат хода
  • User-сообщение живёт под clientId: страница незавершённого хода отдаёт позиционные item-N, но у реплики есть clientId (наш u-…) — id теперь общий, и подбор «слота» для user больше не нужен. Для остальных видов живого хода привязка страница↔live идёт по содержимому (текст, команда, файл), а не по позиции; несовпавшие события видны как synthLiveMiss/ALIAS_MISS
  • Диагностика: codex_state и codex_order_check показывают aliasBound/synthLiveMiss; окно вне видимого списка обновляется без пересборки окна (меньше поводов для перестановок и лишней работы)