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:

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

  2. 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 a data-chat-anchor-key anchor and marked with a flashing highlight ring.

  3. Chat view only
    The plugin controls rendering by reading the current session’s view state. It is shown only when view === "chat", and automatically hides in trace, context, Design, PPT, or empty home-page views.

  4. Full history loading
    DSH session history is paginated and windowed (hasMore). The plugin automatically calls session.loadOlder() in a loop until hasMore === false, ensuring it lists questions for all turns, not only the currently visible window.

  5. Performance optimization

    • Subscribes only to the current session (useSessions selects current).
    • 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.
  6. 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 supports tabIndex=0, so it can be triggered with Enter or Space.

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 web or 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:

  1. 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.
  2. 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).
  3. Jump and locate: Click a question in the list; the conversation smoothly scrolls to that question and highlights it.
  4. 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.js is empty and contains only an empty apply() function. This satisfies the Cordis loader discovery mechanism and allows dsh-client-modules to publish client resources.
  • Browser-side half: lib/client.js is registered through window.__ModuleLoader__.load and injected into the shell.overlay slot inside apply(ctx).
  • Data source: It reads ConversationSnapshot.nodes directly, extracts turns of type user or steering, and maps them to chat anchor key values.

This plugin is part of the DSH plugin ecosystem and has no official affiliation with DeepSeek or High-Flyer.