Back to home@spirits001

dsh-user-message-rail

A dsh client plugin: a tick rail on the window left edge marking every message you sent, with hover preview and jump-to-message.

Stars
1
Language
TypeScript
Created
Aug 23, 2026
Updated
Aug 23, 2026

Introduction

dsh-user-message-rail

DeepSeek Harness 客户端插件:在聊天框最左缘(工作区右侧)竖一条刻度轨,每条刻度对应发过的一条消息。长对话也能一眼扫清——悬停刻度预览你说过的话,点击跳转到那条消息。

English

特性

  • 每条已落定的用户消息(普通消息 + 被导向进行中回合的消息)一个刻度,按会话顺序自上而下排列,整组垂直居中对齐(首末条关于屏幕正中对称)。
  • 刻度很细(2px)、很短(约 3mm),线间距比线短(约 2mm)聊天滚动时,视口中心对应的消息那一根刻度变黑高亮——"你看到哪了"一目了然。
  • 悬停 / 键盘聚焦:鱼眼变长——悬停那根最长(约 7mm)、相邻递减、更远的保持原长;只有悬停那根变黑,其余保持灰色;旁边弹预览气泡(顶部对齐刻度线、往右留出间距,截断文本 + 图片数)。
  • 点击(或 Enter/Space 激活):平滑滚动会话到该消息居中;prefers-reduced-motion 用户直接跳转。
  • 刻度条整体在聊天窗口内、贴在聊天框左缘;除刻度与预览气泡外整条 click-through。
  • 非聊天视图(如 trajectory)激活时自动隐藏;没发过消息前不显示。
  • 打开会话时自动把历史加载完(未加载完不显示,加载完整体淡入),保证每条消息都出刻度、都能跳转;按屏幕高度限制最多条数,超出只保留最新、不会溢出。

安装

插件已发到 npm。用 dsh 的插件命令把它装进你的 profile(官方流程见 Package and install a plugin):

dsh plugin --profile web add dsh-user-message-rail

dsh plugin 会把包作为依赖装进 profile 目录。因为这是一个 client 插件(声明 dsh.client、不是 dsh.bundle),它会作为普通依赖安装、不会自动激活层;再在 profile 的 cordis.patch.yml 里插一行,把它挂进 Cordis 树(浏览器端才会通过 dsh.client 声明扫描并加载):

- insert:
    - id: user-message-rail
      name: dsh-user-message-rail

插件只影响浏览器:node 半体为空,client 半体把自身注册进会话编写器链的 conversation.input.overlay 槽位——无需改动产品包。

工作原理

刻度轨通过框架 session kit 订阅会话的聊天快照,取其中的用户/steering 消息按序生成整齐竖梯,整体以视口垂直中心为对称轴、按固定步距向下排列。滚动时读取每条消息行的位置,找出视口中心对应的那条消息并把它的刻度高亮(变色);悬停时对悬停刻度做鱼眼加长(悬停那根最长、邻居递减、更远不变)并变黑,其余保持灰色,预览弹层顶部对齐刻度线并向右侧留出间距。轨道只在聊天框左缘读取布局、并读取滚动位置,其余刻度位置纯由消息数推导。挂载后自动用会话的 loadOlder 把历史全部加载完——加载完成前隐藏、完成后整体淡入;超过屏幕高度的消息按 maxVisibleTicks 只保留最新,保证不超高、尽量多显示。

开发

npm install
npm run typecheck   # src + tests 严格类型检查
npm test            # vitest(组件、装配、几何)
npm run build       # tsc 声明 + tsdown 打包(lib/)

浏览器产物以 dsh web loader 的闭包工厂格式(window.__ModuleLoader__.load({ id, factory }))输出,react / react-dom / cordis 作为模块表导入保留;CSS Modules 由 lightningcss 编译成哈希类名映射,注入为插件自有的样式表。

License

MIT