Skip to content

perf(web-ui): stop re-measuring transcripts while a pane divider is dragged - #3371

Merged
GCWing merged 3 commits into
GCWing:mainfrom
czs914893385:perf/web-ui-pane-resize-suspension
Oct 19, 2026
Merged

GCWing merged 3 commits into
GCWing:mainfrom
czs914893385:perf/web-ui-pane-resize-suspension

Conversation

@czs914893385

@czs914893385 czs914893385 commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Dragging the workbench divider with a chat transcript and a worker/side-session transcript open repeatedly invalidates width-dependent measurements. This change retains the last published transcript width during the gesture and publishes the settled width afterwards, reducing redundant measurement work.

Changes

  • WorkbenchLayout owns shared drag/settle state. Session scenes and promoted content views in either pane consume it through context, and the contextual canvas receives the same suspension state. Transcript measurement stays suspended through the existing two-frame settle window; composer layout pauses during the drag.
  • Both transcript implementations defer width publication, and the shared virtualizer remembers deferred layout invalidations until measurement resumes.
  • SplitView reuses the latest observer-cached bounds instead of reading layout in pointer handlers. Queued paint frames recheck those bounds, so shrinking or growing the container during a drag preserves the size constraints. Rounded pixel widths that have not changed skip the live style write.
  • Integrates the current main-branch workbench/surface layout and documents the focused verification commands.

Validation

  • Focused Web UI tests: 24 files, 322 tests passed, including workbench navigation/lifetime, split/overlay drag and settle, cancellation, container growth/shrinkage, queued drag frames, transcript measurement, scrolling and suspended viewport recovery.
  • The final promoted-content integration was checked with the workbench/navigation fixtures: 10 files, 155 tests passed.
  • The three added live-container regression cases failed before the bounds fix and pass afterwards.
  • pnpm run check:web passed, including type checking, Appearance contracts, typography, theme color audits and theme visual contracts.
  • SplitView package tests: 2 passed; focused source lint: 0 errors.
  • API bindings were regenerated using the existing gen:types workflow.

AI-assisted changes. Native WebView frame-rate improvement has not been measured. Live remote workspace, Remote Control, Peer Device and Detached Dispatch scenarios were not exercised; DOM tests are not evidence of those paths.

中文说明

拖动分隔条时,主聊天与 worker/子会话暂缓宽度变化引起的测量,布局稳定后再更新。暂停状态已接入当前主分支的 Workbench 布局;同时修复拖动中容器尺寸变化仍使用旧边界的问题,并覆盖排队帧和取消手势。相关 322 项测试及 check:web 均通过。

GCWing added 2 commits October 19, 2026 09:23
Resolve the current workbench layout conflicts while preserving transcript measurement suspension. Share drag and settle state with scenes and the canvas, and use observer-cached bounds for both pointer events and queued paint frames. Cover live container resizing, deferred frames, split/overlay settling and cancellation.
@GCWing
GCWing merged commit 2375420 into GCWing:main Oct 19, 2026
9 checks passed
czs914893385 added a commit to czs914893385/OpenBitFun that referenced this pull request Oct 19, 2026
…recovery

Brings the aux-pane child-session recovery work up to current main.

Conflict (only one file, src/web-ui/src/app/components/panels/base/FlexiblePanel.tsx,
case 'btw-session'): both sides appended a prop to <BtwSessionPanel>. Kept both - upstream's
resizeSuspended={resizeSuspended} (perf(web-ui) 6f2ec2b, the merged pane-resize PR GCWing#3371)
and this branch's four child-identity props (sessionKind / sessionTitle / parentToolCallId /
subagentType). No other file needed manual work; the pane-resize plumbing is untouched.
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