* feat(web): reveal a clipped sidebar session title on hover
A session title wider than its sidebar row is clipped with an ellipsis, so a
long parent title hides the `(1)` that distinguishes its fork. Hovering the row
now scrolls the title to its far edge and returns it to the start when the
pointer leaves. The title stays an `overflow: hidden` scrollport, so nothing
reflows and no scrollbar appears; `scroll-behavior: smooth` supplies the motion
(reduced motion keeps the jump), and the hovered row clips instead of
ellipsizing because a scrolled box still paints the ellipsis over the revealed
characters.
Covered by the row component spec, the stylesheet contract spec, and a new
keyless Chromium scenario that hovers a seeded clipped row in the assembled
application and asserts the reached scroll extent.
* fix(web): return the revealed session title in one step
Review follow-up on the hover reveal:
- Return the title to its start with `scrollTo({ behavior: 'instant' })` instead
of a smooth scroll. A smooth return carried the resting ellipsis and the
narrowing cell over the travelling text for its whole duration.
- Scope `scroll-behavior: smooth` to `.sessionRow .title` so Workspace rows are
untouched, and fold the reduced-motion reset into the file's existing block.
- Guard the hover-only `text-overflow: clip` with `@media (hover: hover)`: a
touch tap latches `:hover` after the title has already returned, which would
otherwise strand that row without its ellipsis.
- Pin the contract in the browser scenario: computed `scroll-behavior` is
`smooth` by default and `auto` under reduced motion, and the return lands
inside one step. Add the unit case for the explicit instant return.
description, kind
| description | kind |
|---|---|
| Package map for the web GUI browser half: shell boot, browser-host communication, shared client services, localization, development reload, and the UI feature plugins. | package-group |
client/ — web-GUI browser half
English | 中文
Summary
The client/ group provides the browser experience for the dsh web GUI, including conversation, navigation, settings, approvals, file access, and other interactive features. Choose packages from this family when adding browser-visible behavior; use host/ for server-side page delivery and host integration. Packages cover both the shared browser foundation and focused UI features, while each child README owns its configuration and behavior. Authoring rules live in AGENTS.md, and the related documentation below explains cross-package composition.
Table of Contents
Packages
The kernel packages boot and serve the page; the UI feature packages present it. Each package README owns its contract and configuration.
| Package | Role | ctx key |
|---|---|---|
web/ |
Boots the browser shell | — |
modules/ |
Loads browser-side client modules | ctx.clientModules / ctx.modules |
connection/ |
Maintains browser-host RPC communication and event delivery | ctx.connection |
file-upload/ |
Sends raw Blob and byte-stream request bodies outside the page thread | ctx.fileUpload |
store/ |
Provides React-free observable and snapshot-store primitives | — |
hmr/ |
Refreshes client plugins during development | — |
locale/ |
Provides localization preferences and message dictionaries | ctx.locale |
test-runtime/ |
Shared repository test support for client feature packages | — |
ui-renderer/ |
Binds slot data to React and mounts the assembled application | ctx.uiRenderer |
ui-slots/ |
Defines typed extension Slots and reusable Component Factories | — |
ui-session/ |
Adapts Session Controller state into standard Slot sources and hooks | — |
ui-theme/ |
Applies the selected color theme | — |
ui-primitives/ |
Provides shared React controls, icons, and content renderers | — |
ui-attachment/ |
Registers composer and message-image attachment presentation | — |
ui-layout/ |
Arranges the main application regions | — |
ui-dockkit/ |
Provides docking layout operations and React components | — |
ui-sidebar/ |
Presents workspace and session navigation | — |
ui-sidebar-right/ |
Owns the right Sidebar and its tab types | ctx.sidebarRight, ctx.sidebarRightTabs |
ui-sidebar-documentpreview/ |
Displays documents in right Sidebar tabs | ctx.documentPreviews |
ui-sidebar-browser/ |
Browses sandboxed HTTP(S) pages, including loopback services, in right-Sidebar tabs | — |
resources/ |
Unified resource model: protocol providers behind the useResource session standard hook |
ctx.resources |
ui-sidebar-files/ |
Right-Sidebar workspace file tree tab type | — |
ui-brand-official/ |
Fills the generic browser-brand slots with the official name and marks | — |
ui-workspace/ |
Provides workspace selection and creation surfaces | — |
ui-conversation/ |
Presents the active conversation and its input surface | — |
ui-chat/ |
Projects and renders the Chat conversation target | — |
ui-approval/ |
Presents approval requests and returns user decisions | — |
ui-tool/ |
Composes Tool call trees and keyed per-Tool views | — |
ui-workflow-run/ |
Replays durable workflow runs as nested chat disclosures | — |
ui-goal/ |
Presents and manages the current goal | — |
ui-trajectory/ |
Presents alternate views of agent activity | — |
ui-commands/ |
Provides session-aware command discovery and dispatch | — |
ui-input-trigger/ |
Coordinates inline command and reference suggestions | — |
ui-skill/ |
Adds skill references to inline suggestions | — |
ui-reference/ |
Unified Web @file / @session reference source |
— |
ui-subagent/ |
Provides subagent navigation, child transcript states, and inline references | — |
ui-schedule/ |
Lists the current Session's active reminders in a read-only header catalog | — |
ui-jobs/ |
Lists this session's background jobs in the conversation header | — |
ui-model-selection/ |
Provides model selection in conversation surfaces | — |
ui-permission-presets/ |
Configures default permissions and switches the current session's access | — |
ui-plan/ |
Presents active plan-mode status and its exit control | — |
ui-settings-plugins/ |
Owns the Plugins settings section, its tab extension point, and configurable host-plane plugin cards | — |
ui-user-questions/ |
Presents interactive questions requested by the agent | — |
ui-agent-preset/ |
Selects a session's agent preset and authors preset compositions | — |
ui-settings/ |
Hosts the settings interface and its extension areas | — |
ui-settings-general/ |
Provides the general settings section | — |
ui-settings-models/ |
Provides model-provider configuration and DeepSeek onboarding | — |
ui-plugin-manager/ |
Contributes the sidebar Plugins panel: install, enable, disable, retry, and compose installed packages | — |
ui-settings-plugin-inventory/ |
Contributes the read-only Host Loader inventory tab to Plugins settings | — |
ui-deliverables/ |
Produces the changed-files card with its comparison tabs, delivery cards, and clickable final-response file references | — |
ui-message-feedback/ |
The feedback surface: per-message Like/Dislike in the assistant-message action strip, and the feedback dialog behind both ratings and /feedback |
— |
ui-directory-picker-browse/ |
In-app directory browsing surface for the workspace directory flow | — |
ui-directory-picker-native/ |
Native directory-picker surface driving the local Desktop or Host OS chooser | — |
ui-open-in-app/ |
Session-header split button opening the workspace directory in an installed application | — |
Related documentation
Start with the subsystem reference and the two notes that own the cross-package composition decisions, then the host half that serves this page.
- Client modules subsystem — the web plugin table:
dsh.clientdeclarations, the boot graph wire, and the bundle route. - Slot system standard — the definitive slot model: registration, props shares, and stores.
- Web client architecture note — the loading chain, object layer, and client services.
- Host group map — the host half that serves this browser half.
Dev Note
Working context for maintainers — click to expand
None.