前言¶
在 DSH 里,多个会话往往共用同一套宿主环境:会话检索、研究页缓存、跨会话 @ 引用、Agent Teams 中继、以及可选的长期记忆插件(例如 OpenViking),都会让「当前对话」间接读到「别的对话」留下的信息。对隐私评审、客户隔离、或只想做一次性实验的开发者来说,默认「全局记忆开着」并不总是合适。
下面介绍的 dsh-memory-switch(维护者 Kingzhoudk,社区分类「记忆」)在每个会话上提供一个开关:关闭后,该会话不再通过插件能管控的渠道与其它会话交换信息;默认仍为 on,与现有 DSH 行为一致。需要说明的是:它是策略门,不是沙箱——若仍授予 bash / read 等权限,模型仍可能直接读磁盘上的会话日志;README 中对此有明确说明。
这是什么¶
dsh-memory-switch 是标准 DSH Profile 插件包:宿主侧 lib/index.js,浏览器侧 lib/client.js(dsh.client)。一句话定位:每个会话一个开关;关断后,该会话停止通过下列已列渠道与其它会话互通记忆。
开关出现在 Composer 工具行(conversation.input.left,与权限 / Plan 芯片相邻)。状态完全由会话日志推导:点击开关会执行 /memory on 或 /memory off,宿主将命令折叠进 memorySwitch 会话投影,投影帧再把新状态推回界面。重载、恢复、fork 都会还原同一位置;fork 通过继承的事件前缀沿用父会话状态。
关闭记忆时拦截哪些渠道¶
README 用表格归纳了「OFF」时的强制措施,要点如下。
| 渠道 | 行为 |
|---|---|
session_search、session_event_search、session_event_read、session_trace、session_event_trace |
单调工具守卫拒绝调用;按智能体限制对模型隐藏这些工具 |
cache_search(~/.cache/dsh-free-search/research.db,跨会话共享的研究页缓存) |
同上 |
跨会话引用(@ 提到的会话快照,source.kind = session-reference) |
从 prepared step 中过滤 |
Team 中继(source.kind = agent-message) |
默认过滤;blockTeamRelay: false 可放行 |
子智能体结果回灌父会话(source.kind = subagent-settled) |
默认可用(同一线程);blockSubagentSettled: true 可过滤 |
| 本子会话派生的子智能体会话 | 继承 OFF,重启后亦然(父会话不在线时查持久化投影) |
| 模型行为 | 注入 memory-switch:policy 提示段,说明记忆已关且勿绕行 |
| OpenViking 工具、MCP 资源、recall、capture、commits、排队写入 | 守卫 + 包装 openvikingMemory 服务方法;仅当已安装 @openviking/dsh-memory-plugin 时生效,否则该段无操作,其它渠道仍适用 |
默认不拦截、可配置封禁的包括:ThoughtDAG 的 why_* 工具(blockThoughtdag: true)、OpenViking 提供的 skills(blockOpenVikingSkills: true)。工作区 AGENTS.md 与普通 skills 不算「会话记忆」,始终可用。其它 MCP 记忆服务(例如 mcp__notion__*)默认不封;若你将其视为跨会话记忆,用 denyToolNames / denyToolPrefixes 声明。
安装与启用¶
插件以 DSH 进程权限运行,安装前建议浏览 GitHub 源码与 MIT 许可证。当前 package.json 标明版本 0.1.0,引擎要求 dsh >=0.2.2-rc.1 <0.3.0。
从 GitHub 安装(命令摘自官方 README):
dsh plugin add github:Kingzhoudk/dsh-memory-switch
# 或显式 git 规格
dsh plugin add git+https://github.com/Kingzhoudk/dsh-memory-switch.git
插件管理器会记录依赖并启用 bundle;无 HMR 时需重启运行时宿主半区才能挂载,浏览器半区在页面重载后出现。
本地目录可用 link 安装:
dsh plugin add link:/absolute/path/to/dsh-memory-switch
或在 ~/.dsh/profiles/web/package.json 的 dependencies 中写 "dsh-memory-switch": "link:/absolute/path/to/dsh-memory-switch",再通过 dsh.profile.bundles 或 ~/.dsh/profiles/web/cordis.patch.yml 挂载(patch 示例见 README),并在 profile 目录执行 pnpm install。
典型用法¶
界面与斜杠命令¶
| 输入 | 行为 |
|---|---|
/memory 或 /memory status |
显示当前会话开关状态 |
/memory off |
切断所有跨会话记忆渠道(立即生效) |
/memory on |
恢复所有渠道 |
/memory toggle |
取反 |
处理敏感话题前,可先 /memory off 或点工具行开关,再开始对话;需要与全局记忆协同的会话保持默认 on 即可。
配置示例¶
在 Cordis 插件条目中可细调各渠道(字段名与默认值以 README 为准):
- id: memory-switch
name: dsh-memory-switch
config:
blockOpenViking: true # OpenViking recall/capture + 其工具(需对应插件)
blockSessionTools: true # session_search / cache_search 等
blockSessionReferences: true # 丢弃跨会话 @ 快照
blockTeamRelay: true # 丢弃 team 中继(agent-message)
blockSubagentSettled: false # 是否丢弃子智能体结果回灌
blockThoughtdag: false # 是否额外拒绝 why_*(默认不关)
blockOpenVikingSkills: false # 是否拒绝 OpenViking skills
denyToolNames: []
denyToolPrefixes: []
自定义 MCP 记忆工具时,把具体工具名或前缀填入 denyToolNames / denyToolPrefixes。
适用场景与已知限制¶
适合谁: 需要在同一 DSH 实例里做「会话级隔离」的开发者——例如临时关掉会话检索与研究缓存、避免 @ 其它会话、或在安装 OpenViking 时同步封住长期记忆读写,且接受「策略门」而非内核级沙箱。
方向性隔离: OFF 会话被强烈阻止读取其它会话,但反向(其它会话的检索仍可能索引到它)在当前插件内无法实现:会话查询 SQLite 索引与 ThoughtDAG 索引没有按会话排除的接缝(dsh-thoughtdag 会直接读 ~/.dsh/sessions);对称隔离需要上游包改动。
不是沙箱: 仅关闭模型可见渠道;若仍有 bash / read,模型可读 ~/.dsh/sessions/**.jsonl.zstd 或 research.db。要严格禁止需配合沙箱策略(如 denyToolNames: ['bash']、工作区文件限制),超出本插件范围。
其它注意: 关断后不会撤回已写入当前会话历史的 recall 文本,只阻止后续读写;未装 OpenViking 时 ~/.openviking/pending 不会自动清理;OpenViking 方法改名可能导致包装 silently 变弱(工具守卫不受影响)。
社区目录 skillhub 插件页 与 GitHub 仓库 为独立生态信息源,与 DeepSeek / 幻方无官方从属关系;DSH 侧安装与配置以 README 为准。
结尾¶
经过上面的步骤,你可以在每个会话上独立决定是否与全局记忆生态互通:默认与今日 DSH 一致为 on;需要隔离时一键或 /memory off 即可封住插件能看到的跨会话接缝。开发自测可运行 npm test(等同 node --test tests/host.test.mjs tests/client.test.mjs)。更多细节与 Known limits 全文见 GitHub README。