DeepSeek Harness plugin

dsh-conversation-indicator

Conversation indicator for the DeepSeek Harness web GUI: clickable markers along the transcript scrollbar that jump to the corresponding message or turn.

Jump to install

Source facts

Repository
smanx/dsh-conversation-indicator
Latest update
Aug 16, 2026
Category
UI Enhancements
GitHub stars
3
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/smanx/dsh-conversation-indicator
Plugin: dsh-conversation-indicator
Author: smanx

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer4 files
README.en.mdSource · read only
README language

@smanx/dsh-conversation-indicator

> 中文 | English

Conversation indicator for the DeepSeek Harness web GUI. A compact pill sits vertically centered on the right side of the transcript, just left of the scrollbar, with one clickable marker bar per user message — assistant replies are not marked. Clicking a marker smooth-scrolls the transcript so that conversation lands near the top, so you can jump around a long session without dragging the scrollbar or scrolling past tool spam. The pill stays out of the way while the transcript scrolls or streams: it appears only when the pointer moves near it and fades out once the pointer leaves.

![Screenshot: the indicator pill on the right edge of the transcript](image.png)

Hover a marker for the summary tooltip; click it to jump to that conversation.

browser: watches [data-conversation-scroll] (the app's transcript scrollport)
         -> reads [data-chat-anchor-key] rows, filtered by data-chat-flow-kind
         -> fixed pill overlay, vertically centered near the right edge
         -> one marker bar per row, positioned by content ratio (contentTop / scrollHeight)
         -> click -> scrollport.scrollTo({ top: contentTop - padding, behavior: 'smooth' })

No harness change is needed and nothing runs server-side: the host entry is a no-op; the whole plugin is the client bundle served at /plugins/@smanx/dsh-conversation-indicator/client.js.

Install

From the GitHub repository (pnpm's github: git-dependency shorthand for git+ssh://git@github.com/smanx/dsh-conversation-indicator.git#main):

dsh plugin --profile web add github:smanx/dsh-conversation-indicator#main

After install the plugin shows up as @smanx/dsh-conversation-indicator in the plugin inventory and the profile dependencies (npm scope = developer name smanx + plugin name).

Restart the web server once so the boot manifest composes the new client bundle, then refresh the page. The pill stays hidden while the transcript scrolls or streams — move the pointer near it (the right edge, just left of the scrollbar) to reveal it, and it fades out when the pointer leaves. It only exists at all when the current session has more than one screen of content (it hides when the transcript does not overflow). To update, run the same command again — pnpm re-resolves the git dependency to the latest commit.

For development against the working tree (live rebuilds, no re-install), point the profile at the local checkout instead:

dsh plugin --profile web add file:C:/mydata/codes/dsh-conversation-indicator

Options

The plugin is self-contained and keeps its preferences in the browser (localStorage["dsh-conversation-indicator.options"], JSON, partial merge). Set them from DevTools and reload; changes apply on the next plugin mount.

KeyDefaultEffect
enabledtrueMaster switch.
markKinds["user"]Row kinds to mark (data-chat-flow-kind); "*" marks every rendered row. Assistant replies render as kind assistant-step and are not marked by default — add "assistant-step" (or "*") to mark them too. Other kinds: steering, context, tool-call, command, compaction, manual-compaction, model-retry, turn-error, turn-max-tokens, turn-tail, unknown.
panelWidth26Panel (pill) width in px.
markerSize6Marker bar height in px.
rightMargin10Gap between the panel and the scrollport's right edge in px.
panelHeightRatio0.5Panel height as a fraction of the scrollport height (markers stay concentrated in the middle band).
minPanelHeight / maxPanelHeight140 / 520Panel height bounds in px.
showCounttrueSmall conversation-count badge at the panel's bottom.
tooltipstrueHover summary tooltip: kind label + the row's text (UI chrome stripped).
summaryMaxChars200Max characters of the hover summary body.
scrollPadding12Extra px kept above the target row when jumping.
hoverZoneX28Hot zone around the panel (px, horizontal) that reveals it on hover.
hoverZoneY24Hot zone around the panel (px, vertical) that reveals it on hover.
idleHideMs450Ms of no pointer activity before the panel starts fading out.
fadeOutMs400Panel fade-out animation duration in ms (fade-in stays at 200ms).
localStorage["dsh-conversation-indicator.options"] = JSON.stringify({
  markKinds: ["user", "tool-call"],
  panelWidth: 30,
  markerSize: 8,
})

Model experience

AspectEffect
Token costNone — indicators are UI-only and never enter a request.
Tool callsNone — the model gets no new tool.
Session logUnchanged — the plugin reads the rendered DOM only, adds no events.
PromptUnchanged — no system-prompt section is registered.

Permission boundary

  • The client observes the transcript scrollport and the rows the web app

already renders ([data-chat-anchor-key] / [data-chat-flow-kind]); it writes nothing to the session log and registers no model-facing tools.

  • The rail is a pointer-events: none overlay; only the small markers are

interactive, so the scrollbar and the conversation remain fully usable.

  • Marker positions are layout-derived (proportional to the row's place in the

scroll content); no conversation content is copied or stored.

Development

pnpm install
pnpm run check    # typecheck + vitest + build (lib/ committed with source)
pnpm run test     # vitest (geometry / kind / options / rail DOM behavior)
pnpm run build    # esbuild host + client bundles, tsc declarations

The plugin has no dependency on the harness checkout: the client bundle is self-contained vanilla DOM, so pnpm install needs no ../dsh sibling.

Known limitations

  • Markers reflect the currently loaded history window; very old rows that the

web app has not rendered yet cannot be marked (paging in more history adds their markers).

  • The rail is drawn near the scrollbar of the active conversation view; it

does not overlay other views (trajectory, details panel).

  • Options are read at plugin mount; toggling localStorage live takes effect

on the next mount (page reload or view remount).

  • Smooth scrolling is animated by the browser; clicking many markers in

quick succession may not interrupt the current animation.

License

MIT