dsh-session-memory
Verifieddsh-session-memory · v0.3.1 · MIT
DeepSeek Harness host-only memory: per-turn project memory (<=600 chars, auto-injected per session) + structured long-term vault v3 (identity/habits auto-injected; credentials only on demand via user-profile skill + scoped vault_read; tiered outbound-only
Install
dsh plugin add dsh-session-memory Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-session-memory
DeepSeek Harness(DSH)的 会话记忆插件:每个用户回合结束后在后台静默整理一次记忆,把「用户身份 / 用户习惯 / 本对话项目记忆」自动注入下一次请求,并把「用户身份 / 习惯 / 账号密码」长期保存在 $DSH_HOME 下、账号密码只通过 skill + 工具按需读取。零运行时依赖、host-only。
一句话:对话内自动记重点(≤600 字),跨对话记住你、你的习惯和你的凭据;身份/习惯/项目记忆自动注入,账号密码绝不自动注入。
功能
- 项目记忆(每对话独立):
turn/end后约 1 秒后台完成,一次模型调用同时产出项目记忆、身份、习惯、账号密码与话题标签;每条 ≤40 字符、同一对话累计 ≤600 字符,自动注入当前会话的 system prompt;别的会话可通过session_memory_read(all:true)只读查看。 - 长期记忆 v3(结构化):
$DSH_HOME/memory/vault.json,identity(职业/角色、语言、专业领域等,≤60;从对话判断/推断,如「我现在在开发插件」→「职业:开发人员」)、habits(长期稳定习惯/偏好,每条 ≤20、总 ≤120、去重)、credentials(账号密码类,≤60),带历史版本。 - 自动注入(顺序固定):用户身份(order 156)→ 用户习惯(157)→ 本对话项目记忆(160)→ 固定规则(161);vault 的 credentials 永不注入。
- 按需读取:注册
user-profileskill +vault_read(scope=all|identity|habits|credentials);只有用户明确索要时才读取,返回值用<vault_secret>包裹。 - divergence 三次标签机制(程序强制):用户问题与项目记忆差距很大时,模型先打一个 ≤6 码点的「小标签」并冻结项目记忆;同话题第 2 次继续冻结;第 3 次才判定「可以安心存储」,清掉标签并允许写入本轮项目记忆。标签只落盘
session-memory.json,不注入提示词。 - 分级防泄漏(不卡死):
guardMode: balanced(默认)下本地工具(pwsh/write/edit/read…)放行;只有向外的工具(web_fetch/web_search/subagent/workflow/a2a_send/mcp*)带长期记忆内容时才拦截,web_fetch仅允许trustedDomains白名单;URL/percent-encoding 绕过会被归一后识别。也可切strict/off。 - 程序化过滤:项目记忆写入/注入两侧都会过滤身份与凭据片段、通用凭据形态(密码/高熵 token),避免凭据进入自动注入的上下文。
安装
# 安装到默认 web profile(按需替换 profile 名)
dsh plugin --profile web add dsh-session-memory
# 或固定版本
dsh plugin --profile web add [email protected]
桌面端 DSH:设置 → 插件 → 安装(从市场/本地包),装完重启窗口。
快速验证
- 说
记住:这个项目先做 MVP→ 下一轮问我们刚才定了什么?,回答应来自自动注入的项目记忆。 - 说
我现在在开发插件,喜欢快一点、不要弹窗,以后叫我小王→ 下一轮 system prompt 自动注入「用户身份(职业:开发人员)」与「用户习惯(要求快、不弹窗)」。 - 说
我的测试账号是 testuser,密码是 TestPass123→ 再说我的账号密码是什么?,应通过user-profileskill +vault_read告知;而普通对话的注入段里不应出现密码。 - 换一个完全不同的话题聊三轮 → 项目记忆应在前两轮保持旧内容(divergence 冻结),第三轮延续后才写入新话题条目。
数据位置:$DSH_HOME/memory/session-memory.json(项目记忆 + divergence 标签)、$DSH_HOME/memory/vault.json(长期记忆,0600 best-effort)。
配置
在 profile 的 cordis.patch.yml 里给 session-memory 行加 config(全部可选):
- id: session-memory
config:
projectMaxChars: 600
entryMaxChars: 40
identityMaxChars: 60
habitsMaxChars: 120
habitEntryMaxChars: 20
credentialsMaxChars: 60
guardMode: balanced # balanced | strict | off
trustedDomains: ['example.com']
analysisReasoningEffort: 'off' # 后台分析关 thinking,保证快
debug: false
完整字段见 cordis.patch.yml 头部注释与 lib/config.js。
安全边界(请阅读)
- 长期记忆按要求明文存放在本机
$DSH_HOME/memory/vault.json(0600 best-effort);会进入后台分析请求、用户索要时的会话记录与磁盘。不要把它同步到公开仓库。 - 自动注入只含 identity / habits / 项目记忆;credentials 绝不注入,只经
vault_read按需返回。 - 护栏挡的是外发(外部网站/子代理/工作流/a2a);本地工具放行,用户明确索要时模型可告知本人。
balanced的网络工具识别按工具名;未知的自定义网络工具可能不在名单内,需要严格时用strict。- 已知误伤:两个字符的通用称呼/职业词出现在项目记忆条目中时可能被过滤(安全优先)。
兼容性
- 开发与真机验证:DSH
0.2.1-rc.2。 - Node.js
>=22.19。 engines.dsh:>=0.2.0-rc.1 <0.3.0-0。- 当前单测:
node --test --test-isolation=none "test/*.test.mjs"112/112 绿。
开发
node --check lib/*.js
node --test --test-isolation=none "test/*.test.mjs"
测试目录不随 npm 包发布(
files只含lib/、cordis.patch.yml、README.md、LICENSE);源码仓库包含test/。
License
MIT