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.
'Arbeiten Sie frei' reads as a harsh historical imperative in German.
Use a neutral phrasing that conveys the actual intent: it is safe to
experiment because the main checkout stays untouched.
Add a toggle left of the worktree editor toolbar that shows or hides the
session list. The choice is persisted per worktree through the backend
instead of a single global property, so each worktree reopens the way the
user left it. While the list is hidden the toggle carries the session
count, or the activity icon of a background session that needs the user,
so a pending question stays visible when collapsed.
Give the toolbar strip standard horizontal-toolbar padding on its left,
top and bottom, keeping the right edge flush so the divider still sits
against the header content, and separate the toggle from the toolbar
actions with a vertical separator. The toggle is centred at its own
height rather than tracking the strip, so its hover box matches a regular
toolbar button instead of running edge to edge.
Diagram rendering degraded to the mermaid source correctly for engine
refusals, but three paths could not recover and none of them left a trace
in the log.
Log every failure. An engine crash was converted to a Fault.Internal
carrying only err.message, discarding the throwable, so a parser or layout
bug reached the user as an unactionable red label and left nothing to
report. It now logs with the stack trace, as does a failing completion
callback and a failed image allocation.
Close the fallback holes. The completion callback ran unguarded inside the
render coroutine, so a failure in it was reported as a plugin error and
left the block pending forever. Painters.of used first {}, turning a future
art type without a painter into an exception in both paint and sizing.
Painting itself was unguarded, and by the time it runs the source pane is
already hidden, so a failure left a blank surface with no way back; paint
failures now hand a fallback to the owner, which restores the source.
diagramImage allocated 2x the scene with no ceiling, and Limits caps the
model rather than the geometry, so a legal diagram could ask for a
multi-gigabyte raster on the EDT the moment someone pressed copy.
Bound the work that limits did not cover. Cancellation is only checked
between lines, so one line needed its own cap, and per-index open/quote
scanning is replaced by a single pass because it made a long line
quadratic. FlowMarks was the only phase with no cancellation point at all
and resolved frame members by recursing per cluster, rescanning every node
each time; it now resolves bounds and depth in one reverse pass. The
remaining FlowLayout phases gained per-iteration checks, and a wall clock
ceiling ends a render that outlasts its cooperative checks as a limit
fault instead of an endless "rendering" state.
Unsupported diagram types now read as a muted note rather than an error.
classDiagram, stateDiagram and friends are valid mermaid this engine does
not draw, and marking each one red reported working markdown as broken.
Show a branch-aware tip under the logo on the empty session screen. On a
plain checkout it nudges toward running the task in a worktree, with
"run it in a worktree" as an inline link that opens the New Worktree
flow. In a worktree it confirms the work is isolated instead.
The tip falls back to the generic welcome whenever a claim would be
wrong: before branch status resolves, when git is missing, and on a
detached HEAD. Read-only surfaces show no tip and skip the fetch.
Branch status now feeds the empty panel as well as the branch dock, so
worktree editor tabs get it too even though they render no dock.
Translate the new strings into all 18 locales. The tip keys carry
placeholders and therefore go through MessageFormat, where a lone
apostrophe silently swallows surrounding text, so KiloBundleLocaleTest
formats every locale for real and checks apostrophe escaping.
* feat(remote): add directory listing and create_session directory
* fix(remote): harden list_directories containment and per-entry skip
* fix(remote): reject a missing directory under a symlinked ancestor
Filesystem.resolve returns the lexical path on ENOENT, so a requested
path whose final component does not exist skipped canonicalization. A
symlinked ancestor that points outside the launch directory then passed
the containment test. Require the target to exist and be a directory
before canonicalizing.
* 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