Integrate the Android client with native desktop pairing, remote terminal and SSH/SFTP sessions, keyboard controls, file reading and Agent conversations. Preserve authenticated connection ownership and per-device input permissions.
Validation: all ten required GitHub checks passed, including five native test platforms and both macOS release workspace checks.
Synchronize product crate versions, local dependency constraints, lockfiles, Windows resources and installer defaults. Add bilingual changes and verified contributor credits before CI packaging.
Synchronize package versions and bilingual notes with verified issue references.
Allow releases without PR contributors to omit that section, with positive and
negative format coverage as requested by the maintainer.
Keep native update process operations and default-shell resolution inside the
platform boundary. Preserve transaction authority in the updater and tighten
the platform condition budget to the measured 484.
Persist native AI recovery targets and per-pane launch contexts without treating
command submission as provider confirmation. Keep window partitions and the
active window in the durable session snapshot for immediate and scheduled updates.
Coordinate draft approval, snapshot writes, helper readiness, process exit and
installation with a committed transaction. Reverify packages and retain recovery
state on failure. Isolate acceptance installers from production integrations and
reject same-version setup that leaves the executable unchanged.
Validation: Windows GPUI suite 1552 passed; settings 55 passed; i18n 20 passed;
9 native helper scenarios; 77 installer migration checks and 41 static invariants.
Full interactive packaged upgrade acceptance remains separate.
Right-clicking a folder has always opened the configured default shell —
usually PowerShell — with no way to ask for a WSL distribution instead.
- `--shell <id>` takes the same ids the `shell` setting uses (`pwsh`, `cmd`,
`wsl:Ubuntu`, or an imported profile's settings id) and applies to the
first tab this process creates. It carries an id rather than a path so
every launch re-resolves the executable.
- The id travels both startup paths: the cold start (`run_shell` →
`WorkspaceStartup::NewTerminal`), and the resident hand-off, which is the
common case on Windows. `tab.new`/`window.create` gained an optional
`shell` field, so clicking the menu while Pebrel is already running adds a
tab to the existing window instead of starting a second process.
- An explicit request never silently degrades. An unresolvable id fails
(`invalid_shell`, or a startup error before any window opens), and a
`wsl:<distro>` id that the registry no longer lists still launches
`wsl.exe -d <distro>`, leaving the complaint to the distribution itself.
The `shell` setting keeps its documented fallback to the platform default.
- The winit shell rejects a shell request instead of ignoring it, so the
caller falls back to a cold GPUI start and still gets the requested shell.
The resolution lives in a new `workspace::shell_launch` module: `main.rs` has
to validate `--shell` before it opens a window, and none of it needs
`NebulaWorkspace` state — `workspace.rs` is also at its line budget, which
this keeps from growing (`architecture/file-budgets.txt`).
The installer registers one context-menu entry per registered WSL
distribution (`PebrelWsl<n>`, skipping `docker-desktop*`) and the uninstaller
reclaims them by key prefix plus the command line it wrote. `--shell` is
passed before `--working-directory`: a drive-root `%V` ends in `\"`, which
would swallow the rest of the line if the directory came first. Both the
string and the order are pinned by installer assertions.
Docs (runtime API schema + control API) and shell completions are updated.
Repair platform-specific tests and Windows manifest resources, separate
completion snapshots, and split oversized modules without raising budgets.
Include the reviewed display-brand, icon-picker, and file-index changes.
Keep release asset compatibility and require explicit Preview publication.
- SSH settings: the modal private-key file dialog now runs on a dedicated
thread with results returned via oneshot and dropped when the editor
generation changed. Running it inside the update borrow let the dialog's
message pump re-enter the GPUI wndproc and panic the AppCell — the
"click add private key, window vanishes" crash. Includes the reworked
host editor panel and dialog owner-HWND plumbing (file_dialog, cli).
- Markdown reader: GitHub-flavored HTML semantics land in the local
gpui-component fork (align="center" blocks, badge rows in one line,
<br/> document order, <a><img/></a> badges keep image + link);
changelog entries and the fork patch ledger recorded here.
- Packaging: freshness guards refuse binaries older than the newest
source change, the staged exe must report the release version, all four
ps1 carry a UTF-8 BOM, and the zip drops the 20MB fonts/ copy (the
embedded font materializes on demand via ensure_bundled_font_on_disk).
- Size budget: release profile goes thin-LTO + codegen-units=1 +
strip=symbols + opt-level=s with render/shaping/VT hot crates pinned at
O3 — nebula.exe 136MB → 93MB, both packages 54.4MB → 28.6MB.
- Tab row: width no longer tracks content (w_full rows shipped in a fresh
binary), tab bar collapse behavior tuned; probe/packaging scratch dirs
ignored.
Convert local and HTTP GIF/WebP to a still PNG before gpui's img element, which panics when a frame index is reused on a static image. Release zip and installer now rebuild nebula with gpui-shell against the local component fork.