dsh-plugin-message-nav
by wuzehao888
DSH网页插件:左侧消息导航栏 — 每条用户消息一个编号勾选,点击跳转,悬停预览,滚动跟随高亮,自动加载完整历史
DSH web plugin: left-side message navigation rail — one numbered tick per user message, click to jump, hover preview, scroll-follow highlight, auto-loads full history
安装
dsh plugin --profile web add github:wuzehao888/dsh-plugin-message-navGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
左侧消息导航轨道插件(DSH Web 客户端插件)。
功能
- 在会话消息区左侧渲染一条垂直导航轨道,高度按刻度内容动态自适应 (最高为消息区高度的 1/3)且垂直居中,上下带 4px padding、 圆角浅灰背景;刻度较多放不下时轨道内部可滚动(隐藏滚动条)浏览全部刻度;
- 每条用户消息一个刻度,刻度上显示消息序号(数字);
- 打开会话即自动加载全部历史:会话窗口默认只拉取尾部一页(50 条),
插件会循环调用
session.loadOlder()(每页 50 条)直到hasMore === false, 让轨道一次性列出会话中的所有用户消息,无需手动点击"加载更早"; - 点击刻度:平滑滚动消息区,跳转到该条用户消息;
- 悬停刻度:浮层预览该条消息的文本内容;
- 跟随滚动高亮:当前视口内最近的用户消息刻度高亮(主题色)。
结构
dsh-plugin-message-nav/
├── package.json # dsh.client 声明(platform: web)+ exports
└── lib/
├── index.js # host 侧 loader 条目(无 host 行为)
├── invariant.js # invariant 伴生插件
└── client.js # 浏览器 bundle:shell.overlay 条目
浏览器 bundle 是手写的 window.__ModuleLoader__.load({ id, factory }) CJS
工厂,无需构建步骤;依赖只取平台 seed 词(react)。
实现要点
- 挂载点:
shell.overlay(frame 级悬浮层,root 作用域,list 槽,点击 穿透默认关闭,条目 opt-in 指针事件); - 数据源:
ctx.sessions.binding(current)?.session(SessionFace=ObservableSnapshot<ConversationSnapshot>),用useSyncExternalStore订阅;用户消息按chat.order中kind === 'user' | 'steering'过滤; - 刻度定位:轨道高度动态 = 刻度数 × 间距(
TICK_SPACING = 26px)+ 上下 padding(RAIL_PADDING = 4px),封顶为滚动容器高度 × 1/3 (RAIL_HEIGHT_RATIO),垂直居中,左缘留RAIL_LEFT_INSET = 4px; 刻度按固定间距等距排列在轨道内容里,内容超出轨道可视高度时轨道内部滚动 (overflow-y: auto,隐藏滚动条),当前高亮刻度自动保持可见(scrollTo跟随); - 跳转:对滚动容器
scrollTo({ top, behavior: 'smooth' }); - 高亮:滚动监听 + 顺序查找视口顶部最近的用户消息;
- 自动加载:effect 观察
snapshot.hasMore / loadingOlder / openState,在会话 打开且仍有更早历史时调用session.loadOlder();以窗口首个锚点 seq 是否 前进来判断分页是否推进,未推进(失败)即停止,避免死循环。
安装
方式一:通过 dsh plugin 命令(推荐)
# 在 web profile 中安装本插件(pnpm 可用时)
dsh plugin --profile web add dsh-plugin-message-nav
# 在 profile 的 cordis.patch.yml 注册 dsh.client 行
# - insert:
# - id: message-nav
# name: 'dsh-plugin-message-nav'
方式二:本地链接(无 pnpm 环境)
# 1. 链接插件包到 profile 的 node_modules
ln -s <repo>/dsh-plugin-message-nav ~/.dsh/profiles/web/node_modules/dsh-plugin-message-nav
# 2. 在 profile 的 cordis.patch.yml 注册 dsh.client 行
# - insert:
# - id: message-nav
# name: 'dsh-plugin-message-nav'
# 3. 重启 web 服务器(patch 热更新在无 --expose-internals 时不可用)
dsh --profile web
重启后刷新浏览器页面,会话消息区左侧即出现导航轨道。
开发期修改 lib/client.js 后由 client-hmr 自动热更新,无需重启。
许可证
已知限制
- 仅当会话处于 chat 视图且存在用户消息时显示;
- 轨道固定在滚动容器左侧边缘,不随会话 header/composer 的几何变化重新 吸附(窗口 resize 与容器尺寸变化会重新测量);
- 自动加载会拉取整个会话历史,超长会话会产生多次分页请求。
原始 README: https://github.com/wuzehao888/dsh-plugin-message-nav/blob/main/README.md ↗
同类插件
查看全部 →
archify
Agent 技能:生成美观、可校验的架构图、工作流图、时序图、数据流图与生命周期图——自包含 HTML、带动画与清晰导出

dsh-turn-rewind
对话回退:基于持久 Change Ledger 回滚会话与工作区状态。

dsh-plugin-cc
把 DeepSeek Harness 接入 Claude Code:评审、批评、委派与会话导入

dsh-interconnect
跨实例互联:经 interconnect 服务在多个 DSH 实例间转发消息与事件。

dsh-chat-import
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。

dsh-crew
DSH 插件:从 Claude Code / Codex 向 DSH agent 派活——原生 subagent 进度、宿主内 worker 会话(分级预设),以及为纯文本宿主补上视觉与图像生成的多模态桥