🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

上下文守卫 woody20100715-collab/dsh-context-guard

DeepSeek Harness
woody20100715-collab17 天前有提交已提供中文文档扫描:含敏感能力

按内容类型压缩工具输出,原文可随时取回

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/15 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add woody20100715-collab/dsh-context-guard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · security
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 4 处,展示前 4 条)
  • 写入本地文件
    src/ccr.ts:98
    this.ready ??= mkdir(this.rootDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/ccr.ts:158
    await writeFile(this.filePathFor(record.id), JSON.stringify(payload), { encoding: 'utf8', mode: 0o600 });
  • 读取本地文件
    src/ccr.ts:189
    const raw = await readFile(this.filePathFor(id), 'utf8');
  • 删除本地文件
    src/ccr.ts:231
    await unlink(this.filePathFor(id));
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-base@deepseek-ai/dsh-brand@deepseek-ai/dsh-commands@deepseek-ai/dsh-compaction@deepseek-ai/dsh-invariants@deepseek-ai/dsh-llm@deepseek-ai/dsh-ptc-runtime@deepseek-ai/dsh-sandbox@deepseek-ai/dsh-sandbox-policy@deepseek-ai/dsh-scope
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 上下文守卫:工具输出按内容类型压缩 + 可逆取回(CCR)+ 高保真历史摘要

README

由 DeepSeek 最新模型翻译生成
dsh-context-guard 给 DSH(DeepSeek Harness)用的上下文守卫:过长的工具输出按内容类型压掉,过长的历史换成高保真摘要,被压掉的内容随时能原样取回。 上下文一长,模型就开始犯迷糊:注意力被稀释,关键数字被噪声淹没,一次目录列表或构建日志几秒钟就能吃掉几万 token。这个插件在三个位置分别下手: | 时机 | 做什么 | | 工具输出进历史之前 | 判断内容类型(JSON / 日志 / 表格 / 长文本)分别压缩;压缩率不到 15% 就放弃,不值得为几个 token 让模型多跑一次取回 | | 历史快撑满窗口时 | 换成结构化摘要,数字、路径、命令、用户约束逐字保留 | | 每次模型调用之前 | 算 token 预算,只裁插件自己注入的上下文;用户消息和工具结果一律不动 | 被压掉的原文不会丢。
展开完整文档(README 剩余 1 节)
dsh-context-guard

给 DSH(DeepSeek Harness)用的上下文守卫:过长的工具输出按内容类型压掉,过长的历史换成高保真摘要,被压掉的内容随时能原样取回。

上下文一长,模型就开始犯迷糊:注意力被稀释,关键数字被噪声淹没,一次目录列表或构建日志几秒钟就能吃掉几万 token。这个插件在三个位置分别下手:

| 时机 | 做什么 |
| 工具输出进历史之前 | 判断内容类型(JSON / 日志 / 表格 / 长文本)分别压缩;压缩率不到 15% 就放弃,不值得为几个 token 让模型多跑一次取回 |
| 历史快撑满窗口时 | 换成结构化摘要,数字、路径、命令、用户约束逐字保留 |
| 每次模型调用之前 | 算 token 预算,只裁插件自己注入的上下文;用户消息和工具结果一律不动 |

被压掉的原文不会丢。原文存进本地的 CCR,压缩结果末尾带一行脚注:

[context-guard] compressed log output: ~16036 -> ~620 tokens (-96%), strategy=log:fold+prioritize.
The full original is available: call context_retrieve with id="ccr_3b25d97745ae4930" ...

模型需要细节时按 id 取回,取回的是逐字原文,不会再被压一次(超长的话按 offset 分页)。

安装

git clone https://github.com/woody20100715-collab/dsh-context-guard.git
cd dsh-context-guard
npm install
npm run build

装进目标 profile(web / headless / 你自己建的都行)
dsh plugin --profile web add .

dsh plugin add 会做三件事:把包装进 profile、发现本包声明了 dsh.bundle.patch 于是自动登记成 bundle 层、再对运行时版本做一次兼容性校验(版本对不上会直接拒绝安装)。

插件自带的补丁会关掉内置的 compaction-basic 并插入自己——ctx.compaction 是单例服务,两个压缩后端不能同时挂。装完可以确认一下:

dsh --profile web --dump-config | Select-String 'compaction-basic|context-guard' -Context 1

GUI 用的 desktop profile 由应用独占,独立 CLI 不允许改。要在 GUI 里用,请走应用内的插件管理界面,或者完全退出应用之后再执行 dsh plugin --profile desktop add .。

配置

全部写在 cordis.patch.yml 的 config 里,所有键都可以省略。

触发

| 键 | 默认 | 说明 |
| enabled | true | 总开关 |
| auto | true | 自动压力压缩 + 上下文溢出恢复 |
| thresholdRatio | 0.8 | 已用 token 占窗口比例达到多少就压历史 |
| retainRatio | 0.16 | 最近这段保留为逐字原文的比例,必须小于 thresholdRatio |
| retainTokens | 0 | >0 时用绝对 token 数覆盖 retainRatio |
| maxSummaryTokens | 2048 | 摘要生成上限 |
| compactionRetries | 2 | 压一次没降到阈值以下时的重试次数 |
| maxOverflowRetries | 2 | 撞到上下文窗口上限后的重试次数 |

摘要

| 键 | 默认 | 说明 |
| faithful | true | 高保真:数字、路径、命令、约束逐字保留 |
| summaryLanguage | auto | auto 时按会话里中文占比决定摘要语言 |
| summaryCacheSize | 32 | 相同历史块的摘要缓存条数 |
| summarizationProvider / summarizationModel | '' | 指定摘要用的模型;留空则跟随会话当前路由 |

工具输出压缩

| 键 | 默认 | 说明 |
| enableToolCompression | true | 开关 |
| maxToolOutputTokens | 2000 | 超过这个估算值才压 |
| minToolOutputTokens | 400 | 低于这个值不折腾 |
| targetToolOutputTokens | 1100 | 压缩目标,压不到就继续加严 |
| jsonMaxStringChars | 400 | JSON 里单个字符串值的截断长度 |
| jsonHeadItems / jsonTailItems | 20 / 5 | 数组保留的头尾元素数 |
| logHeadLines / logTailLines | 15 / 20 | 日志固定保留的首尾行数 |
| logMaxIssues | 40 | 最多保留多少条 ERROR / WARN |
| logContextLines | 3 | 错误行后面跟几行堆栈 |
| tableHeadRows / tableTailRows | 15 / 10 | 表格保留的首尾行数 |
| textHeadChars / textTailChars | 1200 / 800 | 长文本保留的首尾字符数 |
| textExtractSignals | true | 从被省略的中段里挑出含路径 / 命令 / 数字的句子 |

可逆取回

| 键 | 默认 | 说明 |
| enableCCR | true | 关掉就不可取回了,脚注会写明 |
| ccrMaxEntries | 100 | 条目上限,超出按 LRU 淘汰 |
| ccrMaxBytes | 10485760 | 总字节上限 |
| ccrTtlMs | 3600000 | 存活时间 |
| ccrPersist | true | 是否落盘(默认写到 ~/.dsh/context-guard/ccr) |
| ccrStorePath | ~/.dsh/context-guard/ccr | 落盘目录 |
| retrieveMaxChars | 60000 | 单次取回最多返回多少字符,更长的用 offset 分页 |

其它

assemblyEnabled、noticeEnabled、reservedOutputTokens、systemPromptTokenFallback、logLevel。

配置写错会在加载时直接报错,比如:

dsh-context-guard config: retainRatio — must be smaller than thresholdRatio (0.8 >= 0.8)

压缩策略

JSON:先去掉多余空白;还超预算就截断长字符串(留首尾);再超就抽样数组,但会留下 __context_guard_omitted_items 说明省略了多少条。键名一律不缩写——缩写省不了几个 token,却会让模型猜错字段含义。

日志:连续重复的行折叠成 … (x214),ERROR / WARN 连同后面的堆栈整行保留(含时间戳),首尾固定保留。

表格:Markdown 表格和 CSV / TSV 都认,保留表头 + 首尾行,中间写 ... (N rows omitted) ...。

长文本:留首尾,中段按「路径 / 命令 / 数字 / 约束词 / 代码特征」挑几句高信号的留下。

历史摘要走双通道:模型按固定 JSON 结构产出摘要;同时另一条正则通道把数字、金额、日期、路径、URL、命令、标识符、约束句提取出来,无条件并进最终摘要。就算模型那次调用完全失败,这条通道也保证关键事实不丢——这就是 faithful: true 的实际含义。

摘要与替换消息严格遵守 DSH 的 durable 协议(compaction/start → compaction/summary → 紧邻的替换 user/message → compaction/end),并且有一道收缩门限:摘要没比被替换内容更小就直接失败,避免越压越长。

开发

npm test # 52 个测试
npm run typecheck # tsc --noEmit
npm run build # 产出 dist/
npm run dev # dsh --patch ./cordis.patch.yml

测试里有 5 个跑在真实 DSH 运行时上(真 cordis、真 ToolRuntime、真 Session、真 CompactionEngine):插件挂载、工具输出压缩与取回往返、durable 事件顺序、收缩门限失败路径、pre-step 提示注入。@deepseek-ai/ 装不上时会自动跳过这几个用例并说明原因,所以离线环境 npm test 仍然可用。

源码用 .ts 后缀互相 import,node --test 可以直接跑源码;构建时由 rewriteRelativeImportExtensions 改写成 .js。因此需要 Node 22.6+(类型剥离)和 TypeScript 5.8+。

版本要对齐:本项目对的是 @deepseek-ai/dsh-@0.2.0-rc.2 与 cordis@4.0.4。peer 版本写错的话,安装时会被 DSH 的兼容性闸门拦下来。

已知限制

1. 动态组装层不能重排历史——agent/pre-step 只看得到本步骤的 inbox 消息,完整历史归压缩层管。想更省窗口就调 thresholdRatio / retainRatio。
2. 摘要质量取决于模型。成本敏感的话用 summarizationProvider / summarizationModel 指一个便宜的路由。
3. CCR 是进程内缓存 + 可选落盘,不是分布式存储。
4. 取回上限是 retrieveMaxChars,更长的原文需要模型自己分页。
5. 把 faithful 关掉会明显更省 token,但模型更容易在被省略的细节上编。

License

MIT
预览分享卡片长什么样 ↓woody20100715-collab/dsh-context-guard
分享 · DeepSeek Harness Hub
woody20100715-collab/dsh-context-guard

按内容类型压缩工具输出,原文可随时取回

回到顶部