Skip to content

🤖 feat: live line follow-ups and a Waiting on you card - #7687

Merged
ibetitsmike merged 17 commits into
mainfrom
mike/live-line-follow-ups
Oct 28, 2026
Merged

ibetitsmike merged 17 commits into
mainfrom
mike/live-line-follow-ups

Conversation

@ibetitsmike

@ibetitsmike ibetitsmike commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

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:

  • One "Waiting on you" surface for open questions and queued or held messages.
  • No shortcut for the TODO, sub-agents and reviews chips.
  • No overflow cue when all five chips do not fit at 390px (the design's "+N" chip).
  • Bash rows showed the agent's display name instead of the command.
  • Closing a bash's output dialog opened with the mouse left focus on the page body.
  • A fully completed plan cleared when its turn ended, so its chip vanished instead of showing 5/5.
  • Phone landscape (844x390) sheet Close button stayed 32px, because the 44px touch rule stops at 768px wide.
  • A bash row's terminate button had no accessible name.

Implementation

  • Bash rows (BackgroundProcessesBanner.tsx): the row title is the command, the display name is secondary, terminate has an aria-label, and closing the output dialog returns focus to the row that opened it.
  • Finished plan chip (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.
  • Shortcuts (keybinds.ts, ChatInputDecoration.tsx, chatActivityPanels.tsx): OPEN_TODO_PANEL, OPEN_SUB_AGENTS_PANEL and OPEN_REVIEWS_PANEL are Ctrl+Alt+O/A/R, matched by code with 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 in docs/config/keybinds.mdx.
  • "+N" overflow chip (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, so shownFocusTarget (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 (through ChatDockSheet's returnFocus prop), 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.
  • Landscape targets (ChatDockSheet.tsx): the sheet's Close and tab buttons use pointer-coarse:size-11, so they are 44px on touch at any width (the globals.css touch 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.
  • Waiting on you (WaitingOnYou.tsx, ChatDockSheet.tsx): the ask-user question, legacy plan import and interrupted delegated creation docks self-report through useWaitingOnYou; ChatPane adds 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. ChatDockSurface keeps the same two elements inside and outside the card (only classes change), and a getSnapshotBeforeUpdate probe 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. ChatDockSheet is the sheet extracted from ChatActivitySheet so 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

  • Unit tests: 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.
  • Storybook: App.waitingOnYou Desktop, Phone, CountChangeKeepsTyping (drops and restores the unsent messages while an answer is typed; fails in Chromium without either part of the remount fix) and PhoneCountChangeKeepsTyping (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.composerActivityLine NarrowPaneDesktop (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.
  • Remote UAT through Coder Agents (dogfood), against base e5fa140: claims 1 to 5 held (bash rows, finished plan chip, chords incl. AltGr and held-key cases, +N at 320/390/414, 44px landscape targets). Round fu-r1 found the count-change remount (fixed in 9eb14e9). Round fu-r2 confirmed the Codex round 2 fixes and found two phone sheet focus drops (fixed in dfca77d). Round fu-r3 on dfca77d passed and found two low focus gaps (Escape from <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-check with coverage, make dry-check and make check-phone-chrome pass. The phone chrome skeleton (phoneChrome.generated.ts) is regenerated: the live phone page now has the Waiting on you slots (their containers carry outline-none), the strip's data-activity-strip marker 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. ChatDockSheet now 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

  • A focused chip that leaves the line entirely (its last item ends) while no sheet is open drops focus to <body>. This predates the PR (same on e5fa140) and is left for a separate change.
  • The Waiting on you sheet's content host and a slot container that takes focus when the card breaks up have outline-none, so after that handoff a keyboard user sees no focus ring until the next Tab (found in UAT round fu-r6). A focus-visible ring for both is left for a separate change.

@mintlify

mintlify Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
Mux 🟢 Ready View Preview Oct 27, 2026, 8:31 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 27, 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-28T01:16:12.502415Z 907079d Manual request
🔒 Security Review ✅ Completed 2026-10-28T01:15:56.403176Z 907079d 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.

@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 074b3ac1da

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

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e stories (Haiku): 14 passed

22 agent steps · 7 replayed from cache · 15 model calls · 46.3k tokens (24% 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.3s
🟢 a chat survives a restart of the server 1 step · 1 call 5.3s
🟢 compaction.e2e.ts · 1 passed 1 step · 1 call 4.6s
🟢 /compact replaces the old chat with a summary 1 step · 1 call 4.6s
🟢 pluginTrustRestart.e2e.ts · 1 passed 4 steps · 2 calls 10.0s
🟢 a trusted plugin hook stays trusted after the server restarts 4 steps · 2 calls 10.0s
🟢 settingsRoundTrip.e2e.ts · 1 passed 2 steps · 1 call 8.6s
🟢 a chat survives trips through Settings 2 steps · 1 call 8.6s
🟢 sidebarPerWorkspace.e2e.ts · 1 passed 4 steps · 1 call 4.3s
🟢 a new workspace starts with its right sidebar collapsed while another keeps it open 4 steps · 1 call 4.3s
🟢 smoke.e2e.ts · 1 passed 2 steps · 1 call 2.6s
🟢 the agent opens the playground workspace 2 steps · 1 call 2.6s
🟢 streamErrors.e2e.ts · 1 passed 1 step · 1 call 9.9s
🟢 stream errors show in the chat, and the chat recovers 1 step · 1 call 9.9s
🟢 todoNudge.e2e.ts · 1 passed 1 step · 1 call 4.6s
🟢 the agent finishes open TODO items after the turn-end nudge 1 step · 1 call 4.6s
🟢 touchAlignment.e2e.ts · 6 passed 6 steps · 6 calls 23.9s
🟢 the Settings close button is level with the title on a touch screen 390px wide 1 step · 1 call 5.0s
🟢 the Settings close button is level with the title on a touch screen 768px wide 1 step · 1 call 3.6s
🟢 Backup settings checkboxes are small and level with their labels on a touch phone 1 step · 1 call 4.9s
🟢 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.4s
🟢 the workspace actions menu stays on the title row on a touch phone 1 step · 1 call 2.7s

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

🟢 e2e Electron stories (Haiku): 3 passed

3 agent steps · 3 model calls · 7.9k tokens (22% cached)
Spend: $0.02 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 6.1s
🟢 a deep link of a second launch starts a chat in the running app 1 step · 1 call 6.1s
🟢 electron/menuBar.e2e.ts · 1 passed 1 step · 1 call 6.9s
🟢 the workspace menu bar is the desktop title bar 1 step · 1 call 6.9s
🟢 electron/smoke.e2e.ts · 1 passed 1 step · 1 call 5.3s
🟢 Xum Electron opens the playground workspace 1 step · 1 call 5.3s

e2e 0.20.0 · 20.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.4s · 2 targets (web, phone) · run artifacts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread src/browser/components/LegacyPlanImportBanner/LegacyPlanImportBanner.tsx Outdated
Comment thread src/browser/components/ChatPane/ChatInputDecoration.tsx
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 175d4cd162

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.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

Reviewed commit: 175d4cd162

ℹ️ 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".

@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 9eb14e94ac

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread src/browser/components/ChatPane/WaitingOnYou.tsx Outdated
Comment thread src/browser/components/ChatPane/ChatInputDecoration.tsx
Comment thread src/browser/components/ChatPane/WaitingOnYou.tsx
Comment thread src/browser/components/ChatPane/chatActivityPanels.tsx
…s, viewport-owned chords, whole sheet tabs on touch)
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: df07642f50

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.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: df07642f50

ℹ️ 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".

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.
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: dfca77d0c9

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread src/browser/components/ChatPane/ChatInputDecoration.tsx
Comment thread src/browser/components/ChatPane/chatActivityPanels.tsx Outdated
Comment thread src/browser/components/ChatPane/WaitingOnYou.tsx
…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.
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 7aa3fa060c

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread src/browser/components/ChatPane/WaitingOnYou.tsx Outdated
Comment thread src/browser/components/ChatPane/chatActivityPanels.tsx Outdated
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 83b7121f36

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.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 83b7121f36

ℹ️ 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".

…-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.
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 1f9a575b0e

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread src/browser/components/ChatPane/ChatPane.tsx
Comment thread src/browser/utils/messages/StreamingMessageAggregator.ts
Comment thread src/browser/components/ChatPane/chatActivityPanels.tsx
Comment thread src/browser/components/ChatPane/WaitingOnYou.tsx
…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).
@ibetitsmike

Copy link
Copy Markdown
Contributor Author

@codex review

@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: 907079d6a2

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.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: 907079d6a2

ℹ️ 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".

@ibetitsmike
ibetitsmike added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 283a2bd Oct 28, 2026
64 of 67 checks passed
@ibetitsmike
ibetitsmike deleted the mike/live-line-follow-ups branch October 28, 2026 01:53
yermakoffivan pushed a commit to yermakoffivan/mux that referenced this pull request Oct 28, 2026
## 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:
![before 740
turn](https://github.com/user-attachments/assets/2ce34074-71f9-46a6-8f7b-137394faa2ab)

400 px, live turn:
![before 400
turn](https://github.com/user-attachments/assets/5eaa204c-c412-45ab-b2a0-09d31b419727)

### After

740 px, live turn:
![after 740
turn](https://github.com/user-attachments/assets/b060eeda-5839-4ba8-8fb5-b981ce8d5a12)

400 px, live turn:
![after 400
turn](https://github.com/user-attachments/assets/b16c77bb-067f-4f66-b192-18dfad00b84c)

740 px, between turns (chips only):
![after 740
idle](https://github.com/user-attachments/assets/c9c48c89-41f0-419f-9ad7-0271a8aaa091)

400 px, sub-agents chip opened (shared bottom sheet at this width):
![after 400 sub-agents
sheet](https://github.com/user-attachments/assets/b9d42fe9-6f3a-4bc7-9e34-7f8a62b697c8)

1000 px, sub-agents panel above the line:
![after 1000 sub-agents
popover](https://github.com/user-attachments/assets/34a45659-6196-430c-86f0-9100510e2bd1)

## 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>
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.

1 participant