Skip to content

Sync upstream 1.4.214 - #109

Merged
frbarbre merged 482 commits into
mainfrom
sync/upstream-1.4.214
Oct 15, 2026
Merged

frbarbre merged 482 commits into
mainfrom
sync/upstream-1.4.214

Conversation

@frbarbre

Copy link
Copy Markdown
Owner

1.4.214 → 1.4.214 (9c1d5d2fb7..1b1d09cfb5, 475 upstream commits, thirty-five conflicts)

nwparker and others added 30 commits October 14, 2026 01:09
… the user's focus (stablyai#28453)

Main-session CDP key and text input on a <webview> guest is routed by the window's
focus, so it landed in the user's terminal (stablyai#20595). Embedded guests now get
widget key/char events; child-frame focus and untypeable text keep the CDP path
after focusing the guest.
…yai#28354)

* fix(runtime): save a windowless host's chat tabs in its layout

Claude-Session: p2-headless

* fix(runtime): remove a chat's saved tab on the index's hidden notice, which every close reaches

Claude-Session: p2-headless

* fix(runtime): a chat whose record is gone loses its saved tab at startup

Claude-Session: p2-headless

* test: run the windowless chat-layout host test in the Node runtime project

Claude-Session: p2-headless

* fix(runtime): remove a chat's saved tab from whichever partition still holds it

Claude-Session: p2-headless

* refactor(runtime): list saved chat tabs across partitions in the layout module

Claude-Session: p2-headless

* refactor(runtime): read saved chat tabs straight from the store's partitions

Claude-Session: p2-headless

* fix(chat-tabs): save a windowless chat tab under its own tab id

Review pass: the saved tab reuses the id status and attention address, the close
checks for a window before scanning partitions, and the host tests seed readable
records with unreadable, other-host and no-index cases.

Claude-Session: p2-headless

* test(chat-tabs): a window opening a windowless-saved chat reuses its tab

Claude-Session: p2-headless

* test(chat-tabs): check the saved tab with the lookup a window reuses

The window's existing-tab lookup moves to the shared projection so the
windowless-layout test exercises it without importing the renderer.

Claude-Session: p2-headless

* test(chat-tabs): assert the reused tab's identity directly

Drops the shared lookup added for the test; two functions already carry that name.

Claude-Session: p2-headless

* fix(chat-tabs): leave an unstamped chat tab in an SSH partition to that host

Claude-Session: p2-headless

* fix(chat-tabs): count an unstamped chat tab as this host's only in the local partition

A desktop mirrors a remote server's chats into that server's runtime partition
without a host stamp; the startup sweep must not delete them.

Claude-Session: p2-headless

* refactor(chat-tabs): one chat tab writer, one startup match, local partition only

Chats run only on local hosts, so their saved tabs live in the local partition:
the cross-partition listing and its writer go. Open and close share one layout
load, the startup fill and sweep become one function beside the index seed, and
the tab filter is the existing savedSessionId.

Claude-Session: p2-headless

* fix(chat-tabs): restore and sweep saved Claude chat tabs like any structured chat

The Claude skip predates Claude structured chats (stablyai#18519, stablyai#18560); an id the host
has no record of is already dropped by the readable restorer.

Claude-Session: p2-headless
…rent Orca server version (stablyai#28642)

A first connect onto a host whose managed server another Orca version
started deferred the update (its terminal count needs pairing) and failed
the connect. Pair with the running build as it is, before uploading
anything, then let the linked update check ask it for its terminals.

Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#28644)

The connection pool replaced any connection that was not fully up
(reconnecting, failed, closed by a census) with a fresh one, and the
teardown wiped the in-memory password, so background dials after a drop
or sleep/wake prompted again. The pool now keeps the sign-in the host
accepted and hands it to the replacement for the same endpoint. A
password the host refused or re-asked for is never handed on, an edited
endpoint asks again, and an explicit disconnect forgets it.

Co-authored-by: m4air <m4air@Mac.localdomain>
* Require exact-commit PR checks before agent merges

* Give full PR checks a unique required status context

* Validate required context ownership on every pull request
…i#28562)

* Recover orphan browser processes and clarify blocked updates

* Use isolated Electron launch flags for sidecar lifetime tests

* Keep update retries fenced while describing blockers

* Keep update translations and context clock valid on current main

* Use the option context clock restored on main

* fix(updater): address status guidance and test launch reviews
…composer (stablyai#28610)

* test(native-chat): replay recorded Linux Sogou commits into the chat composer

Guards stablyai#26722: keyup-only pinyin, plain Space/digit selector picks (GTK IM
and XIM shapes), Process/229 phrase picks, and a client-preedit commit all
land in the composer. The recorded fcitx4 shapes do not reproduce the issue.

* test(native-chat): read the composer event log through a typed dataset value
…8454)

Any press on a <webview> guest moves Chromium focus into it, so an agent click
took the user's terminal focus (stablyai#20595). Main now asks the hosting pane to guard
focus for each agent press (Orca's click/mouse down and the CDP proxy) and the
pane puts it back inside the webview's focus event, and again when the press
ends. Offscreen pages keep their native focus.
Adapt Jira rows and sort headers to their panel width so titles remain readable in narrow side panels.

Refs stablyai#16627.

Co-authored-by: Leopold Tripot <leopold.tripot@gmail.com>
Preserve safe ADF hyperlinks and rich-text marks through the existing Markdown renderer, with escaping and punctuation regressions.

Refs stablyai#13604.

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
…8592)

Expose host-owned verified Jira reads and single-attempt writes through the CLI. Preserve site ambiguity checks, old-host capability refusal, atomic label changes, and uncertainty after failed writes.

Refs stablyai#11986 and stablyai#26055.

Co-authored-by: Dan Cieslak <dcieslak19973@users.noreply.github.com>
Co-authored-by: kokbee <kok2209@gmail.com>
Use one token-based task search implementation on desktop and mobile. Preserve explicit issue/PR qualifiers, distinguish quoted search text, and follow shared reexports in mounted mobile recordings.

Refs stablyai#10950 and stablyai#11121.

Co-authored-by: MumuTW <42820974+MumuTW@users.noreply.github.com>
Support scoped Jira Cloud API tokens through the configured gateway while keeping self-hosted routing, redirects, diagnostics, and selected-host capabilities bounded.

Co-authored-by: Jerome Würf <oss@scharom.de>
Apply Jira edits immediately, keep writes ordered, and retain unrelated hydrated fields when a successful save cannot refresh details.

Co-authored-by: Jerome Würf <oss@scharom.de>
Search Jira tasks from Cmd+J with captured execution-owner routing and stale-request protection.
)

Generate Jira issue titles through the selected execution host, protecting cancelled requests and treating Jira content as quoted prompt data.

Co-authored-by: Kazuki Hanai <kazukihanai@sakana.ai>
)

Complete Jira Cloud discovery and token pagination, reject incomplete pages, and classify presets by status while retaining strict CLI reads.

Co-authored-by: ggbdpq <ggbdpq@gmail.com>
Recognize Jira issue references in workspace creation while retaining site-qualified identity and existing provider parsing.

Co-authored-by: Eugenio Valeiras <eugenio.valeiras@gmail.com>
…ai#28590)

Show linked workspaces for Jira issues and offer starting another workspace even when one link already exists; preserve site and execution-host identity.

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
…ocesses (stablyai#28594)

Reload externally changed Jira and Linear connection metadata and credentials on the next read using bounded file-identity caches. Existing captured requests and retained result expiry policies remain intact.

Co-authored-by: Minho Yi <tisohjung@gmail.com>
Browse Jira on mobile and create linked workspaces through the paired desktop, retaining shared task queries and protecting account/session changes.

Co-authored-by: Minho Yi <tisohjung@gmail.com>
Jinwoo-H and others added 29 commits October 15, 2026 14:21
… WSL (stablyai#29122)

* Add skill install entries for more agents; read every provider home env in WSL

Adds table entries for CodeBuddy, Qoder, Kiro (KIRO_HOME), Antigravity and
16 agents that read the shared .agents/skills root. The Antigravity entry
replaces its hand-written discovery source. The WSL env probe now reads
every table homeEnv in one NUL-terminated login-shell probe, and WSL
provider detection probes every table provider's detection commands.

* Fence the WSL provider-home probe and reject unusable relocated homes

The WSL probe now runs through buildWslCapturedLoginShellCommand, so rc
output cannot be read as a home value, bash reads .bashrc exports, and fish
falls back to sh. A relocated home at the filesystem root, the user home or
an ancestor of it falls back to the default folder on host and WSL.

* Treat an unusable WSL guest home as a failed provider-home probe
…t) (stablyai#29181)

* refactor(layout): build today's store slices from layout frames (inert)

Adds the phase E2a frame applier: published layout frames plus content
facts plus the window's view become today's tab, terminal, editor and
browser slices, through the shared Serializer and the window's own
restore builders. Nothing calls it yet. Publishes the fields the window
needs to rebuild those records (terminal launch inputs, browser tab
label and creation time, editor file owner) and extracts the pure parts
of editor, browser and terminal restore. An equivalence test compares
the result with today's startup restore for every stored profile.

* docs: name who owns what the applier does not write

* fix(layout): keep frontmatter and page handles, default active tab only where restore does

* fix(layout): default a group's active tab in every frame workspace, as startup does

* fix(layout): keep the published browser tab creation time optional on the wire

* chore(layout): move layout-writer baseline entries with the moved restore code
* test(ci): group PTY connection regression suites

* test(ci): keep reliability gates linked to grouped PTY suites

* test(ci): classify PTY mocks as test support and check live spawn state
…tablyai#29085)

* fix(mobile): phones on a host with no window list each terminal once

With no window attached, the phone tab list was built from the stored terminal rows as they
are, so a leftover row from an older build that repeats another tab's terminal showed as a
second tab on the same terminal. Build it from the shared Loader's result instead, as the
window and main's other readers do.

* perf(mobile): load each stored partition once per loop over worktrees

Review: list-all and graph sync hydrate once per worktree, and the Loader reads the whole
partition, so each call repeated it. The loops now share one cache for their duration.

* docs(mobile): say why the per-loop Loader cache ignores the host id

* perf(mobile): run the Loader only for a partition that repeats a row or terminal

A partition with no repeated row id and no terminal bound in two mounted panes is built from
its raw rows exactly as before, so titles, pane ids and cost there are unchanged.

* fix(mobile): compare terminals as the Loader does before deciding to load

Review: a relay terminal id reused by a later incarnation is a different terminal to the
Loader, so it must not trigger it either.

* fix(mobile): a legacy row's terminals repeat by id alone, as the Loader matches them

Review: comparing every binding by incarnation missed a legacy row repeating an SSH relay
terminal with no incarnation recorded; the Loader's legacy-row check matches raw ids.

* fix(mobile): drop only the legacy rows the Loader absorbs, per worktree

Replaces the partition-wide Loader swap and its per-loop cache: a phone on a
host with no window now differs from main only where it then matches the
desktop window, which tests compare across main, the branch and the window.

* test(mobile): compare tab groups too in the phone, main and window views
…(build switch, off by default) (stablyai#29185)

* feat(layout): add the dark layout.apply channel and route pane splits through main behind ORCA_LAYOUT_OWNER

A build made with ORCA_LAYOUT_OWNER=main registers layout.apply: main applies the
window's layout command to the stored partition through the shared applyLayoutCommand,
minting new ids. A user split then waits for main's answer and mounts the pane id main
minted. Every other build substitutes 'window', so neither branch is compiled in.

* fix(layout): write only the records a layout.apply command touched

A load-then-save rewrite also normalizes records the command never touched. The command's
effect is now the diff between the save before and after it, written onto the stored
partition record by record. A split whose main reply says a paired server holds the tab
splits as today.

* fix(layout): write a load-supplied record whole and check that patched partitions reload to the command's result

* fix(layout): leave a split to today's path only when the workspace's row names a paired server

The split switch point asked which host to route to with a helper that falls back to the focused
server, so a focused server could claim a workspace whose row names no owner. Use the same owner
test the tab mirror uses.

* test(layout): type the split owner mock without a cast
…tablyai#29203)

The browser client's UI bridge lacked the four Jira filter methods, so the
fallback bridge resolved undefined and filters showed empty and never saved.
Route them to the active host, gated on its capability so older hosts report
that an update is required.

Co-authored-by: Claude <noreply@anthropic.com>
…8923)

* feat(native-chat): show Claude's /goal in the goal banner

Claude reports a goal only as a synthetic reply in stream-json, so Orca saved it
as assistant text and never showed the goal banner Codex gets. Journal Claude's
goal replies as the typed goal transition, infer completion when Claude ends a
turn on its own, report the goal to clients apart from host goal controls, and
let the banner clear it by sending /goal clear.

* fix(native-chat): keep a Claude goal open when a person stops the turn

A Stop pressed while Claude ran the goal's check ended the turn with a clean
result, which read as the goal being met and removed the goal banner. The
journal's Stop rule already says when a person's Stop decides how a turn
ends; a turn it decides never counts as the goal being met.

* fix(native-chat): count Claude goal time from the turn start and title an idle goal 'Goal set'

* Fix Claude goal clear reveal and result accounting

* Hold Claude goal clear during pending sends

* Preserve Claude goal text with status-like phrases

* Require host goal support for persisted goal banner

* Keep structured session modules within line limits

* test(native-chat): give option-read journal doubles the goal read

* test(claude): give journal doubles the goal source read
…ra login, not its label (stablyai#29201)

* fix(jira): match workspace links by site identity, not account label

Jira links saved the account email as accountLabel while the Tasks page
source used the site display name, so sameSource() rejected every link and
the "Has Workspace" view stayed empty (STA-10654, stablyai#29055).

Jira connection identity is hostId + providerIdentity.siteId (per login per
site), so link matching, cmd-J workspace lookup and duplicate-link detection
now compare siteId for Jira and treat accountLabel as display-only. All Jira
label producers share getJiraAccountLabel so labels stay consistent.

* refactor(jira): simplify Has Workspace link matching after review

Match Jira workspace links by host only in sameSource, since siteId checks
downstream already separate logins; give getJiraAccountLabel a plain
structural parameter; make the other-login test use a reachable state.
WebKit reports no source frame for an app-initiated load() before iOS 18.5 (WebKit c28b242), so the iOS shell read its own document load as subframe-initiated and cancelled it, leaving the phone on "Opening workspace" forever. The navigation policy no longer takes the initiating frame as an input: the shell's own document loads when its one-shot load flag is up, the URL is the exact document URL, the target is the main frame, and it is not a download, matching the Android copy.

Verified on an iOS 18.1 simulator (hang before, workspace opens after) and iOS 26.5 (unchanged).

Refs stablyai#28626, STA-10545
* fix(omp): read the cmd fresh-config path by name so the guard survives a variable hand-over

On cmd.exe, OMP's fresh-session guard referenced %ORCA_OMP_FRESH_CONFIG%,
which cmd only expands while reading the typed line. When the line reaches
cmd inside another variable (the setup gate's
`<wait> && %ORCA_SEQUENCED_STARTUP_COMMAND%`), cmd expands once, the
reference stays literal, and OMP refuses to start with "fresh OMP settings
are unavailable".

The guard now reads the variable by name with a one-pass for-variable,
`for %! in (.) do @if exist "%~$ORCA_OMP_FRESH_CONFIG:!" ...`, so typed and
handed-over lines behave the same. The older cmd prefix stays recognized
for persisted lines and older hosts. A real-cmd test runs both deliveries in
the Windows CI lane.

* test(omp): pin the cmd guard's echo suppression and type the smoke's cmd line on stdin

The real-cmd test now runs echo on, like a pane, and asserts the config
path never reaches stdout, so dropping the guard's @ fails it. The manual
Windows smoke typed the line into a batch file, where the guard's %! would
need %%!; it now feeds cmd.exe on stdin like a pane does. The guard comment
now states the real rule: only %! or %~...! text in the for body changes,
and the quoter keeps prompts from forming it.
…ble change) (stablyai#28788)

* feat(session-history): the scanner reports its progress to windows

The Session History scanner now counts each agent's history files and
databases while it lists them, and how many transcripts it has read.
Main keeps one progress entry per local scan, tags list results with the
scan that produced them, tells the scan's own no-progress deadline apart
from other faults, and pushes updates to every window. The preload API
exposes getScanProgress and onScanProgress. Nothing reads them yet.

* fix(session-history): drop the redundant scan key from list results and progress

The scan ID already names the scan a result or progress entry came from, so
the key copy on the list result (sent to paired clients too) and on each
progress entry was never needed. The key stays only where it is the lookup.
… chat (stablyai#29056)

* fix(native-chat): resume conversations of any size in a new native chat

Resume in New Native Chat refused any saved conversation over 16 MiB, so long
Claude and Codex sessions could not move into a chat. The import now streams
the file, bounds each message as it is read, and keeps the newest messages
within the same 16 MiB budget; one line is still bounded at 16 MiB. The agent
resumes the full conversation itself, so only the chat's earliest messages
can fall outside the window.

* test(native-chat): adopt preflight refuses one line past the record bound, not a large file

* fix(native-chat): bound retained Pi import state and identities

* fix(native-chat): keep Pi branch projection responsive

* fix(native-chat): classify temporary Pi import table

* fix(native-chat): keep Pi resume independent of import scratch cleanup

* test(native-chat): match legacy Pi identity by shape
Reuse the imported preload graph with explicit runtime cleanup between cases.
…s but never installs (stablyai#28460)

* feat(acp): ACP agents can declare a managed runtime that a start runs but never installs

A start resolves PATH and the agent's install folders first, then the newest whole release under
Orca's data folder (its completion receipt and member sizes checked); with none it refuses with
runtimeNotInstalled instead of downloading.

* fix(runtime): tell an unreadable runtime release from a broken one, and point a not-installed chat at the chat itself

A transient read error (EIO, EMFILE) no longer counts a working release as incomplete; only
definite absence or a mismatch does. The not-installed refusal no longer sends a remote chat's
user to this computer's Settings.

* fix(acp): a start runs Orca's installed release before a copy on PATH, and a copy elsewhere only beside every file it needs
…ll window (stablyai#28781)

* Run clipboard file copy and TLS openssl through process-host

* refactor(clipboard): inject runProcess, pass the Windows path as data, add an e2e

- clipboard-file-copy builds the process spec itself, so the stdio policy sits
  next to the wl-copy/xclip knowledge it exists for; the IPC handler passes
  process-host's runProcess straight through and keeps no wrapper.
- A helper's exit is read as data (clean exit or not) instead of being turned
  into a throw and caught again.
- Windows runs a constant Set-Clipboard script and reads the path from the
  environment, so no path is ever parsed as PowerShell.
- Drop the dead tls-certificate rewrite; nothing in the app imports it.
- e2e: right-click Copy on Windows, then a real shell paste of the file.

* ci(e2e): run the Windows explorer file-copy spec on the Windows runner

Route it from the clipboard sources, keep it out of the Linux lanes, and run it
in the existing Windows e2e job beside the other Windows-only specs.

* refactor(clipboard): tighten the helper seam, tests and e2e after review

- runClipboardHelper takes runProcess and a plain ProcessSpec.
- One handler test pins the process-host wiring on every host; spec details
  stay in the unit tests, which now also pin the inherited environment.
- e2e: native realpath so an 8.3 runner temp path still matches, paste via
  process-host, and no toast check that could never fail.
- Route the renderer caller to the e2e too.

---------

Co-authored-by: Orca Worker <orca-worker@localhost>
…heir real version; a gone server's project can be removed (stablyai#27267) (stablyai#29208)

* fix(ssh): a paused move to the managed server says so, servers report their real version, and a gone server's project can be removed (stablyai#27267)

Co-Authored-By: Claude <noreply@anthropic.com>

* test: type the held-move fixture without an assertion

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
…tablyai#29214)

* fix(ssh): give each machine sharing one home its own managed server state (stablyai#29059)

* fix(ssh): key machine homes by machine-id, keep data roots short, recover empty claims

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
… worktree switch (stablyai#29210)

* fix(remote-terminal): reattach a healthy remote pane promptly after a worktree switch (stablyai#27178)

A remote pane whose stream ended while the host still reported its terminal
ready waited the whole 15s inventory window before reusing it, and a third end
within 60s demanded a replacement handle that never comes, parking recovery
with no timer until the ~3 min deadline. Unknown-liveness outcomes on the
attach and resubscribe paths also parked for online/resume events that a
healthy link never fires.

- Reuse a still-ready handle as soon as the host reports it, unless a
  terminal.send to it is unanswered (it may still come back stale).
- Pace repeated ends on the same handle with growing delays instead of
  requiring a replacement; only ends within 10s of a reattach count.
- Schedule unknown-liveness retries on the backoff ladder instead of parking;
  the existing deadline still latches Reconnect for a genuinely lost link.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(remote-terminal): fence an endless same-handle flap once its pacing ladder is spent

Each paced reattach marked the pane healthy and reset the recovery deadline,
so a handle that ended after every reattach retried forever without ever
offering Reconnect. After the last rung it now falls back to the replacement
wait, whose deadline latches Reconnect.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
…hind the layout-owner build switch (stablyai#29221)

* feat(layout): add the dark layout.apply channel and route pane splits through main behind ORCA_LAYOUT_OWNER

A build made with ORCA_LAYOUT_OWNER=main registers layout.apply: main applies the
window's layout command to the stored partition through the shared applyLayoutCommand,
minting new ids. A user split then waits for main's answer and mounts the pane id main
minted. Every other build substitutes 'window', so neither branch is compiled in.

* fix(layout): write only the records a layout.apply command touched

A load-then-save rewrite also normalizes records the command never touched. The command's
effect is now the diff between the save before and after it, written onto the stored
partition record by record. A split whose main reply says a paired server holds the tab
splits as today.

* fix(layout): write a load-supplied record whole and check that patched partitions reload to the command's result

* fix(layout): leave a split to today's path only when the workspace's row names a paired server

The split switch point asked which host to route to with a helper that falls back to the focused
server, so a focused server could claim a workspace whose row names no owner. Use the same owner
test the tab mirror uses.

* test(layout): type the split owner mock without a cast

* feat(layout): draw local and SSH workspace layouts from main's layout stream behind ORCA_LAYOUT_OWNER

* fix(layout): keep the frame sync out of window-owned builds' live code

* fix(layout): keep each row's live terminal binding and pane state across frames

* chore(layout): count the frame applier's layout writes and drop test casts

* fix(layout): hold frames while any save is owed, scope the view read-back to rebuilt workspaces

* fix(layout): keep the frame sync's module init out of window-owned builds

* docs(layout): name the read-back bucket and the failed-save hold
…yai#29126)

* Prepare native chat CLI copies from the host record

* Apply staged-file lint and formatting checks

* Cover pairing replacement before queued preparation dispatch

* Reuse CLI failure feedback and complete the pairing test response

* Isolate Codex materialization test user data

* Preserve native chat CLI copy completion and preparation ownership

* test: consolidate native conversation fork contracts

* fix(native-chat): refuse a Codex chat fork whose saved account home has no CODEX_HOME path
# Conflicts:
#	src/cli/bundled-skill-guides.ts
#	src/cli/handler-group-manifest.ts
#	src/cli/handlers/file.ts
#	src/main/menu/register-app-menu.ts
#	src/main/runtime/construction/runtime-file-command-state.ts
#	src/main/runtime/files/file-access.ts
#	src/main/runtime/rpc/methods/files-open-navigation.test.ts
#	src/main/runtime/rpc/methods/files.ts
#	src/main/runtime/runtime-file-command-host.ts
#	src/main/runtime/runtime-notifier-contract.ts
#	src/main/window/runtime-window-lifecycle.ts
#	src/preload/api/app-bridge.ts
#	src/preload/api/ui-bridge-terminal-and-session-tabs.ts
#	src/preload/api/ui-command-event-api.ts
#	src/renderer/src/app-shell/use-app-shell-services.ts
#	src/renderer/src/components/jira-issue-workspace-content.tsx
#	src/renderer/src/components/right-sidebar/pr-comment-presentation.test.ts
#	src/renderer/src/components/right-sidebar/source-control/listing/section-action-buttons.test.tsx
#	src/renderer/src/components/right-sidebar/source-control/listing/section-header.test.tsx
#	src/renderer/src/components/sidebar/CommentMarkdown.github-attachment-image.test.tsx
#	src/renderer/src/components/sidebar/MarkdownImageLightbox.tsx
#	src/renderer/src/components/sidebar/SidebarFilter.tsx
#	src/renderer/src/components/sidebar/SidebarWorkspaceFilterSection.tsx
#	src/renderer/src/components/sidebar/sidebar-filter-actions.ts
#	src/renderer/src/components/sidebar/sidebar-workspace-option-items.ts
#	src/renderer/src/components/sidebar/visible-worktree-kinds.ts
#	src/renderer/src/components/sidebar/visible-worktrees.ts
#	src/renderer/src/components/sidebar/workspace-options-menu-items.tsx
#	src/renderer/src/components/sidebar/worktree-list/listing/use-filters.ts
#	src/renderer/src/components/tab-bar/SortableTabContextMenu.tsx
#	src/renderer/src/hooks/ipc-events/mobile-terminal-close-ipc-bridge.ts
#	src/renderer/src/i18n/locales/en.json
#	src/renderer/src/lib/file-type-icons.test.ts
#	src/renderer/src/store/slices/ui/ui-slice-preference-actions.ts
#	src/shared/rpc-contract/files-params.ts
…working on upstream's new layout

Restore the background terminal launcher upstream deleted (stablyai#28130) as a fork copy for review
workspaces, point the PR comment scope at the moved git identity helper, and record in FORK.md
that upstream's own --line/--column (stablyai#28240) retired the fork's.
Classify the fork's persisted UI fields for the WSL mover, drop the chat-visual tab type upstream
removed and the expandImages prop the fork's CommentMarkdown no longer takes, keep the temporary
checkout flag out of upstream's SidebarFilterState, and move fork settings and the close-others
hook call out of two files upstream grew to their line caps.
@frbarbre
frbarbre merged commit c4f79b9 into main Oct 15, 2026
13 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants