Skip to content

🤖 feat: VS Code webview dock uses the desktop live line - #7692

Merged
ThomasK33 merged 3 commits into
mainfrom
feat/vscode-webview-live-line
Oct 28, 2026
Merged

ThomasK33 merged 3 commits into
mainfrom
feat/vscode-webview-live-line

Conversation

@ThomasK33

Copy link
Copy Markdown
Member

Summary

The VS Code webview dock now uses the desktop live line: one row with the turn status plus a sub-agents chip and a background-bash chip, each opening its panel. The two full-width rows above the composer are gone. Fixes #7689 (refs #4968).

Background

#7660 and #7687 folded the desktop composer's activity rows into one live line (ChatActivityLine renders the chips as the activity of StreamingBarrier inside ChatActivityPanelsProvider). #7660 left the webview on the old rows on purpose, so a narrow VS Code sidebar still spent one row per kind.

Implementation

All changes are in vscode/src/webview/. No file under src/ changes, so desktop behavior and the desktop bundle stay as they are.

  1. App.tsx: one ChatActivityPanelsProvider (dataComponent="ChatActivityLine") wraps VscodeStreamingBarrier, whose activity is SubAgentTasksDock, BackgroundProcessesBanner and the shared ChatActivityOverflowChip ("+N", as on desktop). The provider key includes the connection and the workspace (activity-line-<connection>-<workspace>), so no open panel or bash output dialog carries over to another workspace or server. Without a server connection the line gets null chips, as before (no last-known processes offered).
  2. StreamingBarrier.tsx: forwards activity and passes showModelName={false} like the desktop line. Without an aggregator it renders the same StreamingBarrierContent with an idle state instead of null, so the chips show between turns and never remount when a turn starts or ends. With no chip and no turn, the shared view hides the row.
  3. SubAgentTasksDock.tsx: uses useChatActivityPanel("sub-agents") instead of a persisted expanded flag, the same as desktop SubAgentTasksDecoration. Opening one panel closes the other. The getSubAgentTasksExpandedKey entry stays in the storage cleanup registry, so old persisted values still get cleaned up.

Narrow widths: the shared provider opens panels in its bottom sheet at widths of 768 px or less, or heights of 500 px or less. Desktop does the same. So at 740 px and 400 px the panels open in the sheet. At wider widths they open as a popover above the line.

Perf-owner checks: make check-react-compiler stays green with the same pre-existing "1 known skipped" as main. The change adds no eslint-disable react-hooks, no manual memo, and no per-row transcript work. Dist CSS assets: 2 before, 2 after (out/xumChatView.css, out/katex/katex.min.css). No shared CSS was added, and the webviewCss.test.ts drift guard passes unchanged.

Validation

  • BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun test ./vscode/src/webview/ (Bun 1.4.3): 110 pass. New tests in App.test.tsx ("vscode webview live line (🤖 feat: VS Code webview dock folds its activity rows into the desktop live line #7689)"): both chips share one line and one panel slot; Ctrl+Alt+A from the composer opens the sub-agents panel; an open panel survives a turn starting and ending but does not carry over to another workspace. Each new test fails against a deliberate break. The existing terminate, sub-agent select and Ctrl+Shift+J keyboard tests pass on the chip UI.
  • make static-check passes.
  • Dogfood: the webview bundle ran against a no-backend stub extension host (one running sub-agent, one running background bash, with and without a live turn). This ran locally and in a remote Coder Agents UAT round. No model and no chat sends.

Before (main)

740 px, live turn:
before 740 turn

400 px, live turn:
before 400 turn

After

740 px, live turn:
after 740 turn

400 px, live turn:
after 400 turn

740 px, between turns (chips only):
after 740 idle

400 px, sub-agents chip opened (shared bottom sheet at this width):
after 400 sub-agents sheet

1000 px, sub-agents panel above the line:
after 1000 sub-agents popover

Risks

The risk is low and limited to the webview dock. The chips and panels are the shared desktop components. The webview only changes where they mount. Sub-agent panel state is no longer persisted per workspace, which matches desktop.

Pre-existing, not changed here: after a switch to file mode, a stale streaming status stays in the line. I checked the stub on main, and main shows the same.


Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high • Cost: $11.53

The webview dock stacked one full-width row per activity kind (sub-agents,
background bashes) above its turn status. Render them as chips in the turn
status row inside ChatActivityPanelsProvider, as desktop's ChatActivityLine
does (#7660, #7687): one panel open at a time, the row kept between turns for
its chips and hidden without any, keyed per connection and workspace.

Refs #7689

Signed-off-by: Thomas Kosiewski <tk@coder.com>
Signed-off-by: Thomas Kosiewski <tk@coder.com>
…precondition

The live line's bash chip shows only a count, so the server-switch test's
textContent probe for "background bash" could no longer see the previous
server's processes: it passed with the connection-switch cache reset removed.
Probe the chip element instead, as the first-reveal test already does.

The chord test now checks the sub-agents panel starts closed, so only the
chord can open it.

Signed-off-by: Thomas Kosiewski <tk@coder.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-28T07:28:28.697781Z 6cb6100 Manual request
🔒 Security Review ✅ Completed 2026-10-28T07:29:14.449261Z 6cb6100 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@ThomasK33

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 6cb610066d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 6cb610066d

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@github-actions

Copy link
Copy Markdown
Contributor

🟢 e2e stories (Haiku): 14 passed

22 agent steps · 7 replayed from cache · 15 model calls · 46.4k tokens (27% cached)
Spend: $0.09 of the $1.00 cap (proxy ledger)

All 14 tests in 9 files
Test Agent Time
🟢 chatRestart.e2e.ts · 1 passed 1 step · 1 call 5.8s
🟢 a chat survives a restart of the server 1 step · 1 call 5.8s
🟢 compaction.e2e.ts · 1 passed 1 step · 1 call 8.0s
🟢 /compact replaces the old chat with a summary 1 step · 1 call 8.0s
🟢 pluginTrustRestart.e2e.ts · 1 passed 4 steps · 2 calls 9.6s
🟢 a trusted plugin hook stays trusted after the server restarts 4 steps · 2 calls 9.6s
🟢 settingsRoundTrip.e2e.ts · 1 passed 2 steps · 1 call 9.1s
🟢 a chat survives trips through Settings 2 steps · 1 call 9.1s
🟢 sidebarPerWorkspace.e2e.ts · 1 passed 4 steps · 1 call 4.6s
🟢 a new workspace starts with its right sidebar collapsed while another keeps it open 4 steps · 1 call 4.6s
🟢 smoke.e2e.ts · 1 passed 2 steps · 1 call 4.7s
🟢 the agent opens the playground workspace 2 steps · 1 call 4.7s
🟢 streamErrors.e2e.ts · 1 passed 1 step · 1 call 7.6s
🟢 stream errors show in the chat, and the chat recovers 1 step · 1 call 7.6s
🟢 todoNudge.e2e.ts · 1 passed 1 step · 1 call 3.5s
🟢 the agent finishes open TODO items after the turn-end nudge 1 step · 1 call 3.5s
🟢 touchAlignment.e2e.ts · 6 passed 6 steps · 6 calls 25.0s
🟢 the Settings close button is level with the title on a touch screen 390px wide 1 step · 1 call 5.2s
🟢 the Settings close button is level with the title on a touch screen 768px wide 1 step · 1 call 4.1s
🟢 Backup settings checkboxes are small and level with their labels on a touch phone 1 step · 1 call 5.3s
🟢 the heartbeat checkbox is small and level with its label on a touch phone 1 step · 1 call 3.3s
🟢 a reply's model and time stay on one line on a touch phone 1 step · 1 call 4.0s
🟢 the workspace actions menu stays on the title row on a touch phone 1 step · 1 call 3.0s

e2e 0.20.0 · 1m 21s · web · run artifacts

🟢 e2e Electron stories (Haiku): 3 passed

3 agent steps · 3 model calls · 7.9k tokens (33% cached)
Spend: $0.01 of the $1.00 cap (proxy ledger)

All 3 tests in 3 files
Test Agent Time
🟢 electron/deepLink.e2e.ts · 1 passed 1 step · 1 call 5.3s
🟢 a deep link of a second launch starts a chat in the running app 1 step · 1 call 5.3s
🟢 electron/menuBar.e2e.ts · 1 passed 1 step · 1 call 6.2s
🟢 the workspace menu bar is the desktop title bar 1 step · 1 call 6.2s
🟢 electron/smoke.e2e.ts · 1 passed 1 step · 1 call 5.0s
🟢 Xum Electron opens the playground workspace 1 step · 1 call 5.0s

e2e 0.20.0 · 18.6s · electron · run artifacts

🟢 e2e agent repros (Haiku): no tests selected

Spend: $0.00 of the $1.00 cap (proxy ledger)

e2e 0.20.0 · 5.3s · 2 targets (web, phone) · run artifacts

@ThomasK33
ThomasK33 added this pull request to the merge queue Oct 28, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 28, 2026
@ThomasK33
ThomasK33 added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 398cc64 Oct 28, 2026
33 of 34 checks passed
@ThomasK33
ThomasK33 deleted the feat/vscode-webview-live-line branch October 28, 2026 08:01
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.

🤖 feat: VS Code webview dock folds its activity rows into the desktop live line

1 participant