dsh-session-inbox
中文 | English
给 DeepSeek Harness 会话用的收件箱。
任何进程——另一个 DSH 会话、Claude Code、Codex、脚本、CI,或者你自己——往
~/.dsh/inbox/<sessionId>.jsonl 追加一行 JSON 即可。目标会话活着且空闲时,插件会把这条消息
取走,作为一条普通的用户消息交给该会话。
没有 socket、没有守护进程、没有握手、没有 MCP 服务。一条消息就是文件里的一行,所以目标被关闭、 被杀、被重启,消息都还在。
为什么需要它
各家 agent 内部早就能互相发消息:Codex 有 queue,Claude Code 有会话间消息,DSH 有 session
bridge。但跨产品没有共享的会话注册表、没有共享路由、也没有共享的 agent 循环,所以没有任何
东西能唤醒属于别人的会话。
文件系统是每个进程都能碰的唯一交集,于是交接发生在这里:投递落到磁盘,执行留给会话的所有者。
安装
桌面应用(最省事):设置 → 插件 → 添加插件 → 输入包名 dsh-session-inbox → 安装 → 重启。
命令行:
dsh plugin --profile <profile> add dsh-session-inbox
国内网络:在「添加插件」里把源切成中国大陆镜像源(registry.npmmirror.com)。新版本同步到镜像有延迟,急的话可以去 npmmirror 的包页面手动同步一次。
其他方式(不经过 npm):
# GitHub 直装(本包没有构建脚本,因此不需要 allowBuilds 授权)
dsh plugin --profile <profile> add github:SleepNap/dsh-session-inbox
# 本地目录或 tarball
dsh plugin --profile <profile> add ./dsh-session-inbox
dsh plugin --profile <profile> add ./dsh-session-inbox-0.1.0.tgz
装完重启宿主。插件挂载时会打印 [dsh-session-inbox] watching …。
装完重启宿主。插件挂载时会打印 [dsh-session-inbox] watching …。
用法
# 投递一条消息(DSH 是否在运行都可以)
dsh-peer-inbox send --to session-<uuid> --text "..." --from claude-code
# 查看
dsh-peer-inbox pending # 各收件箱待投递条数
dsh-peer-inbox list # 有收件箱的会话 id
接收方看到的是:
[inbox] 来自 claude-code 的消息:
...
消息格式
一行一个 JSON 对象,行末必须有换行。to 必须等于文件名去掉 .jsonl。
{"id":"<uuid>","ts":"<ISO-8601>","from":"<谁>","to":"<sessionId>","text":"<正文>"}
行为
| 情况 | 表现 |
|---|---|
| 目标活着且空闲 | 注入,游标前进 |
| 目标正在跑 | 留在文件里,不打断 |
| 目标不存在 | 一直保留,等该会话出现 |
| 坏行 | 永久跳过,避免堵住队列 |
| 多条消息 | 一次一轮,串行消费 |
游标在 ~/.dsh/inbox/.state/,只前进不后退,所以第二个宿主不会把游标写回旧值、导致重放。
边界
- 推不进不属于你的会话。 插件只服务挂载它的那个 DSH 宿主内的会话,够不到别的产品的会话。
from是自报字段。 任何能写收件箱的进程都能冒充任意发件人,绝不能拿它做授权判断。- 投递不等于确认。 入队成功不代表模型读到了;需要确认就约定「带 id、回显 id」。
兼容性
engines.dsh 是纯下限(>=0.1.7-0),不设上界。插件除了宿主注入的 agents 之外不 import 任何
DSH 包,所以不会钉死 harness 版本。
License
MIT
No comments yet. Be the first to write one.