DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Extra Sandbox Presets — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
E

dsh-extra-sandbox-presets

Extra Sandbox Presets

注册任意配置的 DSH 权限预设,每个预设选择一种沙箱模式和批准策略,并指定其上可写的目录。仅支持 Linux bwrap。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:beicause/dsh-extra-sandbox-presets#df4a6d85ba9706359f165dbed00776cfe721c7f0
README兼容性版本

兼容性与来源证明

Extra Sandbox Presets 以 dsh-extra-sandbox-presets 发布,当前版本为 0.3.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

0.3.0stable
2026/10/8

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

Experimental Auto Review@deepseek-ai/dsh-experimental-auto-review针对每个工具的 LLM 授权审查,适用于 DeepSeek Harness Auto 权限预设Doctor@linxin666/dsh-doctorDSH 配置档案的事务性救援模式,配备受监督的启动器、隔离的恢复容器、确定性修复、健康监控以及本地 Web 恢复控制台DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。Pentesterdsh-pentester用于 DeepSeek Harness 的极简 Root-Orchestrator PTES 渗透测试插件

README

dsh-extra-sandbox-presets

English | 简体中文

Registers any number of configured permission presets in DeepSeek Harness. Each preset selects a sandbox mode and an approval policy, plus the directories that become writable on top of whatever that mode already allows.

That covers both directions the harness can express — a workspace-write preset that opens directories beside the session workspace, and a read-only preset that opens exactly the directories it lists and nothing else — and any number of each.

The three stock sandbox modes are not modified in any way: read-only, workspace-write, and danger-full-access keep their exact meaning, their persisted schemas, and their escalation ladder.

What it adds

One entry in the permission picker per configured preset. A typical table:

PresetSandbox modeApprovalWrites
read-onlyread-onlyasknothing
workspace-writeworkspace-writeaskworkspace + temp areas
workspace-write-extraworkspace-writeaskthe above + its configured directories
scratchread-onlyneveronly its configured directories
danger-full-accessdanger-full-accessnevereverything

A preset is a permission preset, not a fourth SandboxMode. That distinction is the whole point: the sandbox mode vocabulary is a closed three-value union that is written into sandbox/mode session events and re-validated by several foreign projections when a session is restored. A fourth value there would make every session that used it unreadable. Bundling an existing mode with extra behaviour is the same approach the shipped auto preset takes.

Enablement is per session: a preset's directories apply while that session's last recorded permission preset is that preset, which survives a restart because the choice lives in the session log.

How it stays out of the way

The plugin does not disable, replace, or reorder any stock row. It wraps the two live enforcement services in place, and unwraps them exactly on unload:

  • the mounted filesystem's containment check (checkedTarget) gains a retry of its denial against the directories the selected preset grants;
  • the sandbox provider's confine gains the matching --bind pairs in the bwrap profile.

The fence retry deliberately covers read-only as well: the stock fence refuses a read-only mutation before it ever resolves the target, so the wrapper resolves the target itself and compares it against the preset's directories. That is what lets a read-only preset grant writes, and it grants exactly the directories it lists.

The model-facing note needs the same correction, because the stock sandbox:policy note is rendered from the mode alone: under read-only it states that nothing may be modified, and under workspace-write it names only the workspace, while a selected preset may in fact make further directories writable. The plugin therefore listens on the system-prompt/assemble waterfall and appends the granted directories to that note in place. In both confined modes the note reads as a closed boundary, so the appended sentence states the exception outright instead of relying on "additionally" alone to be read as an override of the sentence before it: under read-only it says the directories are writable even under the read-only policy above (the stock sentence reads as a flat prohibition), and under workspace-write it says they are writable whether or not they are inside the session workspace (the stock sentence names only that path and reads as the whole writable area). A danger-full-access preset leaves the note untouched: that mode already restricts nothing, so "additionally writable directories" would be a false statement rather than a correction. A second context of its own would have been simpler, but it would sit next to a stock sentence it contradicts; a context registered under the same name is not an option either, since the system-prompt service keys contexts by name within one layer and rejects a duplicate.

Two consequences follow, and both matter:

  • Failure is safe. If this plugin does not load, the harness keeps the stock filesystem and sandbox rather than losing them. (The alternative — disabling the stock rows and inserting replacements — has no such fallback, and Cordis refuses to register two providers of the same service name, so it cannot be made safe by shadowing.)
  • It is additive. The stock check stays authoritative for every case it already handled; only its own denial is reconsidered.

Configuration

Both surfaces are supported.

Profile config

- id: extra-sandbox-presets
  name: dsh-extra-sandbox-presets
  config:
    presets:
      # The session workspace plus a few caches.
      workspace-write-extra:
        writableDirs:
          - /srv/shared-assets
          - ~/notes
      # No workspace write at all; only these two directories.
      scratch:
        sandbox: read-only
        approval: never
        writableDirs:
          - /tmp
          - ~/scratch
      # A relabelled entry: the client shows `name`, falling back to the key.
      rust-tools:
        sandbox: workspace-write
        writableDirs: [~/.cargo, ~/.rustup]
        name: Rust tools
        description: Workspace plus the cargo and rustup caches
FieldDefaultMeaning
sandboxworkspace-writeread-only, workspace-write, or danger-full-access
approvalaskask or never
writableDirs[]Directories writable on top of the selected mode
namethe preset keyOptional display label
descriptionnoneOptional one-line description

Omit name unless you want a specific label: the picker derives its text from the preset key otherwise (workspace-write-extra renders as Workspace Write Extra), while a supplied label is shown verbatim, in English, because the client localizes only its own built-in presets.

Directories must be absolute; a leading ~ is expanded. Symlinks are resolved, and a missing or non-directory entry is ignored with a warning rather than created — granting a path nobody named would be the unsafe direction. Expansion is asynchronous, so a directory only becomes writable after its own successful expansion. A preset whose sandbox or approval is not one of the values above is likewise refused with a warning instead of being published, as are the reserved names custom and auto.

writableDirs only has an effect under a confined mode. A preset selecting danger-full-access may list them — they stay visible in the table — but that mode confines nothing, so they grant nothing extra and the model-facing note is left untouched.

Preset order is configuration order, which is the order the picker offers them.

Settings page

presets is a volatile field, so the whole table also appears on the Settings page and edits apply live to every session in the profile. The page edits it as one document rather than as a nested form, so the profile patch above stays the natural place to write it.

Compatibility with the harness

This plugin declares no @deepseek-ai/dsh-* peer range, and the harness checks only such peers. Its compatibility therefore rests on something narrower and more exact: the shape of two mounted services (plus one event and one context name). That shape is what the code actually uses, and the service half is pinned by test/contract.test.ts against the real classes, so a harness upgrade that moves any of it fails the suite immediately rather than narrowing a preset in production.

Depends onUsed by
fs.checkedTarget(target, policy) rejects with code FS_SANDBOX_DENIEDsrc/fs.ts
fs.resolve(path) resolves a target carrying targetKeysrc/fs.ts
sandbox.confine(argv, policy, signal) resolves to an object carrying argvsrc/provider.ts
Policy fields mode and sessionId; result field argvboth wrappers
permissionPresets.presets and emitCatalogChanged()src/service.ts
The system-prompt/assemble waterfall, and a sandbox:policy context to correct in itsrc/service.ts

Two properties keep this robust across upgrades:

  • The wrappers call the stock methods through await, so a stock method that changes between synchronous and asynchronous keeps working.
  • Both wrappers operate on the returned object rather than assuming a bare argv, so a return value that grows fields keeps working.

When a mounted service does not expose the expected seam at all, the plugin reports it once per service and leaves the instance untouched. It never disables a stock row, so the failure mode of any unexpected harness shape is a logged warning and stock behaviour — never a missing filesystem or sandbox.

Platform support

  • Linux with bwrap — fully supported. The configured directories join the bubblewrap profile as --bind <dir> <dir>, so confined commands agree with the write/edit tools.
  • Linux with landlock, and macOS seatbelt — the write/edit tools are widened, but confined commands are not, because those profiles are built inside packages this plugin cannot extend. A warning is logged once instead of pretending otherwise.
  • Windows — not supported.

Layout

FileRole
src/service.tsctx.sandboxPresets: owns the configured preset table, decides per session which preset applies, wraps the two enforcement services, publishes the presets, and corrects the stock sandbox note on the assembly waterfall.
src/presets.tsNormalizes the configured table and expands each preset's directories.
src/fs.tsWraps the live filesystem's containment check.
src/provider.tsWraps the live sandbox provider's confine.
src/roots.tsPath expansion and containment checks.
src/plan.tsPure bwrap argv transformation.
cordis.patch.ymlInserts the one plugin row.
test/contract.test.tsPins the harness seams this plugin extends.

lib/ is the compiled output of src/ (tsc -p tsconfig.build.json) and is git-ignored: it is a build artifact, and src/ is the only source of truth. prepare builds it, so pnpm install inside the repository produces lib/. Edit src/, never lib/.

Note that the profile installs this package by symlink (link:), pointing at this working tree, and pnpm runs no lifecycle script for a link: dependency — so an install through the profile does not build. Build here, in the repository, and the linked profile picks up whatever lib/ currently holds.

Build

pnpm run build      # tsc -p tsconfig.build.json -> lib/
pnpm run typecheck  # tsc -p tsconfig.json (src + test)

Tests

node --test test/

src/roots.ts, src/plan.ts, src/presets.ts, and the two wrappers are dependency-free and run anywhere. The contract and integration suites need the DSH packages to be resolvable, so they run from an installed profile: the contract suite pins the real stock seams, and the integration suite assembles the real filesystem and sandbox provider and asserts both the widening and its exact reversal on unload. Every suite that needs those packages skips with a reason when they are absent, and never passes vacuously. The suite runs against the compiled lib/, so run pnpm run build first.