YuanyuanMa03/dsh-funnel
Curate tool output before it enters the model's context — keep error/warning lines and head/tail, spill the full text with a pointer. ~24x smaller model view, measured. For DeepSeek Harness.
已收录
0
Tools
Bundle 已验证
预览
功能介绍
摄入时点的工具输出治理:保留 error/warning 行与头尾,全文落盘留指针供模型按需读回;覆盖所有返回文本的工具,小结果原样通过。
适合
- 工具输出冗长并在后续请求中反复占用模型上下文的长 DSH 会话。
- 运行嘈杂测试、Shell 命令、搜索、抓取或文件读取,通常只需错误行和头尾内容的工作流。
- 希望全文落盘以供模型按需读回和审计的团队。
- 需要按工具配置阈值、保留模式和治理强度的用户。
不适合
- 工具结果通常低于阈值的工作流收益有限;小结果会原样通过。
- 要求每个长结果都完整内联在模型上下文、不能按需读取落盘全文的用户不适合。
- 希望压缩错误结果的工作流不适合,因为错误结果会被刻意保持原样。
- 不允许写入落盘文件的环境不适合,除非显式关闭 spill。
README
dsh-funnel
| English | 中文 |
Curate tool output before it enters the model’s context — keep the lines that matter, spill the rest to disk with a pointer. Faster turns, smaller context, sharper attention, for every tool.
The problem
Every tool result is appended to the conversation and re-sent on every subsequent model request. A npm test run that prints 500 lines rides along for the rest of the session: you pay for it on each turn, it fills the context window, and it buries the one AssertionError the model actually needs.
The existing layers don’t cover this:
| Layer | What exists | What it doesn’t do |
|---|---|---|
| Capture (executor) | 64 MB spill protects the process from OOM | nothing about what the model sees |
| Execution (bash only) |
maxOutputBytes byte-cap, head truncation |
shell tools only; blind cut, no error lines kept |
| Compaction time | official tool-result-pruner rewrites over-budget results on the surface |
fires only when compacting; blind head/tail; model can’t read the original back |
| Ingestion — every result, immediately | — | ← dsh-funnel |
Compaction-time pruning cleans up after the budget is already blown; dsh-funnel keeps it from being blown. They compose.
What you get
- Install and forget. One command, zero configuration. The plugin covers every tool that returns text — bash, file reads, web fetch, search — and results under the threshold pass through byte-identical, so you never notice it until it saves you.
-
A ~24× smaller model view, measured. In a real headless session, a 2001-line (8,893-byte) bash result reached the model as 370 characters: head, tail, and every error/warning line kept:
- [2001 lines of raw output] + [dsh-funnel] output curated: 2001 lines → 40 kept (head 15, tail 25, 0 pattern-matched). Full output: .dsh-funnel/2026-08-15T09-21-56-548Z-bash-1.log + 1 … 15 + [dsh-funnel] … 1959 similar lines omitted … + 1977 … 2000Every later turn in the session pays for 370 characters instead of 8,893 — the saving compounds each request.
-
Nothing is lost, and the model recovers on its own. The full text spills to
.dsh-funnel/and the notice carries the path. In testing, the model missed a middle line in the curated view, searched the spill file itself, and answered correctly — curation is pagination, not deletion. The spool doubles as an audit trail of what the agent actually saw. - Long tasks hold up better. Smaller context means cheaper turns, later compaction, and less attention dilution — the agent stays sharp deeper into a session instead of degrading as junk accumulates.
- Tune it to your workflow. Threshold, kept lines, keyword patterns (add your project’s own failure markers), per-tool aggressiveness, spill on/off.
Boundaries: error results are never touched (they are short and load-bearing); this complements compaction rather than replacing it.
How it works
dsh-funnel wraps the tools/execute extension point (the seam the official timeout guard uses) and curates the canonical value of successful results: the registry re-projects model-facing content from value, so the curated view is exactly what the model sees and what the session log records. Long string fields inside value — stdout, stderr, fetched pages, file contents — are replaced in place; error results are never touched.
Install
dsh plugin add github:YuanyuanMa03/dsh-funnel
Works on every tool that returns text — bash, file reads, web fetch, search.
Configuration
All fields optional; set them under the plugin entry in your profile:
- id: dsh-funnel
name: 'dsh-funnel'
config:
maxChars: 4000 # results at or below this length pass through untouched
keepHead: 15 # lines kept verbatim from the head
keepTail: 25 # lines kept verbatim from the tail (errors usually live here)
keepPatterns: [error, warn, fail, fatal, exception, assert, denied, panic]
maxLineChars: 1000 # single oversized lines (minified/JSON) are capped
spill: true # write the full text to disk and reference it
tools: # per-tool overrides
web_fetch: { maxChars: 2000 }
Safety properties
- Error results are never touched — they are short and load-bearing.
- Lossless at the disk level — spilling keeps the full text; the model re-reads on demand.
- Model-visible ⟺ logged — the curated view replaces the result at the tool seam, so the session log records exactly what the model saw.
-
Byte-identical passthrough — results under
maxCharsreturn as the same object; zero allocation when idle.
Status
v0.1.0 — verified end-to-end in a real headless session: a 2001-line bash result was curated to 40 lines in model view and log, and the model recovered the omitted middle by reading the spill file (its own words: “the tool curates long output for display … verified against the complete saved output”). Unit tests cover the curation logic and the plugin wrapper. Planned: session-level savings accounting (“this session: N tokens avoided”).
License
常见问题常见问题
在启用了 DSH 的终端中执行已验证命令 dsh plugin --profile default add github:YuanyuanMa03/dsh-funnel。命令会解析公开 package 元数据,并保持插件与本页展示的目录身份一致。
兼容性以页面上展示的 bundle 与 profile 状态为准。如果某个 profile 尚未检测到,请先保持禁用,并在生产启用前阅读仓库文档。
GitHub 链接和 activity 元数据是 release 与维护状态的来源。新版本发布后重新查看本页,确认目录已经观察到最新版本。