When using the DeepSeek Harness (DSH) web version for long-form conversational development, quickly locating a specific user question and reviewing the surrounding context is a common pain point. The official deepseek.com web interface solves this with the “Question Rail” on the right side.
The dsh-question-rail plugin introduced below replicates this experience. It creates a vertical question rail along the right edge of the conversation interface. By default, it collapses into a narrow column with small horizontal line markers. When the mouse approaches, it expands to the right and lists the user question for each turn in the current session. Clicking an item smoothly scrolls to the corresponding position in the conversation.
Plugin Introduction¶
dsh-question-rail is a DSH web plugin maintained by developer LeonSone and released under the MIT license.
The plugin mainly addresses the following:
* Quick navigation: Jump to any question turn without manually scrolling through long conversations.
* Context overview: Quickly identify the current session’s question list, whether the rail is collapsed or expanded.
* Visual consistency: Follows the official interface style and supports transparent themes.
Core Features¶
The plugin has the following technical characteristics:
-
Single rendering, two states
The expanded and collapsed states share the same set of DOM elements (.qrl_item). When collapsed, only the vertical line marker on the right is displayed; on mouse hover, CSS expands the panel to show the full question text. Both states share the same styling and spacing. -
Jump to any turn
Clicking any item in the question rail smoothly scrolls the conversation to the corresponding question. The target position is identified by adata-chat-anchor-keyanchor and marked with a flashing highlight ring. -
Chat view only
The plugin controls rendering by reading the current session’sviewstate. It is shown only whenview === "chat", and automatically hides intrace,context,Design,PPT, or empty home-page views. -
Full history loading
DSH session history is paginated and windowed (hasMore). The plugin automatically callssession.loadOlder()in a loop untilhasMore === false, ensuring it lists questions for all turns, not only the currently visible window. -
Performance optimization
- Subscribes only to the current session (
useSessionsselectscurrent). - Uses a render signature (question set + active view) instead of the whole
ConversationSnapshot, preventing unnecessary re-renders during streaming output or tool calls. - Implements skip-typing and stable handlers.
- Subscribes only to the current session (
-
Theme and accessibility
- Theme awareness: Panel text and hover detail boxes follow
body[data-ds-dark-theme]. In dark mode, text is white; in light mode, text is black. The panel itself is transparent, without cards or borders. - Keyboard support: Each question item uses
role="button"and supportstabIndex=0, so it can be triggered with Enter or Space.
- Theme awareness: Panel text and hover detail boxes follow
Installation and Enablement¶
The plugin is installed via DSH’s package management mechanism.
dsh plugin --profile web add github:LeonSone/dsh-question-rail
After installation, the package is added to dsh.profile.bundles. Because the plugin declares dsh.bundle, it is automatically included in the build.
Note: A newly installed client package requires restarting
dsh webor the headless runner. After restart, refresh the browser (Cmd/Ctrl+Shift+R) to load the new package.
Usage¶
After enabling the plugin, operate in the chat interface:
- Expand/collapse: Move the cursor to the right edge of the conversation area; the question rail expands from the vertical line marker into a list.
- View text: Hover over an item in the list, and a detail box appears on the left with the full question text (maximum height 50vh).
- Jump and locate: Click a question in the list; the conversation smoothly scrolls to that question and highlights it.
- View adaptation: When switching to a non-chat view (such as trace or PPT), the question rail on the right edge disappears automatically.
Technical Implementation Notes¶
- Node-side half:
lib/index.jsis empty and contains only an emptyapply()function. This satisfies the Cordis loader discovery mechanism and allowsdsh-client-modulesto publish client resources. - Browser-side half:
lib/client.jsis registered throughwindow.__ModuleLoader__.loadand injected into theshell.overlayslot insideapply(ctx). - Data source: It reads
ConversationSnapshot.nodesdirectly, extracts turns of typeuserorsteering, and maps them to chat anchorkeyvalues.
Ecosystem Links¶
- GitHub repository: https://github.com/LeonSone/dsh-question-rail
- Skill directory: https://www.skillhub.cn/plugins/LeonSone/dsh-question-rail
This plugin is part of the DSH plugin ecosystem and has no official affiliation with DeepSeek or High-Flyer.