{"_id":"@asherliner/dsh-memory-connect","_rev":"3-9f4ada63b7b38de4274f8cca47029126","name":"@asherliner/dsh-memory-connect","dist-tags":{"latest":"0.6.1"},"versions":{"0.5.0":{"name":"@asherliner/dsh-memory-connect","version":"0.5.0","keywords":["dsh","dsh-plugin","memory","cross-session","recall","consolidation","soul","identity"],"license":"MIT","_id":"@asherliner/dsh-memory-connect@0.5.0","maintainers":[{"name":"asherliner","email":"a358793488@gmail.com"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"1dc3c9e07a881ed508e11e8e9b4ce9e7ef0392ba","tarball":"https://registry.npmjs.org/@asherliner/dsh-memory-connect/-/dsh-memory-connect-0.5.0.tgz","fileCount":6,"integrity":"sha512-1LQ1JT1rKYYv/rgGAjYnHmO9tSrd2r37AP/luqL4LOKXWOzHDqN0k6zDPmbA0LLI9N1fSr0pg9cZxkGxyvtrMA==","signatures":[{"sig":"MEUCIQC2RNFb8UoZAUjnhpVAoiFY2FL/fhIVn+pQ6IQKoR6hugIgcshLRwzo0i8lU05p7QKOjx4U0k9asJ3f7mU8tiF1Kxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88154},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"gitHead":"219212c18fb8225edcfd56456866f643038d71dd","_npmUser":{"name":"asherliner","email":"a358793488@gmail.com"},"_npmVersion":"11.12.1","description":"Cross-session memory plugin for DSH — auto-extraction, semantic recall, scheduled maintenance, LLM-powered consolidation, context explosion prevention, global Soul identity","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-scope":"^0.1.0-rc.7","@deepseek-ai/dsh-session":"^0.1.0-rc.7","@deepseek-ai/dsh-invariants":"^0.1.0-rc.7","@deepseek-ai/dsh-session-query":"^0.1.0-rc.7"},"peerDependenciesMeta":{"@deepseek-ai/dsh-scope":{"optional":true},"@deepseek-ai/dsh-session-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dsh-memory-connect_0.5.0_1787815765439_0.2844339458731284","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@asherliner/dsh-memory-connect","version":"0.6.0","keywords":["dsh","dsh-plugin","memory","cross-session","recall","consolidation","soul","identity"],"license":"MIT","_id":"@asherliner/dsh-memory-connect@0.6.0","maintainers":[{"name":"asherliner","email":"a358793488@gmail.com"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"b884a413204db6a5d26842fbaade6e9fb3d4528d","tarball":"https://registry.npmjs.org/@asherliner/dsh-memory-connect/-/dsh-memory-connect-0.6.0.tgz","fileCount":7,"integrity":"sha512-vV6ZqUejt6BQecxlhHZqzpgY9oVevXodRD6rmnDURjiStykVQeUqkO5+2Kn3ycVRjvAOn2xzB5EtyaVmjKLVgw==","signatures":[{"sig":"MEQCIDIhGCWsuqk67qwUfjxasdK90k+3ziIBqmV09T/9+yUdAiAc1rRwYBibolvVaMQJ6UBWxUV6mShoC7P+pBsPtSGZTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103459},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"gitHead":"28ccae387081d20590a4d164e52f8fd257a65ec1","_npmUser":{"name":"asherliner","email":"a358793488@gmail.com"},"_npmVersion":"11.12.1","description":"Cross-session memory plugin for DSH — auto-extraction, semantic recall, scheduled maintenance, LLM-powered consolidation, context explosion prevention, global Soul identity","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-scope":"^0.1.0-rc.7","@deepseek-ai/dsh-session":"^0.1.0-rc.7","@deepseek-ai/dsh-invariants":"^0.1.0-rc.7","@deepseek-ai/dsh-session-query":"^0.1.0-rc.7"},"peerDependenciesMeta":{"@deepseek-ai/dsh-scope":{"optional":true},"@deepseek-ai/dsh-session-query":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dsh-memory-connect_0.6.0_1787831083432_0.9110181654487561","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@asherliner/dsh-memory-connect","description":"Cross-session memory plugin for DSH — auto-extraction, semantic recall, scheduled maintenance, LLM-powered consolidation, context explosion prevention, global Soul identity","version":"0.6.1","type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./package.json":"./package.json"},"license":"MIT","keywords":["dsh","dsh-plugin","memory","cross-session","recall","consolidation","soul","identity"],"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-session":"^0.1.0-rc.7","@deepseek-ai/dsh-session-query":"^0.1.0-rc.7","@deepseek-ai/dsh-invariants":"^0.1.0-rc.7","@deepseek-ai/dsh-scope":"^0.1.0-rc.7"},"peerDependenciesMeta":{"@deepseek-ai/dsh-session-query":{"optional":true},"@deepseek-ai/dsh-scope":{"optional":true}},"dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"gitHead":"d73a481e704d1f7966f322c4adbcefe5102b3b1c","_id":"@asherliner/dsh-memory-connect@0.6.1","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-e7euSsMLWyQhNyVikwCcemy5SZH40enuaYM18B0LyRLGMGwJ1r4a+bvzP/x3sBkrIBhOYmXmsMjUWRqhuCRxYw==","shasum":"3e9173976972846a7976c7cd47ca505cbc3dabc2","tarball":"https://registry.npmjs.org/@asherliner/dsh-memory-connect/-/dsh-memory-connect-0.6.1.tgz","fileCount":7,"unpackedSize":103675,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF54j1wH6XhR08wUPVQ3xN2jlsk7Tik4hc/Y3NyBmZOPAiBWSMcce4qIPv3qmLko9puvEh3idLOfmn2NWA5L+hthdg=="}]},"_npmUser":{"name":"asherliner","email":"a358793488@gmail.com"},"directories":{},"maintainers":[{"name":"asherliner","email":"a358793488@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-memory-connect_0.6.1_1787833627476_0.8396307014903424"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-27T07:29:25.236Z","modified":"2026-08-27T12:27:07.770Z","0.5.0":"2026-08-27T07:29:25.569Z","0.6.0":"2026-08-27T11:44:43.559Z","0.6.1":"2026-08-27T12:27:07.623Z"},"license":"MIT","keywords":["dsh","dsh-plugin","memory","cross-session","recall","consolidation","soul","identity"],"description":"Cross-session memory plugin for DSH — auto-extraction, semantic recall, scheduled maintenance, LLM-powered consolidation, context explosion prevention, global Soul identity","maintainers":[{"name":"asherliner","email":"a358793488@gmail.com"}],"readme":"# @asherliner/dsh-memory-connect\n\n> 跨会话记忆插件 — 让 AI Agent 拥有持久记忆和全局身份  \n> Cross-session memory plugin for DeepSeek Harness (DSH)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Node.js](https://img.shields.io/badge/Node.js-≥18-green.svg)](https://nodejs.org)\n[![DSH](https://img.shields.io/badge/DSH-Compatible-brightgreen.svg)](https://github.com/deepseek-ai/dsh)\n[![Version](https://img.shields.io/badge/version-0.6.1-orange.svg)](https://github.com/Asher-2000/dsh-memory-connect/releases)\n\n---\n\n**English** | [中文](#中文)\n\n## Overview\n\n`dsh-memory-connect` is a cross-session memory sharing plugin for [DeepSeek Harness](https://github.com/deepseek-ai/dsh). It automatically extracts, stores, and recalls memories across sessions, giving your AI agent persistent, intelligent memory with **context explosion prevention** and **global Soul identity**.\n\n**Zero-config** — works out of the box with SQLite FTS5 and DSH's built-in LLM.\n\n> ### 🚨 v0.4.0 — The \"it actually works now\" release\n>\n> 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.\n>\n> v0.4.0 fixes the activation chain and **wires recall into the system prompt**: a `systemPrompt.context` provider injects `## Related Memories from Previous Sessions` on every turn. **Zero-config runnable**: a bare `dsh plugin add` used to crash on `config.openAt` (Cordis passes `undefined` config when the patch has no `config:` 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.\n>\n> See [CHANGELOG.md](CHANGELOG.md) for the full breakdown.\n\n## Features\n\n| Feature | Description |\n|---------|-------------|\n| 🧠 **Global Soul** | Persistent identity across all workspaces via ~/.dsh/soul.md |\n| 🔍 **Auto Extraction** | Extracts facts, preferences, decisions, and context from conversations |\n| 🧠 **Cross-Session Recall** | FTS5 keyword recall injected into the system prompt **every turn** (recency fallback when no query text is available) |\n| 🛡️ **Context Explosion Prevention** | Token budget management prevents context window overflow |\n| ⏰ **Scheduled Maintenance** | Automatic periodic decay and consolidation via built-in scheduler |\n| 🤖 **LLM Consolidation** | Intelligent memory merging using DSH's built-in `ctx.llm` (zero-config) |\n| 📉 **Memory Decay** | Old, unused memories naturally fade; frequently accessed ones persist |\n| 🎯 **Smart Prioritization** | Memory selection based on relevance × recency × frequency |\n| 🗜️ **Memory Compression** | Automatic compression when approaching token limits |\n| 🧭 **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. |\n| 🛡️ **Trust Model** | Recalled history is injected as an **untrusted reference** (explicit warning; current instruction always wins) — prevents memory poisoning and prompt conflicts |\n| 📝 **Turn-End Summarization** | `turn/end` events auto-generate lightweight `summary` memories preserving the conversation arc |\n| 🔎 **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`). |\n\n## 🧠 Global Soul (Identity)\n\nThe Soul feature provides a **persistent identity** that follows you across all workspaces.\n\n### How it works\n\n1. Create `~/.dsh/soul.md` with your identity information\n2. The plugin automatically loads and injects it into every session\n3. Your preferences, tech stack, and coding style are always available\n\n### Example Soul file\n\n```markdown\n# 🧠 Soul — Global Identity\n\n## 👤 Identity\n- GitHub: your-username\n- Role: Developer/Designer/Product Manager\n\n## 💻 Tech Stack\n- TypeScript, React, Node.js, DSH/Cordis\n\n## 🎨 Coding Style\n- Functional programming\n- ES Modules\n- Zero-config preferred\n\n## ⚠️ Preferences\n- No class components\n- No redundant comments\n```\n\n## Installation\n\n> ⚠️ **Not on npm yet** — install from GitHub (v0.4.0):\n\n```bash\n# 方式 A：dsh plugin add（推荐，自动装入 profile）\ndsh plugin --profile <你的profile> add github:Asher-2000/dsh-memory-connect\n\n# 方式 B：npm 直接装 git tag\nnpm install github:Asher-2000/dsh-memory-connect#v0.4.0\n\n# 方式 C：本地源码 link（开发/调试用）\ngit clone https://github.com/Asher-2000/dsh-memory-connect.git\ncd dsh-memory-connect\ndsh plugin --profile <你的profile> add link:/path/to/dsh-memory-connect\n```\n\nAdd to your DSH composition:\n\n```yaml\n# agent.cordis.yml\n- id: memory\n  name: '@asherliner/dsh-memory-connect'\n  config:\n    path: ~/.dsh/memory.db\n    enableSoul: true  # Enable Soul injection (default: true)\n```\n\n> **v0.4.0 requirement**: the plugin now injects `systemPrompt` (used for the cross-session recall context provider). Any profile that loads this plugin needs the `systemPrompt` service available (standard in the dsh web/headless profiles).\n\n## Configuration\n\n### Basic Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `path` | *(required)* | Path to SQLite memory database |\n| `openAt` | `startup` | When to open: `startup`, `first-query`, `never` |\n| `maxRecallCount` | `10` | Max memories to recall per session |\n| `decayRate` | `0.02` | Decay constant (higher = faster decay) |\n| `journalMode` | `wal` | SQLite journal mode |\n\n### Scheduler Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `schedulerEnabled` | `true` | Enable periodic maintenance |\n| `schedulerDecayIntervalMs` | `3600000` | Decay interval (ms), default 1h |\n| `schedulerConsolidateIntervalMs` | `21600000` | Consolidation interval (ms), default 6h |\n\n### Context Explosion Prevention Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `maxContextTokens` | `4000` | Max tokens for memory context injection |\n| `smartPrioritization` | `true` | Enable smart memory prioritization |\n| `enableCompression` | `true` | Enable memory compression |\n\n### Soul Options\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `enableSoul` | `true` | Enable global Soul injection |\n| `soulPath` | `~/.dsh/soul.md` | Custom Soul file path |\n\n### Semantic Embedding Options (optional)\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `embeddingEnabled` | `false` | Enable semantic (vector) recall via local embedding server |\n| `embeddingUrl` | `http://127.0.0.1:8765` | Embedding server base URL |\n| `embeddingModel` | `BAAI/bge-small-zh-v1.5` | Model name (must match the server) |\n| `embeddingWeight` | `0.7` | RRF fusion weight for semantic results (0–1) |\n\nTo use semantic recall, start the bundled embedding server first:\n\n```bash\n# one-time: install the Python model\npip install sentence-transformers\n\n# start the server (keeps the model resident)\npython3 node_modules/@asherliner/dsh-memory-connect/scripts/embed_server.py --port 8765\n```\n\nThen enable it in the plugin config (`embeddingEnabled: true`). The plugin degrades gracefully to keyword-only recall if the server is unreachable.\n\nFull configuration example:\n\n```yaml\n- id: memory\n  name: '@asherliner/dsh-memory-connect'\n  config:\n    path: ~/.dsh/memory.db\n    openAt: startup\n    maxRecallCount: 10\n    decayRate: 0.02\n    journalMode: wal\n    schedulerEnabled: true\n    maxContextTokens: 4000\n    smartPrioritization: true\n    enableCompression: true\n    enableSoul: true\n```\n\n## API\n\n### Search Memories\n\n```javascript\nconst memories = await ctx.crossSessionMemory.searchMemories({\n  query: 'TypeScript configuration',\n  types: ['fact', 'decision'],\n  limit: 5,\n})\n```\n\n### Recall for Session\n\n```javascript\nconst memories = await ctx.crossSessionMemory.recallForSession(\n  'session-123',\n  'Setting up a new React project',\n  10\n)\n```\n\n### Synchronous Recall (for system-prompt providers)\n\n```javascript\n// v0.4.0+ — sync API for prompt-context providers (node:sqlite is synchronous,\n// so no async needed). Returns a formatted markdown block or ''.\nconst block = ctx.crossSessionMemory.recallSync('session-123', 'React project')\n```\n\n### Latest User Text (from dsh session logs)\n\n```javascript\n// v0.4.0+ — extracts the most recent user message text from a dsh Session\n// (handles {event: ...} wrappers, agent/inbox/spliced, and bare events).\nconst query = ctx.crossSessionMemory.currentUserText(agent.session)\n```\n\n### Store Memory\n\n```javascript\nawait ctx.crossSessionMemory.storeMemory({\n  type: 'preference',\n  content: 'User prefers functional programming style',\n  sessionId: 'session-123',\n  tags: ['coding-style', 'preference'],\n})\n```\n\n### Manual Maintenance\n\n```javascript\n// Trigger a full maintenance cycle (decay + consolidation)\nconst result = await ctx.crossSessionMemory.triggerMaintenance()\n\n// Or run individually\nawait ctx.crossSessionMemory.runDecay()\nawait ctx.crossSessionMemory.consolidate()\n```\n\n## Context Explosion Prevention\n\n### How It Works\n\n1. **Token Counting** — Estimates tokens for English, Chinese, and mixed text\n2. **Smart Prioritization** — Ranks memories by: `relevance × 50% + recency × 30% + frequency × 20%`\n3. **Budget Management** — Enforces `maxContextTokens` limit (default: 4000)\n4. **Memory Compression** — Automatically truncates or summarizes when approaching limits\n\n### Output Example\n\n```markdown\n## 🧠 Global Identity (Soul)\n\n[Your Soul content here]\n\n---\n\n## Related Memories from Previous Sessions\n\n- [preference] User prefers TypeScript\n- [decision] Chose PostgreSQL over MySQL\n\n> 💾 Memory: 2/10 memories + Soul | 250/4000 tokens\n```\n\n## Memory Types\n\n| Type | Description | Example |\n|------|-------------|---------|\n| `fact` | Objective information | \"Project uses TypeScript 5.3\" |\n| `preference` | User preferences | \"Prefers functional components\" |\n| `context` | Project context | \"E-commerce platform migration\" |\n| `decision` | Decisions made | \"Chose PostgreSQL over MySQL\" |\n| `skill` | Learned patterns | \"How to configure ESLint\" |\n\n## Development\n\n```bash\ngit clone https://github.com/Asher-2000/dsh-memory-connect.git\ncd dsh-memory-connect\nnpm install\nnpm test\n```\n\n## License\n\nMIT\n\n---\n\n# 中文\n\n## 概述\n\n`dsh-memory-connect` 是 [DeepSeek Harness](https://github.com/deepseek-ai/dsh) 的跨会话记忆共享插件。它自动从对话中提取、存储和检索记忆，让 AI Agent 拥有持久化的智能记忆能力，并**防止上下文爆炸**和**全局身份**。\n\n**零配置** — 基于 SQLite FTS5 和 DSH 内置 LLM，开箱即用。\n\n> ### 🚨 v0.4.0 — \"这次真的能跑\"版本\n>\n> v0.3.0 只注册了服务但**从未实例化**（Cordis 懒加载机制：把类传给 `ctx.provide()` 导致构造函数永远不执行），且\"召回\"功能把计算好的上下文写进了一个**无人读取**的字段——实际运行中插件什么都不做。\n>\n> 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 问它，模型能正确从记忆中回答。\n>\n> 详见 [CHANGELOG.md](CHANGELOG.md)。\n\n## 核心功能\n\n| 功能 | 说明 |\n|------|------|\n| 🧠 **全局身份 (Soul)** | 通过 ~/.dsh/soul.md 跨所有工作区持久化身份 |\n| 🔍 **自动提取** | 从对话中提取事实、偏好、决策和上下文 |\n| 🧠 **跨会话召回** | FTS5 关键词召回，**每轮**注入系统提示词（无查询文本时按最近记忆兜底） |\n| 🛡️ **上下文爆炸防护** | Token 预算管理，防止上下文窗口溢出 |\n| ⏰ **定时维护** | 内置调度器自动执行衰减和整合 |\n| 🤖 **LLM 整合** | 使用 DSH 内置 LLM 智能合并相似记忆 |\n| 📉 **记忆衰减** | 旧的、不常用的记忆自然消退 |\n| 🎯 **智能优先级** | 基于相关性 × 时间 × 频率的记忆排序 |\n| 🗜️ **记忆压缩** | 接近 token 限制时自动压缩 |\n| 🧭 **时态上下文图谱** | 每条记忆带 `valid_from`/`valid_until`；修正通过 `reviseMemory()` **追加而非覆盖**（软废弃旧记忆 + 新记忆链接），历史可回溯，召回只见当前有效真相 |\n| 🛡️ **信任模型** | 召回的历史作为**不可信参考**注入（显式警告；当前指令绝对优先）— 防止记忆投毒和提示词冲突 |\n| 📝 **轮末自动摘要** | `turn/end` 事件自动生成轻量 `summary` 记忆，保留对话脉络 |\n\n## 🧠 全局身份 (Soul)\n\nSoul 功能提供**跨所有工作区的持久化身份**。\n\n### 工作原理\n\n1. 创建 `~/.dsh/soul.md` 包含你的身份信息\n2. 插件自动加载并注入到每个会话\n3. 你的偏好、技术栈和编码风格始终可用\n\n### Soul 文件示例\n\n```markdown\n# 🧠 Soul — 全局身份\n\n## 👤 身份\n- GitHub: your-username\n- 角色: 开发者/设计师/产品经理\n\n## 💻 技术栈\n- TypeScript, React, Node.js, DSH/Cordis\n\n## 🎨 编码风格\n- 函数式编程\n- ES Modules\n- 零配置优先\n\n## ⚠️ 偏好\n- 不用 class 组件\n- 不写冗余注释\n```\n\n## 快速开始\n\n> ⚠️ **尚未发布到 npm** — 从 GitHub 安装 (v0.4.0)：\n\n```bash\n# 方式 A：dsh plugin add（推荐，自动装入 profile）\ndsh plugin --profile <你的profile> add github:Asher-2000/dsh-memory-connect\n\n# 方式 B：npm 直接装 git tag\nnpm install github:Asher-2000/dsh-memory-connect#v0.4.0\n\n# 方式 C：本地源码 link（开发/调试用）\ngit clone https://github.com/Asher-2000/dsh-memory-connect.git\ndsh plugin --profile <你的profile> add link:/path/to/dsh-memory-connect\n```\n\n添加到 DSH 配置：\n\n```yaml\n# agent.cordis.yml\n- id: memory\n  name: '@asherliner/dsh-memory-connect'\n  config:\n    path: ~/.dsh/memory.db\n    enableSoul: true\n```\n\n> **v0.4.0 依赖**：插件现在注入 `systemPrompt` 服务（用于跨会话召回 context 提供者）。所在 profile 需要提供 `systemPrompt`（dsh web/headless profile 默认都有）。\n\n## 许可证\n\nMIT\n","readmeFilename":"README.md"}