🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

本地持久记忆 huangjua/dsh-local-memory

DeepSeek Harness
huangjua31 天前有提交已提供中文文档扫描:含敏感能力

用 Markdown 存储跨会话记忆,让智能体记住项目规则

29.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add huangjua/dsh-local-memory
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@dsh-external/dsh-local-memory(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/22 08:28:22

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 42 处,展示前 38 条)
  • 写入本地文件
    src/config.ts:86
    mkdirSync(resolved.memoryRoot, { recursive: true })
  • 读取本地文件
    src/config.ts:90
    if (!existsSync(full)) {
  • 写入本地文件
    src/config.ts:91
    mkdirSync(full, { recursive: true })
  • 读取本地文件
    src/config.ts:98
    if (!existsSync(metaFile)) {
  • 写入本地文件
    src/config.ts:104
    writeFileSync(metaFile, JSON.stringify(meta, null, 2) + '\n', 'utf8')
  • 读取本地文件
    src/config.ts:108
    meta = JSON.parse(readFileSync(metaFile, 'utf8')) as MemoryMeta
  • 写入本地文件
    src/db-core.ts:131
    renameSync(dbPath, dbPath + '.corrupt-' + ts)
  • 写入本地文件
    src/db-core.ts:132
    try { renameSync(dbPath + '-wal', dbPath + '-wal.corrupt-' + ts) } catch { }
  • 写入本地文件
    src/db-core.ts:133
    try { renameSync(dbPath + '-shm', dbPath + '-shm.corrupt-' + ts) } catch { }
  • 读取本地文件
    src/memory/approval.ts:174
    try { ids = readdirSync(base) } catch { }
  • 读取本地文件
    src/memory/approval.ts:179
    try { names = readdirSync(dir) } catch { continue }
  • 读取本地文件
    src/memory/approval.ts:186
    try { st = statSync(full) } catch { }
  • 删除本地文件
    src/memory/approval.ts:192
    unlinkSync(full)
  • 读取本地文件
    src/memory/approval.ts:278
    if (!existsSync(dir)) return []
  • 读取本地文件
    src/memory/approval.ts:282
    names = readdirSync(dir)
  • 读取本地文件
    src/memory/approval.ts:289
    const rec = JSON.parse(readFileSync(join(dir, name), 'utf8')) as PendingRecord
  • 删除本地文件
    src/memory/approval.ts:315
    unlinkSync(path)
  • 写入本地文件
    src/memory/entries.ts:213
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    src/memory/entries.ts:216
    writeFileSync(tmp, content, 'utf8')
  • 写入本地文件
    src/memory/entries.ts:217
    renameSync(tmp, path)
  • 删除本地文件
    src/memory/entries.ts:219
    try { unlinkSync(tmp) } catch { }
  • 写入本地文件
    src/memory/entries.ts:249
    mkdirSync(dirname(lockPath), { recursive: true })
  • 读取本地文件
    src/memory/entries.ts:259
    const st = statSync(lockPath)
  • 删除本地文件
    src/memory/entries.ts:261
    try { unlinkSync(lockPath) } catch { }
  • 删除本地文件
    src/memory/entries.ts:278
    try { unlinkSync(lockPath) } catch { }
  • 读取本地文件
    src/memory/entries.ts:373
    if (!existsSync(path)) return { raw: '', ok: true }
  • 读取本地文件
    src/memory/entries.ts:376
    const buf = readFileSync(path)
  • 写入本地文件
    src/memory/entries.ts:420
    writeFileSync(bakPath, raw, 'utf8')
  • 写入本地文件
    src/memory/entries.ts:482
    mkdirSync(this.memoryDir, { recursive: true })
  • 读取本地文件
    src/memory/memoryDb.ts:573
    try { return readdirSync(dir) } catch { return [] }
  • 读取本地文件
    src/memory/memoryDb.ts:583
    try { if (statSync(p).isFile()) out.push({ path: p, kind: 'workspace', scopeId: id }) } catch { }
  • 读取本地文件
    src/memory/memoryDb.ts:1115
    try { raw = readFileSync(path, 'utf8') } catch { return }
  • 读取本地文件
    src/memory/memoryDb.ts:1165
    try { dbBytes = statSync(dbPath).size } catch { }
  • 读取本地文件
    src/memory/memoryTools.ts:580
    if (existsSync(path)) {
  • 读取本地文件
    src/memory/memoryTools.ts:581
    try { existing = readFileSync(path, 'utf8') } catch {
  • 读取本地文件
    src/memory/memoryTools.ts:880
    try { mtime = statSync(f.path).mtimeMs } catch { continue }
  • 读取本地文件
    src/memory/memoryTools.ts:883
    try { content = readFileSync(f.path, 'utf8') } catch { continue }
  • 读取本地文件
    src/memory/snapshot.ts:145
    try { return readFileSync(p, 'utf8') } catch { return '' }
扫描于 2026/11/4(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/cosmokit@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-loop@deepseek-ai/dsh-commands@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-projection@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/dsh-workspace@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 跨会话持久记忆
  • Markdown存储记忆
  • SQLite镜像自愈

🧠 给 DSH 智能体提供跨会话持久本地记忆(Markdown 单一事实源 + 自愈 SQLite 镜像)

README

由 DeepSeek 最新模型翻译生成
🧠 dsh-local-memory 为 DSH 智能体提供跨会话的持久本地记忆 100% 本地 • Markdown 即真相 • 自愈 SQLite 镜像 • 前缀缓存友好 功能 • 快速开始 • DSH Power Suite • 工具 • 架构 • 简体中文 💡 为什么需要 dsh-local-memory? DSH 智能体天生无状态。每开一个新会话都从零开始,你不得不反复交代项目规则、环境配置和编码偏好。 dsh-local-memory 给智能体装上真正属于你的长期记忆: - 📝 Markdown 是唯一真相来源:所有记忆都以纯 .md 文件存放在 ~/.dsh/memory/ 下。你可以直接查看、编辑,或用 Git 做版本管理。 - ⚡ 零缓存未命中:按会话冻结快照(WeakMap<Session, ...>),保持逐字节的前缀缓存稳定,省 token,响应更快。 - 🔒 100% 本地,失败即关闭:不会泄露到云端。工作区边界严格对照官方工作区注册表校验。 - 🛡️ 分阶段写入审批:修改全局配置档必须由用户明确确认(memory_pending approve),防止模型幻觉乱改。
展开完整文档(README 剩余 1 节)
🧠 dsh-local-memory

为 DSH 智能体提供跨会话的持久本地记忆 100% 本地 • Markdown 即真相 • 自愈 SQLite 镜像 • 前缀缓存友好

功能 • 快速开始 • DSH Power Suite • 工具 • 架构 • 简体中文

💡 为什么需要 dsh-local-memory?

DSH 智能体天生无状态。每开一个新会话都从零开始,你不得不反复交代项目规则、环境配置和编码偏好。

dsh-local-memory 给智能体装上真正属于你的长期记忆:
- 📝 Markdown 是唯一真相来源:所有记忆都以纯 .md 文件存放在 ~/.dsh/memory/ 下。你可以直接查看、编辑,或用 Git 做版本管理。
- ⚡ 零缓存未命中:按会话冻结快照(WeakMap<Session, ...>),保持逐字节的前缀缓存稳定,省 token,响应更快。
- 🔒 100% 本地,失败即关闭:不会泄露到云端。工作区边界严格对照官方工作区注册表校验。
- 🛡️ 分阶段写入审批:修改全局配置档必须由用户明确确认(memory_pending approve),防止模型幻觉乱改。

🚀 快速开始

安装

In your DSH plugin environment
dev_inject_plugin @dsh-external/dsh-local-memory

典型使用流程

1. 让智能体记住:「记住,我们项目用 pnpm 和严格 TypeScript。」
2. 审阅待写入记忆:运行 /local-memory,或通过 memory_pending 批准待写入条目。
3. 无缝召回:任何新会话里,智能体都会自动拿到冻结的记忆上下文,无需额外提示词。

🧩 DSH Power Suite

本插件属于 DSH Agent Power Suite —— 4 个模块化、零硬依赖的插件,组成完整的开发者工作流闭环:

flowchart LR
M["🧠 dsh-local-memory(1. Remember rules & prefs)"] --> E["⚡ dsh-context-economy(2. Save 80%+ tokens reading code)"]
E --> A["🛡️ dsh-evidence(3. Tamper-proof audit receipts)"]
A --> S["🔍 dsh-session-index(4. CJK search & bookmarks)"]
S --> M

style M fill:#e8f4fd,stroke:#2b7de9,stroke-width:2px
style E fill:#eef9f2,stroke:#1e8e3e,stroke-width:2px
style A fill:#fef7e0,stroke:#f29900,stroke-width:2px
style S fill:#f3e8fd,stroke:#8430ce,stroke-width:2px

| 插件 | 在套件中的角色 | 与本地记忆的协同 |
| 🧠 dsh-local-memory | 记忆层(当前) | 整理持久化的长期知识、开发者配置档和工作区约定。 |
| ⚡ dsh-context-economy | 上下文经济 | 把读代码的 token 砍掉 80–93%,给记忆快照留出充足的提示词预算。 |
| 🛡️ dsh-evidence | 审计与回执 | 为执行运行生成 SHA256 回执,让记忆条目落在可验证的证据上。 |
| 🔍 dsh-session-index | 会话搜索 | 为原始 .jsonl.zstd 日志建索引,支持中日韩文字。记忆整理归这里,日志搜索归那里。 |

📖 深入阅读与参考

🛠️ 可用工具与命令(8 个工具 + 1 个命令)

工具

| 工具 | 说明 | 作用域 / 动作 |
| memory_write | 新增记忆条目 | 用户/配置档 ➡️ 暂存;工作区 ➡️ 直接写入 |
| memory_update | 通过 memoryId 或 oldText 修订条目 | 原先的活跃条目标记为 superseded |
| memory_forget | 从活跃记忆中移除条目 | 替换为最小墓碑记录 |
| memory_pending | 管理暂存的审批 | list、approve、reject |
| memory_append_daily| 向每日笔记追加带时间戳的块 | 只追加的工作区草稿本 |
| memory_search | 用 FTS5 trigram 搜索记忆 | 自动预同步改动过的 Markdown |
| memory_status | 详细文件计数、活跃条目、数据库大小 | 只读诊断 |
| memory_distill | 收集候选每日笔记用于蒸馏 | 只读 + 状态元数据 |

用户命令

- /local-memory feedback <receipt-id> bundle <helpful|harmful>:对记忆投递回执提交反馈。

📁 架构与存储布局

~/.dsh/memory/
├── user/ # User-level profile & global memories (MEMORY.md / USER.md)
├── workspaces/<WorkspaceId>/ # Workspace-scoped memories (MEMORY.md)
├── daily/<WorkspaceId>/ # Daily scratch notes (YYYY-MM-DD.md)
├── summaries/ # Distilled summaries
├── pending/memory/ # Staged write approvals
├── index/memory.sqlite # Derived FTS5 SQLite index mirror (Schema v12)
└── meta.json # Metadata & version tracking

关键架构不变量:
- Markdown 是唯一事实来源:所有文本和元数据都放在 .md 文件里。
- SQLite 是可丢弃的副本:一旦损坏,SQLite 会通过 buildMemoryIndex 从 Markdown 自动恢复。
- 搜索前增量同步:memory_search 按 content_hash 即时同步改动过的文件。

⚖️ 设计取舍与边界

| 优势 | 取舍 / 边界 |
| SSOT/副本分离,确保零数据丢失 | Schema v12 迁移链需要严格维护 |
| 双通道:冻结快照 + 实时工具搜索 | 绑定本机(无云同步) |
| 严格的工作区故障关闭隔离 | 索引含明文(不要在不可信的共享机器上使用) |
| 566 个测试用例,覆盖全面 | forget 只移除活跃表面,不做物理磁盘粉碎 |

🧪 构建与测试

Install dependencies
pnpm install --frozen-lockfile

Build TypeScript to lib/
bash scripts/build.sh

Typecheck & Run test suite
npm run typecheck
npm test

🙏 致谢与参考

- Hermes Agent(Nous Research,MIT):entries.ts、threat.ts、approval.ts 改编自 memory_tool、threat_patterns、write_approval。
- 官方 dsh-plan-mode(MIT):WeakMap<Session, ...> 冻结 + systemPrompt.section 动态服务商模式。
- Jesse-njx/dsh-memory(MIT):托管条目内联 HTML 头部元数据格式。
- ben7am1n/dsh-memory(MIT):Live Context 测试框架架构。

属于 DSH Agent Power Suite。基于 BSD-3-Clause 许可。
预览分享卡片长什么样 ↓huangjua/dsh-local-memory
分享 · DeepSeek Harness Hub
huangjua/dsh-local-memory

用 Markdown 存储跨会话记忆,让智能体记住项目规则

这是你的仓库?认领条目

回到顶部