dsh-subagent-parent-message:给被委派的子 agent 补上双向消息通道

前言

用 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 只对直接父子且子侧有常驻可续激活时生效,不能替代 team send_message 给队友发消息。
  • 两个工具都不等待回执,一次调用就是一条消息。
  • 要带文件附件用 dsh-cross-session,要给队友发消息用 agent_teams_send_message。
  • 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。MIT 协议,代码在 GitHub 公开。
  • 仓库 README 自述有 7 个单元测试(node --test test/*.test.mjs),两个工具都能通过真实 dsh-tools schema 编译,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

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

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

小夜