🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

默认工作区固定 TCOTC/dsh-plugin-default-workspace

DeepSeek Harness
TCOTC22 天前有提交已提供中文文档扫描:未发现敏感能力

一个小巧的 DSH 插件,把新会话在无上下文时的兜底工作区固定到一个文件夹,文件夹在设置对话框里选。

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/13 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add TCOTC/dsh-plugin-default-workspace
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · browser
装得上吗
实装验证未通过(runtime_never_loaded),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 22 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(runtime_never_loaded · 2026/11/2) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-plugin-default-workspace(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 13:14:07

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 固定无上下文兜底工作区
  • 设置对话框选择文件夹

DSH 插件:把新会话的无上下文兜底工作区固定到一个文件夹(浏览器侧 uiWorkspace 策略,不含宿主代码)。

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-default-workspace 一个小巧的 DSH 插件,把新会话在无上下文时的兜底工作区固定到一个文件夹,文件夹在设置对话框里选。 为什么需要它 DSH 从上下文决定新会话的工作区,从不看配置: | 情况 | DSH 原生行为 | 装上本插件后 | | 某个文件夹里开着一段有对话的会话 | 新会话留在那个文件夹 | 不变 | | 应用打开时恢复的是有对话的已保存会话 | 恢复那个会话 | 不变 | | 传入了明确目标(工作区行上的 +、add workspace) | 用那个目标 | 不变 | | 没有任何依据:没有已保存的选择、已保存的会话已不存在,或已保存/当前的空的新会话(从未发送过内容) | 最近活跃的工作区 | 设置里选中的文件夹 | | 你正在查看的会话已归档 | 清空主选择,应用退回选择工作区引导页 | 在该会话自己的工作区里新建会话;它没有工作区时,用选中的文件夹 | 空的新会话不算「已经在别的文件夹里对话」:DSH 在会话第一轮开始前一直把它标记为 blank(SessionSummary.blank),上表倒数第二行就是靠这个标记判断的。点击工作区行再输入,对话仍然在那个文件夹里开始;只有文件夹里有了对话,它才会接管。
展开完整文档(README 剩余 1 节)
dsh-plugin-default-workspace

一个小巧的 DSH 插件,把新会话在无上下文时的兜底工作区固定到一个文件夹,文件夹在设置对话框里选。

为什么需要它

DSH 从上下文决定新会话的工作区,从不看配置:

| 情况 | DSH 原生行为 | 装上本插件后 |
| 某个文件夹里开着一段有对话的会话 | 新会话留在那个文件夹 | 不变 |
| 应用打开时恢复的是有对话的已保存会话 | 恢复那个会话 | 不变 |
| 传入了明确目标(工作区行上的 +、add workspace) | 用那个目标 | 不变 |
| 没有任何依据:没有已保存的选择、已保存的会话已不存在,或已保存/当前的空的新会话(从未发送过内容) | 最近活跃的工作区 | 设置里选中的文件夹 |
| 你正在查看的会话已归档 | 清空主选择,应用退回选择工作区引导页 | 在该会话自己的工作区里新建会话;它没有工作区时,用选中的文件夹 |

空的新会话不算「已经在别的文件夹里对话」:DSH 在会话第一轮开始前一直把它标记为 blank(SessionSummary.blank),上表倒数第二行就是靠这个标记判断的。点击工作区行再输入,对话仍然在那个文件夹里开始;只有文件夹里有了对话,它才会接管。

归档是唯一一种回来的文件夹不是所选文件夹的情况:对话没了,项目还在,所以在 D:\CodeProjects\Moltenfrost 里归档一个会话,你会留在 Moltenfrost,带着一个全新的新会话。不属于任何工作区的会话没有自己的文件夹可留,于是回退到所选文件夹——和上一行同一条规则。只有清空主会话才会这样处理;归档其他行不触发任何跳转,和以前完全一样。

Host 没有为这件事提供任何设置。DSH 里唯一的「默认工作区」概念(workspaceRegistry.initializeDefault、<Documents>\deepseek-harness\default-workspace)只在全新安装时创建一次,而且要求工作区注册表和会话历史都为空,所以在已经有会话的安装上没法改指别处。

选择文件夹

设置里带一页来自本插件的页面,Default folder,作为独立的导航标签(settings.section,顺序 30——排在自带分区之后):

- 选择器按路径列出所有已注册的工作区,外加 Follow DSH,它关掉插件,恢复原生的「最近活跃工作区」规则;
- Choose another folder… 打开工作区 UI 用的同一个文件夹选择器——外壳暴露时用 Desktop 预加载对话框,否则通过 uiWorkspace.pickDirectory() 走 Host 选择器。工作区注册表还不认识的文件夹会先注册,和
添加工作区…(uiWorkspace.workspaces.create({ path })),这样选中的文件夹立刻就能用;
- 选择结果存在页面的 localStorage 里,键名是 dsh.default-workspace.settings,每次路由决策都会读取,所以下一次新建会话就会生效,不用刷新,也不用重新应用。

什么都没存时,编译进去的 DEFAULT_WORKSPACE_PATH 依然生效,所以从不打开这个页面的安装,行为跟以前完全一样。存了文件夹但没注册,则不起作用,仍然走原有规则——这个插件从不凭空造出工作区。

偏好存在浏览器里,不在 Host 用户设置文档里:这个插件装下的策略是浏览器侧的,而 Host 支持的字段会让 host 那一半依赖框架的 schema 包,从裸 file:///… 路径挂载的插件解析不了它。见下面的 为什么用 localStorage。

文件

| 路径 | 作用 |
| package.json | 包清单:host 那一半,加上 dsh.client 声明和 exports["./client"],供 Client 模块系统扫描 |
| lib/index.js | Host 那一半——故意留空;策略和它的设置页面都在浏览器侧 |
| lib/client.js | 浏览器那一半——包装 uiWorkspace.startSession、uiWorkspace.restoreSelection 和 uiWorkspace.clearMain,并提供 Default folder 设置页面 |
| test/interception.test.mjs | 维护检查:拿真实浏览器 bundle 跑一个假的 uiWorkspace,断言上面每条规则,包括设置页面 |
| test/host-integration.test.mjs | 维护检查:问正在运行的 Host,它是否组装并提供了这个插件的浏览器那一半 |
| test/probe-report.mjs | 读取浏览器那一半写进页面 localStorage 的决策轨迹 |
| CHANGELOG.md | 发布说明 |
| LICENSE | MIT |

浏览器那一半包装了 uiWorkspace 服务实例上的三个导航入口。两个导航包装器,凡是不归它们管的场景,都交给原有方法处理;第三个包装结束归档的那次清除。每个包装器都把自己的失败吞回原有流程,所以最坏情况就是原有行为。

为什么用 localStorage

Host 设置文档编辑的字段,由插件在导出的 Config schema 里用 .volatile() 声明,而 schema 来自 @deepseek-ai/schemastery。以 file:///… Loader 行挂载的插件,按自己所在目录解析导入,所以不在插件旁边放一个 node_modules,就够不到那个裸标识符。因此偏好放在浏览器本地,策略本来也在那里。代价是它按浏览器源隔离,Host 配置文件看不到;好处是插件完全没有依赖。

这个插件吃了亏才学会的四条约束

每一条都是对着真实应用学到的,不是从文档里读来的;把它们钉死的是 test/probe-report.mjs 输出的轨迹。
1. 不要声明 inject。 写成 inject: ["uiWorkspace"] 后,插件根本没生效——没有报错,控制台也没有输出,只是页面上那条策略不存在。入口应用时,服务还不存在(trace 显示 apply → waiting → 247 ms 后才 installed),所以浏览器端改为每 50 ms 轮询一次 ctx.get("uiWorkspace"),而不是等待。

2. 绝不要通过上下文代理读取其他插件的服务。 内置 bootstrap 用 this.ctx.layout.beginNavigation() 构造它的取代信号;从这里调用会抛出 cannot get property "layout" without inject——这导致主路径回退到内置流程。现在改为对照 mainReference 检查取代,并且 test/interception.test.mjs 跑在一个 ctx 完全没有 layout 的服务上,所以这个问题不会再悄悄回归。

3. 由 blank 决定,而不是「存在」。 一个已保存的会话仍然存在,但从未收到过一轮对话,它就是空的 New Session,不能锁定它的文件夹。DSH 的 SessionSummary.blank 正好携带这个事实。

4. 启动监听器是一次性的,归档也不是导航入口点。 uiWorkspace.watchNavigation 只在启动时恢复一次选择;之后它只监听一件事——主会话变成已归档——而它的反应是 clearMain(),这会丢掉主引用和持久化的选择,并让内置 hero 留在原地。因此,包装 startSession 和 restoreSelection 完全漏掉了归档,页面归档自己的主会话后会停在「choose a Workspace」,直到用户手动导航。trace 证明了这一点:让应用恢复的那两个 startSession 决策相隔 20 秒,中间什么都没记录。clearMain 是每条归档路径都必经的唯一卡点——行操作、快捷键、停止并归档对话框、其他插件,以及监听器自己的 clearArchivedCurrent——所以要包装的是它,并且它在委托之前先读取会话的 Workspace,因为正是这次清除抹掉了标识它的身份。

挂载

插件由配置档用户补丁层中的一处补丁挂载,路径是 %USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml。补丁方言(@deepseek-ai/cordis-plugin-include)以 id 为目标,所以添加新的顶层行意味着要用一个没有 id、带 insert 列表的补丁——光写 - id: <new id> 的补丁匹配不到任何东西,会被跳过并给出警告:

- insert:
- id: default-workspace
name: file:///C:/Users/<you>/.dsh/plugins/dsh-plugin-default-workspace/lib/index.js

绝对的 file: 名称让插件留在配置档由 pnpm 管理的 node_modules 之外,所以安装或更新其他插件不会把它剪掉(加载器自己的 anchorInsertedPluginNames 才是把 ./… 名称变成补丁文件的相对文件 URL,所以绝对路径也可以)。

编辑这个插件时重新加载规则:

- 编辑 cordis.patch.yml 会热重载:配置档 HMR 监听器通过 reconcileProfilePatches 重新应用补丁层,实时挂载或卸载这个条目。不需要重启。
- 编辑 lib/client.js 会立即进入运行中 Host 的 Client 模块图:新的 bundle 修订版会被组合并提供(由 test/host-integration.test.mjs 证明,它从文件自身的元数据推导修订版)。但页面不会自己重新拉取它——Electron HTTP 缓存在启动后没有显示新的 bundle 拉取——所以页面重载或应用重启才会加载新的那一半,以及随之而来的 Settings 页面。
- 每当包装的策略变化时都要提升 POLICY_VERSION,否则已经安装了旧包装器的页面会把新的那一半当作无操作。

验证

$node = "$env:USERPROFILE\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\node\bin\node.exe"
$plugin = "$env:USERPROFILE\.dsh\plugins\dsh-plugin-default-workspace"

the interception rules, against a fake uiWorkspace service
& $node "$plugin\test\interception.test.mjs"

the live Host actually composed and serves the browser half
& $node "$plugin\test\host-integration.test.mjs"

what the page actually did: policy versions installed, branch per decision
& $node "$plugin\test\probe-report.mjs"

在 GUI 中:

- 打开 Settings:导航中必须出现 Default folder 标签页,位于随附的各个分区之后。选择一个 Workspace,或者 Choose another folder… 并选择一个目录;页面必须立即显示新文件夹。
- 在另一个文件夹中有一个空的 New Session 是最后打开的东西时,退出并重新打开应用——应用必须启动到所选文件夹中的 New Session。
- 在另一个文件夹中有一个对话是最后打开的东西时,退出并重新打开——那个对话必须回来,仍然在它自己的文件夹中。
- 在另一个文件夹中打开一个对话时,按 New Session(Ctrl+N)——它必须留在那个文件夹中。在另一个文件夹中打开一个空的 New Session 时,Ctrl+N 必须转到所选文件夹;工作区行自己的 + 始终以该行的文件夹为目标。
- 在页面上选择 Follow DSH 并重复上一个检查:新 Session 必须改为留在最近活跃的 Workspace 中。
- 在不是所选文件夹的文件夹中打开一个 Session 并归档它(该行的归档按钮,或者它的 … 菜单 → Archive session)——应用必须直接回到同一个文件夹并带有一个全新的 New Session,绝不回到选择 Workspace 的主页,并且 probe-report.mjs 必须显示一个 clearMain 决策,带有 "branch":"keep"。改为从 Ungrouped 归档一个 Session:那个必须落在所选文件夹中("branch":"default")。选择 Follow DSH 时,归档你正在查看的 Session 必须把你降到 stock hero —— 拦截已经关闭,策略的其余部分也一样。

禁用或移除

- 禁用:从 cordis.patch.yml 里删掉 - insert: 补丁(HMR 监听器会实时卸载该条目;否则重启)。
- 彻底移除:删除 %USERPROFILE%\.dsh\plugins\dsh-plugin-default-workspace。
- 清除已保存的偏好:从应用的 localStorage 里清掉 dsh.default-workspace.settings 键(页面上 Follow DSH 的选择也存在那里)。
- 添加本插件之前的配置档补丁不属于这个包;想留一份就自己保存 cordis.patch.yml。

DSH 更新后的维护

浏览器那一半依赖原生 uiWorkspace 服务的私有成员(workspaces.list、workspaces.create、pickDirectory、sessions、selection、mainReference、lifetime、connectWorkspace、openWorkspace、replaceMain、clearMain),依赖 Session 摘要的 blank 标志,设置页面还依赖 settings.section 槽位类型以及 slots/locale 服务。DSH 更新可能给它们改名;那时包装层会失败关闭,退回原生行为(渲染进程里出现一条控制台警告,trace 记录 interception-failed),页面要么消失,要么报 settings-page-failed。更新后重新跑一遍上面的检查:失败信息会指出是哪条规则坏了。

lib/client.js 里的 DEFAULT_WORKSPACE_PATH 和 DEFAULT_WORKSPACE_ID 现在只是初始默认值,在什么都没存的时候使用;实际生效的值是已保存的偏好。策略一有改动就提升 POLICY_VERSION,这样已安装的页面会替换包装层,而不是继续保留它。

License

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓TCOTC/dsh-plugin-default-workspace
分享 · DeepSeek Harness Hub
TCOTC/dsh-plugin-default-workspace

一个小巧的 DSH 插件,把新会话在无上下文时的兜底工作区固定到一个文件夹,文件夹在设置对话框里选。

这是你的仓库?认领条目

回到顶部