y83 code / журнал

Журнал релизов 0.7: часть 2 из 4

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

записей в ветке
102
приложение
18
бэкенд
0
архив сборок
84
период
18 августа 2026 — 29 августа 2026
страниц
2 из 4

журнал

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

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

0.7.21-260826-1048

26 августа 2026архив

  • Шапка тредов: убран префикс «Threads ·», осталось только название проекта — мельче, в одну строку, с многоточием при переполнении.
  • Лента отчётов сгруппирована по треду: раскрывающиеся карточки с названием задачи, числом этапов и датой последнего; внутри — «Stage N» с датой, длительностью и просмотром. Файлы отчётов теперь содержат threadId в имени.
  • Отчёт хода: добавлены «План хода» и все «Ответы агента» по порядку (раньше был только последний ответ); «Задача» не пишется пустой — fallback на план хода при служебных «го/обнови/…»; команды без подряд идущих дублей.

0.7.20-260826-0625

26 августа 2026архив

  • Убран дубль прогресса в ленте: пустой бабл «writing…» (стриминг ещё не пришёл) больше не рисуется в списке сообщений — индикатор активного хода только в WorkingBar над формой ввода.
  • WorkingBar: добавлена иконка этапа (терминал для команды, карандаш для ответа, «думает» в остальных случаях) и счётчик «в очереди: N» при нескольких отправленных сообщениях.

0.7.20-260826-0523

26 августа 2026архив

  • Определение карточки чтения переведено на серверный маркер commandActions[].type == "read" (с path из объекта действия) — без эвристик по тексту команды. В live тип уточняется на завершении хода: placeholder CommandExec пересоздаётся в ReadFile по ключу из item/completed.

0.7.20-260826-0511

26 августа 2026архив

  • Фикс детекта чтений: read-команды с префиксом cd <путь> && … / cd <путь>; … (как идут реальные команды агента) теперь распознаются как карточка ReadFile — префикс cd срезается до проверки. Работает и в live, и при перезаходе из истории.

0.7.20-260826-0502

26 августа 2026архив

  • Новая карточка чтения файлов: read-команды (cat/head/tail/sed -p/…) и tool read/read_file выводятся компактной карточкой ReadFile с путём, командой и превью вывода (≤300 символов) вместо сырого JSON/UnknownItem. Работает и в live, и при перезаходе из истории (пагинация).
  • Сервисные типы истории (webSearch, dynamicToolCall/collabAgentToolCall, subAgentActivity, sleep, hookPrompt, review-режимы, applyPatch, localShell, webFetch/httpRequest, rerunThread, agentCommand/forkThread) выводятся понятными строками (Info) вместо UnknownItem с сырым JSON.
  • ReadFile закодирован в снапшот-энкодеры (CodexEventStore/ThreadSnapshotStore, snapshotType "read") — тип сохраняем при персисте, кэш Room не включён.

0.7.20-260825-1514

25 августа 2026архив

  • Фикс «лента откатывается на момент захода»: installWindow (вход в тред и refreshThreadHistory после contextCompaction) вытирал завершённые (done=true) мысли/ответы/команды активного хода, если серверная страница на момент сверки ещё не содержала их (стрим опережает снапшот, connection=Disconnected не давал элементам вернуться). Теперь элементы с turnId == activeTurnId сохраняются при пересборке независимо от done. Пары [reasoning, agentMessage] и сортировки не тронуты, кэш (Room) не включён.

0.7.20-260825-1423

25 августа 2026архив

  • ОТКАТ затеи со снапшотом карточек вопросов (0.7.20-260825-1328): она ломала порядок и стабильность ленты (две разные вставки — live и перезаход, перезапись карточек на каждом событии, сдвиг окна). Убраны saveCardSnapshot/loadCards, injectRequestCards/injectLiveCards, anchorId, DAO-запросы snapshotsForThread/ deleteByKey и attachRequestToStep.
  • persistItems возвращён к прежнему виду: пишет снапшоты планов/диффов/сводок через CodexEventStore.append (гейт cacheEnabled соблюдается), карточки вопросов в кэш больше не пишутся вовсе.
  • onIncomingRequest/onUserInputRequest снова добавляют карточку напрямую через addItem. Live-пути и refreshThreadHistory не пересобирают ленту сверх прежней логики (restoreCurrentUserText + installWindow).

0.7.20-260825-1240

25 августа 2026архив

  • Убраны все сортировки ленты по time,id (installWindow, restoreCurrentUserText, refreshThreadHistory): у элементов одного хода одинаковый turnStart, и лексикографическая сортировка по id ставила msg_resp_* раньше rs_resp_* — мысли уезжали в конец, порядок сообщений ломался.
  • Порядок ленты теперь серверный/живой, как приходит. В истории после перезахода добавлен только локальный свап соседних пар [agentMessage, reasoning] -> [reasoning, agentMessage] — мысль перед своим сообщением, остальные элементы (сообщения между собой, команды, файлы, мысли-сироты) не двигаются. Live не тронут.

0.7.20-260825-1207

25 августа 2026архив

  • Откат всех перестановок пар «мысль/сообщение»: лента снова в серверном порядке 1:1 (live-поток и перезаход совпадают). Убраны перестановки в истории и live-вставки, которые двигали сообщения и скидывали мысли в конец (эксперименты 1118/1126/1154 отменены — возврат к стандарту).

0.7.20-260825-1154

25 августа 2026архив

  • Порядок пар «мысль -> ответ» выровнен единым правилом для live и перезахода: каждая мысль (rs_resp_<17 hex>) встаёт НЕПОСРЕДСТВЕННО перед своим сообщением (msg_resp_<16 hex> — префикс id мысли без последнего символа), где бы они ни находились в рамках хода. Обе старые перестановки убраны: соседний свап в истории и вставка «перед последним элементом» в live — из-за них мысли съезжали в конец, а порядок сообщений менялся. Сироты-мысли (прерванный ход без ответа), команды, файлы и остальные элементы сохраняют серверный порядок; дубли ITEM_START не плодятся.

0.7.20-260825-1126

25 августа 2026архив

  • Live-порядок «мысль+ответ» исправлен и на живом стриме: app-server шлёт item/started агентского ответа РАНЬШЕ, чем reasoning той же пары — из-за этого мысль появлялась в конце ленты после ответа. Теперь reasoning вставляется ПЕРЕД своим agentMessage (матч по суффиксу id), как и в истории при перезаходе. Пары идут «мысль -> ответ» в обоих случаях.

0.7.20-260825-1118

25 августа 2026архив

  • Порядок пар «мысль+ответ» после перезахода приведён к live: мысль встаёт ПЕРЕД своим ответом строго в рамках своего хода (матч по суффиксу id: msg_resp_* на 1 hex короче rs_resp_* — раньше точное сравнение id не срабатывало и порядок оставался серверным: ответ -> мысль). Перестановка локальная: одиночные мысли и элементы без пары не двигаются, пары не сливаются в «все мысли + все ответы».

0.7.20-260825-1055

25 августа 2026архив

  • Парсер paginated-истории: пары «ответ + мысль» (msg_resp_<id>/rs_resp_<id>) переставляются в порядок живой ленты — мысль идёт ПЕРЕД своим ответом. Раньше сервер отдавал их в обратном порядке (agentMessage -> reasoning), и после перезахода в конце каждого хода появлялась «мысль», которой при ходе не было видно на этом месте.

0.7.20-260825-0951

25 августа 2026архив

  • Снапшот ленты (ThreadSnapshotStore) выключен из входа в тред: openThread больше не читает файл снапшота с диска — лента открывается только с серверной страницы (thread/turns/list, full items), до ответа сервера показывается скелетон, при недоступном сервере — заглушка с Retry вместо пустого экрана. Сохранение снапшота осталось как дебаг-инструмент (запись после открытия).
  • Повторный вход в тред больше не даёт пустую ленту: ветка t == null (сервер недоступен/тред notLoaded) показывает хвост восстановленного журнала, а при пустом кеше — Retry вместо затирания уже показанного.
  • Гонка «вход в другой тред во время загрузки» закрыта guard'ом activeThread != threadId сразу после чтения кеша.
  • codex_state моста: добавлен блок activeItemsDetails — по незавершённым элементам (kind/id/sinceMs/начало текста); при turnActive=true, activeItems=0 отвечает «ход активен, но между шагами — незавершённых карточек нет».
  • Маркер «идёт сейчас» в карточке агента: LinearProgressIndicator (primary, transparent track) показывается, пока элемент не завершён.
  • Парсер paginated-страниц: подтверждён полный разбор серверной истории (userMessage/agentMessage/commandExecution/reasoning/plan/fileChange/ mcpToolCall) — повторный вход на большом треде: parsed=231 merged=231, потерян только пустой бабл; normalizeHistory не теряет серверные элементы (матч по реальным id, кеш дополняет только live-пробелы).

0.7.20-260824-1841

24 августа 2026архив

  • Парсер Codex: перестал рисовать повторяющиеся одинаковые "мысли" (reasoning) внутри одного хода — модель шлёт один и тот же чанк по несколько раз.
  • normalizeHistory: устаревшие live-копии AgentText/Reasoning из кэша больше не вставляются поверх/в конец серверной ленты при перезаходе в тред — раньше из-за этого «последние сообщения становились мыслями» и плодились дубли. Кэш остаётся источником данных только там, где сервер их не отдал (команды/файлы/MCP/недогнанный стриминг).
  • Live-лента: дублирующийся завершённый reasoning-чанк не добавляется повторно.

0.7.20-260824-1324

24 августа 2026архив

  • «Webget / GitHub token» перенесён в меню настроек Codex-экрана проектов (Edit / API providers / Webget / GitHub token / Cache) — был добавлен в неиспользуемый старый экран проектов.

0.7.20-260824-1308

24 августа 2026архив

  • Настройки проекта: пункт «Webget / GitHub token» — поле токена для поиска кода на GitHub (webget_github_search kind=code) и raw-rewrite. Токен пишется в config.json прокси (webget_github_token), после сохранения перезапускаются y83-proxy и codexappserver. Новые эндпоинты GET/PUT /api/v1/webget/settings.

0.7.20-260824-1117

24 августа 2026архив

  • Починено отображение Working-плашки: в bottomBar Scaffold без явного Column плашка и поле ввода перекрывались (плашка рисовалась под полем и не была видна) — теперь bottom-блок явно обёрнут в Column.

0.7.20-260824-1100

24 августа 2026архив

  • Working-индикатор переехал из ленты в фикс-плашку над полем ввода: виден всегда (не зависит от автоскролла), фон на всю ширину (surfaceContainer, радиус 16dp), плавное появление, пульсирующие точки + текст текущего этапа.
  • Таймер «с начала хода»: стартует в момент отправки, тикает каждую секунду (mm:ss / h:mm:ss), не сбивается при перезаходе — старт восстанавливается из серверного turn.startedAt (берётся самое раннее известное время).
  • Плашка скрывается при ожидании ответа/одобрения (показывает карточку запроса) и при блокировке/suspect (там SuspectBanner).

0.7.20-260824-1037

24 августа 2026архив

  • Мерж серверной сверки и live-стрима переведён на атомарный _ui.update: гонка addItem во время входа в тред больше не теряет свежие элементы.
  • done/answered склеиваются через ||: устаревшая live-копия не «застревает» в not-done, если сервер уже вернул завершённый элемент (проверено у DeepSeek).
  • Сортировка мержа стабильная по (time, id), живые элементы текущего хода никогда не удаляются серверным снапшотом.

0.7.20-260824-1027

24 августа 2026архив

  • Починено «откатывание» ленты при входе в активный тред: installWindow больше не заменяет список целиком серверным снапшотом (который отстаёт на секунды), а только дополняет/обновляет по id — живые элементы стрима (сообщение пользователя, мысли, команды текущего хода) никогда не удаляются.
  • Приоритет в мерже у живого элемента: свежая копия со стрима не затирается серверной версией с пустыми полями.

0.7.20-turn-pagination

24 августа 2026архив

  • Открытие треда больше не тянет всю историю через thread/read: вместо этого запрашивается только последняя страница thread/turns/list (40 последних ходов, itemsView=full), остальное догружается по cursor при скролле вверх (тоже itemsView=full, summary не отдаёт полные items) с dedup по id — большие треды (5000+ событий) не загоняются и не фризят UI при входе.
  • Ответ thread/turns/list читается из поля data (схема v2: nextCursor в корне, null = истории больше нет); совместимость со старым turns — дубль.
  • Страницы thread/turns/list приходят в sortDirection=desc (новые ходы первыми) — перед показом реверсим в хронологию, иначе лента показывала самый старый хвост вместо свежих сообщений.
  • Повторное открытие того же треда показывает ленту мгновенно из памяти (cachedThreadItems) без повторного сетевого запроса.
  • Снапшот истории не перезаписывает живую ленту, если ход активен: только обновляет hasOlder/windowStartPosition, свежие элементы сохраняются.
  • Кнопка Send больше не блокируется состоянием соединения/моделей — недоступна только при пустом вводе.

0.7.20-open-fix

23 августа 2026архив

  • Открытие Codex-треда больше не читает кеш через runBlocking на main: большие треды (5000+ событий) не замораживают UI и не рвут WebSocket.
  • Повторное открытие треда защищено проверкой актуальности: фоновые результаты устаревшего запроса не перезаписывают активный экран.
  • log_tail в дебаг-мосте читает файл на IO, поэтому диагностика не усугубляет фриз основного потока.

0.7.20-event-cache

23 августа 2026архив

  • Новая система кэша Codex-чата — event sourcing: журнал stream_events (Room, version 4) вместо старой таблицы codex_messages.
  • Каждое live-событие сети пишется в журнал как есть (started/completed/ delta/patch/diff/request/snapshot); на холодном открытии треда лента восстанавливается чистым reducer'ом по стабильному itemKey.
  • Дельта склеиваются по ordinal, порядок задаёт seq — позиций больше нет, перезаходы/простои не пересчитывают порядок.
  • Миграция 3→4: codex_messages переименована в codex_messages_old (данные для отката сохранены), журнал создаётся с нуля.
  • План (PlanUpdated/PlanDelta/item/started с type=plan) пишется под единым ключом plan-<turnId> — на перезаходе не дублируется.
  • Reducer декодирует turnSummary/turnStep из снапшотов.
  • Удалён мёртвый CodexHistoryStore (вынесен в .bak).
  • Мост: codex_state больше не падает с No value for cacheEnabled — диагностика журнала отдаёт поле с правильным именем, чтение в снапшоте переведено с get на opt (нет падений на отсутствующих полях).
  • Миграция 3→4: codex_messages_old удаляется в конце миграции — Room валидирует отсутствие неиспользуемой таблицы, иначе открытие БД (включение кэша / dump_cache) падало с Migration didn't properly handle.
  • CodexMsgEntity/CodexMsgDao убраны из схемы ChatDb (version 4): старый кэш codex_messages больше не читается, все записи идут в stream_events. Room больше не требует существования переименованной таблицы — dump_cache и открытие БД не падают на миграции.
  • ChatDb переведён на fallbackToDestructiveMigration(): промежуточная БД (след от версий 1608/1620) несовместима со схемой, Room пересоздаёт её автоматически при первом запуске. Данные чата на сервере — не теряются.

0.7.20-cache-settings

23 августа 2026архив

  • Страница «Projects»: в меню шестерёнки новый пункт «Cache» — компактный шит с тумблером «Cache history» (on/off), размером кэша (N items) и кнопкой «Clear cache». Состояние сохраняется в prefs, как и раньше, глобально для всех тредов.
  • CodexMsgDao: clearAll() + count() для полной очистки и показа размера.
  • Однократная очистка старого Room-кэша при установке новой версии (codex_cache_cleared_version) — старый груз не тянется после обновления.
  • Мост: команда cache_clear; в codex_state снапшот теперь отдаёт cacheEnabled и cacheSize.

0.7.20-history-normalize

23 августа 2026архив

  • Живой рендер ленты: item/started больше НЕ переписывает id синтетической карточки (item-N) на реальный id live-события — смена ключа в LazyColumn(key = id) рвала живой рендер (элементы пропадали до перезахода в тред). Теперь контент live-события сливается в синтетическую карточку, id остаётся стабильным, соответствие liveId -> syntheticId хранится в liveAlias и резолвится на входе дельт/завершений (resolveId).
  • CodexChatScreen: убран антипаттерн items(rest.asReversed().distinctBy { it.id }) — дедуп живёт в addItem (mergeLiveDuplicate), key = id стабильна.
  • Диагностика: UI_ITEMS в timeline моста — растёт ли список в Compose синхронно с событиями хода.
  • Живой матчинг ответа: вместо «первый незавершённый» — строго по turnId, иначе самый свежий незавершённый элемент (старая незавершённая карточка больше не уводит новый текст в середину ленты).
  • Парсер: выпилен префикс-fallback («один текст — начало другого») — матча по текстовым префиксам больше нет.
  • Мост: codex_state отдаёт uiTail — хвост живого UI-списка (id/вид/done/ длина и начало текста) + счётчики liveAlias/pendingDeltas.
  • Живой матчинг переведён на позиционные слоты: k-е live-событие вида входит в k-ю синтетическую карточку того же turn, за пределами слотов создаётся новая карточка с реальным id. Несколько сообщений одного хода больше не сливаются в первую карточку и не затирают друг друга; матча по тексту нет.

0.7.20-bridge-timeline

23 августа 2026архив

  • Мост: dump_timeline {n} — кольцевой буфер событий (send/turn/items/stream/cache) с мкс-таймстемпами: порядок операций для ловли гонок «step пропал при перезаходе» (CACHE_WRITE до/после ITEM_START, THREAD_OPEN cached/parsed/merged и т.п.).
  • Мост: dump_scope — активные корутины viewModelScope, очередь, pendingDeltas, состояние persist/interruptWatchdog/firstEvent джобов (кто висит и кто жив).
  • Мост: dump_main_thread — стек main-потока (что делает UI при threadBlocked); dump_perf — память (PSS, heap used/max) и число живых потоков.
  • codex_state дополнен диагностикой кеша: dbVersion (монотонный счётчик записей Room), pendingDbOperations (операции в полёте), lastSavedAgoMs, lastSavedThread/Count, хвост timeline и scopes.
  • CodexHistoryStore: счётчики dbVersion/opsInFlight/lastSaved + колбэк onSave (пишет CACHE_WRITE в timeline). bridge.sh: команды timeline/scope/main/perf, snapshot собирает их автоматически.

0.7.20-bridge-tools

23 августа 2026архив

  • Мост: dump_item {itemId} — полный элемент Room-кеша по id (текст+json с капом), dump_last {n} — последние n сохранённых элементов треда.
  • Мост: prefs — дамп SharedPreferences "y83-ws", app_files — файлы приложения (filesDir: имя, размер, дата).
  • Готовый скрипт scripts/bridge.sh: status/codex/cache/item/last/prefs/files/log/ version/send/stop/unblock/liveness/snapshot (всё для бага → logs/bridge-<ts>.json).

0.7.20-bridge-codex-diagnostics

23 августа 2026архив

  • Дебаг-мост видит Codex-экран: экраны Codex регистрируют CodexViewModel в BridgeState.registerCodex, новая команда codex_state отдаёт полный снапшот (тред, ход, watchdog-флаги threadBlocked/suspectSince/stopPending/ interruptSentTurn, токены, сводка ленты по типам и активные элементы).
  • dump_cache {threadId?} — сырые строки Room-кеша codex-сообщений (сводка по тредам, per-type счётчики, превью строк — без полных тел).
  • codex_action {action: send|stop|unblock|liveness, text?} — удалённый контроль хода через мост (отправка, стоп, разблокировка треда, проверка живости).
  • version — versionName/versionCode/debug/installedAt установленного APK.
  • log_tail {lines, q} — хвост лога приложения командой моста с фильтром.

0.7.20-watchdog-liveness

23 августа 2026архив

  • Вотчдог хода переведён с тяжёлого thread/read на лёгкий thread/turns/list (limit=1, без items): проверка живости больше не грузит всю историю треда, только статус последнего хода.
  • Авто-interrupt по таймеру убран: при тишине агента показывается плашка «Agent is not responding», ход НЕ прерывается автоматически — только кнопкой.
  • Разбор ответа thread/turns/list поддерживает форматы turns.data, turns[] и data[].