Skip to content

Web: instant, flicker-free workspace switching + unified loading UI - #349

Open
Olga Lavrichenko (OLavrik) wants to merge 17 commits into
mainfrom
olga.lavrichenko/async
Open

Web: instant, flicker-free workspace switching + unified loading UI #349
Olga Lavrichenko (OLavrik) wants to merge 17 commits into
mainfrom
olga.lavrichenko/async

Conversation

@OLavrik

Copy link
Copy Markdown
Collaborator
  • Stops remounting the workbench (side/center/bottom chrome, tool panels, terminals) on every workspace switch — layout ids are now stable by role instead of random per instantiation, and Radix panel
    geometry syncs via setLayout instead of a remount-triggering key.
  • Prewarms workspace layouts for every expanded project (not just the selected one), swept once per expansion rather than on every workspace-list change.
  • Skips the host round-trip entirely for a workspace this client just created/attached — installs the default layout synchronously instead of waiting on a network read that can only come back empty.
  • Fixes a regression this surfaced: the one-time initial-terminal seed was keyed only by connection generation, so a second freshly-created worktree in the same session silently got zero terminals.
  • Establishes and documents a strict two-tier loading vocabulary — content-shaped skeletons for regions, pinned spinners for single controls — applied consistently across panels, dialogs, and the
    chat/plan/editor tab restore path. Resolved content now fades in instead of popping in; a retry affordance never appears alongside an active loading indicator (the chat-restore retry only surfaces once
    auto-hydration has genuinely stalled).

Server: git off the event loop
Migrates git read paths through gitAsync so they no longer block the event loop; keeps review/todo read-modify-write passes atomic across the async reads and free of post-teardown writes.

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes — please address the blocking inline finding.

Comment thread packages/server/src/reviews/reviews.ts
Comment thread packages/server/src/host/todoReview.test.ts Outdated

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes — please address the blocking inline findings.

Comment thread apps/web/src/shell/Shell.tsx Outdated

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes — please address the blocking inline finding.

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes — please address the blocking inline finding.

Comment thread apps/web/src/shell/chatReconciliation/chatReconciliation.ts Outdated
Comment thread apps/web/src/index.css Outdated
jetbrains-air[bot]
jetbrains-air Bot previously approved these changes Aug 31, 2026

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — ready to merge.

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes — please address the blocking inline finding.

Comment thread apps/web/src/shell/chatReconciliation/chatReconciliation.ts Outdated
jetbrains-air[bot]
jetbrains-air Bot previously approved these changes Aug 31, 2026

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — ready to merge.

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — ready to merge.

Comment thread apps/web/src/panels/ProjectTree.tsx

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — ready to merge.

…r a worktree is created

ThinkRail-Todo: 01a03102-63c8-7e34-a17a-2874e98866f8/t_2752e41ad684
…ll sites the rebase left un-awaited, and fix retired t-shirt spacing classes reintroduced by pre-migration commits
…e, land the creating-row where the item lands

Deleting the active workspace cleared its layout document/attention in the same tick React's deferred workspaceId hadn't caught up in yet, so the fallback briefly rendered the full-skeleton for the vanishing workspace and remounted the side panels; hold the last-known document/attention through that transition instead. Also move the "Creating worktree…" placeholder row below the list, since new worktrees land at the bottom, not the top.
…of popping it

Switching to a workspace whose default preset has a different panel shape (e.g. Balanced to Focus) forces react-resizable-panels to remount the aligned-row/outer panel groups — it can't reconcile a panel-count change in place. Soften that unavoidable remount with an opacity-only fade (never transform, since these subtrees can hold ChatView's sticky breadcrumbs).
… most SkeletonRows call sites

Fifteen call sites across panels and shell each hand-rolled the same <div className="..."><SkeletonRows/></div> wrapper; three of them additionally opened a redundant second role="status" region around SkeletonRows' own. Centralize the shape in one component and thread label/testId into SkeletonRows' existing live region instead of duplicating it. Also fixes two SPEC.md references to ChatResourcePending left stale by its post-rebase merge into ChatResourceBody, and adds unit coverage for the new primitive.
…ialog's git worktree list was left synchronous

gitWorktreeEntries (behind listExistingWorktrees/openExistingWorktree) still ran git worktree list --porcelain through the sync runner, blocking the host's single event loop on the same request path the gitAsync migration was meant to cover — it wasn't gitStatus/gitDiffFile/listCommits/listBranches, so it slipped through both that commit and the rebase follow-up fixing its un-awaited call sites.
…iled blob read

Both are rebase-exposed gaps from the gitAsync migration commits: workspace.list/openExisting
handlers weren't updated to await the now-async workspaces.ts functions, and blobFrom's ref/path
params went unused once its warning message was split out of readBlobAt.
The gitAsync-migration commit awaited buildSendPackage's sibling reads (getReviewSnapshot,
markCommentsSent) in these same two spots but missed the call itself, so both a manual
TODO fix and a reflected fix interpolated a literal [object Promise] into fixText instead
of the findings package. Also drops a migration-rationale comment per the near-zero-comment rule.
Both drove page.getByTestId(...).first() against whatever provider sorts first, which is only
the e2e fake in the dev boot (THINKRAIL_E2E_FAKE_OAUTH); in binary/desktop mode that resolves to
a real provider and its OAuth/API-key flow hangs or errors in the sandboxed CI runner, timing out
the login-cancel/login-success wait. provider-login.spec.ts/provider-apikey.spec.ts already carry
this tag for the same reason.

@jetbrains-air jetbrains-air Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved — ready to merge.

@OLavrik
Olga Lavrichenko (OLavrik) added this pull request to the merge queue Sep 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Sep 1, 2026
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.

2 participants