mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-08-22 23:25:28 +00:00
4 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
49497f5076
|
feat(web-shell): color-code each split pane by workspace (#6971)
* feat(web-shell): color-code each split pane by workspace On a narrow split (split-screen / mobile), it was hard to tell which workspace each pane belonged to: a pane's header showed only its session name, and the sole workspace signal — the composer chip at the bottom — collapsed to a bare folder icon that looked identical for every workspace, so the workspace was discoverable only by hovering each one. Surface the workspace where you actually scan — the pane header — and give each workspace a stable accent color so panes read apart at a glance and same-workspace panes read as a group: - Add a colored workspace tag (dot + basename) at the start of each pane header on a multi-workspace daemon, and colorize the header divider with the same accent. The dot never shrinks, so panes stay distinguishable even when the name and session title ellipsize. - Derive a stable per-workspace color from the workspace's position in the daemon's advertised workspaces[], reusing the sidebar session-group palette so the two surfaces speak the same color language. Extracted into a shared workspaceAccent.module.css. - Tint the composer workspace chip with the same accent (folder + faint background) so it stays distinguishable even in its icon-only compact state, instead of a generic folder. Single-workspace daemons are unchanged: no tag, and the header divider falls back to the neutral border. * refactor(web-shell): address review on split-pane workspace accent - Rename workspaceAccent.module.css -> WorkspaceAccent.module.css to match the PascalCase convention used by every other component .module.css; update both import sites. - Hoist the four raw-hex accent colors (red/orange/yellow/green) into shared --accent-* theme tokens in App.module.css, and point the workspace accent module, the sidebar group dots, and the overview badges at them. The palette now has a single source of truth and can't drift between the four surfaces (values are unchanged, so rendering is identical). - Add a compile-time exhaustiveness guard so adding a DaemonSessionGroupPresetColor without extending WORKSPACE_ACCENT_COLORS (and its CSS class) fails the build instead of silently dropping that accent. - Give the pane-header workspace tag role="img" so its "Workspace: <name>" aria-label is reliably announced; aria-label on a bare span (generic role) is not. * refactor(web-shell): address follow-up review on workspace accent - Hoist the four --accent-* tokens out of both theme blocks into the theme-independent .app scope, so they are declared once (the values do not vary by theme) — a genuine single declaration rather than two kept in sync. - Add a dev-only runtime check that every accent color has a matching class in WorkspaceAccent.module.css, closing the gap the compile-time guard cannot cover: CSS modules are typed Record<string, string>, so a renamed/removed class would otherwise silently drop that color's accent. - Rename the "same workspace same color" test to describe what it actually asserts (a stable color per cwd, and distinct colors across workspaces). * refactor(web-shell): address second follow-up review on workspace accent - WorkspaceIndicator tests: assert on imported CSS-module class names instead of string literals, so a CSS-module naming change can't silently make the substring checks vacuous; add an expanded-mode (non-compact) accent test so a refactor that gated the accent on `compact` would be caught. - workspaceColor.ts: run the CSS-class contract check unconditionally — throw in dev, but console.error in production — so a missing class in a prod build is at least diagnosable instead of a silent accent drop. - WorkspaceAccent.module.css: correct the docstring to state exactly which tokens come from where — red/orange/yellow/green from --accent-* in App.module.css, blue/purple deliberately reusing the --agent-* brand tokens. --------- Co-authored-by: wenshao <wenshao@example.com> |
||
|
|
38429bc100
|
fix(web-shell): show workspace chip tooltip on narrow composer (#6958)
* fix(web-shell): show workspace chip tooltip on narrow composer The composer's workspace chip surfaced its full cwd only through a native `title` attribute, unlike the sibling git-branch and model chips which use a styled Radix tooltip. On a narrow (split-screen / mobile) composer the chip ellipsizes or collapses to an icon, so the workspace is discoverable only on hover — and a native `title` is inconsistent and never fires on touch. Give WorkspaceIndicator the same Radix tooltip as GitBranchIndicator (with the full cwd as content), completing the documented "mirrors GitBranchIndicator" intent. Its visually-hidden tooltip mirror also exposes the cwd to screen readers, which the native `title` did not do reliably. * test(web-shell): assert the workspace tooltip renders on hover Address review feedback: the WorkspaceIndicator tests checked the `data-web-shell-workspace-title` hook but never opened the tooltip, so a regression rendering the short name (or nothing) in the Radix `TooltipContent` would have gone unnoticed. Open the tooltip via a `pointermove` (jsdom has no `PointerEvent`; Radix opens on mouse move after `delayDuration`) and assert the portalled `[role="tooltip"]` shows the full cwd — and, in compact mode, assert the `workspaceChipCompact` icon-only class is actually applied. * test(web-shell): guard the compact chip before asserting on it Move the `if (!chip)` null guard above the assertions in the compact-mode test so a failure to render surfaces the descriptive "workspace chip was not rendered" error instead of an opaque `expect(undefined)` throw from the optional-chained access. Matches the first test in the file. --------- Co-authored-by: wenshao <wenshao@example.com> |
||
|
|
f88a8aa6fc
|
feat(web-shell): use popovers for composer controls (#6877)
* feat(web-shell): use popovers for composer controls * fix(web-shell): address popover review feedback * fix(web-shell): update popover regression coverage * fix(web-shell): address popover review feedback * fix(web-shell): stabilize toolbar label collapse --------- Co-authored-by: ytahdn <ytahdn@gmail.com> |
||
|
|
720d26b1bb
|
feat(web-shell): flesh out the multi-workspace split view (cross-workspace sessions, workspace labels, responsive layout) (#6746)
* fix(web-shell): surface cross-workspace sessions in split view & overview
The split-view "add session" picker and the Session Overview only listed the
primary workspace's sessions, so on a multi-workspace daemon
(`qwen serve --workspace A --workspace B …`) sessions in non-primary
workspaces could not be picked into a split pane or triaged from the overview
— even though the sidebar already lists them and the load path already drives
them.
Both surfaces now merge the primary workspace's sessions with the live
sessions of every other trusted workspace, label each session by its
workspace, and — in the split view — attach each pane under its session's own
workspace so a non-primary session no longer 409s against the primary cwd. On
a single-workspace daemon the behavior is unchanged.
- add useOtherWorkspaceSessions: fans out listWorkspaceSessions over the
non-primary trusted workspaces in capabilities.workspaces (Promise.allSettled,
tolerant of one failing), and empty on a single-workspace daemon
- SplitView: merge the lists, tag picker items by workspace, and pass each
pane's workspaceCwd to its DaemonSessionProvider
- SessionOverviewPanel: merge the lists and add a per-card workspace badge
- add utils/workspace helpers, plus unit tests across all four surfaces
* fix(web-shell): repair stale composerTagIcons import that broke the build
ScheduledTasksDialog imported getComposerTagIconUrl from `../composerTagIcons`,
a module deleted when the helper was consolidated into `utils/composerTag.ts`.
The stale path failed `vite build` (and the web-shell browser-regression e2e).
Point it at the current location.
* fix(web-shell): address review feedback for cross-workspace sessions
- useOtherWorkspaceSessions: return the shared EMPTY sentinel when every
workspace responds empty (skip a no-op re-render), guard the load effect
against a stale in-flight fetch overwriting a newer one, and keep the
single-workspace path fully synchronous (no fetch, no post-render setState)
- fetch non-primary workspaces at the primary list's page size so a busy
workspace is not truncated at the daemon's smaller default
- split picker: tag primary sessions with the same localized "primary" label
the Session Overview uses, so both surfaces read consistently
- tests: cover reload(), the poll re-query, empty-primary merge, and the
primary badge render; quieten the act() warnings
* feat(web-shell): show each split pane's workspace in its composer placeholder
In a multi-workspace split, once a session becomes a pane there was nothing
indicating which workspace it belongs to. Name the pane's own workspace in the
composer placeholder ("Message this session in <workspace>…"), so it's clear
which workspace a message is going to before you send it. Single-workspace
daemons are unchanged.
* Revert "feat(web-shell): show each split pane's workspace in its composer placeholder"
This reverts commit
|