LittleBlackTong/dsh-plugin-memory ↗★ 3

dsh-plugin-memory

Long-term memory plugin for DeepSeek Harness: persistent cross-session markdown memory with a soul/persona file, auto-injected at every session start, plus remember/recall/consolidate/forget workflows and portable migration tooling. 适合需要Agent具备长期记忆,在会话启动时自动注入设定与历史背景的用户。

Package
dsh-plugin-memory
Compatibility
Unverified
Harness peer range
^0.1.2-alpha.1
Cordis peer range
^4.0.1
Version
0.8.0
License
MIT
Last updated
Sep 24, 2026

Other repositories with this package name

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:LittleBlackTong/dsh-plugin-memory

配置

键默认值含义
enabledtrue总开关:关闭后不注入 boot 块、不注册 memory 技能
memoryDir~/.memory记忆库绝对路径(~ 自动展开)
bootFiles[SOUL.md, MEMORY.md, index.md]开机注入的文件
bootMaxChars12000boot 块总字符预算(防止占用过多上下文);按文件分配见下文
bootFileBudgets—逐文件字符上限,例如 { index.md: 3500 };未列出的文件分剩余额度(composition 层,改完需重启)
trackPageAccesstrue会话首条用户消息时,把 boot 块实际注入的页面戳 last_access(关闭后衰减表需手动维护)
autoInjecttrue会话开始时注入 boot 块
deferUntilUserSpeakstrue用户发出第一条真实消息后才注入(boot 块 / 追忆 / digest 提醒都遵守);面板可热改
activeSessionOnlytrue只对「当前激活会话」(最近收到用户消息的会话)注入,后台会话不打扰;面板可热改
registerSkilltrue注册内嵌 memory 技能
scaffoldtrue记忆库缺失时自动创建模板(只建不覆盖)
configFile/memory.json用户可改配置的 JSON 文件路径(设置面板读写它)
digestNudgeEnabledtrue防懒 digest 提醒总开关(composition)
digestNudgeAfterMinutes120记忆库超过多久未写入就提醒
digestNudgeCooldownMinutes180两次提醒的最小间隔
digestNudgeMaxPerSession2每个会话最多提醒次数
recallEnabledtrue主动追忆总开关(面板可热改)
recallIntervalMinMinutes30随机间隔下限(分钟,面板可热改)
recallIntervalMaxMinutes240随机间隔上限(分钟,面板可热改)
recallMaxPerSession3每个会话最多追忆次数(面板可热改)
autoCommittrue记忆库 git 自动提交开关(composition)
autoCommitQuietSeconds60变更静默多久后提交(防抖)
autoCommitIntervalSeconds60变更轮询间隔

设置面板(热改)

enabled / memoryDir / autoInject / deferUntilUserSpeaks / activeSessionOnly / registerSkill / recallEnabled / recallIntervalMinMinutes / recallIntervalMaxMinutes / recallMaxPerSession 十项在 DSH 设置页的「记忆 Memory」区块中可改,即时生效:boot 注入、两道礼貌闸门、技能注册、主动追忆(含随机间隔与次数)随修改立即生效;记忆目录切换时自动为新目录初始化脚手架(scaffold: true 时)。其余键(bootFiles / bootMaxChars / bootFileBudgets / trackPageAccess / scaffold / configFile / digestNudge* / autoCommit*)只在 composition 配置层生效,改完需重启。

boot 预算分配(为什么 index 不会先被截掉)

bootMaxChars 是总预算,按文件分配而不是简单平摊:

  1. 有 bootFileBudgets 条目的文件先拿自己的额度;
  2. 其余文件各拿一份均分额度,以文件实际大小封顶——短文件把用不完的额度退回池子;
  3. 池子再补给「还有内容没注入」的文件(每个最多补到均分额度的两倍):index.md 优先,其余按体积降序——所以截断落在哪个文件上由体积决定,而不是由 bootFiles 的书写顺序决定。

当每个文件都小于均分额度时,结果与旧的平摊规则逐字节相同;只有记忆库长大后才会不同。这也意味着:index.md 是路由表,别把它写成摘要表——它会被完整注入,膨胀的代价是挤掉人格与其他记忆。

「当前激活会话」怎么判? DSH 宿主侧没有「浏览器当前聚焦的会话」信号(激活会话是前端概念)。插件用最近一次收到真实用户消息的 live root agent作为激活会话的代理:你在哪个会话里说话,哪个会话就激活;切到别处但不发消息时,宿主感知不到「切换」这个动作(这是代理的已知边界)。若日后需要精确到「展开/聚焦」级别,需补一小段客户端 focus 上报。

记忆健康看板

设置页「记忆 Memory」区块下方是一张只读看板,数据来自 GET /api/memory/insights:

展示含义
记忆页 / index 路由 / 记忆字数记忆库规模(字数按字符计,中文不会按字节虚高 3 倍)
健康分(0–100)由孤儿页、缺 salience/type、陈旧页、失效 index 链接加权得出
访问新鲜度条形图今天 / ≤7 / ≤30 / ≤90 / >90 天 / 从未戳记(驱动自 last_access 自动戳记)
四项体检index 链接完整、无孤儿页、frontmatter 完整、访问新鲜度——口径与 dsh-memory lint 同源
陈旧页候选超过 90 天或从未戳记的页面,按陈旧度排序(前 8)
最近动态log.md 最新 5 条标题

看板是实时的:每次打开设置页(或改完任一配置项后)重新拉取,不落盘、不缓存、不写记忆库。头less 部署没有 webServer 时该路由与看板都不存在,其余功能不受影响。

覆盖 composition 键(例如把 boot 块预算调大),在 profile 的 cordis.patch.yml 里写不带 insert 的 id 覆盖条目:

- id: dsh-memory
  config:
    bootMaxChars: 12000

实现说明:DSH 的 settings wire 只服务硬编码的命名空间白名单,插件命名空间写不进去,因此本插件走自建通道——配置存 /memory.json(schema 校验 + 原子落盘),由插件自注册的 GET/POST /api/memory/config 路由服务,客户端区块 fetch 直连。

首次使用:铸魂

插件安装后,第一次会话里 agent 的首要任务不是干活,而是与你对话定义它的灵魂:名字、性格、价值观、语气、边界,以及你的身份与你们的关系。逐项确认并写回 SOUL.md / user/profile.md,直到 BOOTSTRAP.md 的 status 变为 complete。你可以随时跳过或暂缓。