# 用户消息导航条 · Message Minimap
中文 · English
> **A slim minimap rail on the LEFT edge of the DeepSeek Harness Web GUI chat pane: every message you sent becomes a tick — hover for a preview, click to jump, drag to scan long sessions.** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) --- ## 1. The problem it solves In a long session, going back to "what did I say earlier?" means endless wheel scrolling. The assistant's replies are long and dense, and your own messages get buried in between. This plugin adds a thin navigation rail on the **left edge** of the chat pane (like the VS Code minimap): ``` chat scroll pane (overflow-y: auto, long sessions are paged) │ each user message = one tick (including not-yet-loaded history, from the session log) │ ticks of in-viewport messages = bold highlight │ ▼ hover a tick → preview card (index / total + excerpt + time line) ▼ click a tick → smooth-scroll to that message (auto-pages up first if not rendered) ▼ click/drag the rail → proportional jump ``` **Read-only**: the client only reads the conversation DOM already rendered in the browser (chat nodes carry stable `data-chat-flow-kind` / `data-chat-flow-key` anchors) and scrolls the existing chat scroll container; the host half adds a single **read-only route** `GET /api/message-minimap-messages` that extracts **excerpts** of every user message (≤140 chars + timestamp) from the session log (`$DSH_HOME/sessions`) so the rail can cover history the "load older" paging hasn't rendered yet. It never modifies or deletes anything. ## 2. Features - ✅ A **compact, vertically centered** rail on the chat pane's left edge (not full height) — zero layout interference. - ✅ **One tick per user message**, evenly spaced on the rail (oldest at top, newest at bottom) — never scattered by message sizes. - ✅ **Immune to history paging**: ticks cover ALL user messages (including history not yet rendered via "load older", sourced from the session log); clicking an unloaded tick **auto-pages up** and then smooth-scrolls to it (aligned exactly by message id — an intermediate page with no user messages no longer interrupts the jump, and API timing / steers / forked rows can never shift the target). - ✅ **Ticks of the messages inside the viewport are auto-bolded**, following the scroll in real time. - ✅ **Fisheye magnification while sweeping the rail**: the tick under the pointer grows longest, its neighbors grow by a cosine distance falloff (CSS-transitioned) — spot the target at a glance. - ✅ **Hovering a tick** pops a preview card: `My message · 3 / 12` plus the message excerpt (up to 140 chars / 7 lines) on its own line, plus a dedicated time line. - ✅ **Clicking a tick** smooth-scrolls to that message (parked ~18% below the pane top). - ✅ **Clicking or dragging the rail background** jumps proportionally, like a scrollbar. - ✅ Follows streaming output, history loading, session switches and window resizes automatically (MutationObserver + scroll/resize + polling fallback). - ✅ Hides itself when the content doesn't overflow, when there are no user messages, or on the new-session hero screen — zero layout interference. - ✅ Bilingual (zh/en) UI strings following the GUI language. - ✅ Keyboard accessible: ticks are native `