前言¶
在 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 倉庫。