dsh-memory-feeder:把完成轮次里的长期事实写进 Markdown 记忆候选区

前言

在 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 生命周期里具体做什么。

何时入队、何时抽取

  1. 只处理顶层会话(跳过 origin: subagent)。
  2. 仅在 turn/end 且原因为 completed 时入队。
  3. 入队同步追加到 .pending.jsonl,因此 dsh headless 一次性运行退出前也不会丢队列项。
  4. 抽取时机:插件启动后约 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye