前言¶
在 DSH 里和助手聊完一轮,有价值的信息往往散落在当次对话里:偏好、计划、项目约束。若只靠下次会话前的上下文窗口,这些内容容易丢;若每次手动整理进记忆库,成本又很高。常见做法是维护 MEMORY.md 或 shared/ 下的结构化记忆,但自动写回一旦误改正式条目,回滚和核对都麻烦。
dsh-memory-feeder 是维护者 Ryan-G-Rolling 发布的 DSH 记忆类插件(社区目录分类:记忆)。它在每个完成的主会话轮次结束后,把用户与助手的文本先入本地队列,再用该轮会话所用的模型抽取长期事实,追加到记忆库下的 Markdown 候选区 inbox.md,由你核实后再合并到正式记忆。v1 只写 agents/dsh/inbox.md,不会直接改动 shared/、projects/ 或 MEMORY.md。
这是什么¶
一句话:DSH 的记忆写回插件,从已完成轮次中抽取可长期保留的事实,以可追加的 Markdown 形式进入记忆 inbox,等人或其他 agent 合并。
- 维护者:Ryan-G-Rolling
- 包名:
dsh-memory-feeder(npm 当前版本 0.1.1,MIT) - 目录页:https://www.skillhub.cn/plugins/Ryan-G-Rolling/dsh-memory-feeder
- 源码与文档:https://github.com/Ryan-G-Rolling/dsh-memory-feeder
核心行为¶
下面介绍插件在 DSH 生命周期里具体做什么。
何时入队、何时抽取¶
- 只处理顶层会话(跳过
origin: subagent)。 - 仅在
turn/end且原因为completed时入队。 - 入队同步追加到
.pending.jsonl,因此dsh headless一次性运行退出前也不会丢队列项。 - 抽取时机:插件启动后约 1.5 秒处理遗留队列;新轮次入队后约 5 秒(可配置
debounceMs);失败后 15 秒重试。
写入内容与抽取原则¶
每个完成轮次向 agents/dsh/inbox.md 追加一块,包含来源会话、工作目录、模型、置信度及原始对话摘录;同一轮内抽到的事实按 scope 合并成块。
抽取侧重用户亲口说的事实、计划、目标、偏好;助手的建议不会被改写成用户计划;助手长解释仅在存在可复用结论时才提取。抽取器不读取正式记忆,候选可能与已有条目重复,合并时以正式条目为准。
去重、重试与清洗¶
- 已写过的候选记在
.seen.json,重复运行不会重复写入同一轮。 - 同一队列条目最多尝试 3 次(
maxQueueAttempts)。 - 入队前与写盘前会清洗
sk-*、GitHub token、Bearer、私钥及key: value形式的凭据;清洗是兜底,不能把密钥粘进对话当作可依赖的安全措施。
默认记忆库路径¶
默认记忆库根目录为 ~/.dsh/memory(Windows 为 C:\Users\<你>\.dsh\memory),插件会自动创建候选区。可通过环境变量 DSH_MEMORY_ROOT 指向已有记忆库(在 patch 未显式设置 memoryRoot 时生效)。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前请阅读仓库源码与 MIT 许可证,确认队列、日志中会含对话原文,勿将敏感文件提交到公开仓库。
方式 A:从 npm 安装(web)¶
dsh plugin --profile web add dsh-memory-feeder
装完后重启 DSH web,并硬刷新页面。
方式 B:从 GitHub 安装(web)¶
dsh plugin --profile web add github:Ryan-G-Rolling/dsh-memory-feeder
同样需重启 web 并硬刷新。
在启动 DSH 的同一 shell 中可设置记忆库根目录,例如 bash / zsh:
export DSH_MEMORY_ROOT="$HOME/memory"
Windows PowerShell:
$env:DSH_MEMORY_ROOT = 'D:\Projects\memory'
headless 使用的 profile 不一定是 web;桌面版宿主只读自己的 profile 层,这两种情况需用方式 C 手动接入 patch。
方式 C:手动 patch(桌面版 / 自定义路径)¶
DSH 分两层 patch 文件:
~/.dsh/cordis.patch.yml:web 与 headless。~/.dsh/profiles/desktop/cordis.patch.yml:桌面版(桌面宿主不读 home 层,须单独 insert;不能用dsh plugin --profile desktop安装)。
将下列 insert 块追加到对应文件,name 为插件 index.js 的绝对路径:
- insert:
- id: dsh-memory-feeder
name: '<PLUGIN_DIR>/index.js'
config:
memoryRoot: '<MEMORY_ROOT>'
inboxSubdir: agents/dsh
debounceMs: 5000
maxItems: 5
minConfidence: 0.6
同一层不要装两次,否则同一轮会入队两次。web 与桌面两层可共用同一队列和 .seen.json,不会重复写同一条记忆。改完桌面 patch 后重启桌面版。
配置项摘要¶
完整表格见 GitHub README;常用项如下。
| 键 | 默认值 | 说明 |
|---|---|---|
memoryRoot |
DSH_MEMORY_ROOT 或 ~/.dsh/memory |
记忆库根目录 |
inboxSubdir |
agents/dsh |
候选区相对路径,写入 inbox.md |
debounceMs |
5000 |
新轮次入队后延迟抽取 |
startupDelayMs |
1500 |
启动后处理遗留队列的延迟 |
retryDelayMs |
15000 |
失败或未清空队列时的重试间隔 |
maxPerRun |
5 |
每次最多处理几条队列记录 |
maxQueueAttempts |
3 |
单条记录最多尝试次数 |
maxItems |
5 |
每轮最多保留几条候选 |
minConfidence |
0.6 |
低于该置信度的结果丢弃 |
minTurnChars |
30 |
用户加助手文本低于该长度不入队 |
maxTranscriptChars |
16000 |
入队文本上限 |
provider / model |
空 | 留空时使用该会话 request/header 的路由 |
路径建议用绝对路径。若日志卡在 skip turn: no provider/model,需在配置里显式指定 provider 和 model。
典型用法:headless 本地测试¶
复制仓库中的 test.patch.example.yml,替换 <PLUGIN_DIR> 与 <MEMORY_ROOT>,然后执行:
dsh headless --patch "<PLUGIN_DIR>/test.patch.example.yml" "随便完成一轮对话"
测试 patch 把候选区指到 agents/dsh/_feeder_test。headless 常在入队后立刻退出,异步抽取可能来不及跑;再执行一次同样命令,启动时会处理上一条队列记录。
跑完可清理测试产物:
rm -rf "<MEMORY_ROOT>/agents/dsh/_feeder_test"
rm -f "<PLUGIN_DIR>/.pending.test.jsonl" "<PLUGIN_DIR>/.seen.test.json" "<PLUGIN_DIR>/.feeder.test.log"
日常使用时,完成对话后打开记忆库下的 agents/dsh/inbox.md,核对候选块,再按你的记忆库规范合并到正式条目。
日志与排错¶
日志同时写 stderr 与插件目录的 .feeder.log,前缀 [dsh-memory-feeder]。启动时 ready (memoryRoot=...) 会打印实际路径;入队为 queued turn ...;抽取成功为 extracted N item(s) 与 appended ...。
适用场景与限制¶
适合:希望对话结束后自动沉淀长期事实,但不想插件直接改正式记忆文件的 DSH 用户;可与人工或其他 agent 定期清理 inbox 的流程配合。
需注意:
- 只处理顶层会话;依赖 DSH 的
llm服务与会话路由。 - 候选不会自动合并、去重到正式条目。
- 记忆库若同步到远端,
inbox.md中的候选与摘录会一并同步,按需选择私有备份。 - README 写明在 Windows 的 DSH 桌面版、web 和 headless 上验证过;其他平台未实测。运行环境需 Node.js >= 18。
结尾¶
dsh-memory-feeder 把「轮次结束 → 队列 → 模型抽取 → inbox 候选」串成固定管道,在不动正式记忆的前提下,把对话里值得长期保留的内容落到 Markdown,等你核实。社区目录与 GitHub 为独立维护入口,与 DeepSeek / 幻方无官方从属关系。
- 目录页:https://www.skillhub.cn/plugins/Ryan-G-Rolling/dsh-memory-feeder
- GitHub:https://github.com/Ryan-G-Rolling/dsh-memory-feeder