@ray1270/dsh-task-stack:为 DSH Agent 提供可持久化的多步任务栈

前言

在 DeepSeek Harness(DSH)里跑 Agent,常见痛点是:一轮请求里往往藏着好几个可分开交付的目标,对话又长,上下文一压缩,模型很容易「忘了」当前要对用户负责的是哪一层目标、前面已经关掉了哪些子任务。靠系统提示词硬塞「当前任务」会占 token,而且和用户真实的多步栈结构对不上。

@ray1270/dsh-task-stack(维护者 Ray1270,社区目录分类为「记忆」)给 Agent 提供一套显式的任务栈:用三个工具 push / pop / 查看焦点,状态以纯文本 JSON 落在会话工作区;不自动注入系统提示或上下文——Agent 不调用就不额外花 token。npm 包版本见 @ray1270/dsh-task-stack(资料中 package 为 0.2.0)。

这是什么

一句话:给 DeepSeek Harness Agent 用的可持久化、按会话隔离的任务栈,配合人用斜杠命令 /focus 排查或手工收尾。

  • 跨上下文压缩:状态在磁盘,压缩对话不丢栈。
  • 跨会话恢复:同一 sessionId 与 cwd 重新挂载可读回同一文件。
  • 零自动注入:不写系统提示、不注入上下文。

状态文件路径:<session-cwd>/<stateDir>/<sessionId>.json(默认 stateDir 为 .dsh/task-stack)。

三个 Agent 工具

模型侧工具描述按「何时该用 / 不该用 / 返回什么」编写。

focus_task(description)

把一行任务描述压到栈顶;原先 active 的任务变为 paused。返回新栈深度与栈顶任务。

  • 该用:交付需要多步,尤其一个请求里多个可分离目标时;推最外层要对用户负责的目标,不是内部每一步。
  • 不该用:单轮问答、栈顶内部的例行步骤、复述用户消息。
  • 栈深达到 maxStackDepth 时拒绝并说明原因,不抛异常。

focus_complete(conclusion)

弹出栈顶,记下结论,下一层重新 active。返回被关闭的任务、重新激活的任务、剩余深度。

  • 该用:栈顶多步工作已完成、产物已落地,且在写最终答复之前调用。
  • 不该用:放弃、暂停、改名;目标变了应改述栈顶而非挂着不关。
  • 空栈时拒绝,提示本次工作未 push 过任务。

read_focus()

以 markdown 返回完整栈(active + paused)与最近若干条已完成记录。

  • 该用:上下文压缩后、恢复会话、用户问「在做什么」、决定 push 还是 complete 之前。
  • 不该用:每步都调;近几轮仍能看到焦点时不必要。
  • 本插件不注入提示词,这是 Agent 侧查看任务栈的主要途径。

典型嵌套关系(来自 README 示例):

focus_task("给 CLI 加 JSON 导入命令")
   └─ 遇到需要单独完成的多步目标 → focus_task("顺便把导入的错误提示改掉")
        └─ focus_complete("错误提示已改,附带单测")
   ← 栈顶回到 "给 CLI 加 JSON 导入命令",重新变 active
focus_complete("导入命令已加,冒烟测试通过")

/focus 斜杠命令(人用,不消耗模型 token)

除三个工具外,插件注册 /focus,直接作用于当前会话任务栈。

输入 作用
/focus 打印任务栈(active/paused + 深度)与最近历史
/focus done <结论> 关闭栈顶并写入 history,等价于 focus_complete
/focus clear 清空整个栈;每个被清任务记入 history(结论为 cleared via /focus)

/focus clear 空栈时幂等;/focus done 在空栈时会明确提示栈为空。

安装与启用

DSH 生态里插件通常通过 profile bundle 安装;重启 DSH Desktop 后新会话即可让模型调用三工具并使用 /focus。

推荐从 npm 安装:

dsh plugin --profile desktop add @ray1270/dsh-task-stack

安装后,dsh plugin add 会把包放进 profile 的 node_modules,并登记到该 profile package.json 的 dsh.profile.bundles;profile 应用包内 cordis.patch.yml,加载行 name: @ray1270/dsh-task-stack 从 profile 的 node_modules 解析。

开发调试可用启动器 overlay(免安装,注意 --patch 写在 profile 名之前):

dsh --profile web --patch ".\dev.patch.yml" --no-open

常见误写:dsh web --patch x.yml(web 子命令不认识 --patch),应使用 dsh --profile web --patch x.yml。

配置(可选)

在 profile patch 层对应插件条目的 config: 下配置;Cordis 在插件启动之前校验,越界会拒绝加载并在启动日志指出字段。

字段 默认 含义
stateDir .dsh/task-stack 状态目录,相对会话工作区
maxStackDepth 20 栈上最多同时打开的任务数
historyLimit 100 完成记录上限,从最旧裁剪
statePruneDays 0(0 = 不清理) 加载时删除超过 N 天未写入的会话状态文件

示例:

- insert:
    - id: @ray1270/dsh-task-stack
      name: @ray1270/dsh-task-stack
      config:
        stateDir: .dsh/task-stack
        maxStackDepth: 20
        historyLimit: 100
        statePruneDays: 30

Web 组合下的只读快照

在 dsh --profile web 下,插件额外注册只读 HTTP 端点,供 GUI 读取任务栈:

GET /api/dsh-task-stack/snapshot?sessionId=<id>&cwd=<绝对路径>

返回 JSON 含 depth、top、stack、history、warnings 等;未认证或 Host 不在信任范围会 401/403;无 connection 服务时 503(失败关闭)。端点只读,写入仍走 focus_complete 或 /focus。

适用场景与注意

适合:长对话、多目标嵌套、需要上下文压缩后仍能恢复「当前焦点」与已完成结论的 Harness Agent 工作流。

注意:

  1. 插件以当前 DSH 进程权限读写工作区下的 JSON;安装前请查看 GitHub 源码 与 MIT 许可证,确认符合你的安全策略。
  2. 依赖 Node 引擎:^22.19.0 || >=24.0.0(见 package.json)。
  3. 社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标等元数据以各站点为准(线索中为 GitHub 2 stars)。

链接

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

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

Xiaoye