Перейти к основному содержимому
C

dsh-workspace-vault

coldrainlab/dsh-workspace-vault

Pin workspaces and tasks in the sidebar, with a password-protected hidden space and a workspace access lock. The lock only hides items in the interface and does not encrypt session files on disk; dsh-workspace-sync skips hidden and locked items.

Установка

dsh plugin --profile web add github:coldrainlab/dsh-workspace-vault

README

dsh-workspace-vault(工作区置顶 + 任务置顶 + 隐藏空间 + 工作区加密)

给 DSH 桌面端侧栏「工作区」加四个能力:任意工作区置顶、把当前任务置顶到它所在的工作区、 密码隐藏空间(侧栏「工作区」右侧独立图标,隐藏空间的工作区不参与云同步)、 工作区加密(访问锁)(与隐藏空间共用同一个主密码)。

功能

#功能行为
1工作区置顶工作区行悬停 「…」菜单 →「置顶工作区 / 取消置顶」(新工作区同样可用);置顶后该工作区移到「工作区」列表最前,整行高亮(Endfield 下 3px 黄左条 + 淡黄渐变 + 标题提亮,普通主题用 dsw token)并带常显推钉图标徽标。顺序由宿主 workspaceRegistry 持久化,重启/刷新后仍生效;客户端发现列表顺序与 pinned 前缀不一致时会调宿主 pin-workspace {reapply:true} 自愈。
2任务置顶会话页头(标题右侧)新增「置顶此任务」按钮:把当前任务置顶到它所属工作区顶部。复用 DSH 原生 pinSession,原生侧栏会显示「已置顶」指示器;原生 … 菜单里的置顶/取消置顶仍然可用。
3隐藏空间「工作区」区头 label 与搜索图标之间一个独立盾牌图标(不占用原生 headerActions 的 60px 宽度,因此原生「+」始终可见)。首次使用需设置主密码(可绑定手机号用于找回);解锁后侧栏只显示隐藏空间里的工作区,行为与普通工作区完全一致(原生展开、会话、新建任务、重命名、删除);此时点区头「+」会走「新建隐藏工作区」而不是普通工作区。隐藏空间的工作区不参与云同步,数据只保留在本机。
4工作区加密工作区行悬停 「…」菜单 →「加密工作区」:输入主密码后把工作区标记为加密;加密工作区在本次页面打开期间保持锁定,其会话行不显示、行点击会要求解锁;主内容区若正打开该工作区的会话,会被锁定遮罩盖住,解锁后才显示。刷新/重启后自动重新上锁。
5(配套)云同步排除dsh-workspace-sync 自动跳过隐藏空间与加密工作区的工作区条目、会话日志;它们不会上传到云端,也不会从云端拉回。

安装

本插件是本地 bundle(宿主 + 浏览器两半),用 DSH 的插件管理器安装:

# 在 DSH 里让 Agent 执行(安装到当前 desktop profile),或使用 CLI:
& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add "C:\Users\ROG-STRIX\Documents\deepseek-harness\DSH新增功能\dsh-workspace-vault"

安装后刷新页面一次(宿主侧路由/新 bundle 只在启动或 HMR 激活时加载)。刷新方式:标题栏「重新启动」 或 F12 → DevTools(本版是独立 Developer Tools 窗口)→ 在该窗口按 Ctrl+R 重载页面(不丢会话,不影响宿主)。

  • 只改浏览器半边(lib/client.js):刷新页面即可生效。
  • 改了宿主半边(lib/index.js / 依赖模块):页面刷新不会重载宿主;用 plugin_manager set_bundle 先把 dsh-workspace-vault 禁用再启用(无需重启整个 DSH),或在合适时机 「重新启动」DSH。

数据与文件

项位置
插件状态(密码哈希/手机号哈希/三个 id 集合)<DSH_HOME>/workspace-vault/state.json(默认 ~/.dsh/workspace-vault/state.json)
隐藏空间工作区根目录<DSH_HOME>/hidden-space/<工作区名>
隐藏模式/解锁状态只在当前页面内存里;刷新即上锁
  • 密码用 scrypt(随机盐)哈希后保存,不保存明文;手机号只保存 sha256(数字) 与掩码。
  • 解锁令牌只存在宿主内存(30 分钟)与页面内存,不写 localStorage。
  • 删除 state.json 会清空密码与所有标记(隐藏工作区会重新出现在普通列表里,数据本身不删除)。

找回密码

设置密码时可以选择绑定手机号(仅本地保存哈希与掩码,用于校验)。忘记密码时在解锁框点 「忘记密码」→ 输入绑定手机号 → 校验通过后设置新密码。

注意:这是本地校验,不会发送短信。 DSH 没有短信/邮件通道,无法做真正的验证码找回; 它只是防止「不知道绑定号码的人重置密码」。如果设置密码时没有绑定手机号,忘记密码只能删除 state.json(会同时丢失隐藏/加密标记,但不会删工作区与会话)。

安全边界(必读)

  • 这里的「加密」是访问锁,不是磁盘静态加密:会话日志仍是 DSH 原生明文格式,任何能读你用户目录的 程序都能读到。它解决的是「界面上被看到」与「被同步到云端」。
  • 隐藏空间不是安全边界:它隐藏侧栏入口与会话行,不等于把数据从磁盘藏起来。
  • 隐藏空间/加密工作区不参与云同步,但工作区目录本身里的普通文件(例如你放在网盘同步目录里的代码) 不受本插件管理。

与现有插件的兼容

  • 不改写 DSH 原生工作区组件,不占用 sidebar.workspaces 单槽;用 shell.overlay(对话框)、 conversation.session.header.actions(任务置顶按钮)与侧栏 DOM 装饰实现。
  • 与 dsh-workspace-plus(自定义工作区创建、移动会话)、dsh-session-delete、dsh-endfield-theme 同时安装无冲突;Endfield 主题下对话框主按钮沿用黄底黑字。
  • 侧栏选择器依赖 DSH 0.2.1-rc.5 的 data-row-key 与 class 片段;升级 DSH 后请重跑 check-dsh-features.ps1(本项会比对关键选择器是否还能在原生客户端源码中找到)。

卸载

& "D:\Program Files\Deepseek Harness\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop remove dsh-workspace-vault

卸载不会删除 state.json 与隐藏空间目录;要彻底恢复,手动删除 <DSH_HOME>/workspace-vault/ 即可 (隐藏空间里的工作区会回到普通列表。若想连工作区一起移除,需在 DSH 里逐个删除工作区)。

测试

$node = "C:\Users\ROG-STRIX\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
& $node dsh-workspace-vault\tests\host.test.mjs
& $node dsh-workspace-vault\tests\client.test.mjs

验证记录(2026-10-30,DSH 0.2.1-rc.5)

在真实桌面端(http://127.0.0.1:42612)完成以下 E2E,截图在 _verify/shots/vault-*.png 与 _audit/shots/vault-*.png:

项结果
区头盾牌图标(「工作区」右侧)出现,位置/样式与原生图标行一致
工作区行悬停按钮仅「…」菜单 / 新建会话;图钉、锁、隐藏空间状态以徽标显示;点「…」→「置顶工作区」后移到列表最前并 整行高亮,再点「取消置顶」恢复
置顶图标工作区徽标、菜单项、会话页头「置顶当前任务」统一为推钉(pushpin)SVG;置顶态实心、未置顶描边,跟随主题色
工作区「…」菜单点原生「…」弹出我们整合后的菜单:置顶/取消置顶、加密工作区/取消加密、移入/移出隐藏空间、重命名、删除工作区;重命名/删除行为与原生一致(删除保留文件夹与会话记录,会话归「未分组」)
任务置顶按钮页头「★ 置顶当前任务」→ 原生侧栏出现已置顶指示、按钮变「★ 取消置顶」;再点恢复
设置主密码对话框(新密码/确认/手机号)提交后进入隐藏模式,state.json 出现 scrypt 哈希(无明文)
隐藏空间解锁后普通工作区全部隐藏、只剩隐藏工作区;「新建隐藏工作区」在 ~/.dsh/hidden-space/<name> 建目录并在侧栏出现;退出后普通列表恢复
忘记密码(手机号找回)错手机号被拒;正确手机号 + 新密码重置成功,旧密码此后被拒,新密码解锁获得 token
工作区加密「…」菜单 →「加密工作区」→ 主密码确认 → 工作区打上加密徽标;该工作区会话行隐藏、行点击被解锁框拦截(主内容遮罩按当前会话生效)
云同步排除dsh-workspace-sync 单测 13 项 + 全量 84 项通过;vault client 20/20、host 21/21(隐藏 id / 加密 id / hidden-space 路径 / 拉取不写回)
自检脚本check-dsh-features.ps1 → PASS 27 / WARN 2 / MISSING 0(新增 A 插件行、B7 用量补丁一致性、E5 vault 路由)

验证后已清理测试数据:删除 <DSH_HOME>/workspace-vault/state.json、<DSH_HOME>/hidden-space/、测试工作区 vault-test,并把工作区顺序恢复原样;页面已重载,当前处于「首次使用」状态(点盾牌即提示设置密码)。

刷新方式(本生产版):F12 打开独立 DevTools 窗口 → 在 DevTools 窗口 Ctrl+R 重载页面;宿主与本次会话不受影响。

版本记录

0.1.0

  • 工作区置顶(持久化宿主顺序 + 行内按钮 + 徽标;取消置顶回到非置顶区最前)。
  • 任务置顶按钮(页头,复用原生 pinSession / unpinSession)。
  • 隐藏空间:主密码(scrypt)、手机号绑定/本地找回、隐藏模式侧栏过滤、隐藏工作区创建、 隐藏工作区/会话不参与云同步(dsh-workspace-sync 配合改造)。
  • 工作区加密(访问锁):与隐藏空间共用主密码;锁定期间隐藏会话行、拦截工作区行点击、主内容区遮罩。
  • 所有锁定状态只存在内存,刷新即重新上锁。

0.1.0 后续修订(2026-10-30,用户反馈)

  • 修复「+」新增工作区被挤出区头:盾牌图标从原生 headerActions(max-width 60px)移到 label 与搜索之间, 原生「+」与视图选项恢复;隐藏空间模式下「+」改为打开「新建隐藏工作区」。
  • 置顶真正生效并高亮:整行黄左条 + 淡黄底 + 标题提亮;新工作区行同样注入图钉/菜单按钮; 客户端在列表顺序与 pinned 前缀不一致时调用 pin-workspace {reapply:true} 自愈(宿主同路由支持)。
  • 工作区行内「加密」「移入隐藏空间」不再作为独立悬停按钮,统一收进原生「…」位置弹出的整合菜单: 置顶/取消置顶、加密/取消加密、移入/移出隐藏空间、重命名、删除工作区;重命名/删除用自有对话框补回, 删除仍保留文件夹与会话记录(会话归「未分组」)。
  • 验证:真实页面确认区头 4 图标、+创建对话框、置顶高亮、整合菜单;client tests 20/20、host 21/21。
  • 追加:置顶也并入「…」菜单(移除行内独立图钉按钮,保留徽标);置顶图标优化为推钉 SVG(工作区徽标 / 菜单项 / 页头「置顶当前任务」统一),置顶态实心、未置顶描边;client tests 仍 20/20。

0.1.0 修复(2026-10-30,取消置顶后偶发自动置顶)

  • 原因:取消置顶的 pin-workspace 请求与装饰器发出的 pin-workspace {reapply:true} 可能并发;旧 reapply 响应晚到,会把取消前的 pinnedWorkspaceIds 写回客户端,表现为过一会儿又置顶。
  • 修复:客户端加 pin 动作版本号;只有最新一次显式 pin/unpin 的响应能改 state.pinnedIds;reapply 在 pin 请求进行中或完成 5 秒内不发送,且其响应若期间发生过 pin 动作则丢弃;loadState 的旧投影也不覆盖刚完成的 pin 变化。
  • 回归:新增「stale reapply response cannot undo a completed unpin」测试;client tests 21/21,host 21/21。

Похожие плагины