dsh-cross-session:让顶层 DSH 会话之间互发消息、文件与读取记录

前言

在 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_* 下,分工明确。

  1. cross_session_list:列出其他会话,返回精确的 id / title / cwd / state。可以用名字解析「session B」「那几个 C/D/E 会话」。
  2. cross_session_send:向一个或多个会话发送消息和真实文件附件。目标是被唤醒后按它自己的正常 turn 继续工作。
  3. cross_session_read:读 peer 的原始 transcript——用户消息、助手回复,可选工具调用与结果。冷启动的会话也能读。
  4. cross_session_search:在 peer 的整段对话里做字面量搜索,所有词项必须同时出现在一条消息里。
  5. cross_session_wait:等到一个或多个 peer 完全空闲,然后从它的日志里取回它自己的最终助手消息。

后两个工具是关键所在。验收方式是读对方自己的对话记录,而不是信任它回传的摘要。这就是「派发后祈祷」和真正的跨会话协作之间的差别。

安装与启用

前置条件:DSH 0.2.x(桌面版或 dsh web)。插件 0.1.2,要求 Node >= 22.19.0。

先看官方推荐的插件管理器方式,再给 CLI 方式。

方式一:DSH 插件管理器(推荐)

  1. 先拿到包:从 GitHub release 或仓库 dist/ 下载 dsh-cross-session-0.1.2.tgz。
  2. 打开 DSH → Settings → Plugins,从本地 tarball 路径、含 package.json 的本地目录,或 GitHub URL 安装。
  3. 重启一次 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 能跨会话找需求、交文件、回收结果并自行核对,而不是靠复制粘贴上下文。

几点注意:

  1. 插件以当前 DSH 进程的权限运行,能读能写的就是宿主能读能写的范围。安装前应检查源码(lib/、cordis.patch.yml)与许可证(MIT)。
  2. 它只作用于同 profile 内的顶层会话,不替代子 agent;需要子 agent 的轻量并行时仍然用子 agent。
  3. 验收依赖 transcript 读取,若 peer 会话被清理或历史超出上限(maxTranscriptChars / maxEvents),可能读不到完整内容。
  4. 目录站 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
羽毛球分组比赛记分
小程序二维码

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

小夜