zhangzheng25/dsh-timeline
DSH插件:极简提问时间线——每条提问一个圆点,点击跳转,悬停预览。适用于DeepSeek Harness的极简提问时间线。
项目介绍Project Overview
DSH 时间线插件在会话右侧添加提问导航条,每条提问对应一个圆点,点击可平滑跳转,悬停显示时间与内容摘要。它基于浏览器会话快照,零配置、无需后端,长会话自动分页加载,最多显示 15 个圆点并支持内部滚动,自适应深浅主题。安装使用 dsh plugin add github:zhangzheng25/dsh-timeline;本地开发需用 link: 协议,否则修改代码不会生效。提示:纯 client 改动刷新即可,host 改动必须重启 DSH。
DSH Timeline is a DSH plugin that adds a vertical dot rail to the right of any conversation, with one dot per user prompt. It supports click-to-scroll, hover preview of the question time and a short summary, segment highlighting while reading, automatic pagination for long sessions, and up to 15 visible dots with internal scrolling, all using DSH design tokens for light and dark themes. Data comes from the in-browser session snapshot, so no host or database setup is needed. Install with dsh plugin add github:zhangzheng25/dsh-timeline. Note: client changes only need a page refresh, but host changes require restarting DSH.
请帮我了解并安装插件:【dsh-timeline】【https://github.com/zhangzheng25/dsh-timeline】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add github:zhangzheng25/dsh-timeline
把 zhangzheng25/dsh-timeline 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-timeline
简体中文 | English
DeepSeek Harness 的极简提问时间线插件:每条提问一个圆点,挂在界面右侧。点击圆点瞬间跳转到那条提问;悬停查看你当时说了什么、什么时候说的。

零配置、无 host 依赖、不查数据库——数据全部来自浏览器里已有的会话快照。
功能
- 🎯 每条提问一个圆点 —— 所有用户提问在右侧细条上各有一个圆点
- 🔵 安静默认 —— 圆点平时是灰色,高亮(悬停或正在阅读的段落)变蓝。状态全靠颜色表达,圆点永不放大,任何情况下都不会被裁剪
- 🌓 深浅主题自适应 —— 圆点与预览气泡全部使用 DSH 设计令牌(
--dsw-alias-*/--dsw-static-*),跟随浅色 / 深色 / 跟随系统切换,无需重启 - 📍 分段高亮 —— 滚动对话时,视口底部所在的"提问+回答"段落对应的圆点亮蓝;位于对话底部时默认高亮最新一条
- 📜 全历史覆盖 —— 长会话自动分页加载(
loadOlder),直到整条对话的每个提问都有圆点,不只显示最近一页 - 📏 任意长度都清爽 —— 同时最多显示 15 个圆点,更早的在内侧滚动查看(滚动条隐藏),圆点保持等距、不挤压变形
- 🖱 跟随滚动 —— 滚出可见圆点后,圆点列自动跟随,高亮圆点始终在视野内
- ⚡ 点击跳转 —— 平滑滚动到对应消息,长对话不用再手动翻几百行
- 👁 悬停预览 —— 显示提问序号、提问时间、前 80 字提问内容,以及 3 行 AI 回复摘要
- 🕐 绝对时间 —— 今天的提问显示
HH:MM,昨天及更早显示MM/DD HH:MM - 🧹 无滚动条 —— 对话页的垂直滚动条一并隐藏,位置由高亮圆点指示
- 🖱 点击穿透 —— 时间条本身不挡对话,只有圆点响应点击
- 📦 零足迹 host —— node 半端是空
apply,服务端零开销 - 🔤 无 i18n 负担 —— 文案仅中文,保持精简
安装
dsh plugin --profile web add github:zhangzheng25/dsh-timeline
重启 DSH,打开任意有提问的会话,右侧即出现时间线。
本地开发安装:
dsh plugin --profile web add link:E:/path/to/dsh-timeline # link: 协议 → junction 链接,改代码 pnpm build 后刷新页面即生效
⚠️ 必须用
link:协议:file:协议在 profile 的 hoisted 模式下是复制目录,改代码不会生效。用link:后node_modules/dsh-timeline是指向本目录的 junction,构建产物直接可见,无需同步、无需重启。
原理
shell.overlay(root 作用域,附加式,点击穿透)
└─ timeline.rail(自声明子槽,session 作用域)
└─ useSession 快照 → chat.order + chat.nodes(kind === 'user')
→ 圆点 → data-chat-anchor-key 行 → scrollIntoView
- 注入点:全局
shell.overlay席位,自声明会话级子槽timeline.rail,Overlay 通过框架SessionProvider桥接到当前会话。 - 数据:用户消息来自
useSession快照(chat.order/chat.nodes),提问时间在data.time(epoch 毫秒)——不读会话日志、不查数据库。 - 当前段落:
useCurrentAnchor监听对话滚动容器,取视口底部之上最后一条用户行的 key——即读者所在的"提问+回答"段落,其圆点亮蓝。 - 跳转:每条对话行带
data-chat-anchor-key属性(值即节点 key),点圆点找到该行后scrollIntoView。 - UI:时间条
position: fixed+pointer-events: none,只有圆点参与点击;圆点列表上限 15 个、内部滚动;列表和页面的滚动条都通过注入 CSS 隐藏。
开发
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm run build # tsdown → lib/index.js(host)+ lib/client.js(浏览器)
构建产物(lib/)已提交,最终用户无需构建。改源码后:pnpm run build,重启 DSH(纯 client 改动刷新页面即可)。
远端安装(复制模式)注意:如果插件是通过
dsh plugin add在另一台机器/远端安装的,DSH 加载的是 profile 内的插件副本($DSH_HOME/profiles/web/node_modules/dsh-timeline),不是本目录——本地改代码不会生效。改完代码后执行pnpm run sync:dsh把构建产物同步到副本(默认同步到webprofile,可用DSH_PROFILE环境变量指定其他 profile)。
改代码后生效方式(实测):
| 改了什么 | 生效方式 |
|---|---|
client 代码(src/client/,构建后 lib/client.js) |
pnpm run build 后刷新页面即可,无需重启(DSH 对 /plugins/<id>/client.js 实时读文件、no-cache) |
host 半端(src/index.ts)或 cordis.patch.yml |
必须重启 DSH(启动时加载) |
技术要点
- TypeScript + tsdown,对齐官方
clientBundle预设 - 槽位声明通过类型导入合并(
@deepseek-ai/dsh-client-ui-layout/client、@deepseek-ai/dsh-client-ui-conversation/client) dsh.client.inject声明 web loader 需要提供的运行时包- tooltip 显式左对齐(button 的 UA 样式默认居中),并用
width: max-content撑开宽度,避免绝对定位把文字挤成每字一行 - 圆点
flex-shrink: 0防止 flex 布局把圆压成椭圆;tooltip 用 portal 渲染到document.body(overflow-y: auto的祖先会裁剪 absolute 子元素) - 颜色零 JS 适配:圆点颜色直接引用 DSH 设计令牌(挂在
body上,body[data-ds-dark-theme]自动换肤);悬浮卡片颜色由注入的样式表管理,浅色为白底、深色切换为黑底白字,令牌缺失时回退到原有配色
致谢
由 dsh-milestone(SnowCrescenter-tech)大幅精简而来——保留圆点、跳转与悬停预览,并新增分段高亮。
许可
MIT
ruvnet/ruflo
amruthpillai/reactive-resume
volcengine/OpenViking
Molunerfinn/PicGo
titanwings/colleague-skill
nocobase/nocobase
Tencent/WeKnora