DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Workspace Create Dialog — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
W

dsh-workspace-create-dialog

Workspace Create Dialog

DSH 创建工作区对话框:上面填名称,下面选文件夹;只填名称就在「新建位置」下建出同名文件夹,选文件夹则弹出自己调的原生 IFileDialog 并延续上次所在的目录。 · A Codex-style Create Workspace dialog for DeepSeek Harness: name it and go, or pick a folder with a chooser that remembers where you were.

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:LanFeng97/dsh-workspace-create-dialog#7c4d0ef91a0ad9d49efa71ec5a637a53e6d87b2f
README兼容性版本

兼容性与来源证明

Workspace Create Dialog 以 dsh-workspace-create-dialog 发布,当前版本为 0.1.3。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/13

版本

0.1.3stable
2026/10/13
0.1.2stable
2026/10/12
0.1.1stable
2026/10/12

相关插件

正在加载相关插件…

最新版
0.1.3
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/10/13
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 developer-tools 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Sdk App@deepseek-ai/dsh-sdk-appdsh SDK 配置包:基于 dsh-base 提供 stdio JSON-RPC 服务和进程生命周期管理Experimental Inspector@deepseek-ai/dsh-experimental-inspector用于 Host 调试和 Client Runtime 检查的实验性跨 realm CDP hubExperimental Inspector Profile@deepseek-ai/dsh-experimental-inspector-profile用于原始 Session 日志和 Chat 节点检查的可选 Web 捆绑包

README

dsh-workspace-create-dialog

English | 中文

A Create Workspace dialog for DeepSeek Harness: type a name and go, or pick a folder with a chooser that finally remembers where you were.

The Create Workspace dialog: a name field, a workspace folder row with a Choose folder button, and a New workspace location row with a Change button

What it does

Clicking Add workspace… in DSH today opens the OS folder dialog immediately. This plugin replaces that with a small dialog that asks two independent questions: what is the workspace called, and where does it live. Answer the first only and it creates the folder for you; answer the second and the folder you picked is the workspace.

You doYou get
Type a name, press CreateA new folder with that name is created under New workspace location, registered as a workspace, and a session opens in it
Click Choose folder…The native Windows folder dialog, starting where you left off, not at some default
Choose a folder, leave the name emptyThe name fills itself in from the folder's own name
Choose a folder, having typed a nameYour name wins — the workspace is registered, then renamed to it
Click Change… on New workspace locationPick where name-only workspaces go from now on; the choice is saved and survives restarts
Cancel / Esc / click the backdropNothing happens — no folder, no registration

The effect, before and after

BeforeAfter
Creating my-projectCreate the folder in Explorer first, then hunt for it in the pickerType my-project. Done
The folder picker's starting pointThe OS default, every single timeThe directory you last chose
Where new workspaces landWherever you navigate toA location you set once, visible in the dialog, changeable any time
Naming a workspace after its folderRetype the folder nameAuto-filled

Install

From the DSH UI (simplest)

Sidebar → Plugins → Add plugin, paste this address, click Install, then Enable now:

https://github.com/LanFeng97/dsh-workspace-create-dialog

That box takes a package name, a Git address, a tarball or a local absolute path. A repository URL works because this package ships a dsh.bundle patch — DSH checks exactly that before it installs. Restart DeepSeek Harness if the plugin does not come up.

Two things worth knowing: it downloads straight from GitHub, so GitHub has to be reachable (the China-mirror option only covers registry packages, not repository downloads); and DSH does not auto-update third-party plugins yet — upgrading means uninstall + install again.

Already installed with tools/install.mjs below? Run node tools/install.mjs --uninstall first, so the profile does not end up with two loader rows for the same id.

One-line prompt for your agent

If you would rather not click through it:

Install the DSH plugin at https://github.com/LanFeng97/dsh-workspace-create-dialog into my DSH and tell me when to restart.

From the plugin market (once listed)

Search for dsh-workspace-create-dialog in dshmarket and install it in one click. The listing is pending a PR to awesome-dsh-plugin (their CI requires the repository to be at least one day old); until it lands, use the routes above and below.

Manual install from this repository

git clone https://github.com/LanFeng97/dsh-workspace-create-dialog
cd dsh-workspace-create-dialog
node tools/install.mjs

That copies the package into your DSH profile's node_modules and appends one loader line to the profile's cordis.patch.yml. It resolves your DSH home the same way the harness does — explicit config, then $DSH_HOME, then ~/.dsh.

Then restart DeepSeek Harness (the host half is a Node module, so a config reload alone will not import it). After that, changing lib/client.js only needs a page refresh; changing lib/index.js still needs a restart.

node tools/install.mjs --dry-run prints what it would do without writing anything; --uninstall removes the package and its loader row again.

Publishing to npm is not required: the market installs from GitHub exactly the same way, and listing is unaffected either way.

How it works

It uses the official extension point, not a patch

@deepseek-ai/dsh-client-ui-workspace declares a single slot where the "pick a directory" step is handed to whichever plugin fills it:

sidebar.workspaces.directoryFlow              ← the sidebar's "Add workspace…"
conversation.hero.workspace.directoryFlow     ← the empty-state entry

The owner hands the occupant the whole interaction contract:

interface DirectoryFlowOwnerProps {
  open: boolean                     // a pick is requested
  busy: boolean                     // the owner is adopting the picked path
  onPicked: (path: string) => void  // report the directory; the owner registers it and opens a session
  onCancel: () => void
  onError: (message: string) => void
}

This plugin registers its own occupant into both slots at priority -100. A single slot renders the lowest-priority entry, the shipped native driver sits at 0, so this dialog wins (two entries at the same priority throw, which is the official protection against ambiguity). Removing the loader line from your profile patch restores the stock behaviour exactly.

Why the folder dialog is built here instead of reused

The desktop app opens its folder dialog from the Electron main process without a starting directory:

// D:\App\DSH\resources\app.asar → lib/main.js
dialog.showOpenDialog(window, { properties: ['openDirectory', 'createDirectory'] })

There is no defaultPath, which is exactly why the chooser always starts in the same place. A plugin cannot reach that call: the DSH host is a child process of Electron. So lib/pick-folder.js opens its own IFileDialog — a small C# COM interop compiled and run by the Windows PowerShell 5.1 that ships with Windows:

  • no dependencies: no koffi, no PowerShell 7, no native module to publish;
  • compilation happens in memory (~120 ms per call), so there is no DLL cache to corrupt or lock;
  • the one line that matters is IFileDialog::SetFolder — the remembered directory as the starting point;
  • the dialog runs in a child process, so a native fault cannot take the host down.

The C# method declaration order must match the COM vtable (Show=3, SetOptions=9, SetFolder=12, SetTitle=17, GetResult=20). Getting it wrong does not error — it just silently does the wrong thing — so a self-test asserts the order.

Where name-only workspaces are created

The New workspace location is resolved in this order (lib/base-dir.js, a pure function):

  1. What you set in the dialog — highest priority; once you change it, it is yours;
  2. config.baseDir from your profile patch — the value used at install time;
  3. The root of your default workspace — the parent of the workspace whose directory is named default-workspace (a name the harness fixes, independent of UI language). New workspaces land next to it. This is the default for a fresh install;
  4. Fallback — <Documents>/deepseek-harness, or <home>/deepseek-harness when there is no Documents folder.

The resolved value is written to the state file, so "what it was on first run" is decided once and only you change it afterwards. config.baseDir is a seed, not an order.

HTTP routes

All four are loopback-guarded (loopback socket + loopback Host + same-origin marker; x-forwarded-for is never trusted) — they create directories and open windows on the host machine, so nothing off-machine may reach them.

RouteMethodPurpose
/api/dsh-workspace-create/configGETCurrent location + last directory
/api/dsh-workspace-create/base-dirPOST{"path":"…"} → validate absolute, create, persist
/api/dsh-workspace-create/create-folderPOST{"name":"…"} → create the folder, return its absolute path
/api/dsh-workspace-create/pick-folderPOST{"title":"…"} → open the native chooser, return the path (null on cancel)

The dialog title is supplied by the browser half in the current UI language (<html lang>, maintained by the official client-locale service); the host only sanitizes and truncates it.

Configuration

Optional, in your profile's cordis.patch.yml:

- insert:
    - id: ui-workspace-create-dialog
      name: 'dsh-workspace-create-dialog'
      config:
        baseDir: 'D:\Work\Workspaces'                 # seed for New workspace location
        stateFile: '<writable path>/state.json'       # defaults to $DSH_HOME/storages/dsh-workspace-create-dialog/state.json

The state file holds two fields: baseDir (the location) and lastDir (where the chooser last was).

Development

node tools/selftest.mjs           # 40 checks, no DSH runtime needed
node tools/pick-probe.mjs         # native picker: compiles the C#, exercises the COM chain, no window
node tools/pick-probe.mjs --real  # same, but actually opens the dialog so you can look at it
node tools/install.mjs --dry-run  # what the installer would do

tools/selftest.mjs covers name validation rules, the location precedence order, the COM vtable order, the slot registration (it runs apply against a fake client context and asserts priority and both slots), the route behaviour (a real mkdir round trip, guard rejections), and the dialog's behaviour itself — it renders the component through a minimal React hook harness and drives it: name-only creation, auto-fill from a picked folder, "your name wins", cancel, and the location change.

FileRole
lib/index.jsHost half: location resolution, folder creation, native chooser, routes
lib/base-dir.jsLocation precedence + absolute-path validation (pure)
lib/name.jsWorkspace-name validation and path joining (pure)
lib/state.jsAtomic state persistence with corrupt-file fallback
lib/guard.jsLoopback trust fence for the routes
lib/pick-folder.jsThe native picker: embedded C#, PowerShell script, child process
lib/client.jsBrowser half: the dialog, registered into both flow slots

Known limitations

  • The native chooser is Windows-only. On other platforms "Choose folder…" reports the failure; the name-only path is platform-independent and keeps working.
  • It runs powershell.exe with a runtime Add-Type. That pair (-EncodedCommand + Add-Type) is exactly what endpoint protection watches for, so a small number of machines may block it. The alternative is shipping a native dependency (koffi); this plugin chose zero dependencies.
  • An open native chooser cannot be cancelled from the browser. There is no per-request abort on this wire; closing the window is the cancel.
  • "Your name wins" needs the client workspace service. When the name differs from the folder name the plugin registers first and renames after; if the rename fails the workspace still exists, just titled after its folder (with a console warning).
  • It depends on the 0.2.0-rc.2 directoryFlow contract. If a future harness renames or changes it, the plugin goes silently inert — ctx.slots.inject waits for a declaration that never comes, and nothing errors. dsh.engines.dsh states the version requirement; it cannot remove the risk.

License

MIT © 2026 LanFeng97