y83 code / журнал

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

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

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

журнал

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

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

0.7.20-merge-server-order

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

  • mergeHistory переписан по схеме «сервер = порядок и типы» (разбор Дипсика): кэш больше НЕ вставляет свои элементы внутрь серверной истории — позиционная вставка leftover по времени убрана (она давала «рулетку» порядка при каждом перезаходе: ответ агента мог доехать «как мысль»).
  • Кэш теперь только (а) подставляет текст/вывод/длительность в серверный элемент с тем же id и типом (тип всегда серверный: agentMessage = бабл, reasoning = мысль), (б) доклеивает в конец ленты только живой стриминг/недавно прерванный ход. Устаревшие done-копии, которых сервер не хранит, в ленту не попадают — «стена» старых элементов в хвосте больше не растёт.
  • Пользовательские сообщения: серверная копия с clientId поглощает локальную u-… копию (fallback для старых — матч по тексту+времени), дублей одного сообщения нет.

0.7.20-parse-merge

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

  • turn/start/turn/steer теперь шлют clientUserMessageId (id локального u-… элемента) — сервер (схема v2) должен возвращать его как ThreadItem.clientId, по нему mergeHistory матчит «моё сообщение → серверная копия» по id, а не склейкой по тексту+времени.
  • mergeHistory: leftover из кеша (живой стриминг, обрезанные выводы) вставляется позиционно по времени, а не доклеивается в конец — в хвосте треда больше не вырастает «стена» из старых команд/мыслей после ответа.

0.7.20-stream-fixes

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

  • Живой степ больше не прячет выполненные элементы: пока степ активен, виден весь список — текущий reasoning и уже завершившиеся команды компактными строками ($ cmd … ✓ время). Раньше выполнившаяся команда исчезала сразу, поэтому в ходе было видно «только мысли», а команды будто не появлялись.
  • Reasoning-карточка сворачивается по завершении (как CommandCard): «мысли» больше не висят развёрнутыми после конца хода.
  • mergeHistory больше не дублирует summary-карточки хода: серверная сводка показывается на своей позиции под id кеш-копии, и в конце треда не растёт «стена» done-плашек (merged больше не превышает оба источника).
  • Текст ответа агента не теряется в гонке «дельты пришли раньше item/started»: буфер дельт стягивается и на пустой placeholder agentMessage, и при завершении элемента без текста в событии.

0.7.20-history-stable

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

  • History order is now strictly server-side: mergeHistory no longer re-sorts the feed by timestamp (sortBy(time) removed). The cache only enriches items by stable id and appends the tail, so a user message can never jump below the agent reply after re-entering a thread. Previously cached seconds vs server milliseconds still scrambled order from time to time.
  • openThread no longer flashes cached history first, then the merged one: the cache is shown only when the server is unreachable, otherwise the merged server order appears immediately. Steps stay attached to their messages.
  • Release builds no longer need the Java compiler worker at all: BuildConfig is generated as a Kotlin source (the AGP-generated BuildConfig.java was the only Java file, and on this device Java workers cannot start because loopback TCP is blocked — it used to fail compileReleaseJavaWithJavac and silently ship stale APKs). deploy.sh now reads version info from output-metadata.json instead of the removed BuildConfig.java.

0.7.20-plan-approval

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

  • Plan approval now works regardless of the mode toggle: Approve/Revise are shown exactly when the latest non-empty item is a finished Plan and no user message follows it. Previously the buttons disappeared after switching the mode switch away from "plan", which made the plan look permanently blocked.
  • Approving the plan no longer exits silently: "Continue with the plan" is always sent in build mode, so the agent continues instead of replanning.
  • The stall watchdog now recognizes "plan ready, waiting for approval" as a normal state: it no longer marks the agent as unresponsive, shows false "Agent is not responding" banners, or interrupts the run while the plan waits for the user.
  • A hint banner ("Plan ready — Approve or Revise") appears above the input field while a plan is waiting for approval, so it is clear the agent is done and waiting for the decision, not stuck.

0.7.20-agentstream-fix

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

  • Live agent replies no longer disappear: when the server starts an agent_message item with empty text and streams the actual answer as deltas, the app now creates a placeholder immediately so the deltas have something to attach to. Previously the empty start was skipped, the final answer was lost (only reasoning/plan showed live), and the text appeared only after re-entering the thread — if at all.

0.7.20-step-cacheclean

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

  • Cache is deduplicated at load time, before the chat list is rendered: a dirty cache with duplicate empty steps (Key "step:1" was already used) used to crash the LazyColumn instantly on thread open, killing the app before history merge could clean it. The agent then appeared silent and "stuck in plan mode" — the reply was actually written but never shown.
  • A live step created before the turn id arrives now uses a unique fallback id instead of a reused step:1, so it cannot collide with cached entries.

0.7.20-step-dedup

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

  • Fixed the crash Key "step:1" was already used that killed the chat screen and made the agent appear stuck/unresponsive ("cannot write, cannot exit plan mode" was its fallout). Old caches from builds that eagerly created an empty step at turn start could contain several items with the same id; a history merge now removes empty steps and duplicate step ids before rendering.

0.7.20-step-ungroup

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

  • Step grouping is removed: every step renders as its own card with the header "step N" and its output message/question at the bottom. The previous combined card ("steps 1–N") showed a header that did not match the number of messages inside, which was confusing.
  • Steps without an output message (interrupted work, unanswered question) still render as their own collapsed card with the work log — nothing disappears.

0.7.20-step-fixes

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

  • Step is no longer created eagerly at turn start: an empty "step" card no longer flashes before any work. The step appears with the first real item (reasoning/command/tool); a turn with only a message shows a normal message bubble instead of an empty step.
  • Agent text without work (e.g. after answering a question, before the next command batch) renders as a plain message bubble, not as a step card with a single message — no more "extra steps" in the feed and in history.
  • History merge now preserves the step's message and request across thread re-entry: cached streaming text/question is upgraded to the server's final copy, and a step's output never disappears when the cached step is matched against a server step that has no message yet.
  • Old message-only step entries from the previous cache format are converted to plain AgentText on merge, so "step 1 · done" ghosts and duplicated output bubbles after re-entering a thread are gone.

0.7.20-step-message

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

  • A step and its output are now one card: the step (collapsed work log) and the agent message that follows it are rendered together — the message is the result of the step's commands/thinking, not a separate bubble below.
  • Empty server agent_message markers ("turn started") no longer split a step or render an empty bubble; only real text is attached to the step as output.
  • A question/approval is attached to the current step and closes it: work after answering now starts a NEW step instead of continuing the old one above the question (fixed "the step lights up above the question" behavior).
  • Step grouping is now strictly per turn (turnId prefix of the stable id): steps of neighboring turns (e.g. after context compaction / abort) are never merged into one "steps 1..N" block.
  • Answered questions render inside the step card below the work log; unanswered ones remain pinned near the input field as before.
  • Cache and server history persist the step message/question, so cards look the same after re-entering the thread.

0.7.21-step-groups

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

  • Steps of one turn are now grouped into a single card with the header "steps 1–N" instead of a row of separate step cards with no messages between them. The group shows aggregated counters; a mini-header "step N" labels each step inside the expanded group.
  • Removed the copy button from the step footer — copying stays on the individual item cards inside the step (bash/reasoning/tool), so the step itself stays compact.
  • Fixed wrong durations after re-entering a thread: the server sends startedAt/completedAt in seconds while the app treated them as milliseconds. Timestamps are now normalised (seconds -> ms) and the live durationMs from the local cache is kept on merge instead of being overwritten by a stale server value ("0.0s" after re-open).
  • Turn duration prefers the server durationMs; otherwise falls back to completedAt - startedAt, and for an in-progress turn uses the current time, so a running step always shows a growing time.
  • TurnSummary items are deduplicated by turnId, so a server duplicate with a broken timestamp no longer adds a second copy on re-entry.

0.7.20-idempotent-merge

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

  • Fixed "the feed looks different every time you exit and re-enter the thread": mergeHistory now deduplicates by stable IDs instead of time/text similarity, so re-opening a thread always produces the same list.
  • Steps get a stable key turnId:index (the server turn id plus the step number) in both the live feed and the parsed server history — no more matching steps by a 10-second time window and duplicate/ghost steps.
  • Fixed a merge bug where a message matched by content was marked "consumed" and then excluded from the result entirely: it briefly disappeared from the feed and reappeared on the next open with slightly different text/time.
  • Local pending user messages (u-…, not yet acknowledged by the server) are no longer written into the cache on every keystroke/event; only the final snapshot after the turn is saved. Server copies (item-…) deduplicate them on re-entry, so no more permanent duplicates.
  • Legacy caches (steps with old step-N-… ids) still merge correctly via a time-based fallback during the transition.

0.7.19-liveness-watchdog

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

  • Fixed "agent goes silent and does nothing" for good: the watchdog now distinguishes a live but quiet turn from a lost turn/completed event.
  • After 10 minutes of silence the client asks the server via thread/read (includeTurns:true) for the real turn status. inProgress means "agent is alive but quiet" — a banner appears and the turn is interrupted only after 15 minutes of silence, once per turn. Long running commands without output and unanswered questions are never interrupted.
  • If the server reports the turn as completed/interrupted/failed (or the thread is gone), the missed turn/completed is finalised locally and the queue continues — no more phantom "thinking" turning.
  • Lost interrupt (server does not answer): the thread becomes blocked instead of restarting an interrupt loop. New messages are queued and sent only after a manual "Unlock" on the banner.
  • Banner "Agent is not responding (N min)" with Check/Stop actions, and "Server turn was lost" with Unlock when the thread is blocked.

0.7.18-open-thread-anr

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

  • Fixed the "Android kills the app / app freezes" case on thread open: parsing and merging the whole history (parseHistoryItems + mergeHistory) ran on the main thread (the merge is O(cached x parsed) with regex normalization, e.g. 1053 x 790 items), freezing the UI for seconds and triggering ANR. All history loading/merging now happens on Dispatchers.Default; the main thread only receives the merged list.
  • Fixed duplicate log lines in /sdcard/Download/y83ws/log.txt: if the primary log file fell back to the same path as the mirror (storage access failing), every line was written twice. Mirror now skips writing when it is the same file as the primary. File writes also moved off the caller thread to a dedicated log thread (file I/O on the main thread exacerbated jank).
  • Fixed MCP tools not working for chat-protocol providers (deepseek/*, opencode-go/*, y83-coder/*): codex-router in backend/internal/providers/router.go flattened Responses API namespace tool groups into plain chat-completions tool names, dropping the mcp__<server> prefix. Providers then called webai_status instead of mcp__webai__webai_status, and the Codex app-server rejected the call ("unsupported custom tool call: <tool>"). Now the router prefixes namespace tools (mcp__<server>__<tool>) on the way to chat providers and splits them back into name + namespace on the way out (streaming and non-streaming), matching what zen/* (responses protocol via y83-proxy) already did. Verified end-to-end: deepseek-v4-flash now dispatches webai_status and webget_search successfully; zen regression check passes.

0.7.17-turn-stuck-merge

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

  • Fixed the "agent stops and does nothing" case: after turn/start OK, if the server sends no turn events at all for 90 seconds (dead/stuck model), the client now interrupts the turn automatically instead of hanging forever.
  • Turn stall timeout for a silent active turn shortened from 10 to 5 minutes (context compaction keeps its own separate 10-minute timeout).
  • Fixed the feed tail after re-entering a thread: mergeHistory now deduplicates cached user/agent texts already matched to server items, so the last messages no longer appear as a second copy without their steps.
  • Fixed sorting inside mergeHistory: cached times were in seconds while live server events are in milliseconds, which scrambled the chronological order (steps looked detached from the messages). Times are normalized to ms before sorting, and the whole feed is ordered consistently.

0.7.16-cache-read-safe

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

  • Fixed steps/sidebar items disappearing after exiting and re-entering a thread: reading the local cache could crash with SQLiteBlobTooBigException (a row too big for the Android CursorWindow), which killed the whole openThread loading and left the chat empty of cached steps. Cache is now read in pages (a fresh CursorWindow per query); oversized pages fall back to smaller chunks and rows that still don't fit are skipped instead of crashing.
  • Oversized values persisted to the cache (bash output, file diffs, mcp results) are now capped at 40KB per value, so rows stay well under the CursorWindow limit and writes can't produce unreadable rows. The server history restores full text on the next thread/read (mergeHistory).
  • Fixed steps missing on the newest messages after re-entering a thread: an empty step created at turn start was removed from the UI but left in the cache, and on re-entry that "ghost" empty step was treated as a duplicate of the real one and shadowed it. Empty steps are now removed from the cache too, and an empty cached step is replaced by the populated server version.

0.7.15-turn-watchdog

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

  • Fixed the "turn stalled for hours" case: session status/heartbeat events no longer count as turn activity, so the watchdog can now actually detect a dead turn. Stall timeout shortened from 2 hours to 10 minutes of silence.
  • On stall the client now sends a real turn/interrupt (with the existing duplicate guard and 20s local fallback) instead of silently resetting local state while the server keeps the turn running.
  • Diagnostics in docs/stalled-turn.md updated with the implemented fix.

0.7.14-step-persist

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

  • Steps no longer disappear when leaving and re-entering a thread: structural events (step creation, item started/completed, flush, request answered) now persist immediately instead of going through the 800ms debounce; the last state is also saved synchronously in onCleared.
  • Streaming deltas still save through the debounce (no write spam per token).
  • Timers on reasoning/bash/MCP cards inside a step now only tick while the step is the active current one: they freeze when the step finishes or the turn moves on, and freeze for completed items.
  • Removed the side padding of the step body so items inside a step align with the step edges (no card-in-a-card look).
  • Diagnosed the "turn stalled for hours" issue and documented it in docs/stalled-turn.md (fix is a separate next phase).

0.7.13-step-calmer

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

  • Step internals no longer jump: cards inside a step start collapsed (single compact row) and expand only on tap, so streaming reasoning/bash no longer stretches the step.
  • Finished items fade out softly (150ms) instead of collapsing with expand/shrink animations; the step body collapses as one whole animation toward the top when the step finishes.
  • Tapping the step header shows/hides the completed compact rows; animation states are keyed by item id so they don't rebind to list positions.
  • Cards in the main feed (outside steps) keep their previous behavior.

0.7.12-stop-fix

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

  • Fixed the Stop button: pressing it while a turn is still starting (sending) now waits for the turn id and sends a real turn/interrupt instead of silently resetting locally while the server keeps the turn running.
  • Interrupt now targets the thread the active turn actually runs in (activeTurnThreadId), so Stop works even after switching to another thread mid-turn.
  • Guarded against duplicate interrupt sends during the start race; the 20s local fallback still unlocks the UI if the server never answers.

0.7.11-step-inside

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

  • Active work (reasoning, bash, edits) now lives inside the step: the step header appears at turn start, running cards are visible inside it, and finished cards hide with an animation.
  • Tapping a step header reveals/hides the list of completed cards; a finished step is collapsed to its header.
  • Removed the separate active-items list from the feed, which also fixes steps/cards being lost when leaving and re-entering a thread mid-turn.
  • Unified card footers: copy is an icon-only button (no "Copy" label), shown only in the expanded card, bottom-right; time stays in the card header on the right; step footer copy is icon-only as well.

0.7.10-agent-turn-ux

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

  • Active agent work (reasoning, bash, edits) now renders as separate live cards outside the step and settles into the step only when finished, so a step never appears empty at the start of a turn.
  • Turn step and summary timers are frozen once work is done; live ticking remains only on currently active cards.
  • Copy button moved inside bash cards and step group cards (bottom-left, with a label), no longer floating outside the message.
  • User bubbles are right-aligned with left-aligned text, Material tokens and proper padding in both Codex and Qwen chats.
  • "Revise plan" now opens an inline editor with Cancel / Send feedback that actually sends the feedback turn; empty feedback shows a hint instead of silently doing nothing.
  • The custom answer field on request cards is always available and takes priority over a selected option, so sending your own message never gets blocked.

0.7.9-provider-sync

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

  • Added explicit provider discovery, testing and save status in the provider form.
  • Restarted Codex app-server after provider catalog changes so new models appear immediately.
  • Preserved stored API keys when editing a provider without re-entering the key.
  • Fixed Codex-to-DeepSeek compatibility for developer messages, unsupported tool types and duplicate tool names.
  • Updated the DeepSeek preset to current V4 Flash and V4 Pro model IDs.

0.7.8-qwen-agent

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

  • Added Qwen Code as a third agent type alongside OpenCode and Codex.
  • Added supervised loopback qwen serve, normalized backend APIs, SSE streaming and transcript-backed history.
  • Added Qwen workspaces, sessions, model switching, tool cards, usage, stop and permission controls.
  • Configured the Qwen provider to use the public https://coder.y83.ru/v1 endpoint only.
  • Aligned the Qwen input card with Codex and added live status, context usage, model control and native steering.

0.7.7-api-providers

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

  • Added per-agent external OpenAI-compatible API providers in Projects settings.
  • Added provider discovery, manual model selection, connection testing and masked key storage.
  • Added a unified local Codex router so models from multiple providers can be switched directly in chat.
  • Migrated Zen into a regular provider record using the three verified free models and removed hardcoded Codex fallbacks.

0.7.6-webai-theme

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

  • Aligned the WebAI accounts sheet with the main app background and agent-card styling.
  • Replaced legacy hardcoded login-screen colors with the current app theme palette.

0.7.5-skills-icon-geometry

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

  • Restored the original Codex input text bounds after the skills button move.
  • Kept skills beside fullscreen in a compact 28dp top action strip.

0.7.4-skills-icon-fix

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

  • Moved the skills button next to the fullscreen control and made it visually smaller.
  • Added a clear gap between skills and fullscreen actions to prevent mis-taps.

0.7.3-codex-skills

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

  • Added Codex skills picker: multiple skills can be attached to one message.
  • Selected skills are sent as native skill input items followed by the message text.
  • Skills sheet supports search, scope badges, enable/disable switches and refresh.
  • Queued messages retain their own selected skills; user history shows used skills.