前言¶
在 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 工作流。
注意:
- 插件以當前 DSH 進程權限讀寫工作區下的 JSON;安裝前請查看 GitHub 源碼 與 MIT 許可證,確認符合你的安全策略。
- 依賴 Node 引擎:
^22.19.0 || >=24.0.0(見 package.json)。 - 社區目錄 skillhub.cn 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;星標等元數據以各站點爲準(線索中爲 GitHub 2 stars)。