dsh-memory-board:在 DSH 设置页管理基于文件的本地记忆档案

前言

在 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:… 一类命令):

  1. 将整个插件目录放到你本地的插件目录,例如 ~/.dsh/plugin-src/dsh-memory-board。
  2. 复制并编辑本机配置:
cp cordis.patch.example.yml cordis.patch.yml

在 cordis.patch.yml 中按需修改 root 等项(该文件已在 .gitignore,不进仓库)。

  1. 在 profile 的 package.json 里把 dsh-memory-board 加入 dsh.profile.bundles(或按你使用的插件管理工具安装)。
  2. 重启 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 【新设备】 铺底时默认设备标签,会替换骨架中的 【设备】

典型用法

只读浏览与搜索

安装并指向已有档案后,在「概览」看四份核心文件的统计;在「事件流」切换条数上限;在「搜索」对事件流做关键词过滤。全程无需打开写入开关。

打开写入后追加日记或状态

  1. 在 cordis.patch.yml 将 readOnly 设为 false,重启 DSH。
  2. 在概览点击「打开写入」并确认。
  3. 在「日记」或「状态」分段完成表单;写操作经 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 为准;社区条目见 插件目录页。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye