All releases
Release notesLatest

Orbit Pi v0.2.7

Added

  • The Worktrees page opens with a short How worktrees work primer: what a worktree is, how to create and open one, the optional .orbit/worktree-setup.sh step, and the folder-vs-branch rule. It is dismissible and stays gone once closed.
  • Git worktrees as first-class workspaces. A new Worktrees page (workspace header menu or the Open Worktrees command) lists every worktree Git reports, creates one from a new or existing branch (name, branch, and path are independent concepts), opens it as the active workspace — Explorer, terminal, Git page, Review, MCP scope, and the agent all follow its path — and supports rename (directory only, never the branch), move, lock/unlock, remove with a dirty-worktree confirmation, and advanced prune/repair. The status bar's Work in chip switches between the main working directory and any linked worktree and opens the create dialog with a suggested but fully editable (custom) worktree name; the default root is repo/.wt, configurable globally (Settings → Worktrees) and per repository (.orbit/worktree.json), and an optional setup script (default .orbit/worktree-setup.sh, explicitly allowed per repository on first use) runs asynchronously after creation with ORBIT_ROOT_PATH and ORBIT_WORKTREE_PATH, keeping the worktree on failure. Sessions record and restore the worktree path; an unavailable worktree is surfaced instead of silently falling back to the main repository. See crates/orbit-pi/docs/worktrees.md.

Changed

  • Refresh (⌘R, the File menu, or the command palette) now refreshes the whole app, not just the session list. It re-reads sessions and settings from disk, re-lists the active repository's worktrees, rebuilds the Explorer tree and the Review diff, refreshes Git status, re-scans the Usage analytics, re-reads the MCP config, and re-asks the running agent for its model/skill catalog, session stats, and provider auth/quota. The menu and palette entry is now labelled Refresh rather than Refresh Sessions.
  • Quieter chrome on the work surfaces:
  • The sidebar's "star the project" card is gone — the same link stays in Settings → About.
  • Appearance drops the duplicate palette-swatch strip beside each theme picker.
  • The Usage page's cards lose their explanatory subtitles; the metric captions that carry data stay.
  • The status bar drops the redundant branch-count chip (the branch chip's own popover lists every branch) and hides the MCP indicator while every server is connected.
  • The composer's Plan/Build/Ask chip is the single home for the workflow scope: the new-task page no longer draws its own centred Mode control (a block of tiles in the empty state). The chip sits with the other agent controls on every composer, new task included, and still holds the choice as pending until the session id exists.
  • Settings → General states the notification trigger once — "When a run finishes or pi needs an answer" — instead of repeating it on each of the three channel rows.
  • The pull-request detail page drops its metadata rail, which only repeated the chips above it (review, checks, changes, branches). It now reads as one centred column, with the opened/updated times folded into the header line and the checkout/close/open actions moved below the review actions.
  • The pull-request list row now splits identity (number, title, labels, author, branches) from status (review, checks, diffstat, time), which reads down the right edge, and merged/closed rows carry their own state glyph instead of a recoloured open-PR icon.
  • The issue pages get the same treatment: the list row moves its comment count into the right status column, and the detail page drops its rail — assignees, the labels editor, and the updated time fold into the header as one centred reading column.
  • Inline code in the transcript keeps the body ink and its wash instead of painting the glyphs in the accent. A code-heavy answer used to become a field of ember and read as one long link; now only links carry the accent, and code is marked by the mono face and the chip wash.
  • The sidebar wordmark is held to a quieter size, so it labels the workbench instead of reading as the column's headline.
  • An expanded command tool call now reads as one terminal surface. The Command and Output sections sit on a single recessed code plane (code_bg) divided by a hairline, each with its label and copy control on a shared axis, instead of two label-plus-body groups floating on the card with only a gap between them. The command keeps its $ prompt gutter, so a wrapped command hangs under the first line.
  • Settled tool activity is monochrome. Tool glyphs used to shift the accent into a per-kind hue (amber for run, cyan for explore, green for mutate, violet for web); a long transcript became a field of tinted badges. The glyph shape already names the kind, so settled work now uses one muted ink. Running still takes the accent and failure still takes red.
  • Transcript cards (tool, summary, thought, ask) use the plain border hairline instead of border_strong. border_strong is the focus/hover edge; using it at rest made every card read a step too loud.

Fixed

  • Hover fills no longer square off rounded cards. gpui 0.2.2 clips overflow_hidden to a rectangle, not the border radius, so a full-bleed child background painted square corners over the rounded edge. The tool card's header (the reported case), its error strip and detail surface, the summary card's header, the code-block title strip, and the MCP server rows' first/last entries now carry the matching corner radius themselves.
  • Two tr! call sites bound the wrong placeholder name, so the literal token was printed instead of the value: the tool-detail and edit-diff fold labels showed Show all %{count} lines (the call bound total for a %{count} key), and a failed branch creation toasted Branch create failed: %{err} (the call bound error). Both now bind the declared name. scripts/check_i18n.py gained a placeholder pass so the class cannot recur — it validates every tr! call's bindings against its key's %{…} placeholders and exits non-zero on a mismatch.
  • A truncated tool result no longer renders its truncated chip twice in the activity row; the chip was queued twice back-to-back.
  • The transcript no longer writes a per-render [card-dbg] line to stderr for every read/edit/write tool card.
  • The transcript's tok/s rate reads correctly again. It was measured client-side from the gaps between pi's streamed deltas, but pi emits the response in bursts, so that window collapsed to a fraction of the real generation and the rate ballooned (e.g. 600 tok/s against a true ~100). The settled rate now uses pi's own per-call durationMs, and the live rate divides by the time since the turn's turn_start — the same clock basis — so the two figures agree.
  • Baseten's provider-usage readout works again. Its billing summary requires an explicit ISO 8601 start_date/end_date range (31 days maximum), so the old ?window=30d query returned HTTP 400 and the Providers page showed an error instead of a spend figure. The adapter now asks for a rolling 30-day window and sums the response's dedicated_usage, training_usage, and model_apis_usage totals — the shape Baseten actually returns — showing the combined spend with a per-category breakdown.
  • The issue and pull-request detail headers no longer collapse their meta line to one character per line. The text beside the state chip is now flex_1 + whitespace_normal, so it takes the column's remaining width and wraps there instead of shrinking inside a wrapping flex row and overrunning the rows beneath it.
  • A review or comment card with no body (a bare approval, for example) no longer draws a stray hairline across its bottom — the header rule that separates a body from its header now appears only when there is a body.
  • RPC patch auto-apply now locates the pi package for pi's managed installer as well as npm/pnpm/bun globals. The managed launcher at <agent>/bin/pi is not inside a node_modules, so the old ancestor walk never reached the package at <agent>/install/releases/<version>/node_modules/@earendil-works/pi-coding-agent and the Settings → Runtime row read *pi package not found*. Resolution now handles that layout on every platform — via PI_MANAGED_INSTALL_ROOT, install/current-version, or the newest release — searches the usual install roots when even the launcher is missing. The resolved path is recorded in ~/.orbit-pi/rpc-patches/config.json (shown as Package root in Settings); the live launcher stays authoritative, so the row follows pi update to the new release dir and the saved path is only the fallback when no launcher resolves. Override for a single run with PI_PACKAGE_ROOT; the bundled contrib/pi-*-rpc/apply.mjs scripts honour it and fall back to the managed layout, so hand-runs work too.
Previousv0.2.6