Repository navigation
v0.1.0 — persistent per-session task stack
首次发布
给 DeepSeek Harness Agent 用的可持久化任务栈:模型显式调用三个工具 push / pop / 查看自己的多步任务焦点,状态以纯文本 JSON 落在会话工作区里。
- 跨上下文压缩存活 —— 状态在磁盘上,压缩掉对话也不丢
- 跨会话恢复可找回 —— 同一
sessionId+cwd重新挂载即读回同一份文件 - 零自动注入 —— 不写系统提示词、不注入上下文,Agent 不主动调用就一个 token 都不花
三个工具
| 工具 | 作用 |
|---|---|
focus_task |
把一个多步目标压栈;原来的栈顶转为 paused |
focus_complete |
弹出栈顶、记一行结论、让下一层重新变 active |
read_focus |
读取整个栈与最近历史(唯一查看方式,没有自动注入) |
另有斜杠命令 /focus:查看 / done <结论> / clear,不花模型轮次。
存储
- 每个会话一个 JSON 文件:
<会话工作区>/<stateDir>/<sessionId>.json - 原子写入(tmp → fsync → rename),读者只会看到完整的旧文档或新文档
- per-file 异步锁,并发调用不会丢更新
- 文件缺失 / 读失败 / JSON 坏 / 版本不符 / 会话不符 → 退化成空栈或丢弃坏帧并附 warning,从不抛异常
配置(Cordis 在插件启动前校验)
| 字段 | 默认 | 含义 |
|---|---|---|
stateDir |
.dsh/task-stack |
状态文件目录,相对会话工作区 |
maxStackDepth |
20 |
栈上最多同时开着的任务数 |
historyLimit |
100 |
历史最多保留多少条 |
statePruneDays |
0 |
删除超过这么多天没写过的会话状态(0 = 不清理) |
越界值直接拒绝加载该插件并在启动日志指出字段,不会静默夹紧成另一个策略。
验证
- 69 项断言(store 22 / tools 18 / config 12 / commands 13 / lifecycle 4)
- lifecycle 套件把插件挂成真实 Cordis 子 fiber 并覆盖真实 ToolRuntime,证明卸载/热重载不留残留
- 加载器集成走真实的
cordis-plugin-loader
安装
dsh plugin --profile <名称> add @ray1270/dsh-task-stack