前言¶
在 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