dsh-turn-dial:把对话轮次轨道变成半个仪表盘

前言

DeepSeek Harness 的会话右侧有一条纤细的轮次导航轨道,轮次多起来之后,用户很难一眼看出自己读到第几轮、整段对话有多少轮。开发者想在界面层解决这件事时,一般要改宿主的会话组件,自己写一套导航 UI,再处理虚拟化列表下的点击、悬停预览和键盘焦点。下面介绍的 dsh-turn-dial 把这件事做成一个插件:它不新增一套导航,而是直接重用宿主轨道上已有的每一条 marker,把它们画成钟面上的刻度,再加一根指向当前轮次的指针。

这个插件由 Surtr-crimson 维护,MIT 许可,面向 DeepSeek Harness 0.2.1-rc.1 及以上版本,peer 依赖是 @deepseek-ai/dsh-client-ui-conversation。它是纯视觉插件:不调用宿主 API,不发网络请求,不写存储,也没有配置项。

它做了什么

插件把轨道上的 marker 旋转到表盘边缘,每个 marker 变成一根刻度:几轮对话就有几根刻度,不多也不少。每第五根刻度更长、更粗,颜色为紫色,其余保持细的银色。当前轮次由一根蓝色细针指示,针跟随轨道标记的 current 轮次摆动,滚动对话或切换轮次时手针都会动。

刻度仍然是原来的轨道。点击刻度跳转到对应轮次,悬停在刻度上会像原来一样弹出预览卡片,键盘焦点仍然能到达每个标记。表盘本身由一圈双层边框、刻度内侧的章节环、虚线内圈、扇形射线和一个中心轴环组成,全部画在一个 inline SVG 里。

插件没有注册任何键盘处理器,也没有替换点击逻辑。它读取虚拟化列表写出的列表高度,把滚动容器撑到那个高度让所有 marker 都挂载,然后用一条内联 transform 旋转指针。

核心功能

  1. 一根刻度对应一轮对话,直接复用轨道的 marker,不额外生成 DOM。
  2. 每第五根刻度加粗、拉长并着紫色,其余为银色细线。
  3. 蓝色指针指向当前轮次,随滚动和轮次切换移动。
  4. 点击、悬停预览、键盘焦点保持轨道原生行为。
  5. 表盘由单个 inline SVG 绘制,含双层边框、章节环、虚线内圈、扇形射线和轴环。
  6. 无 API 调用、无网络请求、无存储、无配置项。

安装与启用

方式一,从 DeepSeek Harness 插件市场安装:打开 Plugins → Market,搜索 Turn Dial,安装后重启 Harness。

方式二,用插件管理器安装。它会读取 package.json 里的 dsh.bundle,自动套用 cordis.patch.yml。

dsh plugin add

方式三,手工安装,适用于没有插件管理器的 profile。先把包复制到 <profile>/node_modules/dsh-turn-dial,再在 <profile>/cordis.patch.yml 里加入:

- insert:
    - id: turn-dial
      name: dsh-turn-dial

补充一种不含市场的手工布局:把 index.js、client.js 复制进 ~/.dsh/profiles/<profile>/node_modules/@local/turn-dial/,然后在该 profile 的 cordis.patch.yml 里写:

- insert:
    - id: turn-dial
      name: '@local/turn-dial'

这种做法下,本地 package.json 的 name 必须是 @local/turn-dial,与入口名和 client.js 里的 loader id 一致,并且不能声明 dsh.bundle——那个字段专供市场安装和 dsh plugin add 使用,此时包名是 dsh-turn-dial。

装上之后没有需要配置的字段。插件随会话启动注入,inject 指向 @deepseek-ai/dsh-client-ui-conversation,加载即可生效。

兼容性与布局

要求 DeepSeek Harness 0.2.1-rc.1 及以上,package.json 的 peerDependencies 为 @deepseek-ai/dsh-client-ui-conversation: ^0.2.1-rc.1,engines 为 Node.js >= 20。

表盘跟随宿主的响应式规则:当会话列宽度小于 900px 时表盘隐藏。尺寸取对话视口高度的约 40%,介于 190 到 272 px 之间,低档为 104 × 196 px,窗口变化时重新测量。

典型场景

轮次不超过 260 轮的对话。 插件把轨道滚动容器撑到列表真实高度,虚拟化器因此挂载全部 marker,每根刻度都是真实按钮,原生支持点击、悬停预览和键盘焦点。

超过 260 轮的长对话。 刻度改用三条 SVG 路径绘制,分别对应普通、每第五根和当前三种样式,DOM 里只保留轨道自己的标记窗口。刻度以约 3 px 间距画成细线,三千轮的对话只需几百条 path 指令,而不是几千个按钮。点击表盘时把指针角度映射到轮次,把该轮滚动进轨道窗口,再点击它的 marker。

改插件自身。 dev/preview.html 渲染一条与宿主同 DOM 结构的假轨道并加载 client.js,不必启动 Harness 就能调表盘。轮次数量和当前轮次在页面的 turns 数组里改。

适用场景与注意

适合觉得轮次轨道不够直观、想在界面上直接看出对话长度和当前位置的开发者,以及打算研究 DSH 插件如何在不触碰宿主源码的前提下改 UI 的人。

需要注意:插件以当前 DSH 进程的权限运行,安装前应先检查源码与许可证(MIT)。它读取虚拟化列表的高度并改变滚动容器的尺寸,这是宿主内部行为,属于对现有实现的依赖,升级宿主后建议重新验证长对话下的表现。星标、下载量、分类等信息在公开资料中未给出。

结尾

dsh-turn-dial 的价值在于它没有替换轨道,而是在轨道的既有结构上叠加一层仪表盘渲染,代价是零配置和零 API 调用,换来的是轮次数量和当前位置一眼可读。

目录页:https://www.skillhub.cn/plugins/Surtr-crimson/dsh-turn-dial

源码:https://github.com/Surtr-crimson/dsh-turn-dial

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜