PerryLink
dsh-session-pin
Pin sessions in the DeepSeek Harness (DSH) web sidebar - dual-face plugin with a hover pin badge, durable pinning, and top ordering
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 13, 2026
- Updated
- Aug 14, 2026
Introduction
π dsh-session-pin
English Β· δΈζ Β· EspaΓ±ol Β· PortuguΓͺs Β· ΰ€Ήΰ€Ώΰ€¨ΰ₯ΰ€¦ΰ₯
Pin the conversations that matter. A dual-face (host + browser) plugin for DeepSeek Harness that puts a one-click pin badge on every session row β gray on hover, amber while pinned β moves pinned sessions to the top of their workspace group, and keeps the pin across restarts and browsers.
Why pinning?
Session lists sort by recency: the conversation you rely on all week slowly sinks to the bottom, and every new chat buries it further. Dragging rows in the Manual sort mode works, but nobody discovers it β and pinned chats that still get re-sorted on activity are exactly what users of other coding agents complain about. dsh-session-pin gives you the one-click UX instead:
ββ Sessions βββββββββββββββββββββββββββββββ
β π Implement login flow 3h β β pinned: amber pin, always visible
β Fix the auth bug 1h β β hover shows a gray pin to toggle
β Refactor the DB layer 2d β
βββββββββββββββββββββββββββββββββββββββββββ
πΈ Demo
Hover a session row to reveal the gray pin; click to pin β amber and pinned on top, still pinned after a reload. (Real screenshots from a live dsh web run.)
β¨ Features
- π§· Hover pin badge β a gray pushpin fades in at the left of the session title on hover; pinned sessions keep a solid amber pin. One click toggles, and the click never opens the session.
- π Top ordering β pinning moves the session to the front of its workspace account via the public
workspace.insertSessionBeforeRPC. Under the core's Manual order the position stays put β no activity re-sorting. - πΎ Persistent pinning β the host half registers the durable
session-pinsettings namespace; the browser half writes through the standardsettings.*RPCs. On current DSH builds the web proxy serves only its allowlisted namespaces, so until that allowlist moves tosettings.register()(upstream deferred work) the browser half falls back tolocalStorageβ pins survive reloads in the same browser either way. - π’ Optional limit β
config.maxPinscaps the pinned count (default0= unlimited); exceeding it is rejected with a log line. - π§© Zero core changes β a standalone plugin for the stock DSH Web GUI; no patched harness required.
- π Five languages β English Β· δΈζ Β· EspaΓ±ol Β· PortuguΓͺs Β· ΰ€Ήΰ€Ώΰ€¨ΰ₯ΰ€¦ΰ₯.
π Quick start
- Install β add the plugin to your profile's
cordis.yml:
plugins:
'@dsh-external/dsh-session-pin':
path: /path/to/dsh-session-pin
config:
maxPins: 5 # optional; 0 = unlimited (default)
- Build (the web app refuses to start with a missing client bundle):
pnpm install
pnpm run build # lib/index.js + lib/client.js
- Restart
dsh weband hover any session row in the sidebar β the pin badge appears at the left of the title. Click to pin.
Uninstall β remove the plugin row from cordis.yml and restart. The session-pin section can also be removed from settings.yaml; nothing else is written.
βοΈ Configuration
| Key | Type | Default | Meaning |
|---|---|---|---|
maxPins | integer | 0 | Maximum pinned sessions; 0 = unlimited. Unpinning always works. |
π§ How it works
- Host half (
src/index.ts) β registers thesession-pinsettings namespace ({ pinned: string[], maxPins }). No session events, no model traffic. - Browser half (
src/client.ts) β binds the namespace throughctx.settingsScope, renders badges over the core session rows, and orders throughctx.workspaces. AMutationObserverre-applies badges after React re-renders; rows are identified by[role="treeitem"][aria-selected]plus title text (no row-level extension slot exists for third-party plugins yet). - Build β esbuild emits the host ESM half and the client CJS half wrapped in the web boot factory (
window.__ModuleLoader__.load({ id, factory })), with a purity gate that fails the build if any@deepseek-ai/*value import leaks into the browser bundle.
Extension points used: settings (host), sessions / workspaces / settingsScope / connection / remote (client). Model-visible effects: none β this is a UI-only plugin: it adds no session events and no tokens to any model request.
π¦ Compatibility
| Layer | Baseline |
|---|---|
| DeepSeek Harness | snapshot 0812 / npm @deepseek-ai/dsh@0.1.0-rc.6 generation (client packages 0.1.0-rc.6) |
| Cordis peer | @deepseek-ai/cordis: ^4.0.1 |
| Node (dev) | β₯ 22 |
π§ͺ Development
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm run test # vitest unit tests
pnpm run build # dual-half build + client-bundle purity check
πΊοΈ Roadmap
- Right-click / row-menu "Pin" entry (needs a core row-level slot or a menu overlay).
- Standalone Pinned section at the top of the sidebar, Slack-Starred-style β informed by how Cursor, Claude, Slack, Notion and Telegram all converge on a dedicated pinned block.
- Canonical residence: a log-backed
session/pinevent (thesession/titlepattern) once a client-readable projection channel exists.
β οΈ Known limitations
- Persistence scope β on the current DSH baseline the
session-pinsettings namespace is not in the web proxy's served-allowlist, so the browser half stores pins inlocalStorage(browser-local) until upstream exposes plugin namespaces. The host-side namespace registration is already in place and becomes the durable store automatically once that lands. - Ordering scope β the pinned position is stable only under Manual order; under Updated order the core's activity promotion re-fronts active sessions. Ungrouped and flat-list views have no host-side account, so position is not persisted there (badges and pin state still work).
- Remote browsers β settings RPCs are loopback-only; remote browsers fall back to browser-local
localStorage. - Duplicate titles β rows are matched by title text; with duplicate titles the badge shows on every matching row and toggles the first match (cosmetic).
- Row DOM dependency β the overlay relies on the core rows'
role="treeitem"/aria-selectedstructure and must follow upstream UI changes.
π Community
- DeepSeek Harness Discord Β· official discussions
- Discover more plugins on the
dsh-plugintopic.
π License
Apache License 2.0 β see LICENSE. Copyright Β© 2026 dsh-session-pin contributors.