Repository navigation
CmuxNext: composer location strip lines up with the prompt; middle-cut folder, icon-only computer when narrow - #20791
Conversation
Boundary tests for the composer's location strip: its folder icon and branch chevron line up with the prompt's edges, no gap shows where it stands inside the card's corner, no "·" floats between folder and computer, and at 290-300 px the folder cuts in the middle, the computer shows its icon alone and the branch keeps its name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ut folder, icon-only computer when narrow
- The strip's folder icon sits over the prompt's first letter and the branch
chevron over its last column (strip inset 9 px, a foot covers the card's
corner drop so it still stands on the card).
- The floating "·" between folder and computer is gone; the two are ghost
buttons 2 px apart, told apart by their icons.
- A folder name cuts in the middle ("atl…web"); below a 320 px strip the
computer shows its icon alone with its name in the tooltip and label; the
branch keeps its name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Visual preview of 80007f1: in the maintainers' private review feed. |
|
Bead |
… tail keeps the last word
The strip's folder and branch still carried the controls' fixed cap (190 px,
145 px under a 480 px pane), so a long folder name cut beside empty strip,
and a long branch cut before half the strip. They now cut only to fit. The
computer never shrinks (a sub-pixel shrink put an ellipsis on "This Mac").
The middle cut keeps the name's last word when it is 3 to 10 characters
("atlas-we…service", not "…ervice"). Adds a long-folder gallery variant and
boundary tests at 300, 400 and 760 px.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gallery559 states changed: agent-pane.transcript/long-code, agent-pane.artifact-panel/markdown, agent-pane.artifact-panel/html, pages.home-channels/link-no-resolver-timeline, agent-pane.composer-context/computer-menu, ... · 16 new states · 70 play checks failed Diff page and renders (the run's 553 more on the diff page. Live preview (follows this branch; start it with
Play checks failed (0 px anchor movement, 0 layout shift, no frame over 33 ms unless the entry gives a reason):
310 nondeterministic states differed from a second render of the same head (a clock or fixture leak) and are not counted as changes. |
|
all web/size checks green |
|
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by |
|
|
…mulate {fit}, palette, device menu, CEF + WebKit) (cx-va1wd)
A browser tab can fit a desktop layout instead of a device: the daemon
keeps {fit: {aspect: [16, 9]}} on the tab and shows extra.emulation
{mode: fit, fit {aspect, min_width 1024, max_width 1920}}. The engine lays
the page out at clamp(view height x 16/9, 1024, 1920) CSS px, scales it to
the view width, and makes the layout as tall as the view over that scale,
so the page fills the pane with no bars. It recomputes on resize without a
reload. CEF sends the Emulation calls with the computed size and scale;
WebKit sizes the web view and scales its container. Surfaces: the
browserFitDesktop toggle (palette with a check, context menu, cmux browser
fit-desktop, MCP), a row in Emulate Device..., and cmux tab <tab> emulate
--fit 16:9 (MCP browser.tab.emulate fit). Palette rows of toggles that are
on show a check.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d by itself; responder source counts the current event only during its dispatch (cx-3hw0i.2) A subagent pane's page focuses its composer as it loads; WebKit then asks the window to make its web view first responder (WebPageProxy::makeFirstResponder, seen in debug stacks of nx job 1014-202829-5378d2), and the focus model took that as the user's choice: the new pane got the keyboard and the daemon focus although its move ran with keep_focus. ShellWindow now refuses that request when no input event is in dispatch, the focus model is not applying its own target or waiting on an expectation, and the page is not in the focused pane. FocusEvent.Source.current read NSApp.currentEvent, which stays the last key after its dispatch, so such a change was logged as keyboard input; it now counts the event only inside sendEvent.
…ake the keyboard (review P2) (cx-3hw0i.2)
browser-fit-v1 gates the action and the menu row, so an older daemon never sees an unknown fit field. A fit that shows the page as is keeps the WebKit view at the container's size (it stayed 0x0 or stale). The palette check comes from a new opt-in, non-refusing Action.paletteState, so other toggles keep their icons and no refusal shows while the palette builds. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… per operation in cases.rs) (cx-va1wd) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…web view the keyboard inside an input event, as AppKit's click does (cx-3hw0i.2)
… inline optional closure crashed the type checker) (cx-va1wd) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…matched daemon fails closed, not only codex (review note of 1ae9e97)
…l registry failure
…s home, not the caller's (follow-up of c47dd2f)
…d (details.extra.message), never a bare 'internal: internal'
…d_r), like the daemon's brains (c47dd2f)
…daemon (shared_acpmux already runs in the suite step)
… (cx-hmrbt) The signal probe test ran `ps -o ignored= -o blocked=` in the PTY child. macOS ps has no `ignored` keyword: it prints its keyword list, and the test failed with ParseIntError on every Mac. The product was correct. The PTY child is now a third copy of the test binary that reads its own dispositions (sigaction) and mask (pthread_sigmask) and prints them as two hex bit sets. The assertion is stronger: the whole mask must be empty, not only SIGHUP.
…(cx-ncc.106) (#20922) * test: no row Copy over the Edited files card's controls (cx-ncc.106) Fails on base: with focus on a card control (a click or Tab), the row's floating Copy shows on :focus-within at the row's top-right, over View changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: no floating row Copy over the Edited files card (cx-ncc.106) The row's floating Copy sits at the row's top-right and shows on :focus-within, so a click or Tab onto View changes or Show more put it over View changes. The card keeps its own controls in that corner and the turn footer already has Copy; a selected range still copies the card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A failed Windows daemon build with a successful acpmux job left the acpmux exe in assets/cmux-tui (present=false exit): the forbid check then failed publish and the macOS/Linux tree. Remove every Windows file there before that exit. The post-upload cmux-tui/<sha> and latest checks forbid the exe too. No acpmux build for pull_request_target runs (publish-pr-tree publishes no Windows files). The optional companion fetch tests 'is not None', as the publisher does.
…er (cx-gzh.31) (#20888) * test(cmux-tui): a closed saved group reopens linked and in order (cx-gzh.31) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-tui): a reopened tab group keeps its saved-group link and its order (cx-gzh.31) A close records the group's saved-group link with its archive. Reopen links the group it forms again back to that saved group, unless the saved group is gone or another live group took it. Tabs a later partial reopen brings back rejoin the live group in strip order (each is back at its recorded place) instead of at the group's end. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(cmux-tui): a partial reopen never shrinks the saved group; import SurfaceId (cx-gzh.31) Review fixes: rejoin and relink no longer rebuild the saved record from the tabs reopened so far (it still names every closed tab), and relink checks the saved group and its other links inside the commit. The test reads the saved group between the two reopens. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#20478) * test(acpmux): a local slash command or an unanswered cancel ends the turn Red: Claude Code answers /permissions, /config and /clear with a result that has no turn and no API time; the adapter takes it for a resumed process's startup noise and the prompt never ends. And an agent that never answers session/cancel keeps acpmux's turn open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: Stop always frees the chat; Claude terminal-only commands stay in the composer Red: acpmux's forced end says nothing in the pane, a turn still open after Stop keeps showing as working, and /permissions goes to Claude. The hub test moves to its own file (hub_integration.rs is at its line budget). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: a local slash command or an unanswered Stop no longer softlocks a chat - acpmux's Claude adapter: a result with no turn and no API time is startup noise only before the prompt's output; a local command's synthetic reply (or /clear's reset) comes first, so its result ends the prompt. - acpmux ends a cancelled turn whose agent does not answer within 3 s, as cancelled with cancelForced (hub/cancel.rs). - The pane says so, and a turn still open 5 s after Stop stops showing as working. - In a Claude chat the composer keeps /permissions, bare /model, bare /config and the other terminal-only commands, and names the control to use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(acpmux): compare the response id without allocating Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: show the forced-Stop notice after the turn's fold, not inside it The notice row went in before the turn summary, so the collapsed "You stopped" fold hid it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a Stop the agent answered leaves the next turn alone Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: an answered Stop no longer flags the next turn Stop's grace timer outlived the turn it was for, so a prompt sent within 5 s of an answered Stop got the 'didn't answer Stop' notice and stopped showing as working. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(acpmux): a late result for a stopped prompt ends only that prompt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(acpmux): a stopped turn's late result no longer ends the next prompt When acpmux ends a turn Claude Code has not answered Stop for, the next prompt can go out before Claude Code's result for the stopped one. That result answered every pending prompt, the new one included, and each later turn ended one result early. Prompts still pending when a new one goes out are now answered alone by a result that comes before Claude Code reads the new prompt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a Claude Code variant's chat keeps /permissions in the composer Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: Claude Code variants keep terminal-only commands in the composer too Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a turn that starts after Stop is never judged by that Stop Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: a turn that starts after Stop is never judged by that Stop Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a transcript rebuild never undoes Stop's grace Red: a lag resync inside Stop's grace replays the stopped turn's own turn_started and cancels the grace (no forced-Stop notice after 10 s), and one after the grace gave up shows the turn working again (Stop count 1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: a transcript rebuild never undoes Stop's grace Stop records the last seq it saw; only a turn_started, turn_end or turn_result after it ends the grace or the give-up. rebuild() (loadOlder, lag resync) replays older turn events through reduce(), which cleared the timer and reset stopGaveUp, so the chat showed working forever against an acpmux that never ends the turn. Keeping it in reduce() still lets a real turn end that arrives only through a lag resync answer Stop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore: regenerate pane strings on the merged head The base merge kept a stale generated strings.json that dropped base's subagent and summary keys. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore: keep base's pane strings after the base merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 6ef7316 - vp fmt webviews/src/pages/home-channels/AttachmentViews.tsx - vp fmt webviews/src/pages/home-channels/Composer.tsx - vp fmt webviews/src/pages/home-channels/HomeChannelsPage.tsx - vp fmt webviews/src/pages/home-channels/attachmentService.ts - vp fmt webviews/src/pages/home-channels/icons.tsx Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38581725347 * test: composer gallery plays wait out a cold Vite's first compile The first page of each composer play file waits on Vite compiling the gallery, which takes over 30 s on a busy runner: composer-search-files-key and composer-capture failed their first case on the readiness wait alone (the play passes once the frame is ready). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore: keep base's pane strings after the base merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: a surface that fills its pane may cast no shadow Home channels' narrow layout (e111f3f, one pane below 720 px) gives the full-width thread sheet box-shadow: none, and the elevation test read every .lg-sheet shadow as needing --elevation-2. A surface still has to cast its step somewhere, and any shadow it casts is that step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Revert "test: a surface that fills its pane may cast no shadow" #20731 fixes this base red more strictly; #20478 takes it from base. This reverts commit 1d67e29. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at bdfdc2d - vp fmt webviews/src/pages/home-channels/HomeChannelsPage.tsx Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38636316112 * chore(next): PR autofix at af7c4af - regenerated plans/cmux-next/action-surfaces.json - regenerated plans/cmux-next/actions.md Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38688070894 * chore(next): PR autofix at bf76b27 - regenerated webviews/src/agent-session/acpmux/generated/strings.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38694056510 * Restore base's acpmux strings after the base merge The merge reordered the catalog and dropped base keys; it is now base's text plus this PR's four keys, and generated strings are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
… middle-cut), boundary tests At or under a 460 px pane the computer shows its laptop icon alone, its name in its accessible label and tooltip; at or under 340 px the folder takes a short cap and cuts in the middle, keeping both ends. Literals that match COMPOSER_FIT_STEPS (#20802 not merged yet). Since #20869 only a new chat has the strip, so the long-folder fixture is a new chat and a mid-folder fixture holds the 341/340 boundary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base's #20791 now gives the computer its own rule (its name in a wide pane, its icon alone at 460 px or less), so this keeps base's location strip whole and drops this PR's always-icon local computer; the model chip and the quiet default lock stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
cmux-next tour of The tour job failed before the tour ran (build or setup); the run log has the output. The tour produced no media. Tours are data in |
…the vendorless chip #20791 (Leo, 10-15) decides when the computer's name gives way to its icon, so the footer no longer hides it on its own. The New Tab model chip drops its vendor like the composer's, and a middle-cut folder name is read without its seam. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rip runs out of room A container query on the strip's own width (acpmux-strip) replaces the 460 px viewport rule from #20791. Each step is the measured width the controls need next to an uncut "Choose folder"; the Machine chip's text goes before the Where chip's. The temporary measurement test is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-244b9c62b2e8fedec46c
…rip runs out of room (#33671) * wip: measure the composer strip's chip widths (temporary) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-244b9c62b2e8fedec46c * test(composer strip): at 430 px the Where and Machine chips keep their names (red) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-244b9c62b2e8fedec46c * composer strip: Where and Machine chips keep their names until the strip runs out of room A container query on the strip's own width (acpmux-strip) replaces the 460 px viewport rule from #20791. Each step is the measured width the controls need next to an uncut "Choose folder"; the Machine chip's text goes before the Where chip's. The temporary measurement test is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-244b9c62b2e8fedec46c --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>






The composer's location strip (folder, computer, branch on the card's top edge) sat 12 px right of the prompt's first letter, a "·" floated between the folder's chevron and the computer, and in a narrow pane it cut to "atla…" and "This…". The compact-composer design panel flagged all three. Since #20869 the strip shows only on a new chat before its first send, so this styling is the new-chat strip's.
Now:
The widths are literals that match
COMPOSER_FIT_STEPS(machineIconOnly,folderMiddleTruncate) incomposerRowFit.ts; footer PR cmux-next composer: footer swaps whole units sooner, never an ellipsis (folds in #20548) #20802, which adds that table, has not merged, so a comment incomposerLocation.cssnames it.Only the chat composer's strip (
.acpmux-composer) moves to the prompt's edges; the New Tab composer keeps its own insets. The footer row is unchanged, and no hotkeys changed.The steps (gallery
agent-pane.composer-strip, new chat)Computer at 461 / 460 px (
project):Folder at 341 / 340 px (
mid-folder, "atlas-checkout"):A long folder ("atlas-web-checkout-service",
long-folder) whole at 760 px and cut in the middle at 290 px:(The footer row's "O." / "M." in the narrow stills is the footer's own fit, which #20802 reworks; it is not part of this PR.)
Tests
test/composer-location-strip.test.ts(Chromium, gallery stage):src/agent-session/acpmux/ComposerContext.test.ts:splitForMiddleTruncationat the edges, including astral characters.test/new-tab-composer-layout.test.tsxfollows the computer's new accessible label.bun run checkinwebviews/is clean.Localization audit: no new strings. The accessible label and tooltip reuse
composer.computerand the existing machine label.🤖 Generated with Claude Code