dsh-starred-turns
Manifest validRight-click a dash in the conversation's right-edge turn rail to bookmark that turn: the dash grows to the rail's full width and takes the accent colour so it stays easy to find, and right-clicking ag
dsh-starred-turns
Bookmark turns from the conversation's right-edge turn rail — the column of short dashes where each dash marks one turn and jumps back to it when clicked. A bookmarked dash grows to the rail's full length and takes the accent colour, so a specific turn stays easy to find in a long conversation.
Right-click a dash to bookmark it; right-click again to unbookmark.
Why
A long conversation gives you a rail of identical dashes. The shipped rail already distinguishes the active turn, but nothing lets you mark the turns you care about — the decision, the diff, the answer you keep scrolling back to. This plugin adds exactly that one bit per turn, and makes it visible at a glance by reusing the rail's own "full length" geometry.
Features
- Right-click to bookmark a turn. The dash grows from its resting length (
scaleX0.4 for turns not loaded into the transcript, 0.6 for loaded ones) to the rail's full width (scaleX1), and switches from the neutral border colour to the accent colour. - Bookmarks are per conversation. Turn 5 in one conversation and turn 5 in another are different places; the conversation key is the selected Session id.
- Bookmarks persist. They survive reloads and, on the Desktop build, app restarts.
- No layout shifts. The rail keeps its fixed 10px pitch; only the dash's own
scaleXchanges.
Install
dsh plugin add dsh-starred-turns
Or add it to a profile's cordis.patch.yml by hand:
- insert:
- id: starred-turns
name: dsh-starred-turns
Restart the app (or let HMR rescan) after installing: the Host only scans plugin packages at startup.
How it fits in without touching the chat package
The rail is drawn by @deepseek-ai/dsh-client-ui-chat and is not slot-extended, so the plugin decorates it from the outside rather than forking the package. Each dash is:
<button data-index="18" class="…_mark …_markActive" aria-label="Jump to turn 19"></button>
with the visible dash supplied by a ::before pseudo-element:
.…_mark:before { width: 20px; height: 2px; transform: translateY(-50%) scaleX(.6); }
.…_markActive:before { transform: translateY(-50%) scaleX(1); }
.…_markUnloaded:before { transform: translateY(-50%) scaleX(.4); }
So the plugin does three things, all from the outside:
- a capture-phase
contextmenulistener ondocumenttoggles the bookmark for the dash under the pointer; - a
MutationObserver(watchingdata-indexand child insertion) plus a store subscription keep adata-dsh-starred-turnattribute painted on the right dashes; - its stylesheet turns that attribute into
scaleX(1)in the accent colour.
Bookmarking deliberately reuses the dash's own scaleX geometry instead of changing width or height, which is what keeps the rail's pitch intact.
The observer never watches the plugin's own attribute — it writes that attribute, so an unguarded observer would retrigger itself forever. Paints are also guarded by a read of the current attribute for the same reason.
Storage
Bookmarks live in a client store named dsh.starred-turns.v1, keyed by conversation:
{ "byConversation": { "session-…": ["1", "7"] } }
The shell backs persist with localStorage. On the Desktop build the page origin is the stable dsh-app://app scheme, so bookmarks survive app restarts there. On a plain browser the Host picks a new loopback port per launch and browsers scope localStorage by origin including the port, so bookmarks do not carry across restarts in that mode.
Develop
npm install
npm run build # src -> lib (client bundle in the shell's closure-factory format)
npm test # bundle shape, exported surface, selector targets
src/client.js— store, rail painting, right-click gesture, stylesheetsrc/index.js— node half (host-side no-op; exists so the Loader has an entry module)scripts/build.mjs— copies the node half and bundles the browser half with esbuild
License
MIT
Comments
Loading…
Similar plugins
by GeekRicardo
Conversation-map rail down the left edge of the transcript: one tick per user turn, read from the full session log on the host rather than from the rendered page, so long sessions are covered end to e
★ 1
MIT
JavaScript
Oct 10, 2026
dsh plugin --profile web add dsh-convmapLeft-edge conversation rail for the Web UI: one bar per turn, length scaled to the turn text, hover for a question and answer preview, click to jump; bars come from a host-side outline of the whole se
★ 0
dsh plugin --profile web add dsh-conversation-railby shao-01-test
dsh-chat-rail — DeepSeek Harness 聊天右侧导航拉条插件:按「提问→回答」轮次显示彩色节点(绿/黄/红/蓝表状态),点击即跳转对应提问与回答段落,悬停展开状态面板,刚回答完有闪光动画,关键词自动提炼成短句。一个拉条,快速定位整场对话。
★ 0
MIT
JavaScript
Aug 26, 2026
dsh plugin --profile web add dsh-chat-railby hawkongz
Turn-rail settings for DSH Web: tick thickness, rail side, a curved length gradient anchored on the hovered tick, and a plain-text hover preview with adjustable lines, font size, and width.
★ 1
↓ 577/wk
MIT
JavaScript
Oct 18, 2026
dsh plugin --profile web add dsh-chat-locatorby caisiyang123
Tick-rail conversation navigator: one tick per message you sent, a lit peak that follows the mouse with an even falloff, hover previews, click or keyboard to jump.
★ 1
MIT
JavaScript
Aug 18, 2026
dsh plugin --profile web add dsh-tick-railby Yaya716
Conversation message navigation rail for DeepSeek Harness Web: a track on the right side of the session scroll area with ▲/▼ endpoints and evenly spaced dots for user messages; click a dot to jump exa
★ 0
JavaScript
Aug 25, 2026
dsh plugin --profile web add @local/dsh-msg-nav-track