前言¶
在 DeepSeek Harness(DSH)里跑智能体时,宿主工具(读文件、grep、PowerShell、web_fetch 等)的输出会直接进上下文窗口。命令该跑、结果也有用,但整段 stdout 往往把窗口撑满,后续推理空间被挤掉。社区项目 context-mode 在 Claude Code 等 17 个平台上用 hook 做「Think in Code」式路由;DSH 不在官方支持列表里,且 harness 的 tools/pre-execute 协议与 Claude Code hook 并不等价——单靠 deny 只能拦掉工具、让模型换路,对 npm test、git log 这类必须执行的场景并不合适。
维护者 ztc1522021381 的 dsh-context-mode(GitHub:ztc1522021381/dsh-context-mode,目录页:skillhub.cn/plugins/ztc1522021381/dsh-context-mode)是 context-mode 的 DSH 适配层:通过 MCP 与 DSH 原生 tools/pre-execute、tools/post-execute seam,实现「执行前 deny、执行后 truncate」两级策略,把易泛滥的调用导向 context-mode 沙箱,而不是简单禁止运行。
这是什么¶
一句话:context-mode 的 DeepSeek Harness 适配层——两级路由(deny before execution,truncate after),对接 MCP 与宿主工具缝。
分类为工作流插件;当前 package 版本 0.1.0,适配层 MIT,context-mode 本体为 Elastic License 2.0(与适配层许可无关)。运行要求:Node.js >= 20,dsh >= 0.2.1-rc.1,peer 依赖 @deepseek-ai/cordis ~4.0.5-alpha.1。
两级策略¶
DSH 的 tools/pre-execute 只支持 deny / allow / ask,且 exec.arguments 经 deepFreeze(dsh-tools 的 createExecution),不能改写入参;deny 意味着工具根本不会执行。对 curl https://x 一类调用,拦掉后改用 ctx_fetch_and_index 等 MCP 工具是合理替代;对必须跑且输出有真实价值的命令,拦掉则模型什么都得不到,而这类输出又最容易灌满上下文。
因此插件拆成两层:
| 层级 | 时机 | 手段 | 判据 |
|---|---|---|---|
| Tier 1 — deny | 执行前 | tools/pre-execute 返回 { kind: 'deny', reason } |
这件事根本不该由宿主工具做 |
| Tier 2 — truncate | 执行后 | tools/post-execute 返回 { kind: 'accept', content } |
这件事必须跑,但输出不该整段进上下文 |
Tier 2 在工具照常执行成功后,按渲染后 content 字节数判断;超限则把模型看到的内容整段替换为摘要,并提示通过 mcp__context_mode__ctx_batch_execute、ctx_execute 等在沙箱里再处理。失败调用(isError)不改动,错误信息仍留给模型。README 表述的核心是:不是不让跑,是跑了但不把洪水输出塞进上下文窗口。
默认分工(可在配置里改):
- Tier 1(deny):
web_fetch,以及pwsh里的 curl/wget、内联 HTTP、构建工具等 - Tier 2(truncate):
pwsh、read、grep、glob(默认阈值 20 KB,即maxResultBytes: 20000)
pwsh 同时出现在两层:Tier 1 只拦特定 HTTP/构建类用法,其余放行后由 Tier 2 按体积截留。
路由块与 MCP¶
除拦截外,插件在系统提示中注入 context-mode — MANDATORY routing rules,内容对齐 context-mode 的 configs/claude-code/CLAUDE.md(Think in Code、工具选择顺序、并发批处理、会话连续性)。工具名前缀从 ctx.tools 注册表探测,不硬编码 serverName,留空时自动探测。
cordis.patch.yml 随 bundle 应用:挂载 context-mode MCP server 与本适配层。Windows 上须把 command / args 改为 绝对路径,指向 node.exe 与 context-mode 的 cli.bundle.mjs(非 npm .cmd shim);仓库内默认为 REPLACE_ME 哨兵,需用 npm root -g 填真实路径。DSH ACP 层校验绝对路径;spawn 不带 shell: true,.cmd 会 ENOENT。failOnStartupError: false 时填错不会挡 DSH 启动,但可能没有 ctx_* 工具,日志会出现 context-mode MCP tools not found yet 警告。
安装与启用¶
DSH 生态是「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件 README 未提供 dsh plugin add github:... 一类命令,安装按下列步骤(摘自官方 README)。
- 全局安装 context-mode MCP 本体:
npm install -g context-mode
- 将 dsh-context-mode 包放入 profile 本地目录:
cp -r dsh-context-mode ~/.dsh/profiles/desktop/_local-pkgs/
- 编辑
~/.dsh/profiles/desktop/package.json,增加 file 依赖并把 bundle 列入 profile:
{
"dependencies": { "dsh-context-mode": "file:./_local-pkgs/dsh-context-mode" },
"dsh": { "profile": { "bundles": ["...", "dsh-context-mode"] } }
}
- 修正
cordis.patch.yml中 MCP 的command/args绝对路径(见上一节),然后重启 DSH。
安装前请自行查看仓库源码与许可证;插件与 MCP 以当前 DSH 进程权限运行,全局 npm 与 profile 路径修改会影响本机环境。
配置要点¶
README 中的示例片段(enabled: false 时回到原生宿主行为,MCP 仍可挂着):
- id: context-mode
name: dsh-context-mode
config:
enabled: true
denyTools: [web_fetch]
truncateTools: [pwsh, read, grep, glob]
maxResultBytes: 20000
minCommandBytes: 0
readThresholdBytes: 50000
interceptSubagent: false
sectionOrder: 3090
serverName: ''
readThresholdBytes 为 read 的 Tier 1 提醒线;Tier 2 仍按 maxResultBytes 截留。Tier 2 仅按字节判,不区分 diff 与编译日志;需更细粒度可对单场景调低 maxResultBytes。
典型用法与自测¶
模型侧被 deny 或 truncate 后,README 引导改用 context-mode MCP,例如:
mcp__context_mode__ctx_batch_execute(commands: [{label, command}], queries: [...])批跑并拿可检索索引mcp__context_mode__ctx_execute(language: "shell", code)自行 pipe/filterctx_execute(language: "javascript", code)在沙箱读源数据,console.log()只输出答案
仓库自测(无需 DSH 或需 runtime 分开):
node selftest.mjs # 86 个用例:纯路由规则
node selftest.mjs -v
node probe-plugin.mjs # 53 个用例:两级行为、阈值、装配(需 DSH runtime)
适用场景与已知限制¶
适合:已在或打算用 context-mode 做上下文治理的 DSH 用户;希望 web_fetch / shell 里滥用的 HTTP 在 Tier 1 被 deny,同时让 read、grep、git log 类命令照常跑、大输出在 Tier 2 被摘要而非整段进窗。
注意:
- Tier 1 不能改写入参,属 DSH 类型设计;需「跑完再换模型所见内容」时用 Tier 2。
- context-mode 在 Claude Code 上读的
permissions.deny与 DSH 权限预设不互通。 - 子 agent 默认不拦截(
interceptSubagent: false),按 README 自行决定是否开启。
结尾¶
dsh-context-mode 把 context-mode 的两级思路落到 DSH 的 pre/post execute seam 上:该拦的拦、该跑的跑,大输出不进上下文,并通过 MCP 与 mandatory routing 块对齐官方范式。进一步细节与 issue 见 GitHub README;社区条目见 skillhub.cn/plugins/ztc1522021381/dsh-context-mode。