world-channel-bridge:把 QQ 等外部渠道會話登記進 dsh-world 記憶歸檔

前言

在 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 服務。

核心功能

  1. 自動發現房間目錄:默認從工作區註冊表識別 .../worlds/<名>/room,多數環境無需寫死路徑。
  2. 定時巡檢並登記:對未登記的渠道會話調用 workspace.attachSession()。
  3. 可選配置:通過 profile 的 cordis.patch.yml 調整巡檢間隔、世界列表、房間目錄、排障開關等。
  4. 安裝與體檢腳本: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 建議的雙向驗收:

  1. 在 QQ 上說一件新鮮事,再到網頁端詢問,人格應能回憶;
  2. 在網頁端說一件事,再到 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 倉庫。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜