dsh-chat-navigator
No description
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 17, 2026
- Updated
- Aug 19, 2026
Introduction
dsh-chat-navigator
DeepSeek Harness (dsh) web plugin — 右侧轮次导航条 + 对话折叠。
功能
-
右侧锚点簇(轮次导航)
- 贴会话列右缘、以会话列高度约 0.6(可调) 为锚点(簇中心,自动限制在列内);
- 滑动窗口:窗口长度在设置中可调(3–12 挡,默认 6);每次仅显示窗口内的轮次;在簇上滚轮即平滑滑动窗口(每次 1 轮,transform + CSS transition,先慢后快 ease-in 曲线);当前阅读轮离开窗口时窗口自动跟随滑入;视口四周预留光晕余量,当前轮阴影在悬停放大时不会被矩形视口截断;
- 悬停放大:悬停的圆点
scale(1.55)平滑放大,同时弹出操作卡片(渲染在视口之外不被裁剪):该轮首条用户提问摘要(≤80 字)+「折叠本轮 / 展开本轮」+「在此分叉」; - 统一主色调:全部圆点使用自定义主色调(分支树面板可改 + localStorage 持久化);无分支 = 基础强度挡淡色,有分支 = 按分支数渐变增强(更醒目)+ 描边 + 光晕(6 挡可调);当前阅读轮带高亮光晕;
- 分叉标记:圆点右下角按分支数量显示横线(1–4 条细线,5+ 一条粗线);
- 点击圆点 = 平滑跳转到该轮开头;已折叠轮的圆点变暗空心,点击 = 展开并跳转;
- 空会话 / 窗口加载中 / 错误态 / 内容不足以滚动时自动隐藏。
-
折叠
- 整轮折叠:入口在右侧圆点簇的悬停操作卡片(每个轮都有圆点,故每轮都有折叠入口);折叠后该轮全部行隐藏;
- 折叠守卫:不允许折叠全部轮——折叠后若所有轮都已折叠,自动展开会话顺序中的下一轮;被折叠的是最后一轮则展开上一轮;仅一轮的会话不提供折叠按钮;
- 单条助手消息折叠:每条已最终化的助手消息行内「折叠此消息」按钮(正文图标行,非正文末尾);折叠后该行隐藏;
- 已折叠读条:输入区下方的常驻读条列出所有已折叠项(「已折叠 N 项:展开第 3 轮(5 条)…」),支持逐项展开与「全部展开」;
- 有折叠项时圆点簇不因滚动高度不足而隐藏(全折叠时簇仍保留,作为展开入口之一);
- 折叠状态仅内存(按会话),刷新页面即恢复展开;插件停用自动恢复全部被隐藏的行。
-
分叉(fork)与家族树(V2)
- 圆点分叉:悬停卡片「在此分叉」(两步确认)→ 从该轮收尾处
sessions.fork→ 自动切到子会话;分叉轮圆点右下角显示短横线标记; - 分支子会话列表:悬停分叉轮,卡片列出子会话(点击打开);
- 家族树面板:会话头部「🌳 分支树」按钮打开无遮罩浮层,显示当前会话的根→子孙树(纯 client 血缘数据);当前打开的会话行差异化高亮(主色淡底 + 左侧色条 + 标题加粗主色 + 「● 正在查看」徽标,跟随自定义主色调);节点支持点击切换、面板内分叉(尾部,运行中禁用)、归档(移到兄弟末尾 + 删除线)、恢复、物理删除(内置端点,两步确认);悬停节点在面板左侧显示会话摘要悬浮列(每轮用户消息摘要 + 工具/错误/分支标记,滚轮滑窗,点击跳转该轮,异步加载并缓存);默认只展开当前路径,ESC/关闭按钮退出;
- 分叉标记覆盖本插件创建 + 官方 fork 的分叉(官方 fork 通过本插件 host 端点
/sigs读取父子会话事件签名、公共前缀对比推断分叉边界,缓存一次)。
- 圆点分叉:悬停卡片「在此分叉」(两步确认)→ 从该轮收尾处
实现要点
- 双端插件:host 半提供 HTTP 端点(
lib/index.js):/delete(物理删除,移植自 dsh-session-manager,MIT)、/unarchive(恢复归档)、/summary(会话轮次摘要)、/sigs(事件签名表,供官方 fork 分叉边界推断);client 半注册四个加性 Slot:conversation.session.header.utilities→ 圆点簇(跳转 + 悬停卡片折叠/分叉)+ 分支树按钮/面板 + 会话摘要悬浮列;conversation.chat.assistant-actions→ 单条助手消息折叠;conversation.composer.dock→ 已折叠读条(逐项 / 全部展开入口)。
- 双窗口设置:导航窗口 / 摘要窗口长度独立可调(3–12 挡,默认 6,localStorage);
- 分支视觉偏好:主色调(取色器)+ 基础强度 / 分支最大强度 / 光晕大小(各 6 挡,localStorage,分支树面板调整);
- 注意:修改
lib/index.js(host 半)后需重启 dsh web 才生效;纯 client 改动走 HMR 即时生效。 - 数据来自 session 标准 kit 的
useSession:chat.order(节点顺序)+chat.nodes.get(key)(节点 kind/seq/location/data)。 - 滚动与跳转复用官方机制:
[data-conversation-scroll]滚动容器、[data-chat-anchor-key]节点行、flowTop相对定位、直接改scrollTop(锚点簇本身 fixed 固定,不随滚动移动)。 - 颜色全部使用
--dsw-alias-*主题 token,深浅色自动适配。 - 若官方 DOM 属性在版本升级后变更,进度条自动隐藏、折叠按钮失效,不崩溃。
安装
本机开发(link 到仓库目录)
# 1. 在 web profile 的 cordis.patch.yml 追加行:
# - insert:
# - id: dsh-chat-navigator
# name: 'dsh-chat-navigator'
# 2. 安装依赖(link 到本仓库目录)
dsh plugin --profile web add "link:D:/prj_dsh_plugin"
# 3. 重启 dsh web(新增插件行需重启加载)+ 刷新页面
分发给其他用户(git 仓库)
# 1. 安装依赖(从 git 拉取,按 tag 固定版本;GitHub 写法见注释)
dsh plugin --profile web add "git+https://github.com/sean-bike/dsh-chat-navigator.git#v0.1.0"
# GitHub 也可简写:dsh plugin --profile web add "github:sean-bike/dsh-chat-navigator#v0.1.0"
# 2. 在 web profile 的 cordis.patch.yml 追加行:
# - insert:
# - id: dsh-chat-navigator
# name: 'dsh-chat-navigator'
# 3. 重启 dsh web + 刷新页面
- 版本要求:dsh
0.1.0-rc.6(按此版本验证;依赖conversation.session.header.utilities/conversation.chat.assistant-actions/conversation.composer.dock座位与[data-conversation-scroll]等 DOM 属性,官方属性变更时插件优雅降级不崩溃)。 - 升级:发布新 tag 后,接收者执行
dsh plugin --profile web add "git+<url>#<新tag>"更新依赖并重启即可(纯 client 插件,正文改动亦可走 HMR,但换 tag 需 pnpm 更新)。
已知限制
- 进度条仅覆盖已加载的历史窗口(
hasMore之前的内容不在条上)。 - 会话级节点(compaction 摘要等)不生成轮标记。
- 用户消息 / 工具调用行不做单条折叠(官方无逐行加性座位,避免替换官方渲染器)。