Preface¶
When running long conversations in DeepSeek Harness (DSH), the message stream on the right side keeps scrolling longer. To return to a previous question, you can only manually search, which is costly and often disrupts your current reading flow. Products like Codex provide a message scale navigation on the left side of the conversation, with hover preview and click-to-jump functionality; DSH Web lacks this capability by default.
Below, we introduce the community plugin dsh-message-rail (maintainer wx-yss): it mounts a Codex-style message navigation rail on the left side of the DSH Web conversation view, marking each user message with equidistant scales, supporting hover preview and click-to-jump interactions. The interaction is inspired by Codex’s message navigation bar, and this plugin is not affiliated with OpenAI.
What Is This¶
dsh-message-rail is a Web client plugin (dsh.client, platform: web) for DSH, classified as a client-side component. It renders a 42px-wide scale rail on the left side of the conversation, with one scale for each user message. It only displays when the conversation message stream is mounted; it hides when switching to the trajectory page and automatically reappears when switching back to the conversation page.
The plugin builds a user message index independently in the background via the DSH history API, without writing assistant replies, tool calls, or historical messages into the right-side ChatView. The rail automatically hides when there are fewer than 2 user messages.
The license is MIT, and the current npm version is 0.1.7. GitHub repository: wx-yss/dsh-message-rail (13 stars, 1 fork). Community directory page: SkillHub.
Core Features¶
Scale Rail and Virtual Scrolling¶
The rail defaults to a height of 500px (approximately 50 scales) and expands to fill the available height if the screen space is insufficient. Each user message corresponds to one scale with a fixed 10px spacing. Regardless of how many messages are indexed, only scales within the visible window ±12 buffers are rendered; if there are more scales at the beginning or end, a 40px fade-out indicator appears. The rail supports scroll wheel navigation with hidden scrollbars; manual scrolling stops auto-following the latest scale.
Hover Preview¶
When hovering over a scale, its width expands according to Codex’s five levels (6/10/14/20/26px), and a preview card floats on the right, displaying the sequence number, relative time, and message text. Keyboard focus is equivalent to hover; it supports degradation via prefers-reduced-motion.
Click-to-Jump¶
If the target message is already in the viewport, only the bubble is highlighted; otherwise, it is positioned instantly—normal messages are centered, and extra-long messages have padding at the top. If the target has not yet loaded, it protects the current reading anchor on the right side, calls loadOlder() page by page to find the target, and stops immediately upon finding it. A subsequent click can replace the previous jump and clear the old highlight.
Independent Indexing and Stable Switching¶
The complete scale is built via connection.api.sessions.history() (sub-agents use subagents.history()). During indexing, it initially displays the scales already loaded on the right; once the complete index is ready, it switches all at once to avoid continuous reflow flickering. The index page limit is 400 (approximately 20,000 surface messages); when exceeded, it retains the currently loaded scales on the right side and does not display an incomplete full index.
Current Position and Loading Feedback¶
The scale corresponding to the message nearest to the 40% line of the viewport is highlighted in dark color, allowing you to perceive your reading position by scrolling. When clicking an unloaded scale, it estimates the remaining pages based on history pagination; if the estimate exceeds 1 second, a prompt is shown immediately. If the estimate is fast but actual loading times out, a supplementary prompt appears after 1 second, and the target component’s readiness closes the prompt.
Indexing Scope¶
The rail indexes ordinary questions with kind === 'user' and mid-run interjections with kind === 'steering', excluding assistant replies, tool calls, commands, and injected contexts (kind === 'context'). The color scheme follows DSH’s runtime theme (--dsw-* design tokens), adapting to light and dark themes.
Installation and Enabling¶
The plugin is installed via DSH’s dsh command, compatible with DeepSeek Harness 0.1.0-rc.6 or higher and Node.js 22+. Each command below provides two equivalent forms: the dsh form applies if DSH is globally installed; the npx form requires no global installation and has the same effect. The README recommends the latter.
Install from npm (Recommended)¶
# dsh form
dsh plugin --profile web add dsh-message-rail
# npx form (no need to install dsh)
npx @deepseek-ai/dsh plugin --profile web add dsh-message-rail
Install from GitHub¶
# dsh form
dsh plugin --profile web add github:wx-yss/dsh-message-rail
# npx form
npx @deepseek-ai/dsh plugin --profile web add github:wx-yss/dsh-message-rail
Local Development Installation¶
git clone git@github.com:wx-yss/dsh-message-rail.git
cd dsh-message-rail
pnpm install
npx @deepseek-ai/dsh plugin --profile web add .
Restart¶
After installation, you need to fully restart dsh web:
# dsh form
dsh web
# npx form
npx @deepseek-ai/dsh web
Typical Usage¶
Open a conversation with at least two user messages, and the navigation rail will appear on the left. After installing and restarting as described above, you can operate as follows:
- Hover over a scale → ripple expansion + preview card (number / time / text)
- Click a scale → jump to the corresponding user message
- Scroll with the wheel on the rail → browse earlier or later scales
- Scroll the conversation body → the current position scale is highlighted
Applicable Scenarios and Notes¶
Who Is It For¶
- Developers who frequently run long conversations in DSH Web and need to quickly return to historical questions
- Users accustomed to Codex-style left-side message navigation and seeking a similar experience in DSH
- Scenarios where you need to switch between the conversation view and trajectory page but want the rail to appear only in the conversation stream
Before Use¶
DSH’s philosophy is “everything is a plugin”; SkillHub is a community directory site with no official affiliation with DeepSeek / High-Flyer. The plugin runs with the current dsh process permissions, so you should review the source code and MIT license before installation.
Known Limitations¶
- The background index reads 50 surface message boundaries per page; responses may contain raw records like chunks or tool events, but these do not enter the right-side chat state or DOM
- When clicking a very early scale, DSH’s
loadOlder()gradually adds intermediate pages to the right side without automatic unloading, which is a current cumulative rendering limitation of DSH’s chat list - Remaining time estimation does not include subsequent target positioning; calibrated with approximately 0.2 seconds for preparation and 0.45 seconds per page, it is an experience estimate
- The rail scales are rendered via a virtual window; DOM anchors (
data-chat-anchor-key, etc.) are internal DSH contracts that may change with DSH versions - Compatibility requires the latest versions of Chrome / Edge / Safari / Firefox
Conclusion¶
dsh-message-rail brings Codex-style message navigation to DSH Web: equidistant scales, hover preview, and click-to-jump, combined with independent full indexing and virtual scrolling, making it more direct to locate historical questions in long conversations. For installation or to view updates, visit the SkillHub directory page and the GitHub repository.