DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-memory-inject

Y

dsh-memory-inject

Manifest valid★ 4

Three-layer memory for DeepSeek Harness: persistent facts + session summaries + full-text search. Injection costs no model calls, and writes back use your currently selected model.

UI (client)hasBundlePatchMachine translated

dsh-memory-inject

给 DeepSeek Harness 加一套「记得住」的记忆:三层,一处也不用你操心。

大多数 agent 记忆插件只做检索:把对话存成流水账,下次靠语义搜索捞回来。 这套东西做的是三件事叠在一起 —— 短的常驻、中的会攒、长的能翻。

Three-layer memory for DeepSeek Harness: always-on curated facts (USER.md / MEMORY.md), per-session summaries, and full-text recall over every past session. Injection costs zero model calls; the auto-capture layer uses whatever model you've already picked in the UI.


三层是什么

第 1 层  常驻注入   USER.md + MEMORY.md              每个会话开头自动在场
                   ↓ 一轮结束时提炼新事实写回
第 2 层  会话摘要   每段对话 2~3 句,进 index.db      问「上周三聊了啥」先看这里
                   ↓ 命中的那条会话可以下钻
第 3 层  全量原文   所有会话正文 + FTS5 trigram 索引   真正想翻细节时用
第 1 层第 2 层第 3 层
存什么提炼过的事实条目每会话摘要对话原文
花模型吗注入不花;写回才花建索引时花不花
谁维护模型自动回填 / 你手动改索引脚本索引脚本
预算USER 1375 / MEMORY 2200 字符(硬上限)无无

为什么短的必须有硬上限:第 1 层每个会话都要整份进上下文。它一旦膨胀, 每个会话都在为「上次写的一堆废话」付 token。所以超预算直接拒绝写入,不截断、不偷偷丢。

具体多少钱,见下面「这套东西的开销」那张表。

它给你的两个工具

模型自己就能调,不用你开口教:

工具干什么
memory_search搜过去:关键词 + 可选时间窗(7d / 24h / 2w)。按会话聚合返回标题、时间、命中片段、该会话摘要。问「上周三聊了什么」用的就是它
memory_remember记下来:add / remove / replace / batch。batch 可以在一次调用里先删旧的再加新的,预算只算最终结果(快满时能先瘦身再写)

写入有两条硬规矩:replace 的匹配必须唯一命中(多条命中就拒绝,不猜着改); 写前自动备份到 <memoryDir>/.backup/,只留最近 20 份。

全自动回填

一轮对话结束(turn/end)→ 把这一轮喂给一个一次性 agent 提炼 → 按 USER: / ENV: 分类写回文件。

用哪个模型?你自己的那个。 它 spawn 的是 dsh --profile headless, 而这个 agent 读 ~/.dsh/settings.yaml 的 agent-default-model —— 就是设置里模型选择器写的那个字段。你在 UI 里换成 OAI,它就用 OAI;换别的就跟着换。插件不碰你的 key。

默认关。开法二选一:设置面板里点一下,或 cordis.patch.yml 里 autoCapture: true。

递归保护:提炼子进程带 DSH_MEMORY_INJECT_SUMMARIZE=1,插件见到这个标记直接退出, 免得「提炼出来的会话」又被抓一遍,无限循环。

设置面板

装完在「设置」左侧多一项 记忆(排在「刷B站」后面),两个页签。

常驻记忆(第 1 层)

功能说明
自动总结开关开了立刻生效,不用重启
现在提炼最近一轮不等自动,手动跑一次;结果写回并刷新列表
条目增删改逐条编辑、删除、添加;字符上限自己定(数字框,改完立刻生效)
相似检测加之前先跟已有条目比双字组重合度,像的就提示「合并还是照加」
历史回滚列出 .backup/ 里最近 10 份,点一下恢复(恢复前会先把当前内容也备一份)
导出 / 导入导出 JSON 留档或换机器;导入可选「合并(只加没有的)」或「整份覆盖」

会话摘要(第 2 / 3 层)

功能说明
会话列表最近 60 个:标题 / 时间 / 消息数 / 摘要
搜索走同一套 FTS5,和模型调的 memory_search 一个逻辑
点标题展开原文下钻第 3 层,直接看该会话完整对话
重建索引一个按钮跑 dump + build,不用记命令

面板改的开关和上限存在 <memoryDir>/.settings.json,优先级高于 cordis.patch.yml —— 所以面板是「运行时开关」,patch 是「出厂默认」。

这套东西的开销(粗算)

假设注入内容 3000 字符、每轮都带、自动回填全开,100 轮对话的量级:

项每次100 轮
注入3000 字符 ≈ 1875 tokens约 188k tokens
自动回填一轮对话(≤6000 字符≈3750)+ prompt + 输出 ≈ 4200 tokens约 420k tokens
合计约 6.1k tokens/轮约 610k tokens

折算成钱:61 万 token 按 ¥1/百万 token 粗算 ≈ 0.61 元(100 轮,含注入 + 自动回填全开)。

只看注入那一档(188k token)就更便宜,且注入命中前缀缓存时按缓存档计价(约 ¥0.2/百万量级), 实际可能只有标价的十分之一。

⚠️ 这是理论量级,不是账单:单价随模型和时段变,没算你的对话本身波动, 也没算 cache miss 的比例。要准就看你平台账单,别拿这张表当报销依据。

大约相当于「每轮多花一轮对话本身的 15~25%」。想省:关掉自动回填省 2/3; 把回填改成隔几轮一次再省 80%;注入压到 1500 字符再减半。 注入部分命中前缀缓存的话,实际计价会比表里便宜不少。

安装

# npm(发布后)
dsh plugin --profile desktop add dsh-memory-inject

# 本地路径(开发时)
dsh plugin --profile desktop add /path/to/dsh-memory-inject

装完 dsh 会自动登记进 profile/package.json 的 dsh.profile.bundles 并应用自带的 cordis.patch.yml。开个新会话生效(不必整个客户端重启)。

记忆文件

默认 ~/.dsh/memories/:

~/.dsh/memories/
├── USER.md        用户是谁:称呼、脾气、偏好、反感(预算 1375 字符)
├── MEMORY.md      环境事实:路径、端口、坑、命令(预算 2200 字符)
├── index.db       第 2/3 层的索引(由脚本生成)
└── .backup/       每次写入前的自动备份

格式是硬性的:一行一条,条目之间单独一行 §,不要标题、不要段落。

要求回答直接、只讲事实:反感公文腔、空话客套。

§

改配置前先备份、留回退命令;改完跑自检全绿才重启。

§ 不是为了好看:它让后来更新记忆的(人也好、模型也好)能按条目增删, 而不是整份重写 —— 整份重写迟早丢东西。

建索引(第 2/3 层)

插件只查索引,不建索引。建索引用 scripts/ 里两个脚本:

# 1) 把 DSH 所有会话转录(多帧 zstd)解压成 JSONL
node scripts/dsh-memory-dump.mjs

# 2) 建 FTS5 trigram 索引 → ~/.dsh/memories/index.db
python scripts/dsh-memory-index.py build

# 可选:给每个会话写 2~3 句摘要(要模型,慢)
python scripts/dsh-memory-index.py search "关键词"      # 验证一下

为什么用 trigram 不用默认分词:默认的 unicode61 不支持中文(实测查询返回空), trigram 对中文精确命中(QQ机器人 一查就中)。整份索引 200 多个会话约 30 MB。

摘要那一步可以跳过 —— 第 1 层和第 3 层不依赖它,跳过只是少了「一眼看全会话」的目录视图。

配置

写在 profile 的 cordis.patch.yml 里,用 id memory-inject 覆盖:

配置默认说明
memoryDir~/.dsh/memories记忆目录
files[].maxCharsUSER 1375 / MEMORY 2200每份文件的硬预算
maxTotalChars4000单次注入的总预算,超出的文件整份跳过
turns[]空 = 每轮检查去重;填 [1] = 只第一轮
includePreambletrue是否带「这是记忆不是新输入」的说明行
autoCapturefalse全自动回填开关
captureTimeoutMs180000提炼子进程超时

设计上的取舍(说清楚,别踩)

  • 注入的是消息,不是 system prompt。 DSH 插件能通过 agent/pre-step 往 messages 里加东西, 改不了 system prompt。所以这份记忆以一条带 plugin:dsh-memory-inject 标记的用户消息出现 —— 效果等价(都进上下文、都在场),但它在消息列表里可见,不是隐形的系统指令。
  • 注入零模型调用。 读文件、拼字符串,没有 LLM、没有 embedding、没有网络。
  • 去重靠 source.kind,不靠轮次计数。 所以上下文被压缩掉之后标记消失,下一轮自动补回 —— 记忆不会因为上下文满了就没了。
  • 写盘不等于当前会话立刻变。 本会话已经注入过那份快照,新写入下次开会话才读到。这是刻意的: 中途改记忆不该让本轮的提示跟着抖(前缀缓存友好)。
  • 回填失败一律静默 + 记日志。 记忆是锦上添花,不该有资格弄崩一次对话。

装完先自检

不用开 DSH 界面,一条命令验完所有端点:

node selfcheck.mjs

它用真实插件代码起一个临时 HTTP 服务,把面板要用的每个端点打一遍(读类打你的真实记忆目录, 写类只在临时目录里跑,绝不碰真实文件),最后报 18 通过 / 0 失败。

踩过的坑(写下来省得再踩)

1. 前端是新的,后端可能是旧的。 插件服务端在 DSH 进程启动时加载并缓存,改文件不会重载;而设置面板每次打开都重新拉前端。 于是会出现「面板上有新按钮,点下去 404 unknown POST /capture」这种莫名其妙的状态。

所以 /state 会返回 version 和 routes(它实际支持的路由清单)。面板拿自己的需求一比, 缺什么就在顶部亮黄条:「后端插件是旧版本,先重启客户端」,并列出哪几个功能现在不能用。 看到这条黄条就关掉 DeepSeek Harness 重开,不用清缓存。

2. session_summaries.created_at 是「摘要写入时间」,不是「会话发生时间」。 摘要表里那个字段记的是提炼那一刻的时间戳。想按会话日期筛,必须 join sessions 表取 sessions.created_at(毫秒时间戳,别拿秒级去套)。

3. 空会话不会有摘要。 msg_count = 0 的会话本来就没内容可提炼,报「N 个会话只有 M 条摘要」时这是正常的,不是失败。

4. cordis 的 inject 是硬依赖,不是「有就用」。 export const inject = ['webServer'] 写在插件顶层,意思是「这些服务全部就绪,才准调我的 apply()」。 只要有一个服务没就绪,fibre 就永远停在 PENDING,apply() 一次都不会执行, 而且完全静默——模块顶层照跑、你的探针只有「模块已加载」一行,现象和「插件根本没被加载」一模一样。

更坑的是服务是晚一步就绪的:实测本插件 apply() 那一刻 webServer/tools 都还是 false, 约 4 秒后别的插件才拿到。所以别在 apply() 里用 ctx.get() 赌它已经有了。

正解:

export const inject = []                    // 主 apply 不阻塞
ctx.inject(['webServer'], (sub) => {...})   // 等就绪再挂,cordis 保证

5. ctx 是代理,读没声明的服务属性会直接抛。

Error: cannot get property "webServer" without inject

ctx.webServer、ctx.tools.register(...) 这种写法在 inject = [] 下当场炸——连你写的探针都会炸。 一律用 ctx.get('webServer'):取不到返回 undefined,不抛错。

6. Windows 上 spawn 多行 prompt 会被 cmd.exe 截断。 dsh 在 Windows 上是 .cmd 壳,spawn 它必须 shell: true,而 shell 走的是 cmd.exe —— cmd.exe 把换行当成命令分隔符。多行 prompt 塞进 argv,只有第一行成了位置参数, 后面的内容全丢(实测只送进去 42 个字符,模型回「没有内容」)。

这个坑伪装得极像「解析器坏了」:明明有对话,提炼结果永远是 0 条。 正解是走 stdin:

const child = spawn('dsh', ['--profile', 'headless'], {
  shell: true, stdio: ['pipe', 'pipe', 'pipe'],
})
child.stdin.end(prompt, 'utf8')   // prompt 不进命令行,换行随便

(试过并不可行的:直接 spawn DeepSeek Harness.exe + cli.js 绕开 shell —— 完全没输出; 让模型读临时文件 —— headless profile 里没有 tool-fs;把换行换成空格 —— body 上限 6000 会顶到 cmd 的 8191。)

测试

npm test

33 个用例,全部离线(不需要装进 DSH):

  • test/inject.test.js(8)— 注入、去重、空目录、目录不存在、预算守门、step 过滤、turn 白名单、拒绝分支
  • test/store.test.js(9)— 条目往返、预算拒绝、原子批量、remove 未命中整批失败、patch 唯一性、写前备份、重复不加
  • test/api.test.js(16)— 面板每个端点真调一遍:state / write / config / backups / restore(含路径穿越拦截)/ similar / export / import / sessions / search / session / capture / 404

回退

dsh plugin --profile desktop remove dsh-memory-inject

记忆文件不受影响,删不删随你。

许可

MIT

Comments

Loading…

Similar plugins

dsh-memory

by flymysql

DeepSeek Harness 跨会话记忆库:memory_remember/recall/forget 三个工具 + 系统提示注入,agent 持久化记忆

Terminal & ClientsMemory & ContextSessions & MessagesManifest valid

★ 5

↓ 206/wk

MIT

JavaScript

Sep 21, 2026

dsh plugin --profile web add dsh-memory-vault

by jipika

Two-layer long-term memory for DeepSeek Harness (DSH): global + per-project markdown, live re-read, zero extra LLM cost, with a Settings panel. 给 DSH 的两层长期记忆。

Sessions & MessagesManifest valid

★ 3

↓ 168/wk

MIT

JavaScript

Oct 20, 2026

dsh plugin --profile web add @jipika/dsh-memory

by 1304836815

DSH 会话级记忆插件:收尾提醒 + MEMORY.md 记忆索引维护 + 实时对话日志 + LLM 摘要压缩,配置面板在 设置→插件。Session memory for DeepSeek Harness.

Manifest valid

★ 0

MIT

JavaScript

Aug 21, 2026

dsh plugin --profile web add @dsh-external/dsh-auto-memory

by chenkezhen480

Semantic long-term memory for DeepSeek Harness: embedding-based retrieval over a persistent cross-session memory store, with model-facing tools, proactive per-question recall, automatic conversation summarization, and auto-selected embedding provider (apiKey present → API, otherwise local).

Tools & CapabilitiesManifest valid

★ 0

Apache-2.0

TypeScript

Aug 17, 2026

dsh plugin --profile web add dsh-plugin-semantic-memory

by disc0nct

A persistent memory plugin for DeepSeek Harness that enables agents to store and recall information across sessions — DSH-native tools with atomic storage, validation, and concurrency-safe reads

Tools & CapabilitiesManifest valid

★ 0

MIT

JavaScript

Aug 22, 2026

dsh plugin --profile web add @deepseek-ai/dsh-tool-memory

by zhaoxuejie

让 DeepSeek Harness agent 把本地 Obsidian 知识库当作长期记忆与工作台:全文/语义检索、会话记忆注入、一键捕获、巡检管家(只建议不擅改)

Development & InfrastructureManifest valid

★ 1

MIT

JavaScript

Sep 7, 2026

dsh plugin --profile web add dsh-plugin-vault-memory