dsh-milestone
UI & ExperienceSnowCrescenter-tech/dsh-milestone
Git-style milestone timeline for DeepSeek Harness, with hover metadata and click-to-jump navigation for any message.
- deepseek
- deepseek-harness
- dsh-plugin
- milestone
- navigation
README
dsh-milestone
DeepSeek Harness 的会话里程碑导航条
像 Git 提交图一样,一眼定位每一次提问,一键跳转到任何位置。
为什么需要它?
- 上百轮对话之后,想找回「第 17 轮那个提问」?只能不停往上翻,在代码块和思考过程里大海捞针。
- 右侧挂一条圆点时间线:一个提问一个圆点,悬停看内容,点击瞬间跳转——长对话的「导航地图」。
- 官方 slot 机制挂载,不修改 harness 源码,装完即用。
快速开始
# 从 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 官方要求)。
功能总览
按类别分组,一屏扫完所有能力。
| 类别 | 功能 · 一句话 | 键位 |
|---|---|---|
| 定位导航 | 圆点时间线:每问一个圆点,点击平滑跳转 | |
| 定位导航 | 当前位置高亮:视口最近的提问亮起白环 | |
| 定位导航 | 加载更早:「···」继续加载历史,提示已显示条数 | |
| 定位导航 | 全部提问列表:序号 + 轮次 + 预览一次看全,点击直达 | |
| 定位导航 | 深链接:#msg= 锚点,刷新/分享后直达同一条 | |
| 搜索过滤 | 站内搜索:匹配完整消息内容,实时 N/M 命中 | Enter 下一个 / Esc 清空 |
| 搜索过滤 | 跨会话搜索:搜所有会话,点击打开对应会话 | |
| 搜索过滤 | 收藏书签:悬停点星,★ 只看收藏 | |
| 状态感知 | 轮次健康徽章:出错红 / 上限黄 / 重试橙 / 运行蓝 / 等待脉冲 | |
| 状态感知 | 悬停元信息:时间 · 轮次 · 用时 · 结束原因 · TTFT · tok/s · 模型 · token 用量 | |
| 个性化与效率 | 键盘导航:全程不用鼠标 | ↑↓ 移动 · Enter 跳转 · Home/End 首尾 |
| 个性化与效率 | turn 分组折叠:按轮次成组,长轮次折成一条 | |
| 个性化与效率 | 复制与 fork:一键复制提问全文 / 从此处分支 | |
| 个性化与效率 | 聚焦模式:淡化 / 折叠思考与工具调用,强度可调、自由搭配 | |
| 个性化与效率 | 折叠工具栏:功能键默认收起,箭头展开;设置菜单可把常用键钉到折叠外(持久化 + 恢复默认) | |
| 个性化与效率 | 个性化外观:强调色 / 图标圆点大小 / 距侧边距离 / 位置左右(设置内即调即存) | |
| 个性化与效率 | 语言切换:跟随系统 / 中文 / English,设置内一键切换 | |
| 个性化与效率 | 点击外部关闭:搜索 / 列表等浮层自动收起 | |
| 个性化与效率 | 新手教程:首次使用教练气泡引导,锚定真实组件(点击真实推进),设置内可重看 | |
| 发布运维 | 更新检测:6h 缓存自动检查,新版徽章,一键去 npm | |
| 发布运维 | 设置推广区:GitHub / Star / Issue / npm 四入口 |
另:滚轮可在里程碑条上直接滑动选点;圆点的固定间距与蓝色渐变见下方「圆点时间线」一节。
核心功能详解
圆点时间线与悬停元信息
- 每个提问一个圆点,点击平滑跳转;悬停即看内容与元信息。
- 圆点等距排列、不随对话长度变形;颜色由浅入深标出先后,同 Git 提交图。
┌──────────────────────────────────────────┐
│ 第 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),无额外依赖。
站内搜索
- 搜索框过滤圆点,匹配的是完整消息内容(不是 80 字摘要),实时显示命中数 N/M。
Enter跳到下一个匹配,Esc一键清空。- 范围 = 当前已加载窗口;更早的历史先点「···」加载进来。
收藏书签
- 悬停圆点点星收藏,刷新后仍在(
store.persist,按会话隔离)。 - 顶部「★」一键只看收藏,把一次性跳转变反复回访。
深链接 #msg=
- 跳转时 URL 带上
#msg=,刷新或分享链接后仍回到同一条消息。 - 目标在已加载窗口外时,自动先加载更早历史再定位(受加载上限约束)。
跨会话搜索
- 一键搜索所有会话的消息内容(harness 原生索引)。
- 点击结果直接打开对应会话;最多 20 条结果,片段 ≤240 字符。
更新检测
- 自动检查 npm 新版本,6 小时缓存,不打扰。
- 发现新版:功能键亮起提醒徽章;弹窗展示当前/最新版本与已适配版本线;一键去 npm 升级。
工作原理
双半边浏览器插件(空 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)。 - 跳转:DOM 锚点
data-chat-anchor-key,scrollIntoView平滑定位。 - 持久化:
store.persist(每会话 localStorage,keydsh-milestone.bookmarks.<sessionId>),经defineStore引擎读写;工具栏偏好同理。 - 纯函数分层:搜索过滤 / 位置计算 / 圆点状态都在
rail-logic.ts纯函数里,单测覆盖。
版本与兼容
- 当前官方支持线:
0.1.1-rc.2(peer/dev 依赖^0.1.1-rc.2,与@deepseek-ai/dsh最新latest标签一致)。 - 官方客户端包(
dsh-client-runtime等)在 npm 上走next标签发布(latest标签仍是远古版本);升级 harness 后若发现插件不匹配,请确认安装的依赖解析到了0.1.1-rc.2线。 - 更新检测弹窗内展示本插件声明支持的版本线;harness 当前版本在浏览器端没有可信来源(
host.describe().version是占位值),因此不做精确探测,以声明线为准。
已知限制
⚠️ 最需要注意:搜索只覆盖当前已加载的消息窗口(初始 50 条)——更早的历史需先点顶部「···」加载进来,才能被搜到。
- TTFT / tokens/秒 依赖 turn 位置数据,窗口外或未完成的 turn 不显示(自动隐藏)。
- 徽章的瞬态状态(运行中/等待输入)只点亮最新一条可见提问——若该轮次的提问在窗口外,则无脉冲。
- 书签按会话隔离(不跨会话共享)。
- 模型 / token 用量依赖该轮 assistant 节点的元数据,部分场景下缺失则自动隐藏该行。
- fork 从选中消息所在轮次开始分支,不会自动打开子会话(需在会话列表手动打开)。
- 深链接的目标消息若早于已加载窗口,会先自动加载更早历史再定位(受加载上限约束,极端深的历史可能定位失败)。
- 跨会话搜索依赖 harness 的消息内容索引(
session.search),仅返回片段(≤240 字符)、最多 20 条结果;命中过多时请细化关键词。 - 聚焦模式作用于当前会话视图的思考区块,不影响其他插件或工具的展示。
- 尚无全局快捷键聚焦里程碑条(需 Tab 键切换到)。
- 功能键默认折叠,首次使用需点箭头展开;可在设置菜单里把常用键钉到折叠外。
- 更新检测依赖浏览器能访问 npm 镜像(
registry.npmmirror.com/registry.npmjs.org);若页面 CSP 限制connect-src或离线,检查会静默失败。结果缓存 6 小时。 - 工具栏固定偏好存于浏览器 localStorage(不跨浏览器/设备同步)。
更新日志
v0.6.5 · 真实组件教练教程 + 设置对比度修复 · 386 项测试
- 新手教程改为教练气泡(coach-mark):气泡锚定真实组件——欢迎 → 点展开箭头(真实点击自动推进)→ 点设置齿轮(真实打开自动推进,设置开着气泡挂起)→ 圆点 → 完成;目标高亮环 + 就近气泡 + 进度点 + 随时跳过,全部双语。
- 设置模态白色背景修复:UA 默认按钮底色漏出导致浅底浅字不可读,基础态补透明规则(Playwright 计算色实测验证)。
v0.6.4 · 新手教程 · 385 项测试
- 首次使用引导:第一次安装后进入首个可用会话时弹出教程(全局持久化,印象即写——欢迎页一显示即记录,关页/刷新不重弹;想再看走设置里的「重新查看教程」)。
- 4 步教学 + 内置演示:迷你圆点条 hover/点击、玩具搜索与收藏、个性化与设置图例、更新检测与支持;进度点 + 上一步/下一步 + 随时跳过,全部双语。
- 设置与教程模态视觉共用
modal-tokens.ts单一来源。
v0.6.3 · 聚焦高级设置 + 设置模态重设计 · 363 项测试
- 聚焦高级设置:设置内「聚焦」可展开——自定义淡化/折叠 think 推理区与工具调用卡片,淡化强度 20%–80% 可调(稳定选择器
[data-variant="think"]/[data-chat-call-id]),搭配持久化。 - 设置模态重设计:功能悬停描述改为就近 tip(行旁悬浮,不再有大块常驻描述区);恢复表头说明(「开启后,折叠时仍显示在箭头旁」);个性化收进可展开块(默认折叠,头部实时摘要);间距/圆角/强调色统一,修复行 hover 洗色失效。
- README 图片改绝对 URL(npm 渲染器不重写相对路径),npm 页 logo/演示图恢复正常。
v0.6.2 · 设置模态化 + 个性化 + 语言切换 · 346 项测试
- 设置改为居中模态框:功能行悬停显示说明、按类别分区。
- 个性化模块:强调色(预设 + 自定义)、图标 / 圆点大小、距侧边距离、位置左或右(浮层自动换侧),全部即调即存。
- 语言切换:跟随系统 / 中文 / English(zh/en 词典完整,缺译即编译错)。
- 设置按钮进入展开队列(折叠态更干净);底部推广区改 2×2 卡片网格。
- 圆点 turn 分隔线移除(改组间距表达);状态徽章改为柔边光晕。
- npm 包纳入
assets/*.svg(npm 页 README 图片恢复显示)。
v0.6.1 · 对齐 0.1.1-rc.2 支持线 · 五项新功能 · 292 项测试
- 折叠工具栏:功能键默认收起,箭头展开。
- 设置菜单:常用功能「在折叠外显示」固定自定义;偏好持久化,一键恢复默认。
- 设置底部推广区:GitHub / Star / Issue / npm 四入口。
- 更新检测:6h 缓存自动检查、新版徽章、当前/最新版本与已适配版本线、一键去 npm。
- 点击外部自动关闭各浮层(与官方 capture 阶段 pointerdown 契约一致)。
v0.6.0 · P3 功能
- 聚焦模式:淡化思考(thinking)区块,悬停或展开自动恢复。
- 全部提问列表面板:序号 + 轮次 + 预览一次看全,点击即跳。
- 深链接:
#msg=锚点,刷新或分享后直达同一条消息。 - 跨会话搜索:搜索所有会话的消息内容,点击结果打开对应会话。
维护者:发布清单见 RELEASING.md。