Repository navigation
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.shstep, 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 theOpen Worktreescommand) 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 isrepo/.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_PATHandORBIT_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 ofborder_strong.border_strongis the focus/hover
edge; using it at rest made every card read a step too loud.
- The sidebar's "star the project" card is gone — the same link stays in
Fixed
- Hover fills no longer square off rounded cards. gpui 0.2.2 clips
overflow_hiddento 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
showedShow all %{count} lines(the call boundtotalfor a%{count}
key), and a failed branch creation toastedBranch create failed: %{err}
(the call bounderror). Both now bind the declared name.
scripts/check_i18n.pygained a placeholder pass so the class cannot
recur — it validates everytr!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/sagainst a true ~100).
The settled rate now uses pi's own per-calldurationMs, and the live rate
divides by the time since the turn'sturn_start— the same clock basis —
so the two figures agree. - Baseten's provider-usage readout works again. Its billing summary requires
an explicit ISO 8601start_date/end_daterange (31 days maximum), so the
old?window=30dquery 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'sdedicated_usage,training_usage, and
model_apis_usagetotals — 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/piis not inside anode_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 — viaPI_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
followspi updateto 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 bundledcontrib/pi-*-rpc/apply.mjsscripts honour it
and fall back to the managed layout, so hand-runs work too.
What's Changed
- fix(rpc-patches): locate pi package from the managed installer by @imrj05 in #54
- feat: add Git worktrees as first-class workspaces by @imrj05 in #55
Full Changelog: v0.2.6...v0.2.7