🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

陪伴记忆 ly2601620664/dsh-pet-memory

DeepSeek Harness
ly260162066411 天前有提交已提供中文文档扫描:含敏感能力

分层记住对话细节与关系进展,随时检索调用

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ly2601620664/dsh-pet-memory
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 15 处,展示前 13 条)
  • 读取本地文件
    index.js:46
    if (config.migrateFrom && store.facts().length === 0 && existsSync(config.migrateFrom)) {
  • 读取本地文件
    index.js:47
    store.importMarkdown(readFileSync(config.migrateFrom, 'utf8'));
  • 写入本地文件
    lib/store.mjs:47
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/store.mjs:62
    if (!existsSync(path)) return [];
  • 读取本地文件
    lib/store.mjs:64
    try { raw = readFileSync(path, 'utf8'); } catch { return []; }
  • 写入本地文件
    lib/store.mjs:76
    mkdirSync(this.dir, { recursive: true });
  • 写入本地文件
    lib/store.mjs:77
    appendFileSync(path, JSON.stringify(obj) + '\n', 'utf8');
  • 读取本地文件
    lib/store.mjs:211
    return existsSync(this.personaPath) ? readFileSync(this.personaPath, 'utf8') : '';
  • 读取本地文件
    lib/store.mjs:211
    return existsSync(this.personaPath) ? readFileSync(this.personaPath, 'utf8') : '';
  • 写入本地文件
    lib/store.mjs:215
    writeFileSync(this.personaPath, String(text || ''), 'utf8');
  • 读取本地文件
    lib/store.mjs:241
    if (existsSync(this.scenesPath)) {
  • 读取本地文件
    lib/store.mjs:243
    const legacy = JSON.parse(readFileSync(this.scenesPath, 'utf8'));
  • 写入本地文件
    lib/store.mjs:280
    writeFileSync(this.statePath, JSON.stringify(next, null, 2), 'utf8');
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/dsh-system-prompt
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

陪伴型长期记忆 DSH 插件:分层记忆(对话→事实→场景→人格)、规则抽取、时间衰减检索,全本地文件、append-only 不丢数据。

README

由 DeepSeek 最新模型翻译生成
dsh-pet-memory 陪伴型长期记忆插件:分层记忆(对话 → 事实 → 场景 → 人格)、规则抽取、时间衰减检索。 全部存本地文件,不调用额外模型,不产生额外费用;append-only 存储,多进程写入不丢数据。 dsh plugin --profile <name> add github:ly2601620664/dsh-pet-memory Compatible with: dsh 0.2.x(engines.dsh: >=0.2.1-rc.2 <0.3.0-0) 它做什么 | 层 | 内容 | 存储 | | L3 人格/关系档案 | "我叫他笨蛋"、"关系阶段 3" | persona.md | | L2 场景 | 一段对话的摘要 | scenes.jsonl(只追加) | | L1 事实 | "他喜欢喝冰美式"、"约定:周末去爬山" | facts.jsonl(只追加) | | 命中统计 | 每条事实被检索到几次 | hits.jsonl(只追加) | 三个注入点: 1. systemPrompt.section — 每轮把「人格 + 高价值记忆 + 相关场景」放进系统提示词 2. 工具 — memory_search / memory_add / memory_profile 3. session/event — 回合结束时用规则抽取新事实
展开完整文档(README 剩余 1 节)
dsh-pet-memory

陪伴型长期记忆插件:分层记忆(对话 → 事实 → 场景 → 人格)、规则抽取、时间衰减检索。 全部存本地文件,不调用额外模型,不产生额外费用;append-only 存储,多进程写入不丢数据。

dsh plugin --profile <name> add github:ly2601620664/dsh-pet-memory

Compatible with: dsh 0.2.x(engines.dsh: >=0.2.1-rc.2 <0.3.0-0)

它做什么

| 层 | 内容 | 存储 |
| L3 人格/关系档案 | "我叫他笨蛋"、"关系阶段 3" | persona.md |
| L2 场景 | 一段对话的摘要 | scenes.jsonl(只追加) |
| L1 事实 | "他喜欢喝冰美式"、"约定:周末去爬山" | facts.jsonl(只追加) |
| 命中统计 | 每条事实被检索到几次 | hits.jsonl(只追加) |

三个注入点:

1. systemPrompt.section — 每轮把「人格 + 高价值记忆 + 相关场景」放进系统提示词
2. 工具 — memory_search / memory_add / memory_profile
3. session/event — 回合结束时用规则抽取新事实

数据目录

默认 $DSH_HOME/dsh-pet-memory(通常 ~/.dsh/dsh-pet-memory),可用 config.dir 或 DSH_PET_MEMORY_DIR 覆盖。

存储设计(为什么全是 append-only)

facts.jsonl、hits.jsonl、scenes.jsonl 只追加,永不整文件重写。

原因:桌面端和 web 端是两个 DSH 进程,共用同一个数据目录。任何"读全量 → 改内存 → 整文件替换"的写入,都会用自己那份旧快照抹掉另一个进程刚追加的行。早期版本用 tmp + rename 做命中统计,实测会让另一个进程写入的 40 条记忆全部消失。

现在的做法:
- 每条事实/命中/场景都追加一行
- 读取时折叠:同 kind+text 合并为一条,salience 取最大、ts 取最早、hits 累加
- 命中统计单独文件,touch() 完全不碰 facts.jsonl 正文

修复过的严重问题

| 问题 | 后果 | 修法 |
| touch() 用 tmp+rename 全量重写 | 多进程并发时丢数据(实测 40 条全灭) | 拆出 hits.jsonl,append-only |
| section 未设 interpolate: false | 记忆里出现 {{ 会让整轮 prompt 渲染抛错 | 设 interpolate: false + 渲染前 neutralize() |
| textOf 用空格拼接 block | 行首锚定的清洗规则全部失效(实测 83% 场景被污染) | 改用 \n 拼接 |
| textOf 不区分 block 类型 | 助手内心推理被当成"他说的话"写进记忆 | 只取 type === 'text' |
| hits.includes(f.text) 字符串子串匹配 | limit=1 误伤多条 | 改用对象数组按 id 匹配 |
| addScene 无去重 | fork/compaction 重放导致重复场景 | 按 summary 去重 |
| catch {} 静默 | 落盘失败零日志,"以为在记其实没记" | 统一 warn 日志 |
| 无注入防护 | 粘贴的第三方文本可把指令写进长期记忆 | isPromptInjection() 拦截 |

开发

node test/selftest.mjs # 抽取/存储/检索基础行为
node test/plugin.test.mjs # 用假 ctx 跑一遍插件生命周期
node test/regression.test.mjs # 上面每个已修缺陷的回归用例

配置

dir: null # 数据目录,默认 $DSH_HOME/dsh-pet-memory maxItems: 6 # 系统提示词里放几条事实 includeScenes: true # 是否把相关场景也放进提示词 verbose: false # 打印每轮抽取条数 migrateFrom: null # 一次性导入旧 memory.md 的路径

License

MIT
预览分享卡片长什么样 ↓ly2601620664/dsh-pet-memory
分享 · DeepSeek Harness Hub
ly2601620664/dsh-pet-memory

分层记住对话细节与关系进展,随时检索调用

这是你的仓库?认领条目

回到顶部