前言¶
在 DSH 里做长任务时,常见做法是开子 agent 并行干活。子 agent 启动便宜,但值得留意:它和你共享同一次 turn、同一份上下文窗口,也共享同样的失败模式。真正更稳的单位往往是另一个顶层会话——你在侧边栏能打开、能单独指定模型和工具、有自己长时间运行历史的那个会话。可问题是 agent 一直没有办法找到它。
下面介绍的 zhyunran/dsh-cross-session 就是解决这个问题的插件。它由 zhyunran 维护,给 agent 提供五个工具,让它把同 profile 下的其他顶层会话当作 peer 来用:列出来、发消息、交文件、搜历史、读结论。它不是子 agent,也不是消息转发脚本,而是一个以当前 DSH 进程权限运行的插件。
插件已在社区目录 SkillHub 收录,分类为工作流,GitHub 显示 1 stars,版本 0.1.2,许可证 MIT,要求 DSH 0.2.x。
这是一个什么插件¶
一句话定位:让一个 DSH 会话里的 agent 直接和另一个顶层 DSH 会话通信——发消息、交文件、搜它的历史、读它自己的最终回答。
它解决的是「委托后无法验收」的问题。读对方自己的 transcript,而不是相信对方回过来一个信封。README 里把它称作 peer-session development。
维护者 zhyunran,仓库 zhyunran/dsh-cross-session。DSH 的理念是「一切皆插件」,这个插件本身就是一个正常 DSH bundle,没有构建步骤,运行时仅依赖宿主的 @deepseek-ai/dsh-tools。
核心功能:五个工具¶
五个工具都挂在 cross_session_* 下,分工明确。
cross_session_list:列出其他会话,返回精确的id/title/cwd/state。可以用名字解析「session B」「那几个 C/D/E 会话」。cross_session_send:向一个或多个会话发送消息和真实文件附件。目标是被唤醒后按它自己的正常 turn 继续工作。cross_session_read:读 peer 的原始 transcript——用户消息、助手回复,可选工具调用与结果。冷启动的会话也能读。cross_session_search:在 peer 的整段对话里做字面量搜索,所有词项必须同时出现在一条消息里。cross_session_wait:等到一个或多个 peer 完全空闲,然后从它的日志里取回它自己的最终助手消息。
后两个工具是关键所在。验收方式是读对方自己的对话记录,而不是信任它回传的摘要。这就是「派发后祈祷」和真正的跨会话协作之间的差别。
安装与启用¶
前置条件:DSH 0.2.x(桌面版或 dsh web)。插件 0.1.2,要求 Node >= 22.19.0。
先看官方推荐的插件管理器方式,再给 CLI 方式。
方式一:DSH 插件管理器(推荐)
- 先拿到包:从 GitHub release 或仓库
dist/下载dsh-cross-session-0.1.2.tgz。 - 打开 DSH → Settings → Plugins,从本地 tarball 路径、含
package.json的本地目录,或 GitHub URL 安装。 - 重启一次 DSH,宿主加载新 bundle。
方式二:CLI
# 本地 tarball(必须是绝对路径,相对路径会被安装器拒绝)
dsh plugin --profile desktop add C:\path\to\dsh-cross-session-0.1.2.tgz
# 或 GitHub tarball(不要求本机装 git)
dsh plugin --profile desktop add https://codeload.github.com/<owner>/dsh-cross-session/tar.gz/<40-char-commit>
# 如果发布到 npm
dsh plugin --profile desktop add dsh-cross-session
装完同样重启一次。插件通过自身的 cordis.patch.yml 注册,不需要手动改 profile。注意这里的参数是 --profile desktop add,不是凭插件名直接 dsh plugin add github:owner/repo。
验证方式是直接问 agent:
List the other sessions in this DSH.
它应当调用 cross_session_list 并列出真实会话标题。如果工具缺失,说明 bundle 没加载,去 Settings → Plugins 检查后重启一次。
典型用法¶
以下示例来自 README 的写法,可以照着复现。
复用另一个会话的需求。用户说「把打包任务做完,要求和 session B 一致」,agent 先搜再读:
cross_session_search({ session: "ManageBac 打包要求", query: "版本号 changelog" })
拿到精确规则后自己完成,不用把整个上下文搬过去。
指挥一组会话。已知 C、D、E 各自做过这个工程的一部分,让它们把各自的部分做完:
cross_session_send({ to: ["C", "D", "E"], message: "...", expect: "transcript" })
三个 peer 会话随后开始各自工作。之后再验收:
cross_session_wait({ sessions: ["C", "D", "E"] })
然后逐个 cross_session_read 它们的 transcript,核对真实输出。
向 peer 提问。想知道之前关于安装器的决策:
cross_session_send({ to: "session-B", message: "What did we decide about the installer?", expect: "reply" })
peer 会用 cross_session_send 回过来,或者等 cross_session_wait 之后直接读 transcript。
配置¶
默认开箱可用:同一个 profile 里的任意顶层会话都可以访问任意其他会话。DSH 是本地单用户 harness,装插件本身就是授权。要收紧策略,在自己的 profile 层覆盖配置项:
# <DSH_HOME>/profiles/<profile>/cordis.patch.yml
- id: dsh-cross-session
config:
access: workspace # all | workspace | allowlist
allowlist: [] # ids, exact titles, or "cwd:<absolute path>"
denylist: [] # never listed, read or written
allowSend: true
allowRead: true
includeHeader: true
messageSource: agent-message # agent-message | user
几个关键字段的含义:
| 字段 | 默认值 | 含义 |
|---|---|---|
access |
all |
all 同 profile 所有顶层会话;workspace 仅限相同 cwd;allowlist 仅限列表内。 |
allowlist |
[] |
配合 access: allowlist,接受会话 id、精确标题或 cwd:<path>,* 匹配全部。 |
denylist |
[] |
无论哪种 access 模式都禁止,词汇同 allowlist。 |
allowSend / allowRead |
true |
可分别关闭写或读。 |
includeHeader |
true |
在消息前加发送者 id、说明这是 peer 消息、并指明回复工具。 |
messageSource |
agent-message |
agent-message 如实标注 senderSessionId,peer 界面显示为收到任务消息;user 则看起来像人发的消息。 |
其他默认上限来自 README 的两个表格:单个附件 25 MiB(maxFileBytes)、每条消息最多 8 个附件(maxFiles)、消息文本 100000 字符(maxMessageChars)、单次 read/wait 响应 60000 字符(maxTranscriptChars)、read/search 事件扫描上限 20000(maxEvents)、read 默认返回 20 条(defaultReadLimit)、search 默认返回 10 条命中(defaultSearchLimit)、默认等待预算 120 秒(defaultWaitSeconds)、硬上限 600 秒(maxWaitSeconds)。
一个安全相关的行为值得记录:配置写坏时插件不会打开访问。它会记录错误并退回 deny-all,而不是阻止 DSH 启动。
适用场景与注意¶
适合这样的人:已经在 DSH 里把长任务拆成多个顶层会话,分别配了模型和工具,希望 agent 能跨会话找需求、交文件、回收结果并自行核对,而不是靠复制粘贴上下文。
几点注意:
- 插件以当前 DSH 进程的权限运行,能读能写的就是宿主能读能写的范围。安装前应检查源码(
lib/、cordis.patch.yml)与许可证(MIT)。 - 它只作用于同 profile 内的顶层会话,不替代子 agent;需要子 agent 的轻量并行时仍然用子 agent。
- 验收依赖 transcript 读取,若 peer 会话被清理或历史超出上限(
maxTranscriptChars/maxEvents),可能读不到完整内容。 - 目录站 SkillHub 是独立站点,与 DeepSeek / 幻方无官方从属关系,插件的星标、版本、配置项以仓库 README 与 package.json 为准。
结尾¶
这个插件的价值在于把「另一个顶层会话」变成了 agent 可以真实调用的对象:发消息、交真实文件、搜历史、等空闲、读它自己的最终回答。多个会话在同一个 profile 下并行时,它比子 agent 更重,但也更可核对。仓库与目录页如下。
- 目录页:https://www.skillhub.cn/plugins/zhyunran/dsh-cross-session
- GitHub:https://github.com/zhyunran/dsh-cross-session