spirits001/dsh-user-message-rail ↗★ 1
dsh-user-message-rail
A dsh client plugin: a thin tick rail on the chat box's left edge marking every message you sent, with hover preview and jump-to-message.
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗dsh-user-message-rail
DeepSeek Harness 客户端插件:在聊天框最左缘(工作区右侧)竖一条刻度轨,每条刻度对应你发过的一条消息。长对话也能一眼扫清——悬停刻度预览你说过的话,点击跳转到那条消息。
特性
- 每条已落定的用户消息(普通消息 + 被导向进行中回合的消息)一个刻度,按会话顺序自上而下排列。
- 刻度很细(约 2px)、很短(约 3mm),线之间的间隔与线等长(约 3mm);整个刻度组垂直居中对齐——第一条与最后一条关于页面垂直正中对称。
- 悬停 / 键盘聚焦:刻度变长高亮(跟随浅色/深色主题变黑/白),旁边弹预览气泡(截断文本,带附件时显示图片数)。
- 点击(或 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 消息按序生成刻度。刻度是均匀竖梯:整个数组以视口垂直中点为中心,第一条与最后一条关于中点对称,后续每线向下步进一个「线长 + 间隔」(≈3mm)。它只在聊天框左缘读取一次布局([data-conversation-scroll] 的左边缘),刻度位置纯由消息数推导,所以助手流式输出不会触发重绘。轨道挂载后会自动用会话的 loadOlder 把更早的分页全部加载完,保证每条消息都有刻度;聊天视图切换(DOM 增删)与侧栏折叠 / 窗口缩放(ResizeObserver / resize)会触发一次合并到单帧 rAF 的重新对齐。
开发
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