@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)。

鏈接

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

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

小夜