luzonghao/dsh-workspace-light

dsh-workspace-light

DSH 插件:侧栏工作区行四态灯(🟡 待交互 / 🔄 执行中 / 🟢 已完成 / ⏰ 仅定时)+ 会话「⋯」菜单 Mark as unread。纯客户端,外观复用宿主原生组件。

未分類cordisdeepseek-harnessdsh

dsh-workspace-light

  1. 会话菜单增加**「标为未读」**;
  2. 工作区行状态灯显示会话状态。

说明:

  1. 纯客户端 DSH 插件,无 Host 行为;
  2. 中英文双语。

工作区状态灯优先级

状态灯含义优先级
🟡该工作区有会话在等你(提问 / 待批准)1(最高)
🔄有会话正在执行(转圈)2
🟢有会话已完成但你没看过3
⏰只剩定时任务4(最低)

快捷键

插件注册一个 ctx.shortcuts 命令 workspace-light.markUnread,把同一个「标为未读」动作暴露给键盘。

它不带默认键(defaults: {}),需要你在用户覆盖里自己绑 —— 例如 ⌘R:

// ~/Library/Application Support/@deepseek-ai/dsh-desktop/keybindings.json
{
  "schemaVersion": 2,
  "profiles": {
    "desktop:macos": {
      "workspace-light.markUnread": { "code": "KeyR", "modifiers": ["meta"] },
      "page.refresh":              { "code": "KeyR", "modifiers": ["alt", "meta"] }
    }
  }
}

为什么要把 page.refresh 一起写:宿主内置的「刷新当前页」默认就是 ⌘R。 显式覆盖虽然能压过默认("Explicit overrides displace defaults"),但那等于把刷新静默挤没; 顺手把它挪到 ⌥⌘R(宿主 Web 端本来就用这个组合)才不丢功能。

为什么不做成默认键:注册期 parseShortcutDefinitions 会逐 profile 检查默认键重叠 —— 同一 profile 下两条命令不能占同一个默认组合。page.refresh 已占 ⌘R 的默认, 本命令若也声明 ⌘R,会直接抛 Conflicting or reserved shortcut default 导致注册失败。 所以这里用 defaults: {},绑定只走用户覆盖。

目标会话如何确定:快捷键没有菜单上下文,故读宿主会话行的语义属性 —— [data-row-key^="session:"][aria-selected="true"](不是 CSS module 哈希类名,宿主升级不易失效)。 没有选中会话时返回 blocked(no session selected),不会误标。

改完键位需重启 DSH(桌面端没有文件监视器);也可在 设置 → 快捷键 面板里录制,两条路等价。

⚠️ 改名时注意:命令 id 是用户可见契约(keybindings.json 以它为键), green-light.markUnread → workspace-light.markUnread 这次改名就让绑定静默休眠了。 详见 INSTALL.md §7。

标签(tags)

会话可以用标签组织 —— 这是本插件第二个一等公民能力。

  • 侧栏「标签」面板:点侧栏的「标签」面板按钮进入。头部提供 [搜索][选项][添加]: 搜索按名字过滤;选项可切换排序(名称 / 使用次数 / 创建时间)或删除全部标签;+ 新建标签。 选中某个标签会列出它下面的会话,点会话即可跳转打开。
  • 打开会话:面板里的会话行单击或双击都能打开(宿主打开后会自动退出面板回到会话)。该行右侧还会以弱化小字显示它所属的工作区。
  • 面板里也有状态灯:标签行(含隐式中间节点,按子树聚合)、以及选中标签下的每个会话行, 都显示与侧栏一致的状态灯。状态变化实时刷新。
  • 重命名标签:在面板里双击标签名即可就地改名(回车确认 / Esc 取消)。改名为 a/b 这种带 / 的名字会直接建立层级;已贴到会话上的标签不受影响(关联按 id)。
  • 行内标签按钮:已经贴了标签的会话行,操作区会常显(不必悬停),按钮上带数量: 14min ⋯ [标签]2。没有标签的行仍保持宿主「仅悬停显示」的行为。
  • 视图选项按钮与宿主 Workspaces 的同款:斜杆图标 + 悬浮提示「视图选项」,样式沿用宿主的 iconButton(28px / --dsw-radius-sm / hover 高亮底色)。菜单内只有分组 / 排序 / 筛选三组。
  • 视图选项(与宿主 Workspaces 的 View options 对齐,选择会被记住): 分组 标签树(标签名以 / 分段自动成树,如 工作/紧急)/ 单列表; 排序 手动(可拖拽)/ 最近更新 / 按名称 / 按使用次数; 筛选会话 隐藏已归档 / 全部(显示已归档)/ 仅显示已归档。
  • 层级只是命名层级,不是继承:把 test/test1 贴到会话上不等于贴了 test。 面板里选中某个标签只列出显式贴上它的会话,右侧数字也是它自己的用量; 中间的隐式层级(没有对应标签记录)自然为空。状态灯仍按子树聚合(这是你此前要的"逐级穿透")。
  • 逐级穿透:树形下选中父标签时,会话列表包含全部子孙标签的会话;计数同理。
  • 会话行标签按钮:鼠标移到会话行,最右侧出现标签按钮(原生 pin / archive 按钮已隐藏, 这两个动作仍在「⋯」菜单里)。点开后:上半是已贴标签(每行右侧 ✕ 去掉该标签), 下半是添加标签,点三角展开已有标签供选择。

标签数据存在浏览器本地(localStorage),不跨设备同步、换浏览器会丢。

面板走的是宿主官方的「全局面板」机制(sidebar.panellist + main 键控条目), 因此内容渲染在主区域 —— 而不是塞进侧栏标题栏(那里没有插槽)。

安装

dsh plugin --profile <你的profile> add \
  https://github.com/luzonghao/dsh-workspace-light/releases/latest/download/dsh-workspace-light.tgz

新增 bundle 后需重启 DSH;此后改代码只需刷新页面。 其余装法(目录 / npm / git)、卸载、手工等价操作见 INSTALL.md。

自检与诊断

node test/logic.test.mjs     # 离线单测 70 例,不需要 DSH
__dshWorkspaceLight.panel()  # 在页面右下角显示诊断面板(可直接截图)

已知限制

  • 归属取自 React 侧 useWorkspaces / sessionStatus,因此折叠的工作区组也会计入汇总;
  • 标记存在浏览器本地(localStorage),不跨设备同步;
  • 宿主的“⋯ 菜单”插槽若变更,菜单项会静默消失(指示灯不受影响);
  • 会话行已有宿主自己的状态点时,本插件不再叠加未读绿点(避免两个点)。

文档

文件内容
INSTALL.md安装 / 卸载 / 验证 / 发布
index.md设计、决策与全部修订记录(含实现细节)
LICENSEMIT

免责

第三方插件,与 DeepSeek 官方无关。安装第三方 dsh 插件等于在本机以你的权限运行其代码 —— 请先读源码。