dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
User-authored tiered long-term memory for DeepSeek Harness: injected as a system-prompt section, with a Chinese panel to view and edit it. The AI never writes to memory on its own.
自研的 DeepSeek Harness 插件:把你本人编写的分级长期记忆注入到我的系统提示词里,并提供一个中文图形面板让你直接看和改。
memory_suggest 工具),但只有你在面板里点「采纳」,它才会变成一条通知、让我下一轮去写。见下面「待确认区」。重启 DeepSeek Harness 之后,左侧栏会出现一个「长期记忆」入口(和「插件」「上下文洞察」「技能中心」同一列),点开就是面板:
这是给我和你之间的一个闸门:
memory_suggest 提议一条:目标文件 + 完整措辞 + 理由。这个工具不写任何记忆文件,只在 <DSH_HOME>\memory-suggest.json 里放一条 pending。userNote),所以犹豫期间磁盘上没有任何痕迹;5 秒一次的自动刷新也不会擦掉你正在打的草稿。<MEMORY_SUGGESTION_ACCEPTED> 通知(带着你采纳的原文和你的补充);我到那时才总结措辞、写进记忆文件,并调用 memory_suggest_done 记账。pending,你的补充原样留着,可以改完重新采纳。
页签上有数字气泡显示待确认条数;待确认分页每 5 秒自动刷新(可以一边聊天一边看)。沉默 = 放弃:提议完我就回去干手里的活,不催你。
| 工具 | 干什么 | 会不会写记忆 |
|---|---|---|
memory_suggest | 提议一条(文件限那五个,正文上限 4000 字符,单条可带一句理由) | 不会 |
memory_suggest_done | 处理完一条后记账:写进了哪个文件,或为什么不写 | 不会 |
C:\Users\Adler\.dsh\memory\
├── rules-must.md 必须遵守(硬性) ← 注入
├── agent.md 我的行为设定 ← 注入
├── profile.md 用户画像 ← 注入
├── rules-should.md 可选遵守(酌情) ← 注入
└── log.md 变更日志 ← 不注入,只给你自己记账
直接记事本改也行,效果与面板完全一样——文件是唯一真相。
| 行为 | 说明 |
|---|---|
| 注入位置 | 系统提示词的一个段落,order = -500:Harness 身份之后、人格设定之前 |
| 顺序 | 必须遵守 → 行为设定 → 用户画像 → 可选遵守 |
| `` 注释 | 永远不注入。所以模板里的说明文字不占上下文、不干扰我 |
| 只有标题没有正文 | 整节不注入。空文件 = 零开销 |
| 文件都没内容 | 整块不注入,一个字符都不占 |
| token 成本 | 记忆不变时系统提示词逐字节不变 → 吃满 prompt cache;改了才会有一次新快照 |
| 预算 | 默认 6000 字符,超了按节截断并注明「已截断」 |
在 profile 的 bundle patch 里(cordis.patch.yml):
- insert:
- id: user-memory
name: 'dsh-user-memory'
config:
enabled: true # false = 停用注入,不卸载
dir: '' # 空 = <DSH_HOME>/memory
maxChars: 6000 # 注入总预算(含前言与截断提示)
改完需要重启才对 composition 生效;只改记忆文件内容则不需要。
D:\AI\dsh-plugins\dsh-user-memory\ ← 插件本体(本目录)
C:\Users\Adler\.dsh\profiles\desktop\node_modules\dsh-user-memory ← Junction 指向上面的目录
node test/selftest.mjs # 27 项:注入与面板
node test/suggest-test.mjs # 44 项:待确认闸门 + 补充框 + 撤销
node test/panel-test.mjs # 20 项:面板 UI(需要 react + jsdom,见下)
selftest.mjs:注入位置与顺序、注释剔除、空节不注入、预算截断、停用行为,以及面板接口(读取、保存、拒绝非法文件名、拒绝非文本、畸形请求体不崩、注入反馈文案)。
suggest-test.mjs 盯的是闸门最要紧的那条不变量:提议绝不碰记忆文件;只有 resolveSuggestion 能改状态;非法决定与未知编号被拒;内部步骤(压缩、起标题等)吃不掉一条采纳,只有带真实用户消息的那一步才送达;注入的是一条 ours 的、冻结的 user 消息;重启后待确认区与编号延续;补充(采纳时写入、去除首尾空白、1000 字截断、空补充不写、编辑后以最新一条为准、随通知原文一起交给我)与撤销(仅 accepted 可撤销 → 回到 pending、保留补充、丢掉 decidedAt;pending 与 delivered 一律 409;未知编号 404)。
panel-test.mjs 在 jsdom + React 里渲染真实的面板组件,像浏览器一样点分页、打字、点「采纳」「撤销采纳」、手动触发 5 秒轮询,断言:待确认卡片有补充框且初始为空、打字不发任何请求、采纳把补充一起发出去、采纳后变成只读展示 + 出现撤销按钮、撤销后回到输入框并保留草稿、轮询不擦草稿、已送达的卡片没有再撤销的入口。
它需要的 react / react-dom / jsdom 故意不是本插件的依赖(本插件零依赖、无构建步骤)。想让面板测试真的跑起来,装到一个临时目录再指给它(没设 UMEM_UI_DEPS 时它会打印 SKIP 并以 0 退出,CI 因此保持无依赖):
npm install --prefix P:\_temp\umem-deps react@19 react-dom@19 jsdom@26
$env:UMEM_UI_DEPS = 'P:\_temp\umem-deps\node_modules'
node test/panel-test.mjs
改完代码先跑这三个(改了 index.js 或 client.js 还要重启 App 才生效)。
plugin_manager remove_bundle dsh-user-memory
插件消失,记忆库 C:\Users\Adler\.dsh\memory\ 不会被删(数据与代码分离)。想彻底清干净就再手删那个目录。
import(),Node 的 ESM 模块缓存按路径记账且不失效——改 index.js 或 client.js 后必须重启 App。改记忆文件不需要。desktop(桌面版)与 web(网页版)各有自己的 node_modules;这个插件目前只装在 desktop。