dsh-context-toolkit:把大块输出留在对话外

前言

在 DeepSeek Harness(DSH)里跑智能体时,上下文窗口往往被两类内容挤满:一是 curl、wget 或宿主自带的 web_fetch / read_page 把整页响应写进 transcript;二是某次工具已经返回了成千上万行日志、JSON 或表格,模型其实只需要计数、摘要或几段摘录。常见做法是事后手动删消息或换更短的命令,但 flood 往往在调用发生的那一刻就已经进上下文了。

下面介绍的 dsh-context-toolkit(维护者 chimneyQ,社区目录分类为 admin-security)专门做一件事:让 bulk output 尽量不进对话。它在执行前用 routing gate 拒绝必然灌水的调用,在工具执行后用输出瘦身处理已经返回的内容;原始字节可通过 ctk_retrieve 按标记无损读回。知识库基于 Node 自带的 node:sqlite(含 FTS5),沙箱执行用本机已有解释器,无第三方运行时依赖。

这是什么

一句话:DSH bundle,把「原始字节」和「结论」拆开——命令在子进程里跑、大文件在沙箱里分析、长材料写入本地知识库,对话里只留结论、摘录和统计。

痛点 插件做法
命令打印数千行,你只需要个数 ctk_execute 在子进程执行并只返回答案
大文件要统计,不要全文读入对话 ctk_execute_file 把文件字节留在沙箱
多条命令一个问题 ctk_batch_execute 一次调用、逐条状态
页面或规格读一次后要反复查 ctk_index 入库,ctk_search 按需拉摘录
curl / wget 把整段响应贴进对话 routing gate 拒绝并提示替代路径
不知道省了多少上下文 ctk_stats 记账;设置页有实时占用面板

核心能力

工具一览

工具 作用
ctk_execute 沙箱子进程执行代码(javascript / esm / typescript / shell),只返回答案
ctk_execute_file 对文件跑统计或抽取;文件正文不进对话
ctk_batch_execute 多命令一次调用,逐条状态,只返结论
ctk_index 将文本或文件写入本地 FTS5 知识库
ctk_search 多查询检索,摘录围绕匹配位置
ctk_retrieve 从 [ctk_retrieve id=…] 标记读回瘦身前原文,字节级一致
ctk_fetch_and_index 抓取页面 → 去 markup → 入库
ctk_purge 删除已归档材料(需 confirm: true)
ctk_stats 节省账本:拒绝次数、沙箱字节、归档字节、调用计数
ctk_doctor 自检:解释器、scratch 目录、知识库往返
ctk_context_report 当前会话的上下文占用与构成

两道防线

Routing gate(门前):在工具执行前读取调用参数,拒绝会必然 flood transcript 的路径(例如各 shell 里的 curl / wget,并可对 web_fetch / read_page 做 nudge)。主开关为配置项 routing,denyCurlWget 默认开启。

Output slimming(事后):gate 只能看参数;已经返回的大块输出由 tools/post-execute 按形态处理——均匀 JSON 数组做无损表格化重编码;表格保留头尾并对中间步进采样且保留原行号;grep / 搜索类结果按文件折叠等。需要全文时用 ctk_retrieve 取回存储的原文。

配置要点

以下默认值与含义均来自插件 README(节选):

键 默认 含义
routing true routing gate 总开关
denyCurlWget true 直接拦截 curl / wget
bashNudgeMinCommandBytes 4096 过长 shell 命令 nudge 阈值(0 关闭)
maxReadBytesBeforeAsk 51200 整文件读取 nudge 阈值(0 关闭)
nudgeFetchTools true 对宿主 fetch 工具也 nudge
compressNudgeTokens 120000 占用告警阈值(tokens)
searchLimit 5 ctk_search 每查询摘录条数
snippetChars 900 单条摘录字符上限
fetchMaxBytes 2000000 单页抓取上限
caPemPath auto ctk_fetch_and_index 的 TLS 信任;TLS inspection 代理导致 UNABLE_TO_VERIFY_LEAF_SIGNATURE 时可配 PEM
storageDir 空 知识库根目录;空则 <DSH_HOME>/context-toolkit

各 ctk_* 工具可通过 tools.* 单独开关,默认均为开启。设置页 Context Toolkit 可查看 caPemPath 对应文件是否存在,并从系统根证书导出快照(需确认才会覆盖已有文件)。

安装与启用

推荐从 npm 安装:

dsh plugin --profile desktop add dsh-context-toolkit

从 GitHub 安装:

dsh plugin --profile desktop add github:chimneyQ/dsh-context-toolkit

本地路径(示例为 Windows 路径,按你的 checkout 位置替换):

dsh plugin --profile desktop add D:\path\to\dsh-context-toolkit

在 <DSH_HOME>/profiles/desktop/package.json 的 dsh.profile.bundles 中应能看到 dsh-context-toolkit。卸载:

dsh plugin --profile desktop remove dsh-context-toolkit

当前 npm 包版本为 0.3.12,许可证 MIT(见 package.json)。

典型用法

原则:凡是分析、计数、过滤、汇总,优先用 ctk_*——把结果读进对话正是本插件要解决的问题。

统计目录下 .log 文件数量与总大小:

// How many .log files, and how big in total?
await ctk_execute({
  language: 'javascript',
  code: `
    const fs = require('fs');
    const dir = process.argv[2];
    let n = 0, bytes = 0;
    for (const f of fs.readdirSync(dir)) {
      if (!f.endsWith('.log')) continue;
      n++; bytes += fs.statSync(dir + '/' + f).size;
    }
    console.log(n + ' files, ' + bytes + ' bytes');
  `
});

长文档入库后按关键词取段:

await ctk_index({ path: 'D:/specs/api.md' });          // the full text stays in the store
await ctk_search({ queries: ['rate limit', 'auth'] });  // only the relevant excerpts come back

离线自检(不依赖 DSH 运行时)可在插件目录执行 README 中的 node smoke.mjs 等脚本,覆盖合约、gate、瘦身与检索等检查。

适用场景与注意

适合谁:长期在 DSH desktop profile 上开发智能体、频繁跑 shell、读大文件或抓网页,又希望 transcript 里主要是结论而不是原始 dump 的开发者。

权限与安全:插件以当前 dsh 进程权限 运行子进程、读写知识库与沙箱目录;routing gate 会改写或拒绝部分工具调用行为。安装前请自行审阅 GitHub 源码 与 MIT 许可证,admin-security 分类也提醒其具备策略型拦截能力,不适合在未理解配置的情况下 blindly 启用于生产敏感环境。

生态说明:DSH 社区插件目录在 SkillHub 等独立站点维护,与 DeepSeek / 幻方无官方从属关系;本文事实以仓库 README 与 package.json 为准。

结尾

dsh-context-toolkit 用 门前拒绝 + 事后瘦身 + 本地 FTS 知识库 + 可检索原文 把上下文留给推理而不是日志堆叠。若你在 Harness 里常被 curl 输出或巨型 tool result 拖累,可以按上文命令安装,用 ctk_doctor / ctk_stats 验证环境并查看节省情况。

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

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

Xiaoye