前言¶
在 DSH 里用 dsh-world 做长期记忆时,归档范围取决于工作区「房间」里登记的 sessionIds 名单。官方 QQ 插件(@tencent-connect/dsh-qqbot)建会话时通常会设置 cwd 和 agent preset,却未必调用 attachSession() 把会话写进这份名单。表现上 QQ 能收发、会话目录也在 worlds/<名>/room 下,但记忆过滤器会跳过这些会话:网页端人格「不知道」QQ 里聊过什么,日记里也没有痕迹,会话压缩后对话可能永久丢失。
下面介绍 mhggv 维护的 world-channel-bridge:零依赖、零硬编码路径的 workspace 登记桥,把外部渠道会话补登记进房间工作区,让 dsh-world 的归档钩子能写入 archive.sqlite 及下游日记、活动与长期记忆。
这是什么¶
world-channel-bridge 是 DeepSeek Harness(DSH)/ Cordis 服务端插件,分类上属于「记忆」相关能力。维护者为 mhggv,源码与文档在 GitHub,社区目录页为 skillhub.cn/plugins/mhggv/world-channel-bridge。当前包版本 1.2.0,许可证 MIT,运行要求 Node >= 20。
它不做 IM 收发,只做一件事:周期性发现「cwd 已在房间目录、却尚未出现在工作区名单」的会话,调用宿主公开的 workspace.attachSession(sessionId) 完成登记,之后由 dsh-world 按既有逻辑归档。
问题与数据流¶
dsh-world 的归档范围可以概括为:
归档范围 = 工作区「她/他的房间」的 sessionIds 名单
QQ 消息经 im-qqbot 建会话(cwd 指向 worlds/default/room 等)后,若缺少登记步骤,就会出现「数据通、记忆不通」。本插件补的就是登记动作:
QQ 消息 ──► im-qqbot 建会话(cwd = worlds/<名>/room)
│
▼
✗ 缺少 attachSession()
│
world-channel-bridge
│ 发现 cwd 在房间目录但不在名单的会话
▼
✓ workspace.attachSession(sessionId)
│
▼
dsh-world 归档 ──► archive.sqlite
└► 日记 / 活动 / 长期记忆
除官方 QQ 机器人外,README 说明任何走会话的外部渠道(如 WeChat 等)只要 cwd 落在房间目录,同样适用。
安全与行为约束¶
插件只使用宿主公开 API(workspaceRegistry、sessionPersistence),不直接改数据文件。attachSession() 会校验会话 cwd 必须等于工作区路径,否则抛错,因此无法把无关会话塞进某世界的记忆。已在名单中的会话会跳过,重复巡检不会重复登记;失败仅告警,不拖垮 DSH 服务。
核心功能¶
- 自动发现房间目录:默认从工作区注册表识别
.../worlds/<名>/room,多数环境无需写死路径。 - 定时巡检并登记:对未登记的渠道会话调用
workspace.attachSession()。 - 可选配置:通过 profile 的
cordis.patch.yml调整巡检间隔、世界列表、房间目录、排障开关等。 - 安装与体检脚本:
install.sh/uninstall.sh/doctor.sh负责登记 bundle、链接模块、校验 YAML 与服务日志。
兼容说明(来自 README 实测表):在 @deepseek-ai/dsh 0.2.1-rc.5、dsh-world 0.6.6、@tencent-connect/dsh-qqbot 0.5.5 组合下,官方 QQ 会话可自动登记、归档实时写入,重启后可回扫补齐。依赖自 DSH 0.2.x 起稳定的 workspaceRegistry.resolveByPath / entities、workspace.attachSession、sessionPersistence.list();API 缺失时插件告警但不崩溃。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前请自行查看源码与 MIT 许可证。DSH 生态是「一切皆插件」;skillhub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
方式一:Release 包
curl -L -o wcb.tar.gz https://github.com/mhggv/world-channel-bridge/releases/latest/download/world-channel-bridge-1.2.0.tar.gz
tar xzf wcb.tar.gz && cd world-channel-bridge
sudo ./install.sh
方式二:DSH 插件机制(需本地已有插件目录)
dsh plugin --profile web add /path/to/world-channel-bridge
install.sh 与上述登记逻辑一致:将插件放入 $DSH_HOME/plugins/world-channel-bridge,在 profile 的 node_modules 建绝对路径软链,并在 package.json 写入 dependencies 与 dsh.profile.bundles(含 cordis.patch.yml 的 bundle patch),以便 Web「插件管理 → 已安装」中可见。常用参数示例:
./install.sh --home /path/to/dsh-home --profile /path/to/dsh-home/profiles/web
./install.sh --no-restart
./install.sh --link
./install.sh --dry-run
非 systemd 环境(Windows / macOS / 前台启动)可先 --no-restart,再手动重启 DSH;Windows 下可用 Git Bash 或 WSL 执行脚本。
Web 里有两个位置容易混淆:「插件清单」反映 loader 已挂载的 entry;「插件管理 → 已安装」只读 profile package.json 的正式依赖。仅改 cordis.patch.yml 而不登记 package.json 时,插件可能已在跑,但「已安装」列表仍为空;./doctor.sh 第 4 项可区分状态,旧式安装可再跑一遍 install.sh 迁移。
配置¶
全部可选。在 profile 的 cordis.patch.yml 中对应条目下修改 config:
- insert:
- id: world-channel-bridge
name: 'world-channel-bridge'
config:
intervalMs: 30000 # 巡检间隔(毫秒)
worlds: ['default'] # 只处理这些世界;留空 = 全部
roomDirs: [] # 显式房间目录;留空 = 自动发现
worldNamePattern: '' # 自定义房间目录识别正则
dshHome: '' # 显式 DSH_HOME
dryRun: false # true = 只日志不登记
verbose: false
改完需重启服务。大多数部署无需改动配置项。
验证与典型用法¶
安装后执行体检:
./doctor.sh
脚本检查插件文件、模块链接、可导入性、配置 YAML、服务与日志,并汇总各房间已登记会话数与记忆正本记录数。也可查看 systemd 日志:
journalctl -u dsh-web -n 200 | grep world-channel-bridge
正常日志示例:
[world-channel-bridge] v1.2.0 已就绪:监控 1 个世界房间、3 个渠道会话
[world-channel-bridge] 已登记会话 session-xxxx →「房间标题」,该渠道的对话将进入记忆归档
README 建议的双向验收:
- 在 QQ 上说一件新鲜事,再到网页端询问,人格应能回忆;
- 在网页端说一件事,再到 QQ 询问,渠道侧也应能回忆。
换机器时:新环境装好 DSH、dsh-world 与 QQ 插件并确认能聊,拷贝插件目录后执行 sudo ./install.sh,再 ./doctor.sh 确认会话数。历史记忆需另行迁移 archive.sqlite、room、sessions/ 等数据并保持路径一致;本插件只保证新对话能进入归档。
排障与卸载¶
| 现象 | 处理方向 |
|---|---|
| 日志完全没有插件名 | 用 doctor.sh 查配置条目与模块链接;patch 须为 - insert: 形式 |
| 有加载但会话数为 0 | 对比 QQ 会话 cwd 与 doctor.sh 中的房间 path |
| 登记失败 cwd 不一致 | 检查软链、尾斜杠;插件有 realpath 兜底 |
| 已登记但旧对话未进记忆 | 重启服务触发归档全量回扫 |
| Node 语法错误 | 升级到 Node 20+ |
卸载:
sudo ./uninstall.sh
sudo ./uninstall.sh --keep-files
已写入归档的记忆不会被撤销;卸载后新产生的渠道对话不再自动登记进记忆。
结尾¶
world-channel-bridge 解决的是外部渠道与 dsh-world 之间的「登记断点」:零依赖、可跨机器复用,装好后通常无需再改业务代码。目录与详情见 skillhub 插件页,源码与 Issue 见 GitHub 仓库。