dsh-context-mode:在 DSH 上实现 context-mode 两级上下文路由

前言

在 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)。

  1. 全局安装 context-mode MCP 本体:
npm install -g context-mode
  1. 将 dsh-context-mode 包放入 profile 本地目录:
cp -r dsh-context-mode ~/.dsh/profiles/desktop/_local-pkgs/
  1. 编辑 ~/.dsh/profiles/desktop/package.json,增加 file 依赖并把 bundle 列入 profile:
{
  "dependencies": { "dsh-context-mode": "file:./_local-pkgs/dsh-context-mode" },
  "dsh": { "profile": { "bundles": ["...", "dsh-context-mode"] } }
}
  1. 修正 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/filter
  • ctx_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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜