dsh-session-mail: Cross-Session Proxy Communication within a DSH Host

前言

在 DeepSeek Harness(DSH)里开多个会话时,常见做法是人工复制粘贴上下文,或在会话外自己写脚本调宿主 API。同一台机器上若有两个会话各自跑代理,它们默认互不可见:A 会话里的模型无法直接让 B 会话里的模型继续某段协作。

dsh-session-mail 把这件事收成插件提供的工具:一个会话中的代理可以向同一宿主上另一个会话的代理发消息,对方按约定回信。下面介绍它的定位、能力与安装用法。

这是什么

dsh-session-mail 由社区维护者 BJ1919810 发布,在 SkillHub 目录中归类为「工作流」。插件版本为 0.1.0,许可证 MIT;package.json 中声明与 DSH 0.2.0-rc.2 兼容。

一句话定位:Cross-session messaging for DeepSeek Harness —— 一个会话的 agent 向另一个会话的 agent 投递消息。投递是单向的;若要回复,收信方再次调用同一工具,并把 toSessionId 设为来信 From 行里的发送方 session id。

核心功能

发信工具 send_session_message

代理通过该工具向目标会话投递文本。插件会在正文前加上固定格式的抬头,并附带邮件元数据行。

参数 类型 含义
toSessionId string 目标会话 id,格式为 session-<32 位十六进制>。回信时使用 From 抬头中的 id。
message string 要发送的正文;插件会自动 prepend From 抬头。
urgent boolean 默认 false:排队,等目标当前 turn 结束后再投递。true:在当前 turn 的下一步边界插入(steer)。

收信方看到的是普通 user 消息,形状如下:

From <sender session id> :
<what the sender says>

第一行是发送方 session id,模型从工具说明中得知这是另一代理来信以及回信地址。每条消息在 From 之下还有 [mail m-xxxxxxxx …] 元数据行,用于 replyTo、thread、supersedes 等扩展参数(同 thread 未送达前重复发送会被 dedupe;supersedes 可撤回仍排队中的旧信,已落地的无法改写)。

只读窥视 read_session_info

读取其他会话信息,不会唤醒目标会话,也不会向目标投递任何内容。

参数 类型 含义
sessionId string 目标会话 id。
what title | last_reply | last_present | status | all 要取的字段;默认 all(不含 status,因 status 需单独指定)。
  • title:来自 session/projections 的会话标题。
  • last_reply:上一完整 turn 的最后一条 assistant 回复。
  • last_present:该会话最后一次 present 工具调用声明的交付物。
  • status:对端是否 busy、排队情况、最近收/发邮件 id 等。

冷会话(代理未在跑)也可查:文档说明 session/projections 与 session/page 在实测中均能返回标题与事件。

urgent:排队与打断

urgent 宿主模式 收件箱目标 大致落地时机
false(默认) queue next-turn 目标当前 turn 结束后,成为下一 turn 的第一步
true steer next-step 目标当前 turn 的下一步边界

README 中的选用原则:若本条消息会使对方已经收到的 earlier 指令失效(纠错、撤回、结论变更),应设 urgent: true;普通回复、澄清或不矛盾的新请求用默认排队即可。Steer 不能抢占已在执行的前台 tool call,但后台任务不阻塞 turn 内的 step 边界。

开关与可观测性

在 Settings → Plugins 中条目名为 dsh-session-mail,可热切换;关闭后工具从工具表卸载,已运行的 turn 继续,但无法再发信。

程序侧区分「插件投递」与「人类输入」:正文看 From session-… 前缀;事件日志可读 data.source.rpcId,插件投递为 dsh-session-mail:<uuid> 形式。落地证据是 user/message 且正文以 From session- 开头,而非仅看发送方的 tool/call。

安装与启用

取得插件包源码目录后(例如从 GitHub 仓库 或 SkillHub 目录页 指引获取),在该目录执行 README 给出的安装命令:

node scripts/install.mjs --profile <DSH_HOME>/profiles/desktop

这一步会写入 profile 依赖、把包加入 dsh.profile.bundles,并在 profile 的 node_modules 中建立链接。README 说明:新装插件通常不需要重启 DSH;profile 变化后宿主会重算配置树,下一回合即可在工具表中看到 send_session_message。若修改的是已加载插件的源码,则需要重启才能重新 import 模块。

运行环境:package.json 要求 Node ^22.19.0 || >=24.0.0(DSH 自带运行时以 Node 24 为常见情况)。

安装后还应在 Settings → Plugins 中确认 dsh-session-mail 为启用状态。

典型用法

1、确定目标 session id

README 明确:不要用 session/list 拉全量 projections(易撑爆上下文)。应查看会话目录,例如 ~/.dsh/sessions/ 下对应 profile 的 session-<id>/session.v4.jsonl.zstd,按最近修改选取 id。

2、从会话 A 发信到会话 B

在 A 的代理 turn 中调用 send_session_message,例如:

  • toSessionId: session-<32 hex>(B 的 id)
  • message: 协作说明或任务描述
  • urgent: 是否需要打断 B 当前 turn(默认 false)

3、在 B 中回信

B 的代理收到形如 From session-… : 的消息后,再次调用 send_session_message,toSessionId 填抬头中的发送方 id,message 写回复内容。可选 replyTo 引用 [mail m-…] 中的 id。

4、发信前了解对端状态(可选)

调用 read_session_info(sessionId, "status") 查看 busy、queuedNextTurn / queuedNextStep 等,再决定 urgent 与措辞。

5、收信方尚未挂载工具时的回退

若消息已到但工具表还没有 send_session_message,README 提供 CLI 回退:通过 dsh-api.mjs 调用 session/prompt,手动写入完整 From <你的 session id> :\n<正文>,并自行 mint requestId。这与插件自动加抬头的行为不同,需严格遵循文档中的 payload 示例。

适用场景与注意

适合谁: 在同一 DSH 宿主上并行多个会话、希望代理之间传递任务分工、审查意见或状态同步,而不想每次由人工中转的开发场景。

边界(来自 README):

  • 目标会话必须与发送方在同一宿主;另一应用实例有独立会话空间。
  • 同一时刻一个会话只跑一个 turn;默认排队消息在 turn 结束后送达。
  • 插件依赖宿主挂载 web server(desktop / web profile)。

安全与权限: 插件以当前 DSH 进程权限运行,可代表代理向其他会话注入 user 消息并读取会话投影。安装前应阅读 源码与 LICENSE,确认行为符合你的信任边界。SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件是其中一条工作流扩展,而非内置能力。

结尾

dsh-session-mail 把「会话 A 的 agent 对会话 B 的 agent 说话」固定为两个工具:发信、只读读会话。配合 urgent、thread 与 supersedes,可以在不离开 DSH 的前提下做轻量跨会话协作。

  • 目录页:https://www.skillhub.cn/plugins/BJ1919810/dsh-session-mail
  • 源码与完整说明:https://github.com/BJ1919810/dsh-session-mail
羽毛球分组比赛记分
小程序二维码

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

Xiaoye