DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Question Rail — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
Q

dsh-question-rail

Question Rail

DSH web plugin: 模仿 deepseek 网页版界面右侧的问题条 — 右缘一条竖向问题栏,常态收起为窄列小横线,鼠标靠近时向右展开,列出当前会话每一轮的用户提问,点击后平滑滚动定位到对话对应位置。Mimics the deepseek.com right-edge question rail.

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:LeonSone/dsh-question-rail#08fcaf92cfd429eead14da488622037cc3adf298
README兼容性版本

兼容性与来源证明

Question Rail 以 dsh-question-rail 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/8/26

版本

0.1.0stable
2026/8/26

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/4
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Client Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包

README

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_item elements. 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-key anchor) with a brief highlight ring.
  • Conversation-only — reads the live per-session chat store (view from ctx.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-calls session.loadOlder() in a loop until hasMore === false, so it lists all rounds, not just the loaded window.
  • Performance-tuned — useSessions selects only current; 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" with tabIndex=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-runtime seed words.

How it works

LayerWhat 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).
DataReads 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 gatingctx.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.client discovery scans only at boot for new packages (bundle content changes hot-reload). After first install, restart dsh 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:

InteractionBehavior
Move mouse near the right edgeThe strip widens, revealing each round's question as a single line (12px, right-aligned, trailing tick).
Hover a single questionA detail box appears on the left showing the full question text (scrollable up to 50vh).
Click a questionThe chat scrolls smoothly to that turn and flashes a highlight ring.
Switch to 轨迹 / 上下文 / Design / PPTThe rail hides instantly (chat-view gate).
Empty / home screenNothing 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