dsh-question-rail
Manifest validDSH web plugin: 模仿 deepseek 网页版界面右侧的问题条 — 右缘一条竖向问题栏,列出当前会话每一轮的用户提问,点击平滑滚动定位。DeepSeek Harness right-edge question rail.
dsh-question-rail
English | 中文
A DeepSeek Harness web plugin that adds a right-edge question rail like the deepseek.com chat — a narrow strip of ticks on the right edge that expands on hover to list every user turn in the current conversation, and jump-scrolls back to that turn when clicked.
- One rendering, two states — the collapsed tick column and the expanded list are the same
.qrl_itemelements. Collapsed shows only each item's right-edge tick; hovering widens the panel to reveal the text. Identical style, identical spacing, identical right reference line. - Jump to any round — click a question, and the chat scrolls smoothly to that turn (
data-chat-anchor-keyanchor) with a brief highlight ring. - Conversation-only — reads the live per-session chat store (
viewfromctx.slots.entries("conversation.session")+resolveStore), so it renders only on the chat view and hides instantly on 轨迹 / 上下文 / Design / PPT or the empty home. - Full history — DSH conversation history is windowed (
hasMore). The rail auto-callssession.loadOlder()in a loop untilhasMore === false, so it lists all rounds, not just the loaded window. - Performance-tuned —
useSessionsselects onlycurrent; the rail subscribes to a render signature (question set + active view) instead of the whole conversation snapshot, so streaming output / tool calls don't re-render the list. Skip-free typing, stable handlers, signature-memoized items. - Theme-aware — panel text & the hover detail box follow
body[data-ds-dark-theme](dark: white text on transparent; light: black text). The panel itself is transparent (no card, no border). - Keyboard accessible — each question is
role="button"withtabIndex=0, Enter/Space triggers. - Zero runtime dependencies — the node half is intentionally empty (it only makes the loader discover the package); the browser half uses only
react/react/jsx-runtimeseed words.
How it works
| Layer | What happens |
|---|---|
| Node half (lib/index.js) | Empty apply() — just enough to be an active cordis loader entry so dsh-client-modules publishes /plugins/dsh-question-rail/client.js. |
| Browser half (lib/client.js) | Registers via window.__ModuleLoader__.load, then apply(ctx) injects the rail into the shell.overlay slot (frame-wide, additive, click-through until the entry opts in). |
| Data | Reads the current session's ConversationSnapshot.nodes (full list, not the windowed chat.order), extracts user/steering turns, and maps each seq → chat key for scroll anchors. |
| View gating | ctx.slots.entries("conversation.session") → resolveStore(handle, sessionId) → store.getSnapshot().view — the authoritative source DSH's own header tabs use. Renders only when view === "chat". |
Installation
# From a local checkout (dev / link mode — source edits take effect on hard-refresh)
dsh plugin --profile web add link:D:/path/to/dsh-question-rail
# Or straight from GitHub (requires git + a GitHub token on this machine)
dsh plugin --profile web add github:LeonSone/dsh-question-rail
dsh plugin add adds the package to the profile's dependencies; because the package declares dsh.bundle, it is automatically appended to dsh.profile.bundles.
New client packages need a restart.
dsh.clientdiscovery scans only at boot for new packages (bundle content changes hot-reload). After first install, restartdsh web(or the headless runner), then hard-refresh the browser (Cmd/Ctrl+Shift+R).
Usage
Once installed, a narrow strip of ticks appears along the right edge of an active chat conversation:
| Interaction | Behavior | |---|---| | Move mouse near the right edge | The strip widens, revealing each round's question as a single line (12px, right-aligned, trailing tick). | | Hover a single question | A detail box appears on the left showing the full question text (scrollable up to 50vh). | | Click a question | The chat scrolls smoothly to that turn and flashes a highlight ring. | | Switch to 轨迹 / 上下文 / Design / PPT | The rail hides instantly (chat-view gate). | | Empty / home screen | Nothing renders. |
Development
lib/client.js browser half (ModuleLoader bundle, injects into shell.overlay)
lib/index.js node half (empty apply; discovery only)
cordis.patch.yml bundle patch (mounts the node half)
test/*.mjs headless contract & extraction tests
Run the checks:
node test/bundle-contract.test.mjs # __ModuleLoader__.load / apply / inject / shell.overlay registration
node test/bind-fix.test.mjs # closure-bound getSnapshot/subscribe (no lost-this crash)
node test/extract.test.mjs # full-list extraction: user/steering only, anchor mapping
node test/loadolder.test.mjs # loadOlder loop until hasMore=false (full history)
License
MIT
Similar plugins
by lin-nanxing
DeepSeek Harness会话界面的快速查找跳转,根据会话中用户提问为单位进行跳转,适用于较长的上下文工作,需要快速找到对应的问题和回答的场景. A slim right-edge question-navigation rail for long DSH conversations. Every user question becomes a hoverable tick — click
★ 0
MIT
TypeScript
Aug 17, 2026
dsh plugin --profile web add dsh-qnavby TropicWiden
A DeepSeek Harness web plugin that lists every question you ask in the current session in a right-side panel, and scrolls to the matching answer when you click one. DeepSeek Harness Web 插件:在窗口右侧列出当前会
★ 0
JavaScript
Aug 25, 2026
dsh plugin --profile web add @known-mouse/dsh-history-question-navby hhb1028
DSH Web GUI 会话问题导航条:聊天区左缘一问一杠,随滚动高亮当前问题、悬停显示问答预览气泡、点击把该问平滑滚到视口顶(未渲染的更早历史自动翻页加载),无需改动 dsh 本体源码
★ 0
MIT
JavaScript
Sep 3, 2026
dsh plugin --profile web add dsh-client-ui-timelineby Fiker1203
DSH Web UI 插件:对话右侧问题导航,悬停预览用户提问、点击平滑跳转到对应消息,适配女仆主题。
★ 0
MIT
JavaScript
Aug 18, 2026
dsh plugin --profile web add dsh-conversation-navDSH web plugin: a realtime conversation outline panel (user questions + markdown headings) for the DeepSeek Harness Web GUI.
★ 14
↓ 100/wk
MIT
Aug 18, 2026
dsh plugin --profile web add dsh-outlineby smanx
Conversation indicator plugin for the DeepSeek Harness web GUI: a compact rail beside the scrollbar marks each user message; hover for the summary, click to jump. / DeepSeek Harness Web GUI 对话指示器插件:滚动
★ 3
MIT
TypeScript
Aug 16, 2026
dsh plugin --profile web add @smanx/dsh-conversation-indicator