dsh-channel-memory:給微信通道會話一個專屬工作區,並共享一份長期記憶

前言

DSH 的理念是「一切皆插件」,社區插件目錄也因此保留了大量針對具體通道和具體場景的小插件。dsh-channel-memory 就是其中之一:它由 Yuncan050115 維護,分類爲「記憶」,解決的問題很具體——用 wxbridge 這類手機通道時,每從微信發一句話,橋就可能新起一條 DSH 會話,全部落在默認工作區裏,桌面側欄被「手機會話」淹沒,也沒法歸檔回看;同時換一條會話(或橋重啓)之後,之前交代過的身份資料、口徑、偏好都要重新說一遍。這個插件把手機發起的會話歸到一個獨立工作區,並提供一份跨會話共享的可檢索長期記憶。

它是什麼

一句話定位:DSH 插件,爲微信通道會話提供專屬工作區,並在所有會話之間共享一份長期記憶。核心是 5 個工具和零運行時依賴——只用 Node 內置模塊加上宿主自帶的 @deepseek-ai/dsh-tools,兼容 DSH 0.2.1-rc.5 / cordis 4.0.5。當前包版本爲 0.1.3,許可證 MIT,engines 要求 Node >=22。

安裝前有兩點需要知道:npm 上的 dsh-channel-memory 目前只有 0.0.0-stage 佔位版(latest 指向它),真實版本要等 staging approve 完成;另外插件會以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證。社區目錄是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。

核心功能

下面介紹的功能分別對應一個工程判斷,README 裏都寫明瞭原因。

1、專屬工作區。默認路徑是 ~/.dsh/channel-workspace(可配)。插件先調用宿主的 workspaceRegistry.resolveByPath() 查詢,缺失才 create(),不直接覆蓋已有目錄。

2、歸屬判定不自己猜。不同宿主版本暴露會話 cwd 的方式不一樣,猜錯就會靜默跳過。插件改用宿主自己的不變量:Workspace.attachSession() 會校驗會話 header 的 cwd 是否等於工作區路徑,不等就拋。因此「掛載成功」本身就是權威的歸屬證據,普通桌面會話會在 catch 裏被安靜跳過,插件不強行繞過校驗。

3、共享記憶。存儲在 ~/.dsh/channel-memory/memory.json,寫入用原子 rename + sha256 校驗和;校驗和不符(文件被截斷或外部改壞)時退回空庫,而不是拿髒數據當記憶。

4、自動流水。監聽 session/event 的 turn/end,只給已確認歸屬的通道會話記一條,用於回溯「手機側這段時間聊過什麼」。

5、提示詞注入。通過 systemPrompt.section({ name, order, text }) 注入,text 傳函數(宿主按 typeof section.text === 'function' ? section.text(context) 求值),寫入記憶後下一輪組裝自動生效,不需要手動 refresh,且只追加、不替換人格。

模型工具

插件註冊 5 個工具,均在記憶與工作區信息範圍內:

工具 用途
memory_write 記一條跨會話共享記憶,參數含 kind / tags / pinned
memory_search 子串檢索正文、標籤或類別
memory_list 列出最近 20 條,帶 id 便於刪除
memory_forget 按 id 刪除
channel_workspace_info 返回工作區路徑、id、已歸屬會話數、記憶與流水條數

pinned: true 的記憶常駐提示詞索引,其餘按 indexLimit(默認 12)取最近若干條。

安裝與啓用

官方給出的安裝方式是在 DSH 的應用 profile 目錄裏執行(Windows 桌面形態是 %USERPROFILE%\.dsh\profiles\desktop)。注意不要直接 pnpm add dsh-channel-memory。

cd %USERPROFILE%\.dsh\profiles\desktop
pnpm add github:Yuncan050115/dsh-channel-memory

或從本地目錄安裝:

pnpm add file:C:\path\to\dsh-channel-memory

然後把 bundle 名加進同目錄 package.json 的 dsh.profile.bundles(插件管理器會自動做這一步,手工加也可以):

"dsh": { "profile": { "bundles": [ ..., "dsh-channel-memory" ] } }

重啓 DSH 生效。不想重啓可以先用 DSH 自帶運行時做一次幹跑,--dump-config 只組合配置、不啓動 GUI。<APP> 是 DSH 安裝目錄,Windows 桌面形態默認爲 C:\Program Files\DeepSeek Harness 或 D:\DeepSeek Harness:

set ELECTRON_RUN_AS_NODE=1
set DSH_HOME=%USERPROFILE%\.dsh
"<APP>\DeepSeek Harness.exe" --expose-internals ^
  "<APP>\resources\app.asar\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js" ^
  --profile desktop --dump-config

輸出裏應能看到 # == dsh-channel-memory 這一層;若出現 skipped bundles 或 did not activate,說明 bundle 沒掛上。

配置

cordis.patch.yml 裏 channel-memory 行的 config 全部可選,默認值以註釋形式給出:

- insert:
    - id: channel-memory
      name: 'dsh-channel-memory'
      config:
        workspacePath: 'C:/Users/you/.dsh/channel-workspace'
        workspaceTitle: '手機通道'
        dataDir: 'C:/Users/you/.dsh/channel-memory'
        injectIndex: true
        indexLimit: 12
        autoDigest: true

要讓微信發起的會話真的落進這個工作區,還需要橋側的會話 cwd 指向通道工作區。wxbridge 支持在 ~/.dsh/wxbridge/config.json 裏配 cwd(宿主半 pick('cwd') → keeper → 橋的 --cwd),例如:

{ "cwd": "C:/Users/wujid/.dsh/channel-workspace" }

配完重啓橋即可。不配也不會出錯,插件只是沒有會話可歸屬,記憶與工具照常工作。

驗證

插件自帶契約測試 test/contract_test.mjs。與常見做法不同的是,它用宿主自己的 defineTool 跑測試而不是 stub,因此 value-schema DSL 違規會當場拋;夾具強制宿主不變量(cwd 不符則 attachSession 拋),「外來會話被拒絕掛載」是被真實驗證的。在插件目錄裏運行(<APP> 同上,Windows 桌面形態必須用 DSH 自帶的 Electron 跑,因爲宿主模塊在 app.asar 裏):

set ELECTRON_RUN_AS_NODE=1
"<APP>\DeepSeek Harness.exe" --expose-internals test\contract_test.mjs

實測輸出爲:

tools registered: 5
prompt sections : channel-memory:index@3200(text=function)
attached (channel session): ["sess-abc"]
after foreign session     : ["sess-abc"] (must not contain sess-elsewhere)
index reflects post-apply write: true
RESULT: PASS

測試會把 DSH_HOME 指到臨時目錄,不會碰真實的 ~/.dsh。可選的環境變量覆蓋爲 DSH_TOOLS_ENTRY 和 DSH_PLUGIN_ENTRY。權限面見 PERMISSIONS.md。

適用場景與注意

適合用微信通道(wxbridge 或同類橋)長時間與 DSH 交互、希望手機側會話有獨立歸檔位置、又不想讓跨會話記憶丟失的開發者。它的價值在於把「會話歸屬」和「記憶複用」這兩件事固化下來,而不需要自己在宿主裏拼裝。

需要注意幾點。插件以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證(MIT)再啓用;npm 上同名包當前只是佔位版,安裝請走 git 或本地目錄方式;只配插件不配橋的 cwd 時,記憶與工具照常工作,但不會有會話被歸入通道工作區。

小結

dsh-channel-memory 是一個目的明確的插件:用宿主自己的掛載校驗判定會話歸屬,把手機通道會話收進一個可配的工作區,同時用原子寫入和 sha256 校驗維護一份跨會話共享記憶,再通過 5 個工具和提示詞注入讓記憶真正被複用。如果你要用 wxbridge 這類通道,它是解決「會話散落 + 記憶不通」的一個現成選項。

  • 目錄頁:https://www.skillhub.cn/plugins/Yuncan050115/dsh-channel-memory
  • GitHub:https://github.com/Yuncan050115/dsh-channel-memory
羽毛球分组比赛记分
小程序二维码

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

小夜