Repository navigation
🤖 feat: live line follow-ups and a Waiting on you card - #7687
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
🟢 e2e stories (Haiku): 14 passed22 agent steps · 7 replayed from cache · 15 model calls · 46.3k tokens (24% cached) All 14 tests in 9 files
e2e 0.20.0 · 1m 17s · web · run artifacts 🟢 e2e Electron stories (Haiku): 3 passed3 agent steps · 3 model calls · 7.9k tokens (22% cached) All 3 tests in 3 files
e2e 0.20.0 · 20.6s · electron · run artifacts 🟢 e2e agent repros (Haiku): no tests selectedSpend: $0.00 of the $1.00 cap (proxy ledger) e2e 0.20.0 · 5.4s · 2 targets (web, phone) · run artifacts |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 074b3ac1da
ℹ️ 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".
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
Codex Review: Didn't find any major issues. Can't wait for the next one! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
…ou card forms or breaks up
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull 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".
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".
…s, viewport-owned chords, whole sheet tabs on touch)
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
UAT round fu-r2 found two ways a phone sheet closed and left focus on the page body: - Waiting on you: with the sheet open and an answer typed, the count going from 2 to 1 closes the sheet and puts the question back inline, but the textarea lost focus. The sheet lifted the page's inert in a passive effect cleanup, after WaitingOnYouSlot's layout effect had tried to focus the inert textarea. ChatDockSheet now makes the page inert in a layout effect, so the closing commit lifts it before the slot puts its focus back. - Live line: a sheet opened from the bashes chip, then a line change (the turn ending or starting) moved that chip into "+N", and Escape returned focus to the hidden chip. ChatDockSheet takes an optional returnFocus(opener); the activity sheet maps a hidden chip to the "+N" chip, and a "+N" chip that hid to the chip of the panel it showed last. Unit tests and the new PhoneCountChangeKeepsTyping story, plus a WorstCasePhone step, fail on their focus assertions without the fix.
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dfca77d0c9
ℹ️ 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".
…hide or leave, sheet Escape from body, queued menu in the sheet) Codex round 4: - A hidden chip's entry in the "+N" list now moves focus into the panel it opens (the desktop popover comes before the "+N" chip in Tab order). The "+N" chip stays the return target. - The closing activity sheet returns focus to a chip the line still shows when the chip that opened it left with its activity (the last bash exited, which closes the sheet). - In the phone sheet, the queued message's dispatch menu opens below its row and scrolls into view. Above it, the sheet's scroll container cut off the first choices under a short message. UAT fu-r3 (PASS, two low findings): - Escape from <body> closes the Waiting on you sheet, as it does the activity sheet: focus lands there when it leaves the sheet. - A chip that hides while focused hands focus to the "+N" chip, and the "+N" chip to the first chip it stood in for once every chip fits.
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7aa3fa060c
ℹ️ 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".
…anel chords inside the activity sheet)
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
Codex Review: Didn't find any major issues. Another round soon, please! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
…-ups # Conflicts: # src/browser/components/ChatPane/ChatInputDecoration.tsx # src/browser/features/Messages/ChatBarrier/StreamingBarrierView.tsx
- Regenerate phoneChrome.generated.ts: the live phone page now has the Waiting on you slots, the strip's data-activity-strip marker and the invisible "+N" chip (make check-phone-chrome failed on the merge). - NarrowPaneDesktop: a 375px frame again (phoneFrame(width)); the bashes chip still fits a 390px frame, so the play found no Bashes entry. - Keep the "+N" list at the line's end without a TODO chip (comment): it shows only in a full strip. - stripToggle: loose null check keeps its CC at the base's 5.
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1f9a575b0e
ℹ️ 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".
…messages leaves the sheet, when the card breaks up, and when the window outgrows the sheet; spacer gap; seed-only finished plan) - ChatDockSheet: a focused control that leaves the open sheet while focus falls to <body> puts focus back in the sheet (MutationObserver, only while the window has focus). - WaitingOnYou: the provider owns the desktop tablist ref; the summary's sheet returns focus to the selected desktop tab when the window outgrows the sheet. When the card breaks up around the focused control (one item left), the item left over takes focus inline (slot containers are focusable, tabIndex -1). - measureChipOverflow: the hidden spacer's gap counts only beside a plain (TODO) chip. - StreamingMessageAggregator: a finished list that only the window seed knows clears when the running turn ends (todosFromWindowSeed); todo_write handling moved to applyTodoWrite (CRAP). - Regenerated phoneChrome.generated.ts (slot containers carry outline-none).
|
@codex review |
🛡️ Codex Security Review · Automatically triggeredSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
Codex Review: Didn't find any major issues. 🎉 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
## 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 coder#7689 (refs coder#4968). ## Background coder#7660 and coder#7687 folded the desktop composer's activity rows into one live line (`ChatActivityLine` renders the chips as the `activity` of `StreamingBarrier` inside `ChatActivityPanelsProvider`). coder#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 (coder#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:  400 px, live turn:  ### After 740 px, live turn:  400 px, live turn:  740 px, between turns (chips only):  400 px, sub-agents chip opened (shared bottom sheet at this width):  1000 px, sub-agents panel above the line:  ## 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`_ <!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high costs=11.53 --> --------- Signed-off-by: Thomas Kosiewski <tk@coder.com>
Summary
Delivers every follow-up that #7660 listed for the composer live line, in one PR: bash rows lead with their command, the plan chip keeps a finished plan until the next turn, the TODO, sub-agents and reviews chips get shortcuts, a "+N" chip shows strip overflow, phone landscape gets 44px sheet targets, and everything that waits on the user folds into one "Waiting on you" card (a summary row plus a sheet on phones).
Background
#7660 shipped the live line above the composer and left these items open:
Implementation
BackgroundProcessesBanner.tsx): the row title is the command, the display name is secondary, terminate has anaria-label, and closing the output dialog returns focus to the row that opened it.StreamingMessageAggregator.ts,WorkspaceStore.ts,todoList.ts): a plan whose items are all done stays until the next user turn starts instead of clearing at stream end; between turns the sidebar keeps the agent's own status instead of the plan's last step. A finished plan that only the window seed knows (a reload mid-turn whose retained window starts at the running turn) may be the previous turn's, so it still clears when the running turn ends, as before.keybinds.ts,ChatInputDecoration.tsx,chatActivityPanels.tsx):OPEN_TODO_PANEL,OPEN_SUB_AGENTS_PANELandOPEN_REVIEWS_PANELare Ctrl+Alt+O/A/R, matched bycodewith an AltGr guard so international layouts that type characters with AltGr do not trigger them. Like the background bashes shortcut, the chord focuses the list (opening it if needed) and closes it when pressed from inside. They leave the keys to a focused browser or desktop viewport, as the background bashes shortcut now does too. In the activity sheet (phones and short windows), a modal over the inert page, the chords and the background bashes shortcut still swap and close its panels while focus is in it; other dialogs still block them. They are listed in Settings and indocs/config/keybinds.mdx.ChatInputDecoration.tsx): when chips overflow the strip, a trailing chip counts the hidden ones and opens the sheet. A hidden chip's entry in the "+N" list opens its panel with focus in it (the popover comes before the "+N" chip in Tab order), and closing returns focus to the "+N" chip. The line can hide a chip at any time (Stop or a status label takes room, or room comes back), and a hidden chip cannot keep focus, soshownFocusTarget(chatActivityPanels.tsx) picks the first the line shows of: that chip, the "+N" chip, the chip the "+N" chip stood in for, any chip. It runs when a focused chip hides, and when the sheet closes (throughChatDockSheet'sreturnFocusprop), so a chip that left with its activity also hands focus to one the line shows. The background bashes list returns focus itself (a row's Escape, or its chord) and picks the "+N" chip the same way while the bashes chip is hidden (shownChip). The "+N" list opens at the line's end with or without a TODO chip (🤖 fix: left-align activity chips in the live line without a TODO chip #7688 moved bordered chips' panels to the line's start without one): the "+N" chip shows only in a full strip, so it ends the strip either way.ChatDockSheet.tsx): the sheet's Close and tab buttons usepointer-coarse:size-11, so they are 44px on touch at any width (theglobals.csstouch rule stops at the phone width); a test-runner check covers the phone landscape story. On touch phones the tabs keep their whole label and count, and the tab strip scrolls instead of shrinking them.WaitingOnYou.tsx,ChatDockSheet.tsx): the ask-user question, legacy plan import and interrupted delegated creation docks self-report throughuseWaitingOnYou;ChatPaneadds the context switch warning, held inputs and queued messages through entry helpers. With two or more, desktop shows one card with tabs and a collapse toggle; queued messages show as a row under it and do not count toward the threshold. Phones show a summary row that opens a sheet with the chosen item and "Also waiting" rows. Each dock renders through a portal into a container that moves between the slot, the card body and the sheet, so switching layouts does not remount it: a half-typed answer keeps its textarea and its focus when another item arrives or leaves.ChatDockSurfacekeeps the same two elements inside and outside the card (only classes change), and agetSnapshotBeforeUpdateprobe records what had focus before each commit, because removing the card takes the moved content's focus with it before any effect runs. Content that stops waiting (an old-plan notice that found nothing to import) leaves the card and shows inline, with its normal gutter and column. When an item that holds focus leaves while others still wait (the item on show, or on phones a focused "Also waiting" row, such as a queued message that sends itself) and its focus fell to the page, focus moves to what shows the next item (the sheet's content on phones, the selected tab on desktop). A focused control that leaves the open sheet while its item stays (one of several unsent messages) puts focus back in the sheet too. When the card breaks up around the focused control (one item is left, and on phones the sheet closes), the item left over takes focus inline: slot containers are focusable for that (tabIndex=-1, not in the Tab order). When the window outgrows the open sheet, the desktop card's selected tab takes focus.ChatDockSheetis the sheet extracted fromChatActivitySheetso both use it; it makes the covered page inert in a layout effect, so the commit that closes the sheet lifts that before a slot that leaves the sheet puts its focus back (an inert textarea cannot take focus), and Escape from<body>closes it too. In the sheet, which scrolls, the queued message's dispatch menu opens below its row (useInWaitingOnYouSheet): above it, the sheet cut off its first choices.Validation
WaitingOnYou.test.tsx(threshold, queued exclusion, tab switching, no remount across layouts, focus when the shown item, a focused sheet row or one of several unsent messages leaves, the phone sheet's 2 to 1 handoff, the card breaking up around a focused tab or sheet row, the sheet to desktop crossing),chatActivityOverflow.test.tsx(+N count, panel chords incl. AltGr guard, focused viewports and chords from inside the phone sheet, sheet focus return when a chip or the +N chip hides, the hidden spacer's gap), aggregator and store tests for the kept finished plan (and the seed-only one that clears), bash row tests.App.waitingOnYouDesktop, Phone,CountChangeKeepsTyping(drops and restores the unsent messages while an answer is typed; fails in Chromium without either part of the remount fix) andPhoneCountChangeKeepsTyping(the same in the phone sheet),App.composerActivityLine(overflow, landscape 44px check in the test runner, focus on "+N" when a turn hides the chip that opened the sheet, chords that swap and close the phone sheet's panels from inside it, the bashes chord included),App.composerActivityLineNarrowPaneDesktop(a desktop window with a narrow chat pane: the bashes list opened from "+N" hands focus back to the "+N" chip on Escape and on its chord),App.phoneViewports. The new focus assertions fail without their fix.<body>in the Waiting on you sheet, a focused "+N" chip that hides), fixed with the Codex round 4 findings in 7aa3fa0. Round fu-r4 on 7aa3fa0 found that a bashes list opened from the "+N" entry dropped focus to<body>on Escape (fixed in a805bfb); its other checks held. Round fu-r5 on 1f9a575 (after merging main) passed: the panel chords inside the activity sheet, a focused queued row that sends itself, the "+N" bashes focus fix and the 🤖 fix: left-align activity chips in the live line without a TODO chip #7688 layout held; it found one low focus gap (the card breaking up around a focused "Also waiting" row dropped focus to<body>), fixed with the Codex round 6 findings in 907079d. Round fu-r6 on 907079d passed: the item left over takes focus when the card breaks up (phone and desktop), focus stays in the open sheet when one of several unsent messages leaves, the desktop card's tab takes focus when the window outgrows the sheet, the chip fits one column gap sooner without a TODO chip, and a typed answer keeps its textarea and focus across 2 to 1 on both layouts; 1f9a575 dropped focus to<body>in the first three.make crap-checkwith coverage,make dry-checkandmake check-phone-chromepass. The phone chrome skeleton (phoneChrome.generated.ts) is regenerated: the live phone page now has the Waiting on you slots (their containers carryoutline-none), the strip'sdata-activity-stripmarker and the invisible "+N" chip. That check runs only in the merge queue, so PR CI does not show it.Risks
Medium, limited to the composer's dock area. The Waiting on you portal moves existing docks between containers; a bug there would show as a dock rendering in the wrong place or losing local state. The finished-plan change keeps a plan visible one turn longer; the sidebar status ignores it between turns. The new shortcuts use Ctrl+Alt chords that were unbound.
ChatDockSheetnow lifts the page's inert one phase earlier (layout instead of passive cleanup); focus still returns in the passive cleanup. A click on a dock's plain text now focuses its slot container instead of<body>.Follow-ups
<body>. This predates the PR (same on e5fa140) and is left for a separate change.outline-none, so after that handoff a keyboard user sees no focus ring until the next Tab (found in UAT round fu-r6). Afocus-visiblering for both is left for a separate change.