dsh-peer-message:DSH 进程内跨会话消息投递

前言

在 DeepSeek Harness(DSH)里开多个会话并行做事时,常见做法是人为切换窗口、复制粘贴上下文,或等某个会话跑完再口头交代下一步。同一 DSH 进程里,会话 A 里的智能体无法直接给会话 B 注入一条「用户消息」并唤醒 B 继续一轮推理。

dsh-peer-message 是 respawnlife 维护的 Host-only 插件,在同一 DSH 进程内向其他会话投递消息并唤醒目标会话。下面介绍它的定位、工具参数、安装方式、典型用法与安全边界。

这是什么

  • 名称:dsh-peer-message(npm 包名一致,当前版本 0.1.1,MIT 许可证)
  • 维护者:respawnlife
  • 仓库:https://github.com/respawnlife/dsh-peer-message
  • 能力:通过 peer_list、peer_send 两个工具,让当前会话把文本消息投到另一会话,并按目标状态选择 followup(新开一轮)或 steer(在运行中的下一步边界插入);不向公网发请求,不读写工作区文件,只读会话元数据(id、标题、工作目录、状态)。

DSH 0.2.x 自带 team-message / agent-message 等消息源;本插件是独立的进程内实现,只走 agents 服务,不接入官方 team 通道,可与内置能力共存。

核心功能

投递流程(概念)

Conversation A(用户正在对话的会话)
  └─ peer_send(to: "report session", message: "take care of xxx")
        └─ agents.get(sessionId).followup(userMessage)
              └─ Conversation B 收到一条用户消息并开启新回合

典型用途包括:并行会话间委派或交接任务、让另一会话做校验、任务完成后向其他会话汇报。

工具一览

工具 参数 作用
peer_list query?、scope?(workspace / all)、limit?(默认 30,最大 100) 列出可投递的会话(id、标题、工作目录、是否已加载/运行),并标记当前会话;默认仅当前 workspace
peer_send to(会话 id / id 前缀 / 标题)、message、mode?(auto / steer / followup) 投递消息并唤醒目标;成功时返回目标会话、实际使用的 mode、是否已唤醒

mode 含义:

  • auto(默认):目标空闲 → followup 新开一轮;目标运行中 → steer 在下一步插入。
  • steer:强制插入(仅目标运行中才有步骤边界)。
  • followup:强制新开一轮;若目标正在运行则降级为 steer,避免消息被吞掉。

限制:不能发给自己;单条消息正文上限 20000 字符;目标未加载时会先唤醒再投递。

消息在界面上的表现

正文会加上前缀 【跨会话消息 · 来自 DSH 会话"标题"(id)】,便于在日志里辨认来源;UI 仍按普通用户消息渲染,无单独卡片或来源徽章。

环境与依赖

  • DSH:>=0.2.2-rc.1 <0.3.0-0(0.2.x 线,含 prerelease;在 0.2.2-rc.1 上测试过;上界排除 0.3 prerelease)
  • Node.js:>=22(与 DSH 捆绑运行时一致即可)
  • 无 npm 运行时依赖,无构建步骤;Host-only bundle

安装与启用

安装前请确认 DSH 版本落在上述区间。官方 README 给出两条路径,按你当前 DSH 支持的能力二选一。

1. 用插件管理器安装目录(常规 Host-only 方式)

使用 plugin_manager 的 install_bundle,将 target 设为该插件目录的绝对路径。

  1. 在 profile 的 package.json 的 dependencies 中加入:"dsh-peer-message": "link:/path/to/dsh-peer-message"(将路径换成你本机克隆或解压后的目录)。
  2. 在 dsh.profile.bundles 中加入 dsh-peer-message。
  3. 让插件管理器完成安装;不要手写 profile 的 patch 文件。

安装完成后,该 profile 下的每个会话都会获得 peer_list / peer_send,重启后仍保留。

卸载

  • 用插件管理器 remove_bundle,或 set_plugin 且 enabled: false;或
  • 从 profile 的 package.json 的 dependencies 和 dsh.profile.bundles 中移除,然后重启 DSH。

卸载后两个工具消失,不再注入新消息;已投递到目标会话的消息不会撤回。

典型用法思路

  1. 在当前会话调用 peer_list,必要时用 query 过滤、scope: "all" 看全进程会话(列表过滤不等于权限边界)。
  2. 用返回的 id、id 前缀或标题作为 peer_send 的 to。
  3. 写好 message;需要强制行为时指定 mode。
  4. 在目标会话中把这条消息当作用户输入处理,继续原有工作流。

README 中的示例语义:peer_send(to: "report session", message: "take care of xxx"),表示从会话 A 向标题或标识为 report session 的会话 B 投递任务说明。

安全边界(安装前建议通读)

peer_send 是模型可自行触发的有副作用操作,效力等价于在进程内跨会话写入一条用户消息:

  1. 无需人工确认:运行中的智能体可在同一 DSH 进程内向任意会话投递消息;若需人工把关,应通过 DSH 的工具审批 / 权限策略限制该工具。
  2. 接收方视为用户消息:目标会话按你的输入处理,存在提示注入横向移动风险;workspace 仅影响列表范围,不是隔离边界。
  3. 唤醒消耗配额:未加载的会话会通过 host 的 sessionController.resolveAgent() 唤醒并可能开启新回合,触发模型调用、token 与工具副作用。
  4. 范围:仅当前 DSH 应用进程;无跨进程、跨机器、无网络。
  5. 信任环境:建议在可信的单用户环境启用;不要把 peer_send 暴露给不可信的提示来源(例如自动抓取的网页或外部消息通道)。

插件以当前 DSH 进程的权限运行;安装前请自行查看源码与 MIT 许可证条款。

实现要点(供排查兼容问题时参考)

Host 侧复用进程内已有服务:agents(get / list、followup / steer)、sessionQuery / sessions 列会话与标题、sessionController.resolveAgent 唤醒未加载会话。消息结构为进程内 user 消息,source.kind 为 plugin:peer-messaging。工具通过 DSH Host 插件形式 export function apply(ctx, config) 注册。

与 DSH 内部 API 的耦合无公开稳定性承诺;engines.dsh 在 package.json 中声明为 >=0.2.2-rc.1 <0.3.0-0。

结尾

dsh-peer-message 解决的是同一 DSH 进程内「会话 A 通知并唤醒会话 B」的落地问题,适合并行多会话协作、校验与回报类工作流。社区目录页:https://www.skillhub.cn/plugins/respawnlife/dsh-peer-message;源码与完整说明:https://github.com/respawnlife/dsh-peer-message。

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

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

Xiaoye