Right-side dot-timeline rail: jump between user messages.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:SnowCrescenter-tech/dsh-milestone
GitHub-sourced plugins run build scripts on your machine at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
dsh-milestone
DeepSeek Harness 的会话里程碑导航条
像 Git 提交图一样,一眼定位每一次提问,一键跳转到任何位置。
为什么需要它?
和 AI 聊了上百轮之后,想找回第 17 轮那个提问?你只能不停滚轮往上翻,眼睛在一堆代码块、工具调用和思考过程里大海捞针。
dsh-milestone 在会话右侧挂一条圆点时间线——每一条提问对应一个圆点,鼠标悬停看内容,点击瞬间跳转。长对话的"导航地图"。
好用在哪?
- 一键定位 —— 点击任意圆点,平滑滚动到那条消息,不用再手动翻几百行。
- 站内搜索 —— 搜索框过滤圆点,匹配的是完整消息内容(不是 80 字摘要),实时显示命中数 N/M,回车跳到下一个匹配,Esc 一键清空。
- 当前位置高亮 —— 滚动会话时,离你视口最近的那条提问会亮起白环,永远知道「读到哪了」。
- 加载更早 —— 历史没加载完时,顶部出现「···」按钮,点一下继续加载,并提示当前已显示多少条。
- 收藏书签 —— 悬停任意圆点可点星收藏,刷新后仍保留;顶部「★」一键只看收藏,把一次性跳转变反复回访。
- 键盘导航 —— 里程碑条是一个焦点组件:↑↓ 移动、回车跳转、Home/End 首尾,全程不用鼠标。
- 状态徽章 —— 圆点自动标出轮次健康状态:出错红环、达到上限黄环、重试橙环、运行中/等待输入蓝/黄脉冲。
- 固定间距 —— 圆点等距排列,不随对话长度挤压变形,永远点得准。
- 蓝色渐变 —— 最新最深、最早最浅,一眼看清提问的先后顺序,像 Git 提交图。
- 滚轮滑动 —— 长会话圆点超出可视区时,鼠标在里程碑条上滚轮即可滑动选点。
- 丰富悬停 —— 悬停展示消息预览、相对时间、第 N 轮、用时、结束原因、首字延迟(TTFT)、tokens/秒。
- 模型与用量 —— 悬停直接看这一轮用的哪个模型、输入/输出 token 数,调试成本一目了然。
- turn 分组折叠 —— 圆点按轮次分组,一眼看清对话章节;长轮次可折叠成一条,减少干扰。
- 复制与 fork —— 悬停一键复制该条提问全文,或「从此处 fork」开一个分支会话。
- 中英双语 —— 跟随 harness 界面语言自动切换中英文。
- 聚焦模式 —— 一键淡化 AI 的思考(thinking)区块,对话正文更清爽;悬停或展开时自动恢复。
- 全部提问列表 —— 顶部展开面板,一次看全所有提问(序号 + 轮次 + 预览),点击即跳,长对话不再靠圆点一个个数。
- 深链接 —— 跳转时 URL 带上
#msg=锚点,刷新或分享链接后直接回到同一条消息。 - 跨会话搜索 —— 一键搜索所有会话的消息内容(harness 原生索引),点击结果直接打开对应会话。
- 零侵入 —— 官方 slot 机制挂载,不修改 harness 源码,装完即用。
悬停能看到什么
┌─────────────────────────────────────────┐
│ 第 3 / 5 条 · 第 2 轮 ☆ 复制 ✂ │ ← 序号 + 轮次 + 收藏/复制/fork 动作
│ 帮我优化这段代码的性能 │ ← 消息预览(前 80 字)
│ 5 分钟前 · 用时 1m30s · 首字 1.2s · 12.4 tok/s │ ← 时间 · 耗时 · TTFT · 吞吐
│ v4 · continue · 1280 / 2560 tok │ ← 模型 · 用途 · token 用量
└─────────────────────────────────────────┘
元信息全部来自 harness 原生的 session 快照(turnTimings / timeline.turns / turn-tail),无额外依赖。
快速开始
# 从 npm 安装(推荐)
dsh plugin --profile demo add dsh-milestone
# 或从 GitHub 源码安装
dsh plugin --profile demo add "github:SnowCrescenter-tech/dsh-milestone#main"
# 启动 Web UI
npx @deepseek-ai/dsh web # → http://127.0.0.1:3080
打开一个多轮对话(至少 2 条提问),会话视图右侧就会出现里程碑条。
要求 Node.js
>= 24(harness 官方要求)。
它是什么做的?
双半边浏览器插件(空 node half + shell.overlay slot 挂载的 client half):
shell.overlay (root scope)
└─ milestone.rail (session scope, 自声明子槽)
└─ useSession 读取会话快照 → 圆点列表 + 悬停 + 跳转
- 注入点:
shell.overlay—— 全框架浮动层,附加式、点击穿透,不影响任何现有 UI。 - 数据源:
chat.order+chat.nodes(user 消息 +turn-error/turn-max-tokens/model-retry节点)+chat.timeline(turn 元数据)+hasMore/loadingOlder(分页)+running/pending(徽章)+loadOlder(inject face)。 - 书签持久化:harness
store.persist(每会话 localStorage,keydsh-milestone.bookmarks.<sessionId>),经defineStore引擎读写。 - 跳转:DOM 锚点
data-chat-anchor-key,scrollIntoView平滑定位。 - 纯函数:搜索过滤 / 位置计算 / 圆点状态都在
rail-logic.ts纯函数里,单测覆盖。
已知限制
- 搜索范围 = 当前已加载的消息窗口(初始 50 条;点顶部「···」加载更早,更早的历史需先加载进来才能被搜到)。
- TTFT / tokens/秒 依赖 turn 位置数据,窗口外或未完成的 turn 不显示(自动隐藏)。
- 徽章的瞬态状态(运行中/等待输入)只点亮最新一条可见提问——若运行中/等待输入的轮次其提问在窗口外,则无脉冲。
- 书签按会话隔离(不跨会话共享)。
- 模型 / token 用量依赖该轮 assistant 节点的元数据,部分场景下缺失则自动隐藏该行。
- fork 从选中消息所在轮次开始分支,不会自动打开子会话(需在会话列表手动打开)。
- 深链接的目标消息若早于已加载窗口,会先自动加载更早历史再定位(受加载上限约束,极端深的历史可能定位失败)。
- 跨会话搜索依赖 harness 的消息内容索引(
session.search),仅返回片段(≤240 字符)、最多 20 条结果;命中过多时请细化关键词。 - 聚焦模式作用于当前会话视图的思考区块,不会影响其他插件或工具的展示。
- 尚无全局快捷键聚焦里程碑条(需 Tab 键切换到)。
License
Links
More in this category
zhu1090093659/dsh-web-ui★ 1766
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
ccch1mneyyy/dsh-TUI★ 829
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/DSH-better-sidebar★ 705
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
huiliyi37/dsh-tianshu-tui★ 131
A terminal UI (TUI) for DeepSeek Harness.
omdsh-dev/dsh-at-file★ 117
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
Nagi-ovo/dsh-visualize★ 79
In-conversation generative UI: the model renders interactive HTML cards into the chat stream, with streaming preview and sandboxed rendering.