DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-tidy

J

dsh-tidy

Discovered

DSH plugin: drag workspaces or individual sessions you're not currently using into the sidebar's "Stash Area", and drag them back when needed. The stash area can be collapsed (Sidebar stash area for DeepSeek Harness)

Machine translated

dsh-tidy

给 DeepSeek Harness 侧边栏加一个收纳区:把暂时不用的工作区(连同它的所有会话)或单个会话拖进去,侧边栏立刻清爽;要用的时候再拖回来。

收纳区插在**「插件」面板行与「工作区」分区标题之间**——也就是你截图里圈出来的那个位置:

[品牌 / 新会话]
[🧩 插件]                 ← 全局面板行(ui-plugin-manager)
[⌄ 📥 收纳区 2 个  全部还原]  ← 本插件(⌄ 可折叠)
     💬 DSH 任务完成…       ← 单个会话被收纳(只藏这一行,工作区还在)
     📁 dsh-remind         ← 工作区被收纳(它名下所有会话一起消失)
[工作区  🔍 ⚙ ➕]         ← ui-workspace 分区标题
  📁 Autumn
  ...

空态只占一行(28px),不给自己制造新的占位负担;收纳了东西才展开成「标题 + 行列表」, 点标题前的 ⌄ 折叠可以把整个收纳区收成一行(折叠态跨刷新保留):

空态工作区 + 会话各收纳 1 项折叠态
空态收纳中折叠

(截图来自 node tools/browser-check.mjs --shot,是无头浏览器里的真实渲染。)

用法

操作做法
收纳工作区把工作区标题行(带文件夹图标)拖进收纳区 → 该工作区连同它名下所有会话一起从侧边栏消失
收纳单个会话把会话行拖进收纳区 → 只藏这一行,工作区与其它会话不受影响
折叠 / 展开收纳区点收纳区标题前的 ⌄;折叠态会记住,刷新后仍然折叠
还原点收纳行右侧的**「还原」,或把收纳行拖回下方「工作区」列表**
批量还原收纳区标题栏右侧的**「全部还原」**
清理失效项工作区已被删除时,收纳行显示「已不存在」,点「移除记录」只清掉收纳记录

补充说明:

  • 「新会话」只是占位行,不能被收纳(会提示)。
  • 某个会话被收纳、而它的工作区也被收纳时,该行会标注「随工作区」;还原工作区后, 这个会话仍然保持收纳(两条记录互不影响),点它自己的「还原」即可。
  • 收纳清单存在浏览器 localStorage(键 dsh-tidy.stash.v1,v1 只有工作区,读取时会自动迁移到 v2), 跨重启保留,不写宿主、不改工作区与会话本身——文件夹、会话记录、宿主端数据都不动,纯粹是侧边栏的显示收纳。

安装(本机已完成)

# 本机 desktop profile 已装好(link 方式,改代码即时生效)
dsh plugin --profile desktop add <本目录路径>     # 首次安装
dsh plugin --profile desktop remove dsh-tidy      # 卸载

装好后 DSH 宿主会热加载(dsh-client-modules 增量扫描 Loader 条目), 但**已经打开的窗口需要刷新一次页面(Ctrl+R)**才会拉取新的浏览器 bundle。

验证

node --test                    # 43 项单元测试:清单/迁移/隐藏选择器/条目解析/锚点算法/入口契约(无需浏览器)
node tools/verify.mjs          # 宿主端 5 项:启动图收录 + bundle 可取 + 与源码逐字一致 + /api 诊断路由
node tools/browser-check.mjs   # 真浏览器 31 项:位置 + 收纳/隐藏/还原 + 真实拖放 + 折叠持久化 + 会话收纳 + 收起轨道

browser-check.mjs 用临时 --user-data-dir,与你正在用的窗口完全隔离,不会动你的收纳清单; 没有 Chrome/Edge 时它会 SKIP。加 --shot[=前缀] 可以把侧边栏截图存下来(文档里的截图就是这么来的)。 三个脚本都用 ~/.dsh/.credentials.yaml 的 browser-session secret 现场铸签名 cookie(与浏览器同构), 不读取、不打印其它凭据。

排障时还可以在 DSH 窗口的 DevTools 控制台里用诊断面:

__dshTidy.state()        // 当前收纳清单与折叠态
__dshTidy.anchor()       // 解析到的插入点 { host, before, tree }
__dshTidy.mounted()      // 挂载容器是否在位、宽高、父元素
__dshTidy.probe(id)      // 这个 id 会被当成工作区还是会话(拖拽载荷是裸 id)
__dshTidy.stash(id, title, path)   // 手动收纳工作区
__dshTidy.stashSession(id, title)  // 手动收纳会话
__dshTidy.unstash(id); __dshTidy.unstashAll(); __dshTidy.setCollapsed(true)

架构

DSH 插件是「宿主端 + 浏览器端」双半结构,本插件零 npm 依赖、零构建:

文件角色
src/client.js浏览器端 bundle(window.__ModuleLoader__.load 手写格式):收纳区 UI、折叠、拖放、隐藏样式、锚点定位
src/index.js宿主端 Cordis 插件:让包成为 Loader 条目(客户端 bundle 的发现前提)+ /api/dsh-tidy.status 只读诊断路由
cordis.patch.yml安装时自激活宿主端入口
package.jsondsh.bundle.patch 自激活 + dsh.client 浏览器 bundle 声明
test/单元测试(把 bundle 在 Node 里用 ModuleLoader 桩加载后直接断言)
tools/验证脚本:verify.mjs(宿主)、browser-check.mjs(真浏览器,可 --shot 截图)

为什么是「headless 插槽 + DOM 挂载」

侧边栏外壳(@deepseek-ai/dsh-client-ui-sidebar)只声明了固定席位:sidebar.panellist / sidebar.workspaces / sidebar.settings / sidebar.footer.action……没有「面板行与工作区之间」 这个位置;而 sidebar.workspaces 是 single 且已被 ui-workspace 占用,renderSlot() 又按 「本条目声明的 children」授权(否则抛 SlotOwnershipError),所以替换包没法把 ui-workspace 的 浏览器渲染出来。

于是本插件:

  1. 往 shell.overlay(root 作用域的 list 席位)注册一个 headless 组件——拿到全局 useWorkspaces 钩子、t 与 React 生命周期,本身不产生任何可见 DOM;
  2. 用 React portal 把收纳区挂到侧边栏 DOM 的精确位置:从 [role="tree"](ui-workspace 的行容器) 逐级上溯到「工作区」分区标题所在容器,插到它之前;display:contents 的插槽出口会自动跳过 (否则量不到宽度);
  3. 隐藏用属性选择器 CSS:[role="tree"] > *:has([data-row-key="workspace:<id>"]) 整段收起 (分组容器内含该工作区所有会话行),会话行再按 [data-row-key="session:<id>"] 兜底; :has() 不可用的浏览器上自动退化为给分组容器打标记属性。

与 DSH 的耦合点(都有降级)

依赖变化时的表现
[data-row-key="workspace:<id>"] / session:<id>行标识改名 → 收纳区仍在,但收纳不生效;控制台给出 [dsh-tidy] 警告
工作区行 dragstart 的 text/plain 载荷载荷变化 → 改用 DOM 行文本兜底取名;仍取不到则提示「没认出这个工作区」
[role="tree"] 与分区标题的层级锚点解析失败 → 收纳区不出现,DSH 其余功能完全不受影响
shell.overlay 席位席位被移除 → 只告警,不抛错
localStorage 不可用(隐私模式)降级为「本次会话有效」

任何一处失败都只降级收纳区自己;插槽渲染器会把崩溃的条目隔离在 [data-slot-error],不会拖累外壳。

已知限制

  • 平铺视图(「按会话」分组)与搜索结果里没有工作区行:无法从那里把工作区拖入收纳,但收纳区里的项仍可还原; 收纳中的工作区,其会话行在平铺视图里也会被隐藏(单条会话收纳同样按 session:<id> 全局隐藏)。
  • 收纳的是「显示」而不是数据:工作区、文件夹、会话记录都原样保留,只是侧边栏不显示; 被收纳的会话仍能通过搜索、URL、其它入口打开。
  • 正在使用的工作区或会话也能被收纳:会话本身不会关闭,想找回来点「还原」即可。
  • 收纳清单在浏览器 localStorage:换浏览器/清站点数据会丢清单(工作区与会话本身不受影响)。

本机开发备注

  • .ref/ 是本机 DSH 内置包源码摘录与截图(仅本地参考,已 gitignore,不随包发布); 重新摘录用 dsh-remind 里的 tools/asar.mjs。
  • 改了 src/client.js 后:宿主会重新计算 bundle 版本(按文件 mtime/size),页面刷新即生效; 宿主端 src/index.js 改动需要重启 DSH(或插件页重载)。

Comments

Loading…

Similar plugins

dsh-ask-assistant

by ytftu

DSH(DeepSeek Harness)插件:侧边栏底部动作区加「问助理」按钮,一键用内置浏览器打开 DeepSeek 网页版,随手问事不消耗会话 token。

Manifest valid

★ 0

MIT

JavaScript

Oct 18, 2026

dsh plugin --profile web add dsh-ask-assistant

by g1998815

DSH(DeepSeek Harness) 右侧原生工具侧边栏插件:文件系统浏览器 / Git 变更与 diff / 会话变更 采用·撤回 / PTY 控制台。Windows 直连 node-pty,跟随 DSH 主题,RPC fail-closed。

Manifest valid

★ 3

JavaScript

Aug 16, 2026

dsh plugin --profile web add dsh-workspace-tools

by wuyh

DSH (DeepSeek Harness) Web 工作区工具箱插件:文件浏览、Docker 与 Vite 项目管控、SSH/容器终端。

Manifest valid

★ 0

MIT

TypeScript

Aug 19, 2026

dsh plugin --profile web add dsh-workspace-toolbox

by xthreehao

DSH(DeepSeek Harness)隐藏会话插件:把会话从侧边栏隐藏、可随时恢复。免构建零依赖,契约取自运行中的 0.2.0-rc.2。

Manifest valid

★ 0

MIT

JavaScript

Oct 2, 2026

dsh plugin --profile web add dsh-hidden-session

by 439436269-ctrl

DSH 插件:侧栏内联的「置顶」会话分组(原生度量 + 就地搜索)。A pinned-session group in the DeepSeek Harness sidebar.

UI & ExperienceTerminal & ClientsSessions & MessagesManifest valid

★ 0

MIT

JavaScript

Oct 7, 2026

dsh plugin --profile web add @vfvrpq/dsh-pinned-sessions

by liuyun847

DSH Web 客户端插件:侧边栏收起时在左侧空白区竖排显示活跃会话横条 (DeepSeek Harness)

Manifest valid

★ 0

JavaScript

Oct 5, 2026

dsh plugin --profile web add dsh-client-ui-session-rail