dsh-milestone: A Session Milestone Navigation Rail for DeepSeek Harness
snowcrescenter-tech/dsh-milestone
Git-style milestone timeline for DeepSeek Harness sessions: hover for metadata, click to jump to any message.
Attach a dot timeline to the right of DeepSeek Harness sessions, locate each question like a Git commit graph, hover for metadata, click to jump.
dsh plugin --profile web add github:snowcrescenter-tech/dsh-milestone- Category
- Sessions & Messages
- Platform
- DSH-Plugin
- Author
- snowcrescenter-tech
- Distribution
- Plugin
dsh-milestone Key Features
dsh-milestone Repository

dsh-milestone Repo Summary
dsh-milestone is a session milestone navigation plugin (DSH plugin) for DeepSeek Harness, maintained by SnowCrescenter-tech under the MIT license, last updated in 2026-08. It solves the pain of locating past questions in long conversations: it attaches a dot timeline on the right side of the session, like a Git commit graph, where each dot corresponds to a question, hover to see metadata, click to jump. Core capabilities include: in-session search (matching full message content), current position highlight, load older history, bookmark favorites, keyboard navigation, status badges (error/max/retry/running), fixed spacing, blue gradient, wheel scrolling, rich hover info (time/turn/duration/TTFT/tokens per second), model and usage display, turn grouping/collapsing, copy and fork, bilingual support, focus mode, full question list, deep linking (#msg= anchor), cross-session search, and zero-intrusion (mounted via official slot mechanism).
What core features does the dsh-milestone DSH plugin support?
- One-click positioning: Click any dot to smoothly scroll to that message, no manual scrolling.
- In-session search: Filter dots by matching full message content, real-time hit count N/M, Enter to next match, Esc to clear.
- Current position highlight: The question nearest the viewport lights up with a white ring.
- Load older: Top "···" button loads older history and shows loaded count.
- Bookmark favorites: Hover a dot to star it, persists after refresh; top "★" to view only favorites.
- Keyboard navigation: Arrow keys move, Enter jumps, Home/End to first/last, no mouse needed.
- Status badges: Red ring for errors, yellow for max tokens, orange for retry, blue/yellow pulse for running/waiting input.
- Fixed spacing: Dots are evenly spaced, not squeezed by conversation length.
- Blue gradient: Newest is darkest, oldest is lightest, like a Git commit graph.
- Wheel scrolling: When dots overflow, scroll wheel on the rail to select.
- Rich hover: Preview, relative time, turn number, duration, end reason, TTFT, tokens/sec.
- Model and usage: Hover shows model, input/output token counts.
- Turn grouping/collapsing: Dots grouped by turn, long turns can be collapsed.
- Copy and fork: One-click copy full question text or fork a branch session from here.
- Bilingual: Automatically switches between Chinese and English following the harness UI language.
- Focus mode: Dims AI thinking blocks, restores on hover or expand.
- Full question list: Top expandable panel shows all questions (index + turn + preview), click to jump.
- Deep linking: URL gets #msg= anchor, refresh or share returns to the same message.
- Cross-session search: Search all sessions' message content, click result to open that session.
How to install dsh-milestone?
Install command (recommended from npm, or from GitHub source):
dsh plugin --profile web add github:snowcrescenter-tech/dsh-milestone
After installation, start the Web UI (requires Node.js >= 24):
npx @deepseek-ai/dsh web
Open a multi-turn conversation with at least 2 questions, and the milestone rail appears on the right side of the session view.
What is the architecture and data source of dsh-milestone?
It is a dual-half browser plugin: an empty node half + a client half mounted via the shell.overlay slot. The injection point is shell.overlay (a framework-wide floating layer, additive, click-through), and data sources include chat.order, chat.nodes (user messages and error/max-tokens/retry nodes), chat.timeline (turn metadata), hasMore/loadingOlder (pagination), running/pending (badges), and loadOlder (inject face). Bookmarks persist via harness store.persist (per-session localStorage, key dsh-milestone.bookmarks.<sessionId>), and jumping uses DOM anchor data-chat-anchor-key with scrollIntoView. Search filtering, position calculation, and dot state logic are in pure functions in rail-logic.ts, covered by unit tests.
What are the known limitations of dsh-milestone?
- Search scope is limited to the currently loaded message window (initial 50; older history must be loaded first to be searchable).
- TTFT / tokens/sec depend on turn position data; turns outside the window or unfinished are hidden.
- Transient badge states (running/waiting input) only light up the latest visible question.
- Bookmarks are isolated per session, not shared across sessions.
- Model / token usage depends on assistant node metadata; if missing, the row is hidden.
- Fork does not automatically open the child session.
- Deep link targets earlier than the loaded window will first load older history, but extremely deep history may fail to locate.
- Cross-session search relies on harness index, returns only snippets (≤240 chars), max 20 results.
- Focus mode only affects the thinking blocks of the current session view.
- No global shortcut to focus the milestone rail yet.