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
羽毛球分组比赛记分
小程序二维码

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

小夜