Skip to content

dsh-session-colors

Verified

@idoall/dsh-session-colors · v0.1.2 · MIT · Web UI

DSH web plugin: give any Session a colour mark, shown as a chip in the sidebar and picked from the conversation header. Marks are stored on the Host, so a colour chosen on one device is visible on every other one — including over LAN and tunnels.

Install

dsh plugin add @idoall/dsh-session-colors

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Readme

DSH 会话颜色标记

给任意会话上一个颜色,在侧栏一眼认出它。

npm license

English | 中文

功能 · 安装 · 使用 · 兼容性 · 跨设备与局域网 · 配置 · 故障排查 · 安全边界 · 限制 · 卸载 · 开发

DSH Session Colors 是 DeepSeek Harness 社区插件。它不修改 DSH 核心,也不改写任何会话或工作区数据:一个标记只是"会话 ID → 一个颜色"。

工作分散在多个工作区里,而工作区列表就是一堵长得差不多的标题墙。任务跑完之后,刚才那条会话就很难再找回来——状态点已经回到空闲,标题也只是二十个里的一个。自己选的颜色,是让一行变得好认的最省事办法。

侧栏里的四个颜色标记:同一个工作区列表里四条会话各自带一条不同颜色的竖条(琥珀、红、绿、蓝)

功能

  • 会话行上的颜色标记——行左侧内边距里的一小段色条,刻意避开状态点,所以"哪个跑完了"这个信号不会被盖掉。
  • 系统风格的颜色选择器——大色板、色相与透明度滑条、十六进制与 RGBA 输入、七个主题色、我的颜色,以及浏览器支持 EyeDropper 时的屏幕吸色。注册在会话头部的工具区,不占标题位置。
  • 一处标记,处处可见。 标记存在宿主而不是浏览器里,所以在电脑上选的颜色,手机上也能看到——局域网地址、隧道访问都算。
  • 手机端同样显示。 手机把侧栏变成抽屉,色块跟着抽屉走:抽屉滑进来时它一起移动,并且画在抽屉之上。
  • 自动获取改动。 页面重新可见时、以及每 20 秒会重读一次,别的设备改了颜色不用刷新就能看到。
  • 绝不挡住界面。 色块浮层点击穿透,并且按侧栏滚动容器裁剪;最坏情况只是色块不显示。
  • 失败会说。 读不到存储时,头部控制会显示 ⚠ 并给出原因,而不是装作"这个会话没有颜色"。

颜色选择器:色相/明度大色板、吸色按钮、色相与透明度滑条、十六进制与 RGBA 输入、主题颜色色板、我的颜色与清除标记按钮;上方是会话头部里的颜色控件

安装

要求:

  • 带 Web profile 的 DeepSeek Harness
  • Node.js 20 或更新版本
  • 已验证的 DSH 版本:0.1.6-alpha.2(见兼容性
dsh plugin --profile <profile> add @idoall/[email protected]

要改插件本身就用目录安装:

dsh plugin --profile <profile> add link:/path/to/dsh-session-colors

然后在 profile 的 cordis.patch.yml 里给它一个数据目录(与其它需要持久化的插件做法一致,插件不会去猜 profile 路径):

- id: dsh-session-colors
  config:
    dataDir: /absolute/path/to/profiles/<profile>/data/dsh-session-colors

最后重启 dsh web(宿主半边只在启动时加载),再刷新 Web GUI。不配 dataDir 也能用,但标记只活在宿主进程的生命周期里。

使用

  1. 打开要标记的会话。
  2. 点会话头部的颜色控件(未设色时显示 🎨,设色后显示该颜色)。
  3. 选一个颜色,或直接粘贴十六进制值。该会话在侧栏的行上会立刻出现色条。
  4. 取消标记:再次打开选择器,点清除标记,或选主题色里那个透明色块。

在已标记的会话上打开选择器,会从它当前的颜色开始。颜色以 HSVA 保存,所以透明度能原样往返。

手机上的侧栏抽屉:会话列表里同样显示颜色标记,同一个列表里能同时看到琥珀、红、绿、蓝四条

兼容性

当前版本:插件 0.1.2 已针对 DeepSeek Harness 0.1.6-alpha.2 验证。

插件版本 已验证的 DeepSeek Harness npm 发布状态 该版本是什么
0.1.2 0.1.6-alpha.2 latest 修掉折叠/展开工作区后色块停在旧位置约 20 秒:同一个 target 上第二次 MutationObserver.observe()childList 监听顶掉了。
0.1.1 0.1.6-alpha.2 已发布 仅文档:打包进 npm 的 README 不再写"尚未发布",并声明了市场截图。
0.1.0 0.1.6-alpha.2 已发布 首个版本:会话颜色标记、宿主侧存储、手机抽屉内可见
  • 已验证的 DeepSeek Harness 是这个插件实际跑过的确切 DSH 版本。这份清单只有一个存放处——package.jsondsh.compatibility.dshReleases——并且有测试保证两个 README 的兼容性段落与它逐字一致、且落在 peerDependencies 声明的范围内。未列出的 DSH 版本不会被宣称为兼容
  • peerDependencies 声明的范围是 >=0.1.6-0 <0.2.0dsh-client-ui-layoutdsh-client-ui-conversation):这是允许加载的范围,不等于已验证。
  • DSH 升级快于插件时,插件本身不会因此报错:色块依赖 DSH 的行 DOM(见限制),所以 DSH 大改行结构时最坏的结果是色块不再显示,不会挡住点击。

跨设备与局域网

存储走插件自己的 HTTP 路由(GET/POST /plugins/dsh-session-colors/marks),落盘到 profile 数据目录里的一个 JSON 文件。这是有意为之

DSH 自带的用户设置服务只对回环页面做宿主持久化——

persistence = $host.isLoopback ? "host" : "memory"

——所以用局域网地址或隧道打开的页面,设置 scope 会永久不可用,读不了也写不进。自有路由不受这条规则限制,这正是标记能跨设备的原因。局域网转发(dsh-bridgedsh-lan-proxy 等)会把 Host/Origin 改写成回环并注入认证 cookie,所以经局域网进来的请求在 DSH 侧仍是回环,路由正常响应。

配置

字段 类型 含义
dataDir 绝对路径 session-colors.json 的写入位置。不填则标记只存在于进程内存。

标记是一个 JSON 文档:

{
  "version": 1,
  "marks": {
    "session-0698599a-…": { "h": 211.3, "s": 1, "v": 1, "a": 1 }
  }
}

写入是原子的(先写临时文件,再 rename)。要清掉某个标记,用选择器里的清除标记,或直接从文件里删掉那一行。

故障排查

手机上还是看不到颜色。 先看设备跑的是哪个构建:

document.querySelector('.dsh-sc-layer').dataset
// { dshScBuild, dshScStatus, dshScWritable, dshScMarks, dshScError }

dshScBuild 不是 host-routes+drawer-aware 就是客户端缓存,刷新页面即可(客户端半边刷新即热重载,不需要重启 DSH)。dshScStatus 不是 ready 则是存储读不到,见下一条。

头部控制显示 ⚠。 表示读不到存储:dshScError 里有原因,dshScWritable 说明能不能写。宿主路由未注册(插件没被 profile 加载)或数据目录不可写时会这样。注意这不是"这个会话没有颜色"。

局域网页面上功能不全。0.1.0 起本插件在局域网/隧道页面与回环页面行为一致(存储走自有路由)。如果你看到的是旧版那种"设置读不到"的表现,先确认装的是哪个版本。

色块位置不对或消失。 色块浮层靠 ARIA role 找会话行、靠 React fiber 取会话 ID。DSH 大改侧栏结构后可能找不到行;此时色块会消失,但不会影响点击,因为浮层是点击穿透的。

安全边界

  • 标记只保存会话 ID 与颜色,不写会话日志、标题、历史、状态、归档记录或工作区归属。
  • 不创建、不复制、不移动、不重排任何会话;标记不是会话数据的一部分。
  • 色块浮层从不接收指针事件,并且按侧栏滚动容器裁剪:最坏情况只是色块不显示。
  • 宿主路由复用 DSH 自带的鉴权栅栏(connection.requestRejection),写入另加同源检查。
  • 插件不注册模型 Tool、不启动子进程、不访问网络。

限制

  • 色块依赖 DSH 的行 DOM。 它靠 ARIA role 找行、靠 React 内部结构取会话 ID。DSH 未来改版可能让色块不再显示;但不会影响点击
  • 标记属于单个 DSH 实例。 它存在某个 profile 的数据目录里,两个独立的 DSH 服务之间不共享。
  • 没有权限模型。 凡是能访问该 profile 已鉴权路由的人,都能读写标记。
  • 只有颜色。 没有文字标签、图标或 emoji。

卸载

dsh plugin --profile <profile> remove @idoall/dsh-session-colors

重启 DSH 并刷新 Web GUI。数据目录里的 session-colors.json 不会被自动删除;不需要就自行删除。

开发

npm test        # 34 项:bundle 结构、存储、路由、跨设备、几何、文档一致性

浏览器半边是手写的 __ModuleLoader__ bundle——这是 DSH 客户端加载器接受的唯一格式。手写是刻意的:没有构建步骤,就不会有产物与目标 DSH 版本漂移的问题。

src/index.js       宿主半边:路由、JSON 存储、鉴权栅栏
src/client.js      浏览器半边:选择器、色块浮层、fetch 存储
tests/             两个半边的单元测试,外加文档一致性检查
docs/              设计记录(中文)与 README 截图
demos/             独立的选择器 HTML Demo

设计取舍与实测记录见 docs/plugin-design.zh.md;独立的选择器 Demo 见 demos/session-color-mark-demo.html

许可证

MIT