dsh-memraw
Verifieddsh-memraw · v0.1.1 · MIT
Append-only raw memory for DSH: full transcripts, coordinate index, on-demand recall and one-click backup.
Install
dsh plugin add dsh-memraw Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-memraw · 原文全量记忆
给 DSH 用的「外部记忆大脑」:只追加的原文库 + 坐标索引 + 按需召回 + 一键备份。 与 meow-memory(蒸馏/自动记忆)互补:meow 管「记住了什么」,本插件管「原话在哪、能不能原样取回」。
- 版本:v0.1.0(正式版)
- 数据:
$DSH_HOME/memraw/raw.db(SQLite,WAL) - 本机当前规模:35 会话 / 2.1 万事件 / 2200+ 切片 / 摘要若干
安装
依赖:无运行时 npm 依赖(只用 node:fs / node:sqlite / node:zlib / node:crypto)。
要求 DSH 桌面端(Electron 内置 Node ≥ 22.5,提供 node:sqlite)。已在 Windows + DSH 0.2.1-rc.2 验证。
# 已发布到 npm:[email protected](官方源发布,国内镜像已同步)
dsh plugin add dsh-memraw
装完确认:
cordis_inspect_query查Tool.listTools,应看到 11 个mem_*- 或直接在对话里调
mem_status,返回errors: 0
重启与热重载
- 首次安装 / 换版本:重启桌面客户端(或
dsh web),让 Loader 重新解析包。 - 只改代码(link 到工作区):不用重启。
plugin_manager set_plugin对include:memraw先enabled:false再true,会重新导入改动过的文件。 - 改完代码建议先跑一次本地 harness 脚本(开发用,不在发布包内),再热重载。
工具(11 个)
| 工具 | 作用 |
|---|---|
mem_status |
库状态:路径、会话/事件/切片/摘要数、错误、最近补全与摘要 |
mem_search |
检索原文;默认全局,scope:"workspace" 只查本区,workspace 指定区;返回带 ref、工作区标签、路径、时间的片段 |
mem_read |
按坐标回读单条事件;offset/length 分页;超 100KB 的事件从会话日志现读拼回 |
mem_list_sessions |
最近会话、覆盖水位、缺口起点 |
mem_note |
把一条事实/结论落盘(可带原文坐标) |
mem_hot |
写/改常驻热记忆(soul / user / rules / criteria),进系统提示词 |
mem_digest |
为任意区间生成带坐标摘要;list:true 列出现有摘要 |
mem_synonym |
查看/扩充近义词词典 |
mem_policy |
查看/扩充条件触发的安全约束 |
mem_export |
一键备份(VACUUM INTO + manifest + sha256) |
mem_import |
合并式导入备份(绝不覆盖本地,校验校验和) |
工作区与“换区不失忆”
原文库是全局一份,检索默认跨工作区(换到新工作区也能问以前的事),需要隔离时显式指定:
mem_search(query):全局检索(默认);mem_search(query, scope:"workspace"):只查当前工作区;mem_search(query, workspace:"D:\\projects\\my-app"):只查某个工作区。
每条结果和每个摘要标题都带工作区标签:【压缩摘要|默认工作区】、【压缩摘要|鱼鱼】。
新会话首轮自动引导(bootstrap: true):
- 当前工作区有旧记录 → 注入一条「【近期上下文|标签】」+ 最近 3 条摘要;
- 当前工作区是全新的 → 注入「【新工作区】这里还没有历史,过去的记录在:工作区A(31 会话)、工作区B(2 会话)…」,并提示用
mem_search找回。
标签来源优先级:config.workspaceLabels(路径 → 名字)> 宿主工作区标题(侧边栏里起的名字)> 目录名;default-workspace 目录自动显示为「默认工作区」。工作区改名后会随下一次检索自动刷新,不用重启。
安全约束(policy)
约束不塞进常驻人格,而是按条件触发,每条命中后每个会话只注入一次(压缩改写历史后重置)。
内置 6 条:
| kind | 触发示例 | 注入的一句话 |
|---|---|---|
| privacy | 身份证/密码/银行卡/api_key… | 涉及凭据/身份信息:只做必要引用,不完整复述、不写日志、不外发 |
| link | http(s):// / 打开链接 | 外部链接:不自行打开或抓取未验证链接 |
| danger | 删库/格式化/rm -rf/关机 | 危险操作:先确认目标与后果,给出可回滚方案 |
| readonly | 只读/不要修改 | 只读模式:本轮不改文件、不写数据 |
| forward | 转发/分享给 | 转发前确认范围,不泄露第三方内容 |
| leak | 保密/别告诉 | 隐私信息先脱敏,不主动扩散 |
维护方式:
mem_policy({ list: true })
mem_policy({ add: [{ kind: 'custom', trigger: '合同|报价', text: '涉及合同/报价:不复述具体数字,先确认对方身份。', priority: 15 }] })
注入形态是一条极短的 【本轮约束】… 记录(同一轮命中多条会合并成一行),不占常驻 token;实现上走 agent/pre-step,因为 DSH 不允许在会话中途插入 system 消息。
与 meow-memory 的去重
轻量方案,不做向量比对:
mem_search的结果顶层带source: "memraw",来源可辨;- 常驻指引里有一条硬规则:meow 自动召回里已看到的信息不重复
mem_search;查重了自行忽略。
工作原理(为什么这样设计)
- 原文是底座:每个
session/event原样落进raw_event(只 INSERT),超 100KB 只留头 4000 字 + 指针。 - 索引是派生的:按轮切片 →
chunk+ FTS5(中文单字 + 二元词),每条切片带[start_seq, end_seq]指回原文,坏了可全量重建。 - 每轮不硬塞:实测
systemPrompt.context是追加语义(旧快照不删),所以每轮变化的内容不进上下文;常驻的只有稳定指引 + 热记忆(section,吃缓存)。 - 压缩只补一次:
compaction/summary记录被压掉的区间,下一轮由agent/pre-step补一次原文(有界、只补一次),同时后台异步生成带坐标摘要。 - 不做主动遗忘:只冷归档,不降权、不删除;检索兜底为零命中时明确说「没找到」。
配置(cordis.patch.yml 的 config)
| key | 默认 | 说明 |
|---|---|---|
dir |
$DSH_HOME/memraw |
数据目录 |
oversizeBytes |
102400 | 单事件超过它只留头 + 指针(按字节) |
chunkChars / chunkCharsMax |
1600 / 3000 | 切片目标/上限 |
backfill |
true | 激活时补齐历史会话(按行数判断,允许乱序) |
guide |
true | 是否挂常驻检索指引 |
gapRefill / gapChars |
true / 4000 | 压缩后补原文、单次补多少字 |
autoDigest |
true | 压缩时后台生成带坐标摘要(本地抽取,无模型调用) |
bootstrap |
true | 新会话首轮注入「近期上下文 / 新工作区」提示 |
workspaceLabels |
{} |
工作区目录 → 标签覆盖;未配置时用宿主工作区标题/目录名 |
本插件没有 token 预算配置:它不做每轮上下文注入(设计原因见上),常驻的只有一段稳定指引 + 热记忆,其余靠工具按需检索。
备份与恢复
- 导出:
mem_export,产物在$DSH_HOME/memraw/backup/<时间戳>/,含raw.db+manifest.json。- 先写
.tmp暂存目录,重开快照做PRAGMA integrity_check,记录字节数与 sha256,最后整体改名——中途失败不会留下半成品。
- 先写
- 导入:
mem_import(dir),合并式:- 先校验
manifest.format与dbSha256; - 只追加本地没有的事件(
INSERT OR IGNORE),按行数/坐标水位续传; - 导入后从
raw_event重建切片; - 二次导入同一份备份应为
events: 0(幂等)。
- 先校验
- 换机:把整个
backup/<时间戳>/拷过去,mem_import一次即可;raw.db里带session/workspace字段,可按会话或工作区过滤。
近义词维护
词典在 synonym 表(首次启动自动灌 25 组基础词)。
// 新增一组(同义/近义互换)
mem_synonym({ add: [["猫", "猫咪", "喵", "小猫"], ["备份", "导出", "backup"]] })
// 查看全部
mem_synonym({ list: true })
规则:一组至少 2 个词;查询时只用词典扩展,不会把任意单字塞进 FTS,避免噪音。
目录与表
$DSH_HOME/memraw/
raw.db # 原文 + 切片 + FTS + 摘要 + 热记忆 + 规则
backup/<ts>/ # 一键备份
raw_event / session_meta / chunk + chunk_fts / digest / hot / policy / synonym / assembled_log / meta
已知边界
- 压缩缺口补全只在运行中的会话触发;压完不再进入的会话只靠摘要 + 检索召回。
- 摘要默认抽取式(不调模型);模型润色版尚未实现。
- 与 meow-memory 的去重是规则级(标源 + 提示),不是逐条内容比对。
变更记录
- v0.1.1:补
repository/homepage/bugs字段,指向 GitHub 仓库。 - v0.1.0(正式版):原文入库、按轮切片 + FTS、11 个工具、压缩缺口补回、后台带坐标摘要、备份/恢复(含 sha256 校验)、近义词词典、条件触发安全约束、默认全局检索 + 工作区标签与首轮引导。
- chunker v4:中文单字 + 二元词 + 词典扩展;升级时自动丢弃切片并从
raw_event重放。
License
MIT,见 LICENSE。