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具备长期记忆,在会话启动时自动注入设定与历史背景的用户。
같은 패키지 이름의 다른 저장소
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:LittleBlackTong/dsh-plugin-memory配置
| 键 | 默认值 | 含义 |
|---|---|---|
enabled | true | 总开关:关闭后不注入 boot 块、不注册 memory 技能 |
memoryDir | ~/.memory | 记忆库绝对路径(~ 自动展开) |
bootFiles | [SOUL.md, MEMORY.md, index.md] | 开机注入的文件 |
bootMaxChars | 12000 | boot 块总字符预算(防止占用过多上下文);按文件分配见下文 |
bootFileBudgets | — | 逐文件字符上限,例如 { index.md: 3500 };未列出的文件分剩余额度(composition 层,改完需重启) |
trackPageAccess | true | 会话首条用户消息时,把 boot 块实际注入的页面戳 last_access(关闭后衰减表需手动维护) |
autoInject | true | 会话开始时注入 boot 块 |
deferUntilUserSpeaks | true | 用户发出第一条真实消息后才注入(boot 块 / 追忆 / digest 提醒都遵守);面板可热改 |
activeSessionOnly | true | 只对「当前激活会话」(最近收到用户消息的会话)注入,后台会话不打扰;面板可热改 |
registerSkill | true | 注册内嵌 memory 技能 |
scaffold | true | 记忆库缺失时自动创建模板(只建不覆盖) |
configFile | /memory.json | 用户可改配置的 JSON 文件路径(设置面板读写它) |
digestNudgeEnabled | true | 防懒 digest 提醒总开关(composition) |
digestNudgeAfterMinutes | 120 | 记忆库超过多久未写入就提醒 |
digestNudgeCooldownMinutes | 180 | 两次提醒的最小间隔 |
digestNudgeMaxPerSession | 2 | 每个会话最多提醒次数 |
recallEnabled | true | 主动追忆总开关(面板可热改) |
recallIntervalMinMinutes | 30 | 随机间隔下限(分钟,面板可热改) |
recallIntervalMaxMinutes | 240 | 随机间隔上限(分钟,面板可热改) |
recallMaxPerSession | 3 | 每个会话最多追忆次数(面板可热改) |
autoCommit | true | 记忆库 git 自动提交开关(composition) |
autoCommitQuietSeconds | 60 | 变更静默多久后提交(防抖) |
autoCommitIntervalSeconds | 60 | 变更轮询间隔 |
设置面板(热改)
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 是总预算,按文件分配而不是简单平摊:
- 有
bootFileBudgets条目的文件先拿自己的额度; - 其余文件各拿一份均分额度,以文件实际大小封顶——短文件把用不完的额度退回池子;
- 池子再补给「还有内容没注入」的文件(每个最多补到均分额度的两倍):
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。你可以随时跳过或暂缓。