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

记忆旧时光 dsh-xiaoyi/jiyijiushiguang

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

把约定与教训存入数据库,每次会话自动带回模型眼前

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-xiaoyi/jiyijiushiguang
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 68 处,展示前 36 条)
  • 读取本地文件
    memory/dsh-zstd-extract.js:16
    const buf = fs.readFileSync(src);
  • 写入本地文件
    memory/dsh-zstd-extract.js:36
    fs.writeFileSync(dst, all);
  • 读取本地文件
    memory/plugin/index.mjs:130
    if (c && existsSync(c)) { chosen = c; break }
  • 读取本地文件
    memory/plugin/index.mjs:138
    const require_stat = function (f) { return statSync(f) }
  • 读取本地文件
    memory/plugin/index.mjs:141
    if (!f || !existsSync(f)) return 'missing'
  • 读取本地文件
    memory/plugin/index.mjs:189
    const b = readFileSync(new URL(import.meta.url))
  • 执行外部命令固定命令
    memory/plugin/index.mjs:201
    const r2 = spawnSync('whoami', ['/groups', '/fo', 'csv', '/nh'], { encoding: 'utf8', timeout: 4000 })
  • 写入本地文件
    memory/plugin/index.mjs:244
    try { if (logPath) writeFileSync(logPath, line, { flag: 'a' }) } catch (e) { }
  • 写入本地文件
    memory/plugin/index.mjs:246
    try { if ((msg.indexOf('INJECT-') === 0 || msg.indexOf('SEMANTIC-') === 0 || msg.indexOf('PATH-') === 0 || msg.indexOf('CONVENTIONS-') === 0) && injec
  • 读取本地文件
    memory/plugin/index.mjs:255
    if (!existsSync(replicaPath)) {
  • 读取本地文件
    memory/plugin/index.mjs:261
    let rawText = readFileSync(replicaPath, 'utf8')
  • 删除本地文件
    memory/plugin/index.mjs:310
    try { rmSync(coreOut, { force: true }) } catch (e) {}
  • 执行外部命令来自配置/变量
    memory/plugin/index.mjs:312
    rr = spawnSync(powershell, ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', coreRulesPath, '-Tier', 'core', '-OutFile', coreOut], { encoding: 'ut
  • 执行外部命令固定命令
    memory/plugin/index.mjs:370
    const res = spawnSync('curl.exe', ['-s', '--max-time', '12', '-X', 'POST', ollamaUrl + '/api/embed',
  • 写入本地文件
    memory/plugin/index.mjs:878
    writeFileSync(tPath, title, 'utf8')
  • 写入本地文件
    memory/plugin/index.mjs:879
    writeFileSync(bPath, body, 'utf8')
  • 写入本地文件
    memory/plugin/index.mjs:890
    writeFileSync(sPath, machine, 'utf8')
  • 写入本地文件
    memory/plugin/index.mjs:898
    writeFileSync(wPath, '\uFEFF' + ps, 'utf8')
  • 执行外部命令来自配置/变量
    memory/plugin/index.mjs:900
    const child = spawn(powershell, ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', wPath], { stdio: 'ignore', windowsHide: true
  • 删除本地文件递归
    memory/plugin/index.mjs:903
    try { rmSync(dir, { recursive: true, force: true }) } catch (e) { }
  • 删除本地文件递归
    memory/plugin/index.mjs:907
    try { rmSync(dir, { recursive: true, force: true }) } catch (e) { }
  • 读取本地文件
    memory/plugin/verify.mjs:45
    const replicaPath = candidates.find((p) => { try { return existsSync(p) } catch (e) { return false } })
  • 读取本地文件
    memory/plugin/verify.mjs:48
    for (const c of candidates) console.log(' ' + (existsSync(c) ? '[有] ' : '[无] ') + c)
  • 删除本地文件
    memory/plugin/verify.mjs:69
    try { rmSync(probeLog, { force: true }) } catch (e) { }
  • 写入本地文件
    memory/plugin/verify.mjs:76
    writeFileSync(stubCli, ['$ErrorActionPreference = "SilentlyContinue"', 'exit 0'].join('\r\n'), 'utf8')
  • 读取本地文件
    memory/plugin/verify.mjs:104
    try { tailLog = readFileSync(probeLog, 'utf8') } catch (e) { }
  • 删除本地文件
    memory/plugin/verify.mjs:113
    try { rmSync(spoolLog, { force: true }) } catch (e) { }
  • 删除本地文件
    memory/plugin/verify.mjs:114
    try { rmSync(spoolPath, { force: true }) } catch (e) { }
  • 读取本地文件
    memory/plugin/verify.mjs:120
    try { armedLog = readFileSync(spoolLog, 'utf8') } catch (e) { }
  • 读取本地文件
    memory/plugin/verify.mjs:166
    let raw = readFileSync(replicaPath, 'utf8')
  • 删除本地文件
    memory/plugin/verify.mjs:213
    try { rmSync(out, { force: true }) } catch (e) { }
  • 执行外部命令固定命令
    memory/plugin/verify.mjs:214
    const r = spawnSync('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File',
  • 读取本地文件
    memory/plugin/verify.mjs:216
    if (!r || r.status !== 0 || !existsSync(out)) return null
  • 删除本地文件
    memory/plugin/verify.mjs:319
    try { rmSync(probeLog, { force: true }) } catch (e) { }
  • 删除本地文件
    memory/plugin/verify.mjs:347
    try { rmSync(argsPath, { force: true }) } catch (e) { }
  • 写入本地文件
    memory/plugin/verify.mjs:348
    writeFileSync(stubPath, [
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(123 字)↓

记忆旧时光 · Long-term memory for DeepSeek Harness:把每次定下的事存进你自己的数据库,每次会话开局把该记得的放回它眼前。支持 SQL Server / MySQL / SQLite 三种后端(同一份引擎)。

README

由 DeepSeek 最新模型翻译生成
记忆旧时光(jiyijiushiguang) 让 DSH 记住你们定过的约定。 会话再长,也不用重新解释一遍。 一个最小可用的长期记忆层:把对话与决定存进你自己的数据库,并在每次会话开局,把「该记得的东西」自动放到模型眼前 —— 而不是指望它恰好没被上下文截断。 第一次读到这里,不必一次记住;先照着跑一遍,遇到问题再回来查对应那一节。 后端成熟度(2026-10-24) - SQL Server:功能 ✅ / 长期运行 ✅ 已验证(生产环境连续数周) - MySQL(5.7 / 8.0):功能 ✅(15 命令 + 独立断言)/ 长期运行 ⚠️ 未验证 - SQLite(3.33+):功能 ✅(同上)/ 长期运行 ⚠️ 未验证 也就是说:MySQL 与 SQLite 后端现在就能用,但「连续跑几周不出问题」还没有时间证明。 细节见 docs/16-long-term-notes。 它解决什么问题 单个 DSH 聊久了会开始「忘记」:昨天定过的规则、上周踩过的坑、你反复纠正的那几条。 这不是模型变笨,是每次会话只看得到最近一小段上下文,而那段里没有你们定过的东西。
展开完整文档(README 剩余 1 节)
记忆旧时光(jiyijiushiguang)

让 DSH 记住你们定过的约定。 会话再长,也不用重新解释一遍。

一个最小可用的长期记忆层:把对话与决定存进你自己的数据库,并在每次会话开局,把「该记得的东西」自动放到模型眼前 —— 而不是指望它恰好没被上下文截断。

第一次读到这里,不必一次记住;先照着跑一遍,遇到问题再回来查对应那一节。

后端成熟度(2026-10-24)
- SQL Server:功能 ✅ / 长期运行 ✅ 已验证(生产环境连续数周)
- MySQL(5.7 / 8.0):功能 ✅(15 命令 + 独立断言)/ 长期运行 ⚠️ 未验证
- SQLite(3.33+):功能 ✅(同上)/ 长期运行 ⚠️ 未验证

也就是说:MySQL 与 SQLite 后端现在就能用,但「连续跑几周不出问题」还没有时间证明。
细节见 docs/16-long-term-notes。

它解决什么问题

单个 DSH 聊久了会开始「忘记」:昨天定过的规则、上周踩过的坑、你反复纠正的那几条。
这不是模型变笨,是每次会话只看得到最近一小段上下文,而那段里没有你们定过的东西。

本项目做三件事:

1. 存:会话、消息、决定、教训都进数据库(可追溯、可回滚、可备份)
2. 取:按关键词 + IDF(稀有词加权)检索,不用语义模型也能答到点上
3. 放:每轮会话自动注入「强制指令 + 相关旧记忆 + 关键约定全文 + 定义型记忆」

环境要求

PowerShell 5.1+(Windows 10 / 11 / Server 2016 及以上系统自带) Node.js(只有注入插件需要) SQL Server(Express 免费版即可)—— 建表时需要一次 sysadmin Windows 7 用户:需先装 WMF 5.1(系统自带的是 PowerShell 2.0),否则脚本无法运行

一键安装(三个后端任选)

SQLite(零安装,最省事) powershell -ExecutionPolicy Bypass -File .\ops\install.ps1 -Provider sqlite -SqliteDb C:\dsh-mem\data\dsh-mem.db MySQL(口令放文件,别上命令行) powershell -ExecutionPolicy Bypass -File .\ops\install.ps1 -Provider mysql -MySqlServer 127.0.0.1,3306 -MySqlPasswordFile C:\temp\pw.txt SQL Server(默认) powershell -ExecutionPolicy Bypass -File .\ops\install.ps1 -Provider sqlserver -SqlServer 127.0.0.1,1433 -Database DSHMemory

给智能体/自动化用的详细步骤与判定标准见 AGENTS.md。
下面是 SQL Server 的手动步骤(其它后端见 docs/13、docs/14)。

5 分钟跑起来(Windows + SQL Server)

0) 前置:Windows + PowerShell 5.1+ + SQL Server(Express 免费版即可)

1) 复制配置并改连接串
mkdir C:\dsh-mem
Copy-Item examples\config.example.json C:\dsh-mem\dsh-mem.config.json
notepad C:\dsh-mem\dsh-mem.config.json

2) 建库建表(需要 SQL sysadmin,一次性)先建库:CREATE DATABASE DSHMemory;
foreach ($f in Get-ChildItem sql\sqlserver\.sql | Sort-Object Name) {
sqlcmd -E -d DSHMemory -i $f.FullName
}

3) 装注入插件(这一步才是"记忆真的进到会话里"的关键) $pd = Join-Path $env:USERPROFILE '.dsh\profiles\desktop' New-Item -ItemType Directory -Path (Join-Path $pd 'node_modules') -Force | Out-Null cmd /c mklink /D "$pd\node_modules\dsh-memory-bridge" "$PWD\memory\plugin" 然后在 $pd\package.json 的 dependencies 里加一行: "dsh-memory-bridge": "link:<仓库路径>\memory\plugin" ★ 重启 DSH(不重启 = 插件不加载,而且不会报错,最容易被忽略)

4) 体检 powershell -File ops\doctor.ps1 -ConfigPath C:\dsh-mem\dsh-mem.config.json

5) 存一条、再搜回来 powershell -File memory\dsh-mem.ps1 save -Title "第一条记忆" -Body "你好" -Scope global powershell -File memory\dsh-mem.ps1 search 记忆

跑通之后,下一次会话你应该能看到注入段落里出现「关键约定」与「自动检索」。

记忆是怎么"保持新鲜"的(重要)

注入插件读的是一份离线副本(JSON),不是每次都查库。所以刷新机制必须有人负责:

方式 A(推荐,开箱即用):ops\install.ps1 -RegisterTasks → 注册两个计划任务:DSH_MemReplica(每 1 分钟导出副本)、DSH_MemSync(每 3 分钟导入新会话)

方式 B(不注册任务也行):插件会在副本过期(默认 180 秒)时自己在后台触发一次刷新 → 效果略慢一拍,但零配置

本仓库不包含任何常驻服务/闭源程序:刷新要么靠计划任务,要么靠插件自触发,二选一即可。

MySQL 版怎么装(v0.3.3 · 5.7 / 8.0 已验证;长期运行未验证)

版本要求:MySQL 5.6.4+(推荐 5.7 / 8.0;8.4+ 见下方"认证插件"一行)实测环境:MySQL 8.0.12 / Windows。MariaDB 理论可用但未测。
细节见 docs/13-mysql-compatibility.md

1) 建库(utf8mb4 必须显式) mysql -uroot -p -e "CREATE DATABASE dsh_memory CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"

2) 建账号(只给这个库的权限)认证插件按你的版本选:≤8.3 用 mysql_native_password;8.4+ 默认禁用该插件,去掉 IDENTIFIED WITH 让它用默认插件 mysql -uroot -p -e "CREATE USER 'dsh'@'%' IDENTIFIED WITH mysql_native_password BY '你的强口令'; GRANT ALL PRIVILEGES ON dsh_memory. TO 'dsh'@'%'; FLUSH PRIVILEGES;"

3) 建表(按编号执行;连接时把会话时区设为 UTC) for f in sql/mysql/0*.sql; do mysql --defaults-extra-file=my.cnf --init-command="SET time_zone='+00:00'" dsh_memory < "$f" done

4) 验收 mysql --defaults-extra-file=my.cnf -t dsh_memory < sql/mysql/009-verify.sql

⚠ 安全:账号、端口、备份、字符集这几件事请先看 docs/12-mysql-security。
SQLite 版的边界更物理(文件权限就是全部安全边界),见 docs/14-sqlite。
验收时请按 docs/15-verification-checklist 自己查库 —— 引擎说「OK」不算证据。
打算长期运行的话,先看 docs/16-long-term-notes(哪些能放心用、哪些还没验证、小机器怎么配)。

实测环境:MySQL 8.0.12(Windows),10 张表 + 6 个只追加触发器全部建成; UPDATE/DELETE messages 会被触发器拦住(SQLSTATE 45000),UPDATE memories 正常放行。

目录

memory\ 引擎(dsh-mem.ps1)+ 注入插件(plugin\)+ 约定模板(conventions.example.md) sql\ 建表脚本,按数据库分目录:sqlserver\ · mysql\ · sqlite\(三套都已验证) ops\ install.ps1(一键装)/ doctor.ps1(体检)/ secret-scan.ps1(发布前扫描) examples\ config.example.json(占位值) docs\ 为什么做 / 记忆设计(含三层缺陷复盘)/ 复盘集 / 权限与安全软件

数据库支持(重要)

| 数据库 | 功能 | 长期运行 | 适合谁 |
| SQL Server | ✅ v0.1.0 | ✅ 已验证(生产连续数周) | 已有 SQL Server 授权的人 |
| MySQL 5.7 / 8.0 | ✅ v0.3.3(15 命令 + 独立断言) | ⚠️ 未做长期测试 | 多机共享、又不想买 SQL Server 授权的人 |
| SQLite 3.33+ | ✅ v0.3.3(15 命令 + 独立断言) | ⚠️ 未做长期测试 | 单机用户:零安装、零授权、一个文件 |

我们自己的集群仍跑 SQL Server,不切换;SQLite/MySQL 会作为独立版本开发、测试通过后再发布。
这样每个版本都能"下载就能用",而不是让用户自己改连接字符串和方言。

边界(说清楚,避免误解)

- 记忆库里的数据不随仓库发布;仓库只有代码、结构与模板。
- 这是 v0.2.2(experimental):接口可能变,重要环境请先备份。
- 检索是关键词 + IDF,不是语义向量(向量表已留好,后续可接)。

权限与安全软件

装不动、或被杀软拦?看 docs/08-permissions-and-antivirus:里面列了每一步需要什么权限(建表 sysadmin、插件要 profile 写权限…),以及 360 / Defender 常见拦截点与"加白名单而不是关防护"的做法。

文档

| 文件 | 内容 |
| docs/00-why | 我们为什么做这个(含三次失败) |
| docs/02-memory-design | 注入四段、为什么必须 IDF、三层缺陷复盘 |
| docs/04-postmortems | 真实事故与修法 |
| docs/08-permissions-and-antivirus | 权限要求 + 安全软件拦截 |
| docs/ROADMAP | 接下来做什么(SQLite / MySQL / 向量检索) |
| docs/09-file-map | 每个文件是干什么的 |

许可与署名

MIT。作者:小易

致谢

这套东西起于一个很朴素的问题:"你怎么又忘了?" 如果你也在解决同一类问题,希望这里踩过的坑能帮你少走几步。
预览分享卡片长什么样 ↓dsh-xiaoyi/jiyijiushiguang
分享 · DeepSeek Harness Hub
dsh-xiaoyi/jiyijiushiguang

把约定与教训存入数据库,每次会话自动带回模型眼前

这是你的仓库?认领条目

回到顶部