前言¶
DeepSeek Harness(DSH)里每个对话都是独立 agent,跑在各自会话中,彼此不可见。想在一个会话里了解另一个会话在做什么,或在终端、脚本里给指定会话追加一条用户消息并让它跑一轮,默认没有统一入口。
dsh-session-bridge 把本机上的 DSH 会话变成可枚举、可读、可写:列出标题与工作目录、直接读磁盘转录、通过桌面 App 本地 RPC 向任意会话发消息;还提供带「每轮一行菜单」的跨会话聊天模式,方便在 IM 等通道里盲操作。
这是什么¶
维护者 DylanYeung0929 在 GitHub 开源的 dsh-session-bridge(当前 package 版本 0.1.1,MIT 许可证)。它既是 Python CLI(dshctl),也可注册为 DSH 插件,在会话内暴露 session_list、session_read、session_send 三个工具。
读列表与发消息依赖 DSH 桌面 App 正在运行并通过 127.0.0.1 上的本地 JSON-RPC(默认端口信息来自 App Cookie,README 示例为 51413);读转录则直接解压 ~/.dsh/sessions/**/session.v4.jsonl.zstd,App 关闭也能读最近若干条。
平台说明: package.json 中 os 为 darwin,鉴权路径指向 macOS 上 DSH 桌面 App 的 Chromium Cookie 库。Linux 等环境不在官方支持范围内。
核心功能¶
| 能力 | CLI | 需要 App 在跑? |
|---|---|---|
| 列出全部会话(标题、cwd、是否活跃、token 等) | dshctl list |
是 |
| 读某会话最近 N 条 | dshctl tail <会话> N |
否 |
| 向某会话发消息 | dshctl prompt <会话> "…" |
是 |
| 交互式跨会话聊天(每轮一行菜单) | dshctl chat <会话> |
是 |
| 记住当前聊天对象 | dshctl focus / where / focus - |
是 |
| 调用任意 RPC | dshctl raw <ns/method> '<json>' |
是 |
| 在 DSH 内当工具用 | session_list / session_read / session_send |
是 |
下面补充几条实现上的约束,便于脚本化时少踩坑。
- 纯 Python 3 标准库实现 CLI 核心;读转录额外需要系统里的
zstd命令。插件侧需要 Node ≥ 20,无第三方 npm 运行时依赖。 - 会话参数支持
session-<uuid>全名、唯一短前缀或唯一标题子串;命中多个会话会报错并列出候选,不会静默选第一个。 - 各命令支持
--json;prompt可用--steer打断当前轮次插入消息,默认queue排队;--wait SECS可等待该会话轮次结束。 list输出里●表示会话打开且近 5 分钟有写入,◐表示打开但近期无动;发消息前会打印目标 id 与标题。
前置条件¶
| 项 | 要求 |
|---|---|
| 系统 | macOS(本地 RPC 与 Cookie 路径随 DSH 桌面 App) |
| DSH | 桌面 App 运行中(dshctl status 可见 backend: app) |
| Python | 3.9+ |
| Node | ≥ 20(插件或 npm/npx 路径) |
| zstd | 读转录时需要(README 示例:brew install zstd) |
安装与启用¶
社区目录页:dsh-session-bridge(SkillHub)。DSH 生态是「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。安装前建议自行查看仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,等价于把「向其它会话发消息」的能力暴露给当前 agent,不会绕过模型侧权限,但写操作仍需谨慎。
方式 A:只当 CLI 用(README 推荐先试)¶
git clone https://github.com/DylanYeung0929/dsh-session-bridge.git
cd dsh-session-bridge
brew install zstd # 若还没有
./tools/dshctl.py status # 应该输出 backend: app port: 51413
方式 B:装成全局命令¶
在仓库目录内执行:
npm install -g ./
dshctl status
方式 C:装成 DSH 插件¶
在 DSH profile 目录(macOS 默认 ~/.dsh/profiles/desktop):
cd ~/.dsh/profiles/desktop
npm install /绝对路径/dsh-session-bridge
在 package.json 的 dsh.profile.bundles 中加入 bundle 名 dsh-session-bridge:
"bundles": [
"...",
"dsh-session-bridge"
]
重启 DSH 后会出现三个工具。npm install 不会自动登记 bundle,必须手动改 bundles;可检查 ~/.dsh/profiles/desktop/package.json。插件仍要求 python3 在 PATH 中;可设环境变量 DSH_SESSION_BRIDGE_PYTHON 指定解释器。
典型用法¶
先做列举与只读,确认会话名唯一,再发消息。
# 1. 看看有哪些会话(● 表示正在跑)
./tools/dshctl.py list
# 2. 读某个会话最近 10 条(App 关了也能读)
./tools/dshctl.py tail "安装插件" 10
# 3. 给那个会话发一句话,并等它跑完
./tools/dshctl.py prompt "安装插件" "用一句话汇报你现在的进度" --wait 90
# 4. 进入交互式跨会话聊天(每轮后给一行菜单)
./tools/dshctl.py chat "安装插件"
chat 每轮回复后固定一行菜单,小屏也可盲打:
1继续 2切换 3上下文 4退出 ← 直接打字=继续
按 1 或「继续」会再问要说什么;直接回车或空行等价于发送「继续」。若中间隔着微信、Slack 等 IM,应使用 focus / where 外置状态,按 1/2/3/4 驱动协议,而不是依赖终端 REPL。
在 DSH 会话内,模型可调用:
session_list({ full: true })
session_read({ session: "安装插件", count: 6 })
session_send({ session: "安装插件", message: "把结论压缩成三行", wait: 60 })
CLI 完整子命令见 README:status、list、tail、prompt、chat、focus、where、raw,以及 App 未开时的兜底 start / stop。
适用场景与注意¶
适合: 需要在终端或脚本里统一查看本机所有 DSH 会话;离线审计某会话最近转录;从当前会话或外部 automation 向指定会话 queue/steer 一条 prompt;在 IM 机器人里用一行菜单做多会话切换与续聊。
注意:
- 写操作必须显式指名会话;解析歧义时会拒绝发送。
- 不要把
~/.dsh/.credentials.yaml、Cookie 库内容贴进对话或日志;README 列出了作者默认红线(不代转账、不代答应、不发文件等),可自行写进 agent 规则。 - 常见故障:
cannot find the DSH app cookie多为 App 未开;ECONNREFUSED 127.0.0.1:51413可先看dshctl status或dshctl start;tail报缺少 zstd 则安装 zstd。细节见仓库docs/PROTOCOL.md与docs/TUTORIAL.md。
结尾¶
dsh-session-bridge 把 DSH 多会话从「各自为政」收成一条可脚本化的链路:磁盘读转录、RPC 写 prompt、插件内三工具与 dshctl chat 的跨会话菜单,面向需要在 harness 外编排 harness 的开发者。
- 目录页:https://www.skillhub.cn/plugins/DylanYeung0929/dsh-session-bridge
- 源码与文档:https://github.com/DylanYeung0929/dsh-session-bridge