dsh-taskfold
Wraps work in named tasks and, once a task closes, folds its whole span of messages into one summary at the next step boundary; the original content can be restored on demand.
Install
dsh plugin --profile web add dsh-taskfold
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
<p align="center">
<img src="https://raw.githubusercontent.com/yindf/taskfold/master/assets/banner.zh.png" width="100%" alt="taskfold —— 给你的编程智能体,近乎无限的上下文" />
</p>
<p align="center"><b>给你的编程智能体,近乎无限的上下文</b></p>
<p align="center">
<a href="README.md">English</a> ·
<a href="https://github.com/yindf/taskfold/releases/latest">Releases</a> ·
<a href="CHANGELOG.md">更新日志</a>
</p>
<p align="center">
<a href="https://github.com/yindf/taskfold/releases/latest"><img src="https://img.shields.io/github/v/release/yindf/taskfold?style=flat-square&color=4c8dff" alt="最新版本"></a>
<a href="https://www.npmjs.com/package/dsh-taskfold"><img src="https://img.shields.io/npm/v/dsh-taskfold?style=flat-square&color=cb3837" alt="npm"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="MIT 许可"></a>
<a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DeepSeek%20Harness-plugin-4c8dff?style=flat-square" alt="DeepSeek Harness 插件"></a>
</p>
让长时间的 AI 编程会话保持快速、便宜、可读:完成的工作被折叠成一条短摘要,完整原始内容随时一条命令取回。
面向 DeepSeek Harness(DSH)。
当前支持的最新 dsh 版本:0.2.1-rc.5。 dsh 的 rc 版本在本分支(master)支持;dsh 的 alpha 版本在alpha分支支持。
快速开始
在 dsh Desktop 里安装(推荐)
1. 打开 dsh Desktop,在侧边栏进入 插件 页。
2. 点右上角的 添加插件。
3. 在 包名或地址 一栏填 dsh-taskfold——安装框自己调 pnpm,不用你手工装依赖:
- 想在新版本一发布就装上?钉住它——
dsh-taskfold@<版本>(版本号从 npm 版本列表 取)。dsh Desktop 自带的 pnpm 11 会让发布不满 24 小时的版本对裸包名不可见,显式写版本即可绕过,pnpm 还会把它记进 profile 的minimumReleaseAgeExclude。0.37.7 与 0.38.0 千万别装——它们从注册表装不上(ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND),npm 上已标记 deprecated; - 完全绕过 npm:直接粘最新 Release 里预构建的
.tgz直链,tarball 不受发布时长策略限制; - 跟分支走:
github:yindf/taskfold#master(rc 通道)/github:yindf/taskfold#alpha(alpha 通道),要求本机能直连 GitHub; - 本机路径必须指向副本,绝不能指向你的工作检出:装进来的目录,插件管理器会当成自己的(会在旁边留下
dsh-taskfold.frozen-*.bak快照,升级时整个替换)。
4. 安装源 保持「默认安装源」;中国大陆网络若拉取失败,改选「中国大陆镜像源」再试。
5. 点 安装,等它显示「已安装,下次启动后加载。」,再点 立即启用。
6. 重启 dsh Desktop——插件组合只在启动时求值。重启后回到 插件 页,应看到 Taskfold 卡片写着 包含的组件 · 共 2 个 · 2 运行中(taskfold 与 taskfold-client 两行);折叠下限与任务栏开关就在这张卡片里(见[设置](#设置))。
7. 升级请先 卸载 再装新版:界面明确说明暂不支持自动更新;卸载后它提供的功能即消失。
这个安装框做的和下面的命令行是同一件事:把依赖与 bundle 条目写进当前 profile(dsh Desktop 用 desktop),此外不需要任何手工配置。
用命令行安装
dsh plugin --profile <profile 名> add 就是上面对话框的命令行等价物。desktop 是 dsh Desktop 的 profile,web 是 DSH Web GUI 的——按你实际跑的那个改:
# npm 上的最新发布 dsh plugin --profile desktop add dsh-taskfold # 钉住某个版本——发布不满 24 小时时必须钉;0.37.7 / 0.38.0 装不上 dsh plugin --profile desktop add dsh-taskfold@<版本> # 跟某个通道的分支(引号不能省:# 在 sh 里是注释) dsh plugin --profile web add "github:yindf/taskfold#master" dsh plugin --profile web add "github:yindf/taskfold#alpha"
无论走界面还是命令行,装完都要重启 dsh。
通道、npm 包与支持范围
npm 上的 dsh-taskfold 是预构建包——免去 dsh 的 allowBuilds 构建授权;0.37.6 起由发布流程发布,但只发 rc 通道(master):alpha 通道的发版只出 GitHub Release,从不进 npm。裸包名因此跟随 rc 通道的最新版本;要确定性就用 @版本 钉住,或直接填分支的 Git 地址。
master 分支承载 rc 通道、alpha 分支承载 alpha 通道:本分支记录 rc 通道的支持范围(见[支持的 dsh 版本](#支持的-dsh-版本)),alpha 通道的记录在 alpha 分支的 README。
重启 dsh——该 profile 下的每个会话都拥有这些工具。之后智能体用命名任务包住自己的工作:
task_begin("修复登录 bug") … 干活 … task_end("修复登录 bug")
整段来回就此折叠成一条带标题的摘要,fold_recall 随时能读回原始内容。
它解决什么问题
长会话会被自己的历史淹没:每个请求都在重发几小时前就完成的工作——旧的工具输出、调试日志、失败的尝试。成本越滚越高,模型注意力被稀释,上下文窗口迟早被塞满。
taskfold 用“好笔记本”的方式解决:干活前,智能体先用 task_begin("修复登录 bug") 开一个任务;做完后 task_end 关闭任务,同时把整段来回替换成一条带标题的短摘要:
之前: [800 条原始调试消息……]
之后: 「修复登录 bug」— 摘要:试了什么、为什么失败、改了什么、
用户拍板了什么。(约一屏)
会话保持可读,每个请求都更便宜,模型带走的是经验而不是流水账。
什么都不丢。 每次折叠都会把原始消息原样存成文件,fold_recall({ fold: N }) 随时能重新生成。先折叠、后查阅——像合上一本随时能翻开的书记。
与 dsh 内置压缩的关系
同一个目标,不同的时机——两者可以叠加。
- dsh 内置压缩是自动的、由压力驱动的。 它在窗口快满时触发,按 token 压力选出一段区间替换成摘要;原始事件仍留在会话日志里,只是被 shadow 掉,而不是删除。
- taskfold 是显式的、按任务划分的。 每完成一个任务就顺手折叠一次,摘要是趁那一段还在上下文里时写下的——天然准确——而且带标题,会话始终可导航。
- 因为你折叠得早,窗口很少被塞满。 下面实测会话的峰值是 20.7% 而不是 59.5%,于是压力压缩要么更晚触发、要么根本不触发;真触发时,需要总结的东西也更少。
- 每一次折叠都可寻址。
fold_recall({ fold: N })取回的是原始消息,不是二手摘要。
原理(通俗版)
- 命名任务。 智能体开工前开任务、完工后关任务。开启状态跨重启不丢;关闭按嵌套顺序(内层先关);关闭失败不会破坏任何状态——重试即可。
- 折叠 = 关闭 + 总结,一次调用完成。 摘要在原始内容还在上下文里时一次性写好,所以准确——不是“摘要的摘要”。
- 摘要保留要紧的东西。 总结指令明确要求保留用户的关键决策与反馈(措辞重要处原文照录)、踩过的坑和为什么失败、改了什么、最终结果。
- 温和护栏。 智能体忘记纪律时,上下文里会出现一条简短提示。提示是事件而非状态:只在条件出现或措辞变化时发布一条;条件解除后什么都不发(模型已经照做了,不需要再被告知);没有包装标签、没有取代声明、也没有过期通知——流程健康时零噪音。
- 对缓存友好。 折叠只改写历史中段;稳定前缀(系统提示词、工具、更早的上下文)保持缓存命中。
省了多少(实测)
一次真实会话——411 个模型步、26 次折叠——数字直接读自 harness 自己的用量记录:
· 不折叠 · 用 taskfold
提示 token 总量 · 142,654,308 · 52,127,098(−63.5%)
单次请求最大体积 · 594,909 · 206,896(−65%)
峰值上下文窗口占用 · 59.5% · 20.7%
机制:折叠把 441,100 token 的已完成工作移出表层。这些历史本来会在之后每个请求里被重发一遍,累计下来就是 90,527,210 token 从未发出。生成那 26 条摘要本身花了 3,550,270 token(相当于节省量的 3.9%,且其中大部分是缓存读取);单次折叠最多一次性移走 40,422 token。
这些被省下的 token 大多是缓存读取而非全新输入——单价更低,但依然计费、依然占窗口。会话再长一些,这就成了「还在窗口内」和「已经塞满」的区别。
一次会话、一种任务形态——你的数字会不同;关键是机制:完成的工作离开表层,稳定前缀持续命中,模型带走经验而不是流水账。
它添加了什么
四个智能体工具(加上上述提醒机制):
工具 · 一句话
task_begin({ name }) · 开一个命名任务。
task_end({ name }) · 关闭它,并把整段折叠成一条带标题的摘要。
list_folds · 列出全部折叠(编号、大小、标题)。
fold_recall({ fold }) · 按需取回任意折叠的原始内容。
在 Web GUI 中,当前打开的 task 栈还可以以常驻 dock 显示在输入框上方(和 todo 面板一样)——默认隐藏,在插件页用 showTaskBar 打开:外层任务在前、最内层高亮,附带 folding/pending 计数——直接读会话的 taskMarks 投影,不追加任何事件。
<img src="https://raw.githubusercontent.com/yindf/taskfold/master/assets/screenshot-tasks.png" width="100%" alt="常驻输入框上方的任务栈:嵌套的打开任务、最内层高亮,每个已结束任务各占一行 folding">
<img src="https://raw.githubusercontent.com/yindf/taskfold/master/assets/screenshot-tasks-collapsed.png" width="100%" alt
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::15,最后更新 2026-11-03