前言¶
用 DeepSeek Harness(DSH)跑长任务时,一个会话很快会积累几十条用户消息。想回看某次指令的原文、核对当初给的约束,只能在消息流里一屏一屏滚动,会话越长成本越高。
@lcthe/dsh-timeline-rail 把这件事变成一次点击:沿对话左边缘为每条用户消息画一条细刻度,组成时间轴;悬浮刻度可预览消息,点击刻度直接跳转。本文介绍它的功能、实现和接入方式。
这是什么¶
@lcthe/dsh-timeline-rail 是 DSH 网页会话的消息时间轴导航条,作者 lcthe,当前版本 0.2.12,MIT 许可。它在对话左边缘、composer 卡片上方渲染一条 1px 竖轨,为每条 durable 用户消息绘制一条等间距水平刻度,固定 12px 间距,刻度居中于竖轴。
DSH 的理念是「一切皆插件」,客户端 UI 同样通过槽位扩展。这个包注册单个入口到 conversation.input.dock 槽位,属于纯展示型客户端插件,不定义新服务。
Desktop 与 Web 均可使用。DSH 桌面应用是 Electron 外壳,内嵌同一套浏览器客户端,所以面向 web 的插件在两端表现一致;只有 headless/TUI profile 没有 composer 槽位,不会渲染任何内容。
核心功能¶
- 等间距刻度:1px 竖轨上,每条用户消息一条水平刻度,固定 12px 间距。
- 长历史独立滚动:历史很长时,轨道内容在轨内自行滚动,而不是压缩刻度间距;滚动轨道不会带动对话区滚动。
- 完整历史加载:会话打开后,通过
loadOlder()自动串行加载更早的历史页,直到没有更多页,每页到达即添加对应刻度。 - 点击跳转:将所选的第 N 条用户消息对齐到可见消息区顶部。
- 悬浮预览:宽卡片显示加粗、限 2 行的用户消息,以及限 3 行的助手回复;纯图片/附件消息显示带标签的占位。
- 主题感知:颜色取自
--dsw-*token,自动跟随亮/暗主题,无需额外配置。 - 不挡交互:除刻度本身外
pointer-events为none,不阻挡消息区或 Session Log 的点击与滚动。
实现方式¶
DSH 的网页 GUI 是一个 Cordis 组合,本包是运行在其上的客户端插件,做三件事:
1、向 conversation.input.dock 槽位(composer 卡片上方的附加带)注册单个入口。
2、通过槽位的 useSession 读取实时 ConversationSnapshot,把每个 durable 的 kind: 'user' 节点映射为一条刻度。
3、测量 [data-conversation-scroll]、[data-composer-seat] 等 scrollport,把轨道铺在左边缘;定位计算复用产品自身的稳定 data 属性([data-conversation-scroll]、[data-chat-flow]、[data-chat-anchor-key]、[data-composer-seat])。
它不定义新服务,也不改动消息区本身的逻辑。
安装与启用¶
前置条件:一个带浏览器客户端的 DSH 部署——桌面应用(内嵌 Web UI)或 Web 版均可。插件是纯展示组件,只在存在消息输入区(composer)的位置渲染。
1、安装包:
pnpm add @lcthe/dsh-timeline-rail
2、在 cordis.yml 中,与 bundle 行相同的 include 层级添加插件行:
- insert:
- id: dsh-timeline-rail
name: '@lcthe/dsh-timeline-rail'
经过上面的步骤,打开会话后即可在对话左边缘看到时间轨。完整接线细节见仓库中的 INSTALL.cordis.yml.md。
典型用法:会话内动态加载¶
如果只想快速试用,可以不走 npm 安装:在会话里直接让 agent 用动态 Cordis 工具(cordis_define + cordis_run)加载本包。这条路线适合快速评估;npm 包是稳定、可分享的形式。
适用场景与注意事项¶
适合的用户:主要通过 DSH 桌面版或 Web 版工作、会话历史偏长、需要频繁回溯定位消息的人。headless/TUI 环境没有 composer 槽位,这个插件不会显示任何内容。
使用前有几点需要知道:
1、刻度是等间距的(每条用户消息一个刻度、固定 12px 间距),并不代表各消息的真实滚动位置。按真实位置渲染的 minimap 模式是作者列出的后续工作。
2、预览有截断:用户消息限 2 行、助手回复限 3 行,轨道内没有展开手段;点击刻度可以跳到完整消息。
3、插件针对 0.0.1-rc.1 发布线的 Harness 客户端槽位契约。若后续 RC 更改 conversation.input.dock 契约,本包可能需要升级。peerDependencies 要求如下:
| 包 | 版本范围 |
|---|---|
@deepseek-ai/cordis |
>=4.0.1-rc.1 |
@deepseek-ai/dsh-client-locale |
^0.0.1-rc.1 |
@deepseek-ai/dsh-client-runtime |
^0.0.1-rc.1 |
@deepseek-ai/dsh-client-ui-conversation |
^0.0.1-rc.1 |
@deepseek-ai/dsh-client-ui-slots |
^0.0.1-rc.1 |
react / react-dom |
^18.2.0 |
4、安全提醒:插件以当前 dsh 进程的权限运行,安装前建议检查源码与许可证。本包源码公开在 GitHub,采用 MIT 许可。
小结¶
@lcthe/dsh-timeline-rail 解决的问题很具体:在长会话里定位某条用户消息。它不碰消息流本身,只在左边缘加一条可悬浮、可点击的时间轴,改动范围小。如果你经常在 DSH 里跑长会话,值得接入试试。
- GitHub 仓库:https://github.com/lcthe/dsh-timeline-rail
- 社区插件目录页:https://www.skillhub.cn/plugins/lcthe/dsh-timeline-rail
社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。