前言¶
用 DSH 做任務委派時,父會話把活兒交給子 agent,但消息回傳經常卡住。DSH 核心的 send_message 只允許「常駐可續子 agent」向「直接父會話」發消息,而父會話那邊看到的 send_message 常常已經被實驗性 team 工具的 {target, message} schema 覆蓋,核心的 {agent_id, message} 同名工具反而叫不到。實際後果是:子 agent 能彙報,父會話回覆不了;workflow 的 agent() / pipeline() 子 agent 是一次性執行,沒有續接激活,核心通道直接失敗;嵌套子 agent 只知道 root 或祖父 id,而核心只接受直接父子。
老辦法是把結果寫進磁盤讓父會話自己讀。這能用,但那不是消息。下面介紹 zhyunran 維護的 dsh-subagent-parent-message,它用兩個帶命名空間的工具把雙向通道補上,不引入第三個 send_message 衝突。
這是什麼¶
一個 DSH 插件,分類「工作流」,當前 GitHub 1 stars,開源,MIT 協議。它不改 DSH 核心的授權邏輯,而是補兩個工具:subagent_parent_message(子 → 直接父,支持一次性子 agent)和 subagent_send_message(父 ↔ 直接可續子,父側的可命名通道)。適用於 DSH 0.2.x。
核心功能¶
subagent_parent_message:子 agent 向直接父彙報¶
subagent_parent_message({ "message": "self-contained progress or result" })
subagent_parent_message({ "message": "...", "mode": "steer" })
參數說明:
message:自包含的進度或結果文本。mode:followup(默認)會排隊一次新的父會話輪次,能喚醒閒置的父會話;steer會在父會話正在運行時注入到下一步。
實現上不需要父 id:工具從子 agent 自己的 Session header 裏取 session.header.parentSession,解析出直接父。然後走活的父 Agent,或 sessionController.resolveAgent 冷恢復,再調用 agent.followup / agent.steer 並 ctx.sessions.flush。因爲不依賴續接激活,workflow 一次性子 agent 也能用。工具拒絕自我投遞,也不接受任意目標 id。
subagent_send_message:父會話聯繫直接可續子 agent¶
subagent_send_message({ "agent_id": "session-…", "message": "keep going" })
它是 ctx.subagents.sendMessage() 的薄命名空間適配器。subagent 服務仍然強制直接父子鄰接和常駐可續激活。用在父會話的 send_message 被 team 工具遮蔽、核心通道按名字叫不到的場景。它不能喚醒一次性子 agent;一次性子 agent 要彙報,用的是子 agent 側的 subagent_parent_message。
消息投遞形態¶
父子兩側收到的消息帶統一前綴,便於父 agent 區分這來自委派子 agent 而非人類用戶:
[Subagent message from session-…]
This is a peer message from a delegated child, not the human user. Treat it as a task update.
---
<your message>
subagent_parent_message 走 agent.followup(message)(或 agent.steer)+ ctx.sessions.flush(agent.session);subagent_send_message 委託給 ctx.subagents.sendMessage()。
安裝與啓用¶
先裝插件本體,再重啓一次 DSH,兩個工具即可全局生效,子 agent 也能看到。
dsh plugin --profile <profile> add C:\path\to\dsh-subagent-parent-message-0.1.2.tgz
# or
dsh plugin --profile <profile> add https://codeload.github.com/zhyunran/dsh-subagent-parent-message/tar.gz/<40-char-commit>
當前版本 0.1.2,要求 DSH 0.2.x。運行時無第三方依賴,peer 依賴只有 @deepseek-ai/dsh-tools(>=0.2.0-rc.1 <0.3.0)。源碼包內的 cordis.patch.yml 是 bundle patch,隨包一起發佈。
典型用法¶
父會話委派子 agent 後想追一次進度,如果當前 profile 裏 send_message 是 team 版 {target, message} 的,就用 subagent_send_message 按 agent_id 發:
subagent_send_message -> { "agent_id": "session-…", "message": "keep going" }
一次性子 agent(例如 workflow 裏 agent() 跑出的)沒有續接激活,彙報時在子側調用:
subagent_parent_message -> { "message": "finished: <result>", "mode": "followup" }
如果父會話正在跑、希望立刻看到這條消息,mode 改成 steer。兩者都是一次調用一條消息,不等待對側應答。
適用場景與注意¶
適合這幾類開發者:用 workflow / pipeline() 拆一次性子任務、需要把結果真實回傳父會話的;父會話的 send_message 被 team 工具遮蔽、想按 agent_id 聯繫直接子 agent 的;不想繼續用「寫文件再讓父讀」替代消息的。
邊界要看清:
subagent_parent_message只發直接父,不支持附件,沒有 team 郵箱;父會話必須活着或可恢復。subagent_send_message只對直接父子且子側有常駐可續激活時生效,不能替代 teamsend_message給隊友發消息。- 兩個工具都不等待回執,一次調用就是一條消息。
- 要帶文件附件用
dsh-cross-session,要給隊友發消息用agent_teams_send_message。 - 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。MIT 協議,代碼在 GitHub 公開。
- 倉庫 README 自述有 7 個單元測試(
node --test test/*.test.mjs),兩個工具都能通過真實dsh-toolsschema 編譯,README 也記錄了subagent子 → 父和workflow一次性子 → 父的 live 驗證。
小結¶
它的價值在於把 DSH 裏斷掉的雙向通道用兩個命名空間工具接通,讓一次性 workflow 子 agent 也能彙報,讓父會話在 send_message 被遮蔽時仍能聯繫直接子 agent,同時不改核心授權、不引入第三個同名工具。
目錄頁:https://www.skillhub.cn/plugins/zhyunran/dsh-subagent-parent-message
GitHub:https://github.com/zhyunran/dsh-subagent-parent-message