DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Unicode Guard — DeepSeek Harness 插件(DSH Plugin)
← Plugins
U

dsh-unicode-guard

Unicode Guard

DSH 插件会将触发 DeepSeek 内容审核的字符从模型可见的所有界面中移除,因此抓取的页面不会再因 HTTP 400 "Content Exists Risk" 永久中断会话。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:KAsyori/dsh-unicode-guard#1479c57774d63c6a55e0812640c777b9a66f1153
README兼容性版本

兼容性与来源证明

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

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

版本

0.2.0stable
2026/9/27

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录

相关插件

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

Cc Safety Netcc-safety-net编码代理 CLI 钩子——阻止破坏性命令和访问机密文件Doctor@linxin666/dsh-doctorDSH 配置档案的事务性救援模式,配备受监督的启动器、隔离的恢复容器、确定性修复、健康监控以及本地 Web 恢复控制台Mobiledsh-mobileDeepSeek Harness 移动端适配与安全访问插件,支持局域网、远程连接、Android App 和手机浏览器。Codex Subscriptiondsh-codex-subscription通过 OAuth 在 DeepSeek Harness 中使用 ChatGPT 和 Codex 订阅,支持配额管理、安全重置、网页搜索、图像和快速模式

README

dsh-unicode-guard

English | 中文

A DSH host-half plugin that keeps a small class of rare glyphs out of every model-visible surface.

The failure it prevents

Some inference endpoints reject a request outright when its body contains a particular glyph, answering with an HTTP 400 and the opaque reason Content Exists Risk. The usual way such a glyph enters a request is accidental: an agent fetches a web page whose language switcher or footer uses flag-style emoji, the whole page lands in a tool result, and from then on every request in that session replays it. Each retry is byte-identical, so each retry fails the same way. The session cannot recover on its own.

The glyph that matters here is a regional indicator pair: two adjacent code points from the U+1F1E6..U+1F1FF block, which is how flag emoji are encoded. Nothing about the page is objectionable - a page footer is enough.

What this plugin does

It rewrites the payload before the payload can hurt, at three layers:

HookLayerEffect
tools/post-executetool resultsrewrites result content before it is appended to the session
agent/pre-stepan already-affected sessionreplaces the offending surface node with a scrubbed copy, so the session's next turn is already clean
llm/streamthe outgoing requestscrubs the serialized body itself - the last hook before adapter dispatch

The three layers matter because they cover different producers. Only the first sees a tool result; only the third sees text that never travels as one (compaction summaries, instruction bodies, MCP server instructions, scheduled prompts).

A regional indicator pair is rewritten as a readable ASCII tag: the two code points become [FLAG:AB]. A variation selector (U+FE0F) directly after such a rewrite is dropped so no bare selector is left behind. Everything else is untouched - ordinary emoji, CJK text, and every other astral-plane character pass through unchanged.

Install

As a bundle (recommended)

dsh plugin add dsh-unicode-guard

The package ships a cordis.patch.yml that inserts its own row, so adding it to the profile bundle list is enough.

Manually, into a profile

Link the directory into the profile's node_modules and append one row to the profile's cordis.patch.yml:

- insert:
    - id: unicode-guard
      name: dsh-unicode-guard
      config:
        mode: regional
        verbose: true

A change to cordis.patch.yml is hot-reloaded; adding the link itself needs a restart.

Configuration

KeyDefaultMeaning
moderegionalregional masks regional indicator pairs only. astral additionally replaces every non-BMP character with replacement, which destroys legitimate output - opt in deliberately.
replacementU+FFFDReplacement used in astral mode only.
toolResultstrueScrub tool results before they are logged.
userMessagestrueScrub user-role messages during heal.
assistantMessagesfalseScrub assistant messages during heal.
requesttrueEnable the llm/stream backstop.
verbosetrueLog one line per rewrite through ctx.logger.

Unknown keys or wrong value types fail at mount time rather than silently doing nothing.

Verifying it works

A mounted plugin logs exactly one line:

[I] [unicode-guard] unicode-guard: mounted (mode=regional, toolResults=true, ...)

Every rewrite logs a warning, so you can watch it work:

[W] [unicode-guard] unicode-guard: scrubbed the web_fetch tool result
[W] [unicode-guard] unicode-guard: healed 1 surface node(s), removed 2 glyph(s)
[W] [unicode-guard] unicode-guard: scrubbed the outgoing request

An end-to-end check that does not depend on any log: read a file that contains a regional indicator pair. The tool result must show [FLAG:AB] where the file has the raw pair.

How a session recovers

A session that is already rejected heals on its next turn, with no retry: agent/pre-step runs before that turn's request is assembled, so the node is replaced first and the very first request of the turn is already clean.

Repairs are surface replacements. The session log is append-only, so the original record stays on disk and is shadowed on the current surface. That is the same mechanism the kernel uses for its own tool-result pruning, and it is what keeps the log's integrity guarantees intact.

Design notes

  • Projection, not mutation. A message in llm/stream arrives deep-frozen; a changed message is replaced by a clone. Rewriting in place would either throw or corrupt a message that other listeners still hold.
  • assistant/message cannot carry sourceEventSeqs. The kernel rejects it because that event embeds its own source stream, so the replacement intent differs per event type.
  • The whole payload, not just the message. A tool result can carry a second copy of its payload in data.meta (the read tool stores its numbered window in meta.lines). That copy is never sent to the provider, but leaving it tainted keeps the session file dirty for forks, exports, and UI replay, so it is scrubbed too.
  • A repair must never break the turn it repairs. A node that throws during healing is logged and skipped; the turn proceeds.
  • UTF-16 care. Regional indicators are surrogate pairs. Pairing walks code points, never bare code units, and a lone surrogate is passed through rather than mangled.

Tests

node --test test/

The suite has no dependencies and no fixtures to download. It covers the masker's edge cases (pairing, leftovers, variation selectors, idempotence, surrogate integrity), the hook contracts, and the request-backstop rewrite.

test/selfcheck.test.mjs fails the run if any file in this repository ever contains a literal astral-plane character. A plugin that shipped one would be a trigger source in its own right, so the property is enforced rather than promised.

Scope and limits

  • It masks the glyph classes it is configured for. mode: astral widens that to all non-BMP characters.
  • It changes what the model sees: a flag-style emoji becomes [FLAG:AB]. That is the point - an ASCII tag keeps the information readable while removing the bytes that make the request fail.
  • Repairs do not shrink the log: shadowed records stay on disk.
  • It is a client-side robustness measure, not a replacement for whatever the provider may do server-side. If the endpoint stops rejecting this glyph class, the plugin degrades into a harmless normalizer.

License

MIT