DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
P

dsh-pinned-panel

Pinned Panel

DeepSeek Harness 侧边栏顶部的“已置顶”分组:显示所有工作区中的已置顶对话,并在其原始工作区中打开。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:OuQiL/dsh-pinned-panel#8b3c55981801eecc3dc4f292fd03cceb6924b9de
README兼容性版本

兼容性与来源证明

Pinned Panel 以 dsh-pinned-panel 发布,当前版本为 0.7.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

0.7.0stable
2026/11/4
0.6.0stable
2026/11/1
0.5.0stable
2026/10/29
查看其余 3 个版本收起版本
0.4.0stable
2026/10/28
0.3.0stable
2026/10/26
0.1.1stable
2026/10/25

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

Client Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH 技能中心:按来源(bundled / project / user / custom / runtime)浏览已加载的技能,在 Web GUI 面板中启用或禁用、创建和删除技能。Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Client Ui Market@linxin666/dsh-client-ui-marketWorkshop 浏览卡片:浏览来自 dsh-market.com 的皮肤、宠物和社区插件,并在 GUI 中安装(资源安装到 DSH 主目录,插件通过可选的插件管理器安装)。Client Ui Web Ui Settings@linxin666/dsh-client-ui-web-ui-settings用于 dsh 设置页面的 Web UI 插件组:一个承载 dsh-web 系列插件启用开关和配置表单的一级设置分区。

README

dsh-pinned-panel

A Pinned group at the top of the DeepSeek Harness sidebar. Pinned conversations stop being pinned inside one workspace: they are collected into a Pinned group first in the session list, expanded by default — and opening one still drops you back into its original workspace.

English | 简体中文

The Pinned group at the top of the sidebar, above the workspace groups, listing two pinned conversations with their origin workspace and time

Pinned group first in the session list — two pinned conversations from one workspace, each still opening in its own workspace. (Chinese UI shown; titles and labels follow the active locale.)

Contents

  • What you get
  • Install
  • Requirements
  • How it works
  • Compared with dsh-pin
  • FAQ and troubleshooting
  • Security and privacy
  • Known limitations
  • Development
  • Contributing
  • License

What you get

Sidebar
├─ 📌 Pinned                     3      ← first in the list, expanded by default
│   ├─ 🔧 Fix expired login      14:32
│   ├─ 📊 API diff report        Yesterday
│   └─ 📝 Weekly draft           10-21
├─ 📁 default-workspace                 ← your workspaces, untouched
│   ├─ Conversation A
│   └─ Conversation B
└─ 📁 another-workspace
  • Pinned group first in the sidebar session list. Same row metrics as the shipped session rows (32px rows, 34px group header, --dsw-radius-md, hover/focus rings), light and dark themes included.
  • Expanded by default, collapsible from its header (the choice is remembered in localStorage).
  • Click a row → the conversation opens in its original workspace. It uses the official uiWorkspace.openSession() call, exactly like clicking that row in the sidebar: same working directory, same context, same history.
  • Rows are not duplicated into a private store. The group reads the Host's own pinnedSessionIds and workspace membership; pinning/unpinning stays the shipped 📌 action (plus a ✕ on hover).
  • Origin is visible. Each row shows the workspace it belongs to; hover it for the full title.
  • Live activity at a glance. While something is happening the row's leading glyph becomes a dot: pulsing while the conversation runs, amber while it waits for approval, a plan review or an answer, green for an unread completion (same source as the shipped status dots, so it updates live).
  • Per-row actions without leaving the group. Hover a row for its ⋯ menu: rename, fork, copy session ID, unpin, or archive — all through the same calls the shipped rows make (session.rename, forkSession, unpinSession, archiveSession). Double-click a title to rename it in place (Enter saves, Escape cancels). Archiving a conversation that is still running asks stop and archive first instead of silently ending its work.
  • Original rows stay. A pinned conversation is still listed under its own workspace — the Pinned group is an extra entry point, not a move.
  • Archived section. A collapsed Archived N entry under the rows expands into the archived conversations, each with a one-click restore (uiWorkspace.unarchiveSession) — archiving by accident no longer means hunting through the full archive view.
  • No extra panel, no extra page. The plugin adds the group and nothing else; there is no pinned page and no rail icon to configure.

Install

In the app (easiest)

  1. Open Settings → Plugins.

  2. Add plugin.

  3. Paste the Git address of this repository:

    github:OuQiL/dsh-pinned-panel
    

    (the dialog also accepts the full https://github.com/OuQiL/dsh-pinned-panel URL, a tarball, or an absolute local path)

  4. Reload the page. The Pinned group appears at the top of the conversation list.

With the CLI

dsh plugin add github:OuQiL/dsh-pinned-panel
# or pin a profile explicitly
dsh plugin --profile desktop add github:OuQiL/dsh-pinned-panel

From a local checkout

git clone https://github.com/OuQiL/dsh-pinned-panel.git
dsh plugin add /absolute/path/to/dsh-pinned-panel

After changing lib/client.js in a linked checkout, reload the page (Ctrl+R) to load the fresh bundle; no reinstall is needed.

Uninstall

Settings → Plugins → dsh-pinned-panel → disable/uninstall, or dsh plugin remove dsh-pinned-panel.

Requirements

SurfaceDeepSeek Harness Web GUI (the Desktop app renders the same Web surface)
Tested with0.2.1-rc.2 on Windows
Host halfnone — it is a no-op; everything runs in the browser
Credentials / networknone
Sidebarrequired; TUI/headless profiles have nothing to attach to

Because it attaches to the sidebar list, a DSH release that restructures that list may require a small adaptation (see How it works); the plugin degrades to "no group" rather than breaking the app.

How it works

pinned state (Host)                   uiWorkspace service (shipped)
  pinnedSessionIds  ────┐                openSession(id)  ──► selects the Session
  items[].sessionIds ───┴──► Pinned group ──► unpinSession(id) ──► writes the pin set
                              (sidebar list)      (both official calls)

The shipped Workspace browser owns the single sidebar.workspaces slot, so there is no slot to add a group inside its list. Replacing the whole browser would mean reimplementing the app's session list and would break on upgrades. The smallest intervention is a sibling group at the top:

  1. The plugin mounts one invisible seat in the sidebar shell (sidebar.footer.action, an empty action beside Settings; the seat renders nothing).
  2. From that seat's own DOM node it walks up to the browser's list area, then finds the scroll container.
  3. It inserts one host element as the list's first child and portals the group into it, adopting the shipped group wrapper class so native spacing applies.
  4. A MutationObserver (plus a slow fallback tick) re-attaches the host after React rebuilds the list.

It only inserts, never hides or reorders anything the app renders.

The seam is defensive

  • Anchored from the plugin's own node, never from a global selector.
  • Matches build-hashed class suffixes (*_listArea, *_list, *_groupSection), so it survives class-hash changes.
  • Skips the flat "In one list" view and the search view (no workspace groups to sit above).
  • If the expected structure is missing, it does nothing and logs one line: [dsh-pinned-panel] sidebar list seam not found; the Pinned group cannot be placed.

One React detail matters here: portal events bubble through the React tree, not the DOM tree, so the portaled group stops propagation for its own interactions. That keeps clicks inside the group from reaching whichever seat the portal is mounted under.

Compared with dsh-pin

dsh-pin is the closest existing plugin; both are pure client-side, both attach to the sidebar list, and both use the shipped session-order/open APIs. The difference is the shape:

dsh-pinned-panel (this)dsh-pin
Where pins show upone Pinned group first in the session lista global tray above all workspace groups, plus in-group pinning
Original rowsalways keptoptionally hidden for globally pinned rows
Pin levelsone — it reuses the app's own pin statetwo — workspace pin and global pin, with its own records
Extra chromenone (no page, no rail icon)tray chrome and per-row pin buttons
State it ownsonly your collapse preferenceits own localStorage records per pinned session
Undo / restorethe app's own unpinprecise restore of the pre-pin position

If you want a floating tray and hidden original rows, use dsh-pin. If you want one extra group in the list and nothing else, use this.

FAQ and troubleshooting

The group does not appear. Open the browser console. If it shows [dsh-pinned-panel] sidebar list seam not found; the Pinned group cannot be placed., your DSH build moved the sidebar list and the seam needs adapting — please open an issue with that line and your DSH version.

The group appears twice, or loading fails with loaded without registering …. An older copy under the pre-rename package id (@local/dsh-pinned-panel) is still installed. Uninstall it (Settings → Plugins) or restart the app; the bundle registers both ids so a leftover copy does not error out.

Clicking a row keeps ending on the same conversation. Fixed in 0.1.6; make sure you are on 0.3.0+ (console prints [dsh-pinned-panel] active vX.Y.Z).

How do I verify which version is loaded? The console line on page load, or the Plugins page entry.

Do I need to configure anything? No settings. The only stored value is your collapse choice, under the dsh-pinned-panel.sidebar.collapsed key.

Does it work across browsers? Pin state comes from the Host, so yes. The collapse preference is per browser.

Where do I unpin? The app's own 📌 action (as before), or the ✕ that appears on a row in the group.

Security and privacy

  • No network requests, no telemetry, no credentials. The Host half is an empty apply().
  • Reads the Host workspace and session snapshots the sidebar already displays (titles, ids, timestamps, workspace membership).
  • Writes exactly one browser key: localStorage['dsh-pinned-panel.sidebar.collapsed']. Pin changes are the app's own actions through uiWorkspace.
  • DOM: inserts one host element as the first child of the sidebar list and renders into it with a React portal. Nothing else in the app is modified, hidden, or reordered.
  • Styles: an inline <style> element registered with the plugin's lifetime and using only DSH theme tokens.

Known limitations

  • The group is a display-layer insert. It does not change session order or write extra state; the app's own "pinned first inside the group" ordering is untouched.
  • Pinned conversations that belong to no workspace are shown inline without an origin label.
  • Rows are ordered by last update (newest first).
  • This plugin follows the app's pin semantics. It does not add its own pin storage, so everything stays consistent across reloads and browsers.
  • A future DSH release that restructures the sidebar browser may require adapting the seam (the suffixes above are the contract).

Development

package.json          bundle manifest: Host patch + browser half
cordis.patch.yml      inserts one Host plugin row (no-op Host half)
index.js              Host half: empty apply()
lib/client.js         browser bundle: sidebar seat, list seam, Pinned group
locale/{zh,en}.json   Plugin Manager title/description
icon.svg              original artwork
scripts/verify.mjs    local self-check (encoding, JSON, manifest, client module)
scripts/ci-workflow-template.yml  drop-in GitHub Actions workflow for that check
assets/               README screenshot of the sidebar group
node scripts/verify.mjs     # encoding + JSON + manifest + client module
node --check lib/client.js  # syntax only

There is no build step: lib/client.js is the shipped browser module (window.__ModuleLoader__.load({ id, factory })), read directly by the client at page load. It registers the factory under both the current package id and the pre-rename @local/dsh-pinned-panel id, so a profile that still has the old package installed keeps loading instead of failing with loaded without registering …. The legacy id is inert once that package is uninstalled.

See CHANGELOG.md for the release history, including the two bugs that shaped the current implementation (portaled event bubbling, and a UTF-8 BOM that broke GitHub installs).

Contributing

Issues and pull requests are welcome.

  • For a bug report, include your DSH version and every console line starting with [dsh-pinned-panel].
  • Before opening a pull request, run node scripts/verify.mjs.
  • scripts/ci-workflow-template.yml is a ready-to-use Actions workflow for that check; copy it to .github/workflows/verify.yml from an account/token allowed to edit workflows.
  • Anything that changes visual behaviour should say which DSH build it was verified on.

License

MIT © 2026 OuQiL

Not affiliated with DeepSeek. "DeepSeek Harness" is the host application this plugin extends.