DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

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

dsh-egress-guard

Egress Guard

DeepSeek Harness 的运行时安全网关:出站主机允许列表、工具结果中的机密信息脱敏,以及仅追加审计日志

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

npx -y @deepseek-ai/dsh plugin --profile web add github:tancheng33/dsh-egress-guard#dcb52e1239a70d03ee36db0e39ccbd5979b3da9f
README兼容性版本

兼容性与来源证明

Egress Guard 以 dsh-egress-guard 发布,当前版本为 0.2.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

0.2.0stable
2026/9/22

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

Doctor@linxin666/dsh-doctorDSH 配置档案的事务性救援模式,配备受监督的启动器、隔离的恢复容器、确定性修复、健康监控以及本地 Web 恢复控制台DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。Plugin Subscriptionsdsh-plugin-subscriptions将 ChatGPT (Codex)、Claude、Grok (X Premium)、GitHub Copilot 和 Google Antigravity 订阅用作 DeepSeek Harness LLM 提供商,并通过网页设置页面使用 OAuth 登录Mobiledsh-mobileDeepSeek Harness 移动端适配与安全访问插件,支持局域网、远程连接、Android App 和手机浏览器。

README

dsh-egress-guard

English | 中文

A runtime security gate for DeepSeek Harness tool calls.

Existing security plugins in the ecosystem scan configuration files before an agent runs. This one sits in the tool-execution pipeline and acts on the calls themselves:

RuleExtension pointWhat it does
Egress allowlisttools/pre-executeDenies (or asks about) a call that names a network destination outside your allowlist — curl to a paste site, git push to an unknown remote, a fetch to an exfiltration endpoint.
Secret redactiontools/post-executeRewrites credentials out of a tool result before the model, the durable session log, or a Code Mode program can read them.
Audit logboth waterfallsAppends every decision — including the ones monitor mode only would have made — to a JSONL file.

No fork, no patched loop: three listeners on documented extension points, disposed cleanly on unload.

Install

dsh plugin --profile <name> add dsh-egress-guard

The bundle ships mode: monitor, so installing it cannot break a working setup: every rule is evaluated and audited, nothing is blocked or rewritten. Read the audit log for a day, then turn on enforcement in your profile's cordis.patch.yml:

- id: egress-guard
  config:
    mode: enforce
    egress:
      enabled: true
      allowHosts: ['*.github.com', '*.npmjs.org', 'api.deepseek.com']
      denyHosts: []
      allowLoopback: true
      onViolation: deny
    redact:
      enabled: true
      builtins: true
      extraPatterns: []
      placeholder: '[redacted:{name}]'
    audit:
      enabled: true
      path: ''
      logAllowed: false

A patch replaces a row's whole config, so restate every key you want to keep.

Configuration

KeyDefaultMeaning
modemonitoroff registers nothing. monitor evaluates and audits without acting. enforce denies and redacts.
egress.allowHosts[] in schema, a starter list in the bundlePermitted hosts. *.example.com covers the apex and every subdomain. An empty list means denylist-only.
egress.denyHosts[]Always denied. Beats allowHosts and allowLoopback.
egress.allowLoopbacktrueExempts localhost, 127.0.0.0/8, ::1, *.localhost.
egress.onViolationdenyask routes to ctx.approval instead — and degrades to deny when no approval service is mounted.
redact.builtinstruePrivate keys, vendor API keys, JWTs, bearer headers, KEY=value assignments.
redact.extraPatterns[]Extra regex sources, compiled with the global flag.
redact.placeholder[redacted:{name}]{name} is the pattern that matched.
audit.path$DSH_HOME/egress-guard.jsonlJSONL, one decision per line.
audit.logAllowedfalseAlso record calls that named a host and passed — this is how you build an allowlist out of real traffic.

Building an allowlist from real traffic

# 1. Install (monitor mode) and work normally for a while, with logAllowed: true.
# 2. See which hosts your agent actually reaches:
jq -r '.hosts[]?' ~/.dsh/egress-guard.jsonl | sort | uniq -c | sort -rn
# 3. Put the legitimate ones in allowHosts, then flip mode to enforce.

Design notes

Redaction happens at the canonical value, not the rendered content. The registry's contract is explicit that content replacement is not a confidentiality boundary — a Code Mode program receives the canonical value directly. So a successful result is redacted by replacing its value, and the content is re-rendered from the redacted value. Failed results carry no value (the registry rejects a value replacement on them), so their message is redacted as content.

The guard runs last in the post-execute waterfall. It delegates with next() first, then redacts whatever projection the composed decision actually carries, so a listener deeper in the waterfall cannot reinstate the original text. When another plugin replaced the content but the underlying value holds a secret, the guard replaces the value — losing that plugin's presentation, but not leaking to programmatic consumers. That precedence is deliberate.

Denials tell the model not to route around them. A bare "denied" invites a retry with a different tool; the reason string names the hosts and says to ask the user instead.

Limitations — read this before trusting it

This is a guard rail, not a containment boundary. It raises the cost of an accident or a careless prompt injection; it does not stop a determined adversary running code on your machine.

  • Detection is textual. Destinations are found by scanning argument strings for URLs and user@host remotes. A command that assembles its destination at runtime (curl "$ENDPOINT", base64, string concatenation, an IP in decimal form) is invisible to the gate. Real containment is the sandbox seam's job (dsh-bash-sandbox, network namespaces, a proxy), not a string matcher's.
  • A tool that opens its own socket bypasses the gate entirely unless the destination appears in its arguments.
  • Redaction is pattern-based, so it misses credential shapes it does not know, and it can rewrite text that merely looks like a secret. Add extraPatterns for your own formats; check the audit log for false positives before enforcing.
  • Binary content is not scanned — image blocks and other non-text blocks pass through untouched.
  • The audit log is local and unsigned. Anything that can write to your filesystem can edit it.

Compatibility

Built against the @deepseek-ai/dsh-tools 0.1.5 / 0.1.6 pipeline contract; dsh.compatibility.dshReleases in package.json carries the per-release declaration.

Verified on 2026-09-22, each release line pinned across the whole @deepseek-ai/dsh-* family:

DSH releasetypecheckbuildtests
0.1.5-rc.2 (npm latest)passpass61/61
0.1.6-alpha.1passpass61/61
0.1.6-alpha.2 (npm alpha)passpass61/61

On 0.1.5-rc.2 the packed tarball was also installed into a disposable profile (DSH_HOME pointed at a throwaway directory, --from-default-profile headless): the bundle composes into the profile tree as the egress-guard row, the profile boots with it loaded — stopping only at the provider credential gate — and dsh plugin remove takes both the dependency and the row back out.

0.2.0 drops the 0.1.0-rc line. Upstream renamed CallId to ToolCallId and moved JsonValue out of dsh-session, so a build against 0.1.0-rc.6 fails. Stay on 0.1.0 of this plugin if you are still on that harness line.

Note that npm's latest tag for the @deepseek-ai/* packages now points at 0.1.5-rc.2, with the 0.1.6 prereleases on the alpha tag. If you install harness packages by hand, ask for the version explicitly.

The harness is in developer preview and states that compatibility-breaking changes will happen. If a pipeline contract shifts, this plugin's tests are designed to fail loudly — they execute real calls through a real registry rather than mocking the waterfalls.

Development

npm install
npm test          # 61 tests: pure unit tests + end-to-end through a real ToolRuntime
npm run typecheck
npm run build

Every release in dsh.compatibility.dshReleases is exercised by CI. To reproduce one locally, pin the whole harness family and run the suite against it (package.json and the lockfile are restored afterwards):

node scripts/pin-dsh.mjs 0.1.6-alpha.2
npm run typecheck && npm test && npm run build

To try it against a live harness without publishing:

dsh plugin --profile <name> add /path/to/dsh-egress-guard
dsh --profile <name> --dump-config   # shows the "# == dsh-egress-guard" layer

License

MIT