跨会话记忆插件(v0.6.1,npm 包 @asherliner/dsh-memory-connect):自动提取、SQLite FTS5 索引、RRF 语义召回(每轮注入系统提示词)、定时维护、LLM 智能合并(自动接入 ctx.llm)、上下文爆炸防护、全局身份 Soul(~/.dsh/soul.md)。v0.5.0 新增:时态上下文图谱(valid_from/valid_until/supersedes,reviseMemory 追加式修正)、信任模型(历史记忆作为不可信参考注入,当前指令绝对优先)、轮末自动摘要。v0.6.0 新增:本地语义 embedding(BAAI/bge-small-zh-v1.5,embed_server.py 提供,余弦相似度 + 与 FTS5 的 RRF 融合,纯本地无云端调用,CPU 约 232 条/秒)。v0.6.1 修复 path 配置 ~ 展开。零配置装完即用。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Asher-2000/dsh-memory-connect
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
跨会话记忆插件 — 让 AI Agent 拥有持久记忆和全局身份
Cross-session memory plugin for DeepSeek Harness (DSH)
English | 中文
Overview
dsh-memory-connect is a cross-session memory sharing plugin for DeepSeek Harness. It automatically extracts, stores, and recalls memories across sessions, giving your AI agent persistent, intelligent memory with context explosion prevention and global Soul identity.
Zero-config — works out of the box with SQLite FTS5 and DSH's built-in LLM.
🚨 v0.4.0 — The "it actually works now" release
v0.3.0 registered the service but never instantiated it (Cordis lazily constructs services — passing the class to
ctx.provide()means the constructor never runs), and the "recall" feature wrote a computed context to a field no one ever read. In practice the plugin did nothing.v0.4.0 fixes the activation chain and wires recall into the system prompt: a
systemPrompt.contextprovider injects## Related Memories from Previous Sessionson every turn. Zero-config runnable: a baredsh plugin addused to crash onconfig.openAt(Cordis passesundefinedconfig when the patch has noconfig:block) —apply()now fills in full defaults (DB at~/.dsh/memory.db,openAt: startup). Verified end-to-end on dsh v0.1.1-rc.2 / Node 24: tell session A "my cat is named Mimi", start a fresh session B and ask — the model answers correctly from memory.See CHANGELOG.md for the full breakdown.
Features
| Feature | Description |
|---|---|
| 🧠 Global Soul | Persistent identity across all workspaces via ~/.dsh/soul.md |
| 🔍 Auto Extraction | Extracts facts, preferences, decisions, and context from conversations |
| 🧠 Cross-Session Recall | FTS5 keyword recall injected into the system prompt every turn (recency fallback when no query text is available) |
| 🛡️ Context Explosion Prevention | Token budget management prevents context window overflow |
| ⏰ Scheduled Maintenance | Automatic periodic decay and consolidation via built-in scheduler |
| 🤖 LLM Consolidation | Intelligent memory merging using DSH's built-in ctx.llm (zero-config) |
| 📉 Memory Decay | Old, unused memories naturally fade; frequently accessed ones persist |
| 🎯 Smart Prioritization | Memory selection based on relevance × recency × frequency |
| 🗜️ Memory Compression | Automatic compression when approaching token limits |
| 🧭 Temporal Context Graph | Every memory carries valid_from/valid_until; corrections are append-only via reviseMemory() (soft-supersede + successor link), never destructive. History stays queryable; recall only sees current truth. |
| 🛡️ Trust Model | Recalled history is injected as an untrusted reference (explicit warning; current instruction always wins) — prevents memory poisoning and prompt conflicts |
| 📝 Turn-End Summarization | turn/end events auto-generate lightweight summary memories preserving the conversation arc |
| 🔎 Semantic Recall | Optional local embedding (BGE-small-zh-v1.5) fuses with FTS5 via RRF — finds memories by meaning even with zero keyword overlap. Opt-in (embeddingEnabled: true). |
🧠 Global Soul (Identity)
The Soul feature provides a persistent identity that follows you across all workspaces.
How it works
- Create
~/.dsh/soul.mdwith your identity information - The plugin automatically loads and injects it into every session
- Your preferences, tech stack, and coding style are always available
Example Soul file
# 🧠 Soul — Global Identity
## 👤 Identity
- GitHub: your-username
- Role: Developer/Designer/Product Manager
## 💻 Tech Stack
- TypeScript, React, Node.js, DSH/Cordis
## 🎨 Coding Style
- Functional programming
- ES Modules
- Zero-config preferred
## ⚠️ Preferences
- No class components
- No redundant comments
Installation
✅ Published on npm — install from npm registry (v0.6.1):
# 方式 A:dsh plugin add(推荐,自动装入 profile)
dsh plugin --profile <你的profile> add @asherliner/dsh-memory-connect
# 方式 B:npm 直接安装
npm install @asherliner/dsh-memory-connect
# 方式 C:本地源码 link(开发/调试用)
git clone https://github.com/Asher-2000/dsh-memory-connect.git
cd dsh-memory-connect
dsh plugin --profile <你的profile> add link:/path/to/dsh-memory-connect
Add to your DSH composition:
# agent.cordis.yml
- id: memory
name: '@asherliner/dsh-memory-connect'
config:
path: ~/.dsh/memory.db
enableSoul: true # Enable Soul injection (default: true)
Requirement: the plugin injects
systemPrompt(used for the cross-session recall context provider). Any profile that loads this plugin needs thesystemPromptservice available (standard in the dsh web/headless profiles).
Configuration
Basic Options
| Option | Default | Description |
|---|---|---|
path |
(required) | Path to SQLite memory database |
openAt |
startup |
When to open: startup, first-query, never |
maxRecallCount |
10 |
Max memories to recall per session |
decayRate |
0.02 |
Decay constant (higher = faster decay) |
journalMode |
wal |
SQLite journal mode |
Scheduler Options
| Option | Default | Description |
|---|---|---|
schedulerEnabled |
true |
Enable periodic maintenance |
schedulerDecayIntervalMs |
3600000 |
Decay interval (ms), default 1h |
schedulerConsolidateIntervalMs |
21600000 |
Consolidation interval (ms), default 6h |
Context Explosion Prevention Options
| Option | Default | Description |
|---|---|---|
maxContextTokens |
4000 |
Max tokens for memory context injection |
smartPrioritization |
true |
Enable smart memory prioritization |
enableCompression |
true |
Enable memory compression |
Soul Options
| Option | Default | Description |
|---|---|---|
enableSoul |
true |
Enable global Soul injection |
soulPath |
~/.dsh/soul.md |
Custom Soul file path |
Semantic Embedding Options (optional)
| Option | Default | Description |
|---|---|---|
embeddingEnabled |
false |
Enable semantic (vector) recall via local embedding server |
embeddingUrl |
http://127.0.0.1:8765 |
Embedding server base URL |
embeddingModel |
BAAI/bge-small-zh-v1.5 |
Model name (must match the server) |
embeddingWeight |
0.7 |
RRF fusion weight for semantic results (0–1) |
To use semantic recall, start the bundled embedding server first:
# one-time: install the Python model
pip install sentence-transformers
# start the server (keeps the model resident)
python3 node_modules/@asherliner/dsh-memory-connect/scripts/embed_server.py --port 8765
Then enable it in the plugin config (embeddingEnabled: true). The plugin degrades gracefully to keyword-only recall if the server is unreachable.
Full configuration example:
- id: memory
name: '@asherliner/dsh-memory-connect'
config:
path: ~/.dsh/memory.db
openAt: startup
maxRecallCount: 10
decayRate: 0.02
journalMode: wal
schedulerEnabled: true
maxContextTokens: 4000
smartPrioritization: true
enableCompression: true
enableSoul: true
API
Search Memories
const memories = await ctx.crossSessionMemory.searchMemories({
query: 'TypeScript configuration',
types: ['fact', 'decision'],
limit: 5,
})
Recall for Session
const memories = await ctx.crossSessionMemory.recallForSession(
'session-123',
'Setting up a new React project',
10
)
Synchronous Recall (for system-prompt providers)
// v0.4.0+ — sync API for prompt-context providers (node:sqlite is synchronous,
// so no async needed). Returns a formatted markdown block or ''.
const block = ctx.crossSessionMemory.recallSync('session-123', 'React project')
Latest User Text (from dsh session logs)
// v0.4.0+ — extracts the most recent user message text from a dsh Session
// (handles {event: ...} wrappers, agent/inbox/spliced, and bare events).
const query = ctx.crossSessionMemory.currentUserText(agent.session)
Store Memory
await ctx.crossSessionMemory.storeMemory({
type: 'preference',
content: 'User prefers functional programming style',
sessionId: 'session-123',
tags: ['coding-style', 'preference'],
})
Manual Maintenance
// Trigger a full maintenance cycle (decay + consolidation)
const result = await ctx.crossSessionMemory.triggerMaintenance()
// Or run individually
await ctx.crossSessionMemory.runDecay()
await ctx.crossSessionMemory.consolidate()
Context Explosion Prevention
How It Works
- Token Counting — Estimates tokens for English, Chinese, and mixed text
- Smart Prioritization — Ranks memories by:
relevance × 50% + recency × 30% + frequency × 20% - Budget Management — Enforces
maxContextTokenslimit (default: 4000) - Memory Compression — Automatically truncates or summarizes when approaching limits
Output Example
## 🧠 Global Identity (Soul)
[Your Soul content here]
---
## Related Memories from Previous Sessions
- [preference] User prefers TypeScript
- [decision] Chose PostgreSQL over MySQL
> 💾 Memory: 2/10 memories + Soul | 250/4000 tokens
Memory Types
| Type | Description | Example |
|---|---|---|
fact |
Objective information | "Project uses TypeScript 5.3" |
preference |
User preferences | "Prefers functional components" |
context |
Project context | "E-commerce platform migration" |
decision |
Decisions made | "Chose PostgreSQL over MySQL" |
skill |
Learned patterns | "How to configure ESLint" |
Development
git clone https://github.com/Asher-2000/dsh-memory-connect.git
cd dsh-memory-connect
npm install
npm test
License
MIT
中文
概述
dsh-memory-connect 是 DeepSeek Harness 的跨会话记忆共享插件。它自动从对话中提取、存储和检索记忆,让 AI Agent 拥有持久化的智能记忆能力,并防止上下文爆炸和全局身份。
零配置 — 基于 SQLite FTS5 和 DSH 内置 LLM,开箱即用。
🚨 v0.4.0 — "这次真的能跑"版本
v0.3.0 只注册了服务但从未实例化(Cordis 懒加载机制:把类传给
ctx.provide()导致构造函数永远不执行),且"召回"功能把计算好的上下文写进了一个无人读取的字段——实际运行中插件什么都不做。v0.4.0 修复了启动链路,并把召回真正接入了系统提示词:通过
systemPrompt.context提供者,每轮对话都注入## Related Memories from Previous Sessions。零配置即可运行:此前仅执行dsh plugin add(patch 无config:块时 Cordis 传入undefined配置)会在config.openAt崩溃——现在apply()自动填充完整默认值(DB~/.dsh/memory.db、openAt: startup)。已在 dsh v0.1.1-rc.2 / Node 24 上端到端验证:会话 A 说"我的猫叫咪咪",开新会话 B 问它,模型能正确从记忆中回答。详见 CHANGELOG.md。
核心功能
| 功能 | 说明 |
|---|---|
| 🧠 全局身份 (Soul) | 通过 ~/.dsh/soul.md 跨所有工作区持久化身份 |
| 🔍 自动提取 | 从对话中提取事实、偏好、决策和上下文 |
| 🧠 跨会话召回 | FTS5 关键词召回,每轮注入系统提示词(无查询文本时按最近记忆兜底) |
| 🛡️ 上下文爆炸防护 | Token 预算管理,防止上下文窗口溢出 |
| ⏰ 定时维护 | 内置调度器自动执行衰减和整合 |
| 🤖 LLM 整合 | 使用 DSH 内置 LLM 智能合并相似记忆 |
| 📉 记忆衰减 | 旧的、不常用的记忆自然消退 |
| 🎯 智能优先级 | 基于相关性 × 时间 × 频率的记忆排序 |
| 🗜️ 记忆压缩 | 接近 token 限制时自动压缩 |
| 🧭 时态上下文图谱 | 每条记忆带 valid_from/valid_until;修正通过 reviseMemory() 追加而非覆盖(软废弃旧记忆 + 新记忆链接),历史可回溯,召回只见当前有效真相 |
| 🛡️ 信任模型 | 召回的历史作为不可信参考注入(显式警告;当前指令绝对优先)— 防止记忆投毒和提示词冲突 |
| 📝 轮末自动摘要 | turn/end 事件自动生成轻量 summary 记忆,保留对话脉络 |
🧠 全局身份 (Soul)
Soul 功能提供跨所有工作区的持久化身份。
工作原理
- 创建
~/.dsh/soul.md包含你的身份信息 - 插件自动加载并注入到每个会话
- 你的偏好、技术栈和编码风格始终可用
Soul 文件示例
# 🧠 Soul — 全局身份
## 👤 身份
- GitHub: your-username
- 角色: 开发者/设计师/产品经理
## 💻 技术栈
- TypeScript, React, Node.js, DSH/Cordis
## 🎨 编码风格
- 函数式编程
- ES Modules
- 零配置优先
## ⚠️ 偏好
- 不用 class 组件
- 不写冗余注释
快速开始
✅ 已发布到 npm — 从 npm registry 安装 (v0.6.1):
# 方式 A:dsh plugin add(推荐,自动装入 profile)
dsh plugin --profile <你的profile> add @asherliner/dsh-memory-connect
# 方式 B:npm 直接安装
npm install @asherliner/dsh-memory-connect
# 方式 C:本地源码 link(开发/调试用)
git clone https://github.com/Asher-2000/dsh-memory-connect.git
dsh plugin --profile <你的profile> add link:/path/to/dsh-memory-connect
添加到 DSH 配置:
# agent.cordis.yml
- id: memory
name: '@asherliner/dsh-memory-connect'
config:
path: ~/.dsh/memory.db
enableSoul: true
依赖说明:插件注入
systemPrompt服务(用于跨会话召回 context 提供者)。所在 profile 需要提供systemPrompt(dsh web/headless profile 默认都有)。
许可证
MIT
链接
同类插件
vectorize-io/hindsight#coding-agents★ 45151
Hindsight:会学习的 Agent 长期记忆系统,自动召回/保存、知识页、深度反思与按仓库隔离的记忆银行。
volcengine/OpenViking#examples/dsh-memory-plugin★ 39169
面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`viking://` URI 防护,以及对接 OpenViking 服务端的 recall/write 记忆工具。
agentscope-ai/ReMe#dsh★ 3548
将 DeepSeek Harness 接入 ReMe 本地优先、自进化的个人知识库:自动把已完成的主 Agent 对话沉淀为用户掌控的 Markdown 记忆,通过 reme_search 结合 BM25、可选向量检索和 wikilink 展开搜索对话与资料,并按日整理长期记忆。
zilliztech/memsearch#MemSearch★ 2711
供 DSH 与其他编程 Agent 共享的 Markdown 记忆,支持自动捕获、步骤前上下文注入、搜索召回,以及通过审阅面板实现 memory-to-skill 自进化。
vshulcz/deja-vu#extensions/dsh★ 1127
读取本机上其他三十三个编程智能体已经写下的会话文件——Claude Code、Codex、Cursor、VS Code Copilot Chat、opencode、OpenClaw、Hermes、Kimi、Cline、Zed 等,包括安装之前的历史:提供 deja_recall、deja_session、deja_blame、deja_fix、deja_how、deja_remember 六个工具与 /deja 命令,并可选地把召回结果加入运行时上下文。本地 BM25 索引,不用大模型,不用向量嵌入,不联网(dsh plugin --profile web add dsh-deja)。
adoresever/graph-memory★ 636
DeepSeek Harness 的可追溯、可检索跨会话记忆:把对话知识沉淀为带类型的图节点(任务/技能/事件)与关系边。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。