前言¶
在 DSH(DeepSeek Harness)里跑智能体时,很多团队会把「记忆」做成一套本地 Markdown / JSONL 档案:日记流水、生长状态、事件流各自落盘,再由 Python 脚本做跨设备合并。这类做法文件是权威、格式固定,但日常查看、搜索、谨慎追加或改一两处,往往要直接开编辑器或记一堆脚本命令,和 Harness 的设置页也接不上。
下面介绍社区插件 dsh-memory-board(维护者 S3K926,分类:记忆)。它把同一份档案搬进 DSH Web 设置页的一页「记忆」面板:概览、搜索、追加、在守卫与备份前提下编辑,不建数据库、不改档案格式。仓库 GitHub 采用 MIT 许可证;社区目录页见 skillhub.cn。
这是什么¶
dsh-memory-board 是 DSH 的 bundle 插件:Host 侧注册 /api/memory/* 路由并解析档案,Client 侧在 settings.section(id: memory,label: 记忆,order: 120)渲染五个分段。核心承诺在 README 里写得很直白——文件仍是权威;认档案根只靠特征文件(身份.md、日记.md、生长\状态.md 三者齐备),认不出就停手或让你在面板上手填/选择位置,不做「扫盘猜根」。
插件以当前 DSH 进程权限读写你配置的档案目录;安装前建议通读仓库源码与 LICENSE,并确认 readOnly 与面板「打开写入」开关是否符合你的安全预期。
核心功能¶
设置页五段面板¶
| 分段 | 作用 |
|---|---|
| 概览 | 日记 / 状态 / 生长记录 / 事件流四张卡片(条数、序号、元信息、大小、mtime);写入开关;追加生长记录一行;新设备铺底;同步区 |
| 日记 | 倒序列表,点开原文(pre-wrap,不渲染 Markdown);八行表单新增;真删需原样输入 #N |
| 状态 | 分节列表与正文查看;只改某一节正文(标题行保留);真删需原样输入节标题 |
| 事件流 | 最近 30 / 100 / 300 条,字段含 ts / kind / source / id / topic / 摘要,只读 |
| 搜索 | 关键词(空格分词、全命中)只读过滤 记忆\事件流.jsonl,不调用 生长\记忆.py search |
顶栏常显档案根与只读模式;缺字段显示「(读不到)」,出错显示错误行而非白屏。
读写与守卫¶
写盘统一走 writeWithGuards:指纹拒写(外部已改则拒绝)→ 幂等跳过(内容相同不写)→ 改前整份备份 → 写临时文件再 rename → 读回复核。备份落在 <根>\归档-旧版本与记录\写入备份\;真删另有删除内容归档与面板二次确认(序号或节标题须原样输入)。记忆\事件流.jsonl 与 身份.md / 开场.md 在面板侧只读;行尾 CRLF、UTF-8 无 BOM 写回时保持。
支持的写操作包括:追加生长记录行、六段式追加日记(元信息与 diary_version 按档案规则更新)、编辑状态节正文、真删日记条目或状态节、在空目录初始化六件骨架(已有档案一律拒绝,force 不开放到路由)。
档案根与面板状态¶
档案根解析优先级(README 2026-09-25 更新):面板选择的位置 > 配置 root > 环境变量 DSH_MEMORY_ROOT > 自动识别 > 默认 $DSH_HOME/memory(DSH_HOME 未设时为 ~/.dsh)。面板状态写在 $DSH_HOME/memory-panel.json。设置页顶部可「选择位置…」:优先 DSH 目录选择器,否则手填路径;判定为已有档案、空目录或缺特征文件时,分别对应认领、铺底或只提示缺哪些文件。
跨设备同步¶
合并仍调用档案里原有的 合并记忆.py / 合并日记.py / 合并状态.py / 回流包.py;插件提供 /sync/status、/sync/dryrun(不带 --apply)与 /sync/merge(白名单脚本、写入开关、confirm=yes、先干跑、确认框须原样输入脚本名)。恢复.py、备份.py、自主轮次.py 永不放行。
安装与启用¶
本插件是 bundle,package.json 里 dsh.bundle.patch 指向 cordis.patch.yml,由 patch 向 Loader 条目表插入一行。官方 README 给出的步骤如下(无 dsh plugin add github:… 一类命令):
- 将整个插件目录放到你本地的插件目录,例如
~/.dsh/plugin-src/dsh-memory-board。 - 复制并编辑本机配置:
cp cordis.patch.example.yml cordis.patch.yml
在 cordis.patch.yml 中按需修改 root 等项(该文件已在 .gitignore,不进仓库)。
- 在 profile 的
package.json里把dsh-memory-board加入dsh.profile.bundles(或按你使用的插件管理工具安装)。 - 重启 DSH,硬刷新页面 → 设置 → 左侧应出现 「记忆」。浏览器 Console 可见
[memory-panel] 已注册设置页「记忆」…及各路由注册日志。
package.json 声明引擎要求 dsh >= 0.1.7-rc.2,当前插件版本为 1.3.0。
配置项¶
| 键 | 默认 | 说明 |
|---|---|---|
root |
无 | 档案根;也可依赖 DSH_MEMORY_ROOT 或 $DSH_HOME/memory |
readOnly |
true |
true 时写操作在 Host 与面板上均不可用;要写入须设为 false 并重启,再在面板打开写入 |
templatesDir |
无 | 新设备铺底模板目录;亦可 DSH_MEMORY_TEMPLATES 或 $DSH_HOME/memory-templates,否则用插件 templates/basic |
device |
【新设备】 |
铺底时默认设备标签,会替换骨架中的 【设备】 |
典型用法¶
只读浏览与搜索¶
安装并指向已有档案后,在「概览」看四份核心文件的统计;在「事件流」切换条数上限;在「搜索」对事件流做关键词过滤。全程无需打开写入开关。
打开写入后追加日记或状态¶
- 在
cordis.patch.yml将readOnly设为false,重启 DSH。 - 在概览点击「打开写入」并确认。
- 在「日记」或「状态」分段完成表单;写操作经 API 二次确认(如
confirm=yes),并建议带上你读到的文件指纹fp=以配合拒写逻辑。
Host 侧路由前缀为 /api/memory/,例如 GET /api/memory/diary、POST /api/memory/diary/append(需写入已解锁)。完整路由表见仓库 README「接口」一节。
新设备铺底¶
在概览或「选择位置」流程中,对空目录执行铺底:写入 6 件带 【占位】 的骨架(开场.md、身份.md、日记.md、生长\状态.md、生长\生长记录.md、记忆\事件流.jsonl),并标明这是骨架而非真实记忆。目标路径须由你填写,不会默认用配置里的 root 以免误写现有档案。
合并前先看干跑¶
在同步区选择 which=合并记忆|合并日记|合并状态|回流包,先调用干跑接口查看报告,再在写入开关打开且确认脚本名后执行 merge(真跑带 --apply,超时 180 秒)。
本地自检¶
仓库提供模块级自检,可在插件目录执行:
node --check index.js
node --check client.js
node index.js --selftest
node index.js --selftest /path/to/your/archive
node index.js --selftest --keep
失败时退出码为 1。
适用场景与注意¶
适合:已经在用(或计划用)基于文件的本地记忆档案,希望在 DSH 设置页统一查看、搜索,并在明确守卫下做少量追加或编辑;跨设备仍依赖档案内 Python 合并脚本,只需在面板触发干跑与合并。
注意:
- 插件不实现第二套合并逻辑,也不把记忆搬进数据库;格式与编号空间完全服从现有文件约定。
- 默认 只读(配置
readOnly: true+ 面板写入开关关),避免不知情写盘。 - 运行身份与 DSH 进程相同,档案路径与
memory-panel.json落在$DSH_HOME(默认~/.dsh)体系下;多实例或便携部署时留意环境变量。 - 社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,选型以仓库 README 与源码为准。
结尾¶
dsh-memory-board 把「本地记忆档案」接到 DSH 设置页:读、搜、 guarded 写与同步预览,且始终承认磁盘上的文件为权威。若要安装细节、API 与自检命令,以 GitHub 仓库 README 为准;社区条目见 插件目录页。