为 DeepSeek Harness Web 会话右侧追加 Git 风格的圆点时间线,圆点对应每条提问,支持点击跳转、悬停元信息、站内搜索、收藏书签、键盘导航、轮次折叠、聚焦模式与跨会话搜索。
- 语言
- TypeScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add dsh-milestone在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 SnowCrescenter-tech/dsh-milestone:先查看仓库 https://github.com/SnowCrescenter-tech/dsh-milestone 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
在 DeepSeek Harness 的 Web 会话右侧追加一条类似 Git 提交图的圆点时间线,一个圆点对应一条提问,点击跳到任意消息;专为多轮长对话场景设计,解决滚动大海捞针的痛点。
核心能力
- 一键跳转:点击任意圆点平滑滚动到对应提问,不用手动翻几百行
- 站内全文搜索:在圆点旁输入关键词,匹配完整消息内容(不是 80 字摘要),实时显示 N/M 命中数,回车跳到下一条,Esc 一键清空
- 当前进度高亮:滚动会话时,离视口最近的提问圆点显示白环,永远知道「读到哪了」
- 状态徽章:圆点自动标识轮次健康状态——出错红环、达到上限黄环、重试橙环、运行中/等待输入蓝/黄脉冲
- 加载更早历史:顶部「···」按钮分页加载更早消息,并提示当前窗口覆盖多少条
- 收藏书签:圆点可点星收藏并按会话持久化到本地,顶部「★」一键切换只看收藏
- 键盘导航:里程碑条是焦点组件,↑↓ 移动、回车跳转、Home/End 首尾,全程不用鼠标
- 悬停元信息:悬停圆点查看消息预览、相对时间、第 N 轮、用时、结束原因、首字延迟(TTFT)、tokens/秒、所用模型与输入/输出 token
- 等距圆点 + 蓝色渐变:圆点固定间距永远点得准;最新最深、最早最浅,顺序一眼可辨
- 轮次分组与折叠:按轮次聚类并支持折叠长轮次;可一键查看全部提问列表(序号 + 轮次 + 预览)
- 复制与 fork:悬停一键复制该条提问全文,或从选中消息处 fork 出新分支会话
- 聚焦模式:淡化 AI 思考区块,让正文更好读;悬停或展开时自动恢复
- 深链接:跳转时 URL 带
#msg=锚点,刷新或分享后回到同一条消息 - 跨会话搜索:搜索所有会话的消息内容(走宿主原生索引),点击结果直接打开对应会话
- 中英双语:跟随宿主界面语言自动切换
技术实现
- 语言: TypeScript + React 18
- 关键依赖: @deepseek-ai/cordis(宿主插件生命周期)、@deepseek-ai/dsh-client-runtime(store、locale、useSession)、@deepseek-ai/dsh-client-ui-slots(slot 注册)、@deepseek-ai/dsh-client-ui-layout(shell.overlay 槽位声明)
- 架构模式: 双半边浏览器插件——Node 半边仅声明
apply()占位(让宿主 loader 能识别),UI 半边通过 cordis fiber 在浏览器端注入两个 slot:shell.overlay(root scope,挂载 MilestoneOverlay)+milestone.rail(自声明 session scope,挂载 MilestoneRail);纯逻辑(搜索、状态、位置计算、圆点配色)抽离到rail-logic.ts等纯函数文件,单测覆盖 - 入口文件: src/index.ts(node 占位)、src/client/index.ts(client 注册)、src/client/MilestoneRail.tsx(核心组件,1126 行)
适用场景
当你和 AI 聊了几十甚至上百轮,想找回「第 17 轮那个提问」时,不用再滚轮翻几百行——在右侧时间线点一下就到;同时悬停就能看到这轮用了多久、什么模型、有没有出错等元信息。长对话调试、复盘、引用历史提问时尤其有用。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| @deepseek-ai/cordis | ^4.0.1 | 宿主插件运行时(peerDependencies) |
| @deepseek-ai/dsh-client-locale | ^0.1.0-rc.6 | 国际化字典命名空间注册(peerDependencies) |
| @deepseek-ai/dsh-client-runtime | ^0.1.0-rc.6 | useSession、defineStore、locale register(peerDependencies) |
| @deepseek-ai/dsh-client-ui-slots | ^0.1.0-rc.6 | slot 注入与声明合并(peerDependencies) |
| React | ^18.2.0 | 组件渲染(peerDependencies) |
| Node.js | 未声明 | 源码未在 package.json#engines 声明;README 提示宿主官方要求 Node ≥ 24 |
平台与原生模块:源码未声明 os/cpu 限制,无原生模块依赖,纯前端组件。
安装方式
dsh plugin --profile web add github:SnowCrescenter-tech/dsh-milestone
配置项
本插件无需额外配置。安装后打开 Web UI 的多轮会话即可在右侧看到里程碑条;所有交互通过 UI 上的按钮和键盘完成,无环境变量、无 Schema、无配置文件。
常见问题
Q: 安装后没有看到里程碑条怎么办?
A: 当前会话的提问不足 2 条时会自动隐藏——这是为了避免单条消息时不显示空条;至少发起两条提问后再打开会话即可看到。极少数情况下,如果会话视图布局异常,里程碑条会因找不到滚动容器 [data-conversation-scroll] 而隐藏,请检查宿主是否运行在最新 Web UI 模式下。
Q: 搜索能搜到没加载进窗口的历史提问吗?
A: 不能。搜索范围就是当前已加载的消息窗口;要搜更早的消息,先点顶部「···」加载更早页面,被加载的消息才会进入搜索索引。窗口外的历史永远不可被搜到,这是宿主分页模型决定的。
Q: 书签会跨会话共享吗?存在哪里?怎么彻底清除?
A: 不共享。书签按会话隔离,每会话一份独立列表。底层走宿主 defineStore 引擎,持久化到浏览器 localStorage,键名格式 dsh-milestone.bookmarks.<sessionId>。卸载插件不会自动清除数据,需要在浏览器开发者工具里手动清理该域名下的对应键。
Q: 圆点颜色为什么不一样?蓝色圆点旁边的红环、黄环是什么?
A: 圆点默认使用蓝色渐变:最新提问颜色最深、最早最浅,方便一眼看出对话顺序。叠加的颜色环代表该轮的健康状态——红环表示该轮出错、黄环表示达到 token 上限、橙环表示模型重试中、蓝色脉冲表示正在运行(生成 token)、黄色脉冲表示正在等待用户输入。
Q: 这个插件会修改 DeepSeek Harness 的源码吗?卸载会留痕迹吗?
A: 不会。它通过官方 slot 机制挂载到宿主声明的 shell.overlay 槽位以及自声明的 milestone.rail 子槽位上,不修改任何宿主代码。卸载插件即可彻底还原到原生 UI。
Q: 顶部的「全部提问」按钮和圆点列表有什么区别?
A: 圆点列表受搜索和收藏过滤影响——你筛掉的不显示;「全部提问」面板永远展示当前会话的每一条提问(序号 + 轮次 + 前 80 字预览),点击即跳。当你筛掉了一批想回到全集快速定位时,用它最快。
Q: 跨会话搜索的结果数量看起来总是不够,是不是出问题了?
A: 不是。跨会话搜索走的是宿主原生 session.search RPC,结果片段被截断到 ≤ 240 字符、单次最多 20 条;如果命中过多会出现「结果已截断」提示,请细化关键词。这是宿主索引层的行为,不是本插件的限制。
上手难度
入门 — 安装即用,无配置项,会话中出现提问就自动出现里程碑条;所有功能按钮都附带中文 title/aria-label,鼠标悬停即可理解。
已知问题与限制
- 搜索范围 = 当前已加载的消息窗口,窗口外或未加载的历史不可被搜到(MilestoneRail.tsx:114-124,依赖宿主
loadOlder) - TTFT 与 tokens/秒依赖
turn-tail元数据,未完成的 turn 或窗口外的轮次会自动隐藏该行 - 「运行中」与「等待输入」徽章只点亮最新一条可见提问;若该轮提问已滚出窗口则无脉冲
- 书签按会话隔离,不跨会话共享
- 模型与 token 用量依赖 assistant 节点元数据,部分场景缺失时自动隐藏该行
- fork 从选中消息所在轮次开始分支,需要在会话列表手动打开子会话
- 深链接的目标消息若早于已加载窗口,会自动触发一次
loadOlder;极端深的历史可能定位失败 - 跨会话搜索依赖宿主
session.search索引,片段 ≤ 240 字符、最多 20 条结果 - 聚焦模式仅作用于当前会话视图的思考区块,不会影响其他插件或工具
- 尚无全局快捷键聚焦里程碑条(需 Tab 键切换焦点到圆点列表)
为什么需要它?
和 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
觉得好用?给个 star 支持一下,或把它推荐给正在 DeepSeek Harness 里挣扎的开发者吧。
查看使用指南 →
该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。
收录徽章
[](https://deepseek-plugin.org/plugins/SnowCrescenter-tech/dsh-milestone)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。