Skip to content

Atelier Studio 1.4.0

Choose a tag to compare

@tofunori tofunori released this 14 Aug 03:34
· 1097 commits to main since this release

Atelier Studio 1.4.0

Atelier Studio 1.4.0 is a calm-and-consistency release. It closes the gap between the design contract and the code that was supposed to implement it: the chat reading column is bounded again, a running turn shows one living indicator instead of seven, the file explorer is fully keyboard-operable, and App.css finally speaks a single colour vocabulary. It also makes provider effort levels honest — the composer slider no longer trusts the order a provider happens to announce — and gives changed defaults a way to reach profiles that already exist.

Highlights

  • Read the chat in a bounded column again: the width setting is a real ceiling instead of a floor, so a full-screen window no longer produces 170-character lines.
  • Watch a running turn through a single living indicator; the thinking label, its icon, the step dots, and the label shimmer are no longer six competing loops at four different periods.
  • Operate the file explorer entirely from the keyboard — ARIA tree, roving tabindex, arrows, Home/End, Enter/Space, and type-ahead — where it was previously mouse-only.
  • Pick an effort level that matches its position on the slider: levels are ordered from faster to smarter regardless of the order the provider announces.
  • Keep xhigh available on Grok from the moment the app starts, instead of only after the first message.
  • Get a changed default without wiping your own choices, through one-shot default promotions.
  • Feel the Density setting actually do something: it now drives the dense list surfaces rather than three orphaned rules.
  • Import a PDF article straight into a gbrain page, with metadata resolution and duplicate detection.

Article import

  • Convert a PDF through MinerU, falling back to local extraction, then resolve metadata from Zotero and Crossref, detect duplicates by DOI, and write a gbrain page.
  • Automatic mode writes the page without confirmation and can be turned off in the dialog.
  • Fixed a build-breaking defect found alongside it: stage-rust-server.sh passed the path of kb_cli.mjs as argv[1], which the CLI read as a command-line invocation — it printed its usage and exited 1, failing every build.

Chat reading and motion

  • --chat-col is computed with min() instead of max(), so --chat-w caps the reading column instead of being overridden by the pane width. The comment above it had described this behaviour for some time without implementing it.
  • .messages padding is symmetric, which stops the capped column from sitting off-centre against the composer.
  • The Quiet Instrument budget of one continuous animation per surface is enforced in the chat: the running indicator is the Working ring, and the thinking label, thinking icon, activity step dots, activity label shimmer, streaming caret, and reviewer running badge are now differentiated by colour and text alone.
  • The JavaScript-driven shimmer sweep on the thinking block, including its timers and mask DOM, is gone.
  • Dead CSS left behind by the move from ActivityCard to ActivityDisclosure was removed.
  • A CSS contract test locks the result: those indicators carry no animation, and the chat perimeter declares exactly one infinite animation.

Accessibility

  • The file explorer implements the ARIA tree pattern: treeitem children of tree, aria-level, aria-posinset/aria-setsize computed over siblings, aria-expanded, and a roving tabindex that puts the tree one tab away from the search field. Search results follow the same contract as a flat level-1 list.
  • Explorer rows became RowButton, keeping the project rule that no bare <button> exists outside the primitive layers.
  • Image thumbnails have a visible focus ring again. The rule referenced --focus-ring, which is not defined anywhere in src/, so the declaration was invalid and silently dropped.

Design system

  • App.css consumes --text-primary/--text-secondary/--text-muted/--text-disabled for all 596 text colours, making tokens.css the single public interface rather than a layer with 8% adoption.
  • Borders moved to the --border-* family where the role matches.
  • Non-text marks — status dots, switch knobs, scrollbar thumbs, slider rails — use two new tokens, --mark-neutral and --mark-neutral-strong, instead of being painted with text tokens.
  • The Density setting drives --pad-y across the real dense surfaces (navigator rows, explorer, settings, Git files, bibliography, ledger) instead of three rules, and interactive targets keep their minimum height in every density.
  • A .sidebar button selector whose specificity beat the product classes was removed; navigator rows were carrying an unintended 6px of padding.

Providers

  • Effort levels are ordered from faster to smarter in the composer slider, independently of provider order. Grok announces its levels strongest-first, which placed Extra High second out of five while the label correctly read Extra High.
  • Grok's effort fallback advertises low/medium/high/xhigh, matching what Grok actually announces. The catalogue only carries efforts after an ACP session/new, so the fallback is what the UI shows at every startup — a three-level fallback made xhigh disappear on each launch.
  • The Grok default effort is a named value instead of efforts.last(), which resolved differently depending on whether the list came from the provider (descending) or from the fallback (ascending).
  • Grok gained an ACP-driven model catalogue, and pending replies now resolve instead of accumulating.
  • Claude gained a live catalogue and CLI controls.
  • Grok auto-compaction is mapped to a visible boundary in the timeline, and ACP -32603 failures now carry the underlying cause instead of the bare protocol code. Both paths are covered by tests; neither has been exercised against a live Grok turn, since they only run on auto-compaction and on a failing turn respectively.
  • Thinking split by a provider is stitched back together, and the active turn renders its in-progress reasoning correctly.

Settings

  • A changed default now reaches an existing profile through one-shot promotions. loadSettings merges {...DEFAULT_SETTINGS, ...stored} with stored winning — deliberately, so updates never overwrite explicit choices — which also meant a new default only ever reached fresh installs. A promotion applies only when the stored value equals the previous default exactly, so it replaces an inherited value and never a deliberate one, and it runs once.
  • The first promotion moves the chat font size from the previous default of 15 to 13.5.

Editors

  • LaTeX selection is handled by a single layer on the correct editor engine, at full depth, with the native selection neutralised.
  • Automatic rewrap survives a restart, and compilation results are no longer duplicated in the top bar.

Performance

  • The Git snapshot index is persisted per repository and warmed when a project opens.

Continuous integration

  • Gallery browsers are installed under test, AppSnap is staged before the Tauri tests, and mobile dependencies are installed before staging.