SessionLayout sizes MessageErrorView and then reads its preferred size, but the
wrapper's BorderLayout asked the text area for a preferred size without passing that
width down. A wrapping JBTextArea answered with one unwrapped line, so a long provider
error was clipped to a single-line slot.
Measure at the available width the way the transcript's other text rows already do.
Dropping the caret reset with it: there is no scroll pane around this area, so its only
effect was to let a new failure card yank the transcript scroll to itself.
A turn whose provider ended the stream without a terminal stop reason closed as
"completed" with no message error and no session error, so the session simply went
idle and the truncated answer had no explanation.
Plumb the assistant finish reason through to the frontend and render a warning
outcome card for "unknown" and "other", with the raw reason on the icon tooltip.
The notice is seeded from history so it survives reopening the session. "length" is
excluded because the CLI already writes a visible warning text part for it.
Also broaden the branch/changes refresh from Idle to any non-busy state, so a turn
that edited files still refreshes the git indicators when it ends incomplete, failed,
interrupted, or in error.
* feat(cli): import cloud transcript on create_session
* fix(cli): satisfy typecheck for in-process cloud import
Provide the helper's effect services from the group context so the
HTTP import handler keeps the base request graph. Map the tagged
helper errors via Effect.match instead of matchEffect.
* refactor(server): remove dead cloud-import error fields
* fix(cli): restore clone workspace files only after attach
The task tool picked the last text part of the subagent's final message as
its result. Subagents that ran with memory context get a synthetic, ignored,
empty text part (the memory marker) appended after their answer, so findLast
surfaced an empty <task_result> to the parent agent. The extractor now skips
synthetic, ignored, and empty text parts, and background jobs no longer let
an empty run overwrite an earlier non-empty result on extend.
Fixes#13469
The auto-routing selection is kilo/kilo-auto/free, so the model id itself contains a slash and only the provider may be split off the front. Pins that parseModel keeps the remainder intact on the retry path.
Retry replayed the model, agent and effort recorded on the failed turn, so switching away from a broken model and pressing Retry just failed the same way. It now resolves model/agent/effort from the live selection the way a normal send does, falling back to the recorded values when no selection has resolved yet.
Login resume keeps using the recorded model: the user authenticated for the model that demanded it, so substituting the current selection there would silently run a different one.