前言¶
DeepSeek Harness(DSH)在本地运行多个会话时,任务之间可能互相干扰:一个会话的改动会影响另一个会话的阶段,或者需要互相传递设计决策。现有方案要么只能单向消息,要么无法在阶段冲突时真正暂停对方。dsh-parallel-sessions 专为 DSH 0.2.1-rc.2 及以上版本设计,在同一个进程内协调并行会话,让它们能互相沟通、共享设计方向,并在阶段冲突时暂停/恢复对方,并在 Chat 中显示清晰的归属信息。
插件定位¶
- 名称:dsh-parallel-sessions
- 维护者:CatLollipop
- 版本:0.6.0
- 分类:工作流
- 核心价值:检测并行会话、带发起方归属的跨会话消息、阶段冲突时暂停/自动恢复。
插件参考了 dsh-cross-session-approval 和 dsh-agent-message 的设计思路,并按 DSH 0.2.1-rc.2 的 Host Service、Session 事件与 Chat 渲染契约重新实现,补上了「阶段冲突时暂停/自动恢复」的协作协议。
核心能力¶
本插件提供 4 个工具,以 parallel_ 开头,可与 cross_session_* 工具共存。
parallel_sessions¶
检测同一工作区内并行运行/曾运行过的顶层会话。返回内容包括 cs_ 别名、标题、运行状态、工作目录、暂停关系。
parallel_sessions({
include_offline: false
})
parallel_message¶
向另一个会话投递消息。默认 mode=steer 直接送达(运行中在下一步边界立即插入,空闲时立即开一轮);只有显式 mode=queue 才等对方当前整轮结束后再投递。
parallel_message({
session_id: "cs_xxxxx",
message: "把登录接口的返回结构改成统一 Result 包装",
intent: "guide"
})
接收方对话流内渲染为右侧聊天气泡(我收到的消息,正文只含消息内容,底部显示发送方/状态/时间/复制);发送方对话流内渲染为左侧「发给会话「…」」的发送块(我发出的消息)。
parallel_hold¶
当本任务会影响另一个会话的阶段时暂停它。真实停止其当前运行回合、清除其待处理队列(数量会上报),并投递带发送方归属的暂停通知。
parallel_hold({
session_id: "cs_xxxxx",
reason: "我正在重构 B 依赖的 xxx 接口",
impact: "B 的联调阶段",
until: "holder-turn-end" // 默认,在本轮任务结束时自动恢复
})
parallel_release¶
恢复被本会话暂停的会话,并投递带发起方归属的「继续工作」通知与变更摘要。
parallel_release({
session_id: "cs_xxxxx"
})
典型流程¶
- 会话 A 在推进中发现自己的改动会影响会话 B 正在做的阶段:
- 用parallel_sessions找到 B 的cs_别名;
- 调用parallel_hold({ session_id: "cs_xxxxx", reason: "...", impact: "..." });
- B 的运行回合被真实停止,B 的 Chat 中出现「暂停通知 · 来自「A」」卡片,输入区显示「已暂停 · 等待「A」完成任务」。 - A 完成任务、本轮结束 → 插件监听
turn/end自动恢复 B,B 收到「恢复通知 · 来自「A」」。 - 如果 A 只是要沟通(不是暂停):调用
parallel_message({ session_id: "cs_xxxxx", message: "...", intent: "guide" })。
别名与 cross-session 插件互通(v0.5.0)¶
早期版本使用 ps_ 别名,而同一进程里的 dsh-cross-session-approval 使用 cs_ 别名。v0.5.0 起,本插件改用与 cross-session 完全相同的 cs_ 派生算法(相同的盐与 base64 规则),因此:
parallel_sessions返回的cs_别名可以直接传给cross_session_*工具,反之亦然;- 本插件仍接受旧版
ps_别名(仅本插件支持),历史上已发出的旧消息不会因此失效; parallel_message的消息头部会提示用同一个cs_别名回复。
只与活动会话沟通(v0.6.0)¶
parallel_message的目标必须当前已加载(running/idle);offline 会话会被拒绝,并提示先打开会话。- 插件不调用
agents.resume,不会创建、恢复或唤醒任何会话;parallel_sessions默认只列活动会话,传include_offline:true仅用于查看离线会话,不能对其发起沟通。 parallel_hold仍要求目标已加载;parallel_release的恢复通知也只会投递给仍活动的目标,目标已关闭时会在回执里报告未送达。
安装与启用¶
把本目录作为本地 bundle 安装进当前 profile:
plugin_manager({ action: "install_bundle", target: "<本目录绝对路径>" })
安装后插件行与 Client 半区由 dsh.bundle / dsh.client 自动挂载,无需手改 cordis.patch.yml。工具名以 parallel_ 开头。
配置项¶
cordis.patch.yml 的插件行支持以下配置(均在代码中有默认值):
| 键 | 默认 | 说明 |
|---|---|---|
guide |
true |
检测到并行会话时,向系统提示注入一段简短的协调指引(无并行会话时不注入)。 |
autoReleaseOnTurnEnd |
true |
holder-turn-end 暂停在发起方回合结束时自动恢复。 |
holdCancel |
true |
暂停时真正取消目标运行中的回合(agent.cancel({kind:'user'}),会清空其待处理队列)。 |
maxHolds |
8 |
同时存在的暂停登记上限。 |
pairMessageLimit / pairWindowMs |
10 / 60000 |
同一对会话在滚动窗口内的投递上限,防止两个 Agent 互相刷屏。 |
maxTextBytes |
32768 |
单条消息正文的 UTF-8 字节上限。 |
界面显示¶
每条跨会话消息都是真实的持久化 user/message,来源字段同时携带结构化归属:
{
"kind": "agent-message",
"form": "relay",
"producer": "parallel-sessions",
"senderSessionId": "session-...",
"senderTitle": "设计评审",
"senderAlias": "cs_xxxxxxxxxx",
"targetSessionId": "session-...",
"intent": "guide",
"summary": "把登录接口的返回结构改成统一 Result 包装"
}
Chat 的内置 relay 渲染器据 form: "relay" + senderSessionId 显示「来自会话 …」并渲染正文;点击「来自会话」会打开对应会话的历史窗口并定位到那次发送调用。
插件自带的 Client 半区把跨会话消息渲染为对话流内的聊天气泡(我发出的发送块靠左、我收到的接收气泡靠右)。气泡内只显示消息正文,底部依次是:来自会话「标题」(点击打开发送方会话,并滚动/高亮到本插件渲染的发送块)· 状态(是否继续:如「已暂停 · 等待继续」/「已恢复 · 可以继续」)· 时间 · 复制按钮。发送方一侧通过 tool.call.toolview 把 parallel_message 的工具卡片替换为「发给会话「…」+ 正文 + 已送达」的独立发送块。
适用场景与注意¶
- 只协调同一工作区的顶层会话:归档会话、子代理(
origin: subagent)与跨工作区会话会被拒绝。 - 硬限制:本插件不创建新会话、不恢复/唤醒离线会话,只与当前正在活动的会话(running/idle)沟通;目标 offline 时
parallel_message会直接报错。 - 暂停登记保存在进程内存中:Harness 重启后不会自动恢复已暂停的会话;重启前请先
parallel_release。 agent.cancel的停止语义属于宿主:它停止当前回合并清空待处理队列。需要保留队列时请把holdCancel设为false(此时暂停仅记录登记并发通知,等待对方自然空闲)。- 会话 ID 可能被显示链路遮蔽;所有工具优先使用
cs_别名寻址,收到遮蔽占位符会明确报错而不是猜。 - 若目标发送块远早于当前已加载历史,插件会自动点击 Chat 的「加载更早」最多 80 页来翻找;超过该范围仍会提示未找到,可手动向上滚动后再点一次。
- 本插件不替代权限审批:暂停/恢复不需要提权,但消息投递遵守目标会话自身的权限与审批策略。
目录¶
dsh-parallel-sessions/
├── lib/core.js 纯函数:别名、占位符识别、文本截断、归属 source、通知文案、限流
├── lib/index.js Host:4 个工具、投递/恢复、turn/end 自动恢复、系统提示指引
├── client.js Client:对话内跨会话气泡(接收方)+ 发送块(发起方),底部含会话跳转/继续状态/时间/复制
├── cordis.patch.yml 自注册补丁
├── locale/*.json 插件管理器显示元数据
└── test/ node:test 单元测试(纯函数 + mock Host)
生态背景¶
DSH 的理念是「一切皆插件」,本插件遵循这一生态,通过本地 bundle 方式安装,与 DSH 0.2.1-rc.2 的 Host Service、Session 事件与 Chat 渲染契约对接。社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。
总结¶
dsh-parallel-sessions 为 DeepSeek Harness 的多会话场景提供了协调能力:检测并行会话、带归属的跨会话消息、阶段冲突时暂停/恢复。它通过 cs_ 别名与 cross-session 插件互通,仅作用于活动会话,并提供了清晰的归属显示与跳转能力。适合需要多个会话协作、共享设计决策、互相暂停/恢复的场景。
- 目录页:https://www.skillhub.cn/plugins/CatLollipop/dsh-parallel-sessions
- GitHub:https://github.com/CatLollipop/dsh-parallel-sessions