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

记忆编排进化引擎 3likofj/dsh-anagenesis

DeepSeek Harnessv0.2.1
3likofj8 天前有提交已提供中文文档扫描:含敏感能力

dsh-anagenesis该插件是 DSH 上的可编程记忆编排层 + 自我进化引擎

31.5/100
综合分
2
GitHub 星标
855
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-anagenesis
npm 源 · dsh-anagenesis 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-anagenesis @ 0.2.1
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 10:15:51

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 32 处,展示前 32 条)
  • 读取本地文件
    src/paths.js:80
    if (existsSync(current)) return { rootDir: current, source: 'current', legacyDir }
  • 读取本地文件
    src/paths.js:81
    if (existsSync(legacyDir)) return { rootDir: legacyDir, source: 'legacy', legacyDir, reason: 'legacy directory exists' }
  • 读取本地文件
    src/paths.js:96
    if (!existsSync(snapshot) && !existsSync(join(dir, 'journal'))) return 0
  • 读取本地文件
    src/paths.js:98
    const parsed = JSON.parse(readFileSync(snapshot, 'utf8'))
  • 读取本地文件
    src/preset/index.js:213
    const existing = await readFile(compositionPath, 'utf8').catch(() => undefined)
  • 写入本地文件
    src/preset/index.js:223
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    src/preset/index.js:224
    await writeFile(compositionPath, compositionYaml, 'utf8')
  • 写入本地文件
    src/preset/index.js:225
    await writeFile(metaPath, presetYaml, 'utf8')
  • 删除本地文件
    src/preset/index.js:245
    await rm(join(dir, 'agent.cordis.yml'), { force: true })
  • 删除本地文件
    src/preset/index.js:246
    await rm(join(dir, 'preset.yml'), { force: true })
  • 读取本地文件
    src/scope/project.js:55
    if (existsSync(value)) value = realpathSync(value)
  • 读取本地文件
    src/scope/project.js:106
    const stat = statSync(marker)
  • 读取本地文件
    src/scope/project.js:110
    const text = readFileSync(marker, 'utf8')
  • 读取本地文件
    src/scope/project.js:137
    text = readFileSync(join(gitDir, 'config'), 'utf8')
  • 读取本地文件
    src/viz/mirror.js:37
    if (!existsSync(journalDir)) {
  • 读取本地文件
    src/viz/mirror.js:138
    return existsSync(join(rootDir, 'journal'))
  • 发起网络请求
    window/client.js:3861
    const response = await fetch(API_PATH + '?' + query.toString(), {
  • 读取本地文件
    src/update/check.js:103
    const parsed = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'))
  • 读取本地文件
    src/util.js:205
    return JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    src/store/journal.js:143
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    src/store/journal.js:150
    bytes = (await stat(join(dir, file.name))).size
  • 读取本地文件
    src/store/journal.js:184
    names = await readdir(this.#dir)
  • 读取本地文件
    src/store/journal.js:278
    text = await readFile(join(this.#dir, name), 'utf8')
  • 读取本地文件
    src/store/journal.js:334
    raw = JSON.parse(await readFile(join(this.#dir, name), 'utf8'))
  • 写入本地文件
    src/store/journal.js:372
    await appendFile(file, line, 'utf8')
  • 删除本地文件
    src/store/journal.js:475
    for (const { name } of await this.checkpoints()) if (name !== checkpoint) await rm(join(this.#dir, name), { force: true })
  • 删除本地文件
    src/store/journal.js:476
    for (const { name } of await this.segments()) await rm(join(this.#dir, name), { force: true })
  • 删除本地文件
    src/store/journal.js:535
    for (const { name } of inputs) if (name !== target.name) await rm(join(this.#dir, name), { force: true })
  • 删除本地文件
    src/store/journal.js:583
    await rm(join(this.#dir, name), { force: true })
  • 读取本地文件
    bench/run.mjs:141
    const baseline = existsSync(BASELINE) ? JSON.parse(readFileSync(BASELINE, 'utf8')) : null
  • 读取本地文件
    bench/run.mjs:141
    const baseline = existsSync(BASELINE) ? JSON.parse(readFileSync(BASELINE, 'utf8')) : null
  • 写入本地文件
    bench/run.mjs:151
    writeFileSync(BASELINE, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 可编程记忆编排
  • 自我进化引擎

该插件是 DSH 上的可编程记忆编排层 + 自我进化引擎

v0.4.02026-10-25
· 0.4.0 — 先量,再改 不加工具、不加依赖,改的是检索与写入的质量。存储 v7 → v8(自动迁移,只加 confirmedAt)。 · 亮点 · 离线检索基准(bench/,npm run bench):211 条记忆 × 41 条查询,nDCG@10 0.903 → 0.974,污染率 0.908 → 0.193,平均注入 11.6 → 1.6 条 · 相关性门槛:无关查询不再为了填满预算而注入;ana_recall.excluded 报告排除了谁、为什么 · 图检索:links 参与召回(1 跳扩展),被取代的旧信念默认不再注入 · 写入智能:近重复 top-3 建议、supersedes: [ids] 一事务收编、write.admissionThreshold 接线 · 调参闭环:奖励来自变更后的反馈窗口;一次只允许一个在飞变更 · 仪表盘:新增「召回质量」分区;窗口 UI 改为分组两栏,设施视图增加楼层健康徽标 · 日志完整性:status().journal.health 报告坏行与 seq 空洞 完整变更见 CHANGELOG.md。
v0.3.22026-10-25
· 0.3.2 0.3.1 的建议升级版。 0.3.1 的版本检查本身没问题,但结果到不了界面。 · 修了什么 · 窗口里的「版本更新」块永远是「没检查过」。window/src/host/viz.js 的 readUpdate() 写在模块作用域,却引用了 createRenderer 闭包里的 updateProvider —— 引用不存在,它自己的 try/catch 把 ReferenceError 吞成 null,于是无论服务报什么,设施视图与仪表盘都显示 check disabled / never。核心层的检查是好的(service.updateStatus() / ana_audit view=status 能读到),坏的是最后一公里。 修法:readUpdate(provider) 显式收参数,四个调用点各自传入。 · 补上接线测试:createRenderer({ update }) → 模型必须出现 available/latest,且文本帧不带这个分区。0.3.1 的单测全绿,因为它们测的是投影(模型 → 渲染),没测 provider → 模型 那一段 —— 测函数 ≠ 测接线。 · dsh-anagenesis@0.3.1 已在 npm 上 deprecate,指向本版。 · 真机实测(本机,0.2.1-rc.3 宿主) GET /anagenesis/api?method=dashboard current version=0.3.1 | latest version=0.3.1 | update=up to date | last checked=8s ago GET /anagenesis/api?method=facility {"enabled":true,"mode":"npm","current":"0.3.1","latest":"0.3.1","available":false,"error":""} 即:核心行真的发了一次 GET 到 registry.npmjs.org、读回 latest、与自己比过、两个界面都拿到了这个状态。 · 闸门(本轮实测) npm test 118/118 npm run preflight 35/35 npm run test:window 91/91 npm run gate:pack 14/14 npm run verify:boot 98/98 preview.mjs 11/11 npm run gate:window 91/91 + 19 项探针 完整变更见 CHANGELOG.md。
v0.3.12026-10-25
· 0.3.1 一块牌子:有新版本了。非破坏性变更 —— 存储仍是 v7,行 id / 工具 / 路由都没动。 · 新增 · 新版本提示:插件会检查自己是不是最新版,并把结果画在仪表盘上。 - 设施视图(窗口默认面)顶条出现信号黄牌子 v0.4.0 可更新(悬停写着升级方式),告警台里同时有一条「有新版本 vX.Y.Z」。 只有真的查到新版本时才出现 —— 检查关闭 / 没查过 / 查失败都不占顶条。 - 仪表盘面新增「版本更新」分区:当前版本 / 最新版本 / 更新状态(有新版本 · 已是最新 · 检查已关闭 · 检查失败:原因)/ 上次检查。 - ana_audit view="status" 与 service.updateStatus() 里同样能读到,Agent 不必靠猜。 - 它只提示:不下载、不安装、不重启、不改任何文件。 · 默认值与那个开关 | 配置 | 默认 | 说明 | |---|---|---| | updateCheck | 代码里 off,bundle 里 npm | off = 完全离线;npm = 每 6 小时读一次 npm 上的 latest | | updateCheckIntervalMs | 21600000 | 检查间隔,同时是缓存寿命 | | updateRegistry | | 换镜像改这里 | | updateCheckTimeoutMs | 5000 | 单次超时;超时按「检查失败」显示 | 只发一次 GET、不带实例 id / 项目指纹 / 记忆内容,下载零字节、安装零动作。 想要完全离线:updateCheck: off,一行就够。 · 实现要点 · 版本比较是自己写的纯函数(src/update/check.js),不引 semver —— 零运行时依赖是硬约束; 已覆盖预发布优先级(0.3.1-rc.1 0.3.1)。 · 窗口不自己上网:它问核心服务的 updateStatus(),是否联网由核心行的配置决定。 · 文本帧(ana_dashboard / 窗口 /frame)不加这个分区:那一份必须逐字节相同(有探针守着), 更新状态会随时间变化,所以只在结构化模型里出现。 · disclosure.network 从空数组改为如实声明 registry.npmjs.org。 · 闸门(本轮实测) npm test 118/118 npm run preflight 35/35 npm run test:window 90/90 npm run gate:pack 14/14 npm run verify:boot 98/98 preview.mjs 11/11 npm run gate:window 90/90 + 19 项探针 完整变更见 CHANGELOG.md。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-anagenesis 给智能体一套它自己管得住、你也看得见的记忆。 不是又一个「自动记忆黑箱」:记忆操作是智能体手里的 20 个语义工具;注入策略是运行时可换的纯函数栈;每一次变更都带逆操作、进日志、可回滚;整个存储自包含、离线、零依赖。 English · 更新日志 · Apache-2.0 Listed on dsh-plugin.org dsh.so risk dsh.so install · dsh 0.2.0-rc.2 dshfind anagenesis 桌面窗口 —— 设施平面图(默认面) 一眼看懂它和「自动记忆插件」的差别 | | 典型「自动记忆」插件 | anagenesis | | 谁在写 | 后台抽取流水线,模型不知道它记了什么 | 智能体主动调用 ana_remember / ana_promote / ana_link,写什么、为什么写由它自己决定 | | 怎么取 | 一条固定的相似度管线 | 7 种意图(orient / recall_fact / recall_precedent / avoid_mistake / reuse_procedure / verify / contrast)× 6 套可切换策略栈 |
展开完整文档(README 剩余 1 节)
dsh-anagenesis

给智能体一套它自己管得住、你也看得见的记忆。

不是又一个「自动记忆黑箱」:记忆操作是智能体手里的 20 个语义工具;注入策略是运行时可换的纯函数栈;每一次变更都带逆操作、进日志、可回滚;整个存储自包含、离线、零依赖。

English · 更新日志 · Apache-2.0

Listed on dsh-plugin.org
dsh.so risk
dsh.so install · dsh 0.2.0-rc.2 dshfind

anagenesis 桌面窗口 —— 设施平面图(默认面)

一眼看懂它和「自动记忆插件」的差别

| | 典型「自动记忆」插件 | anagenesis |
| 谁在写 | 后台抽取流水线,模型不知道它记了什么 | 智能体主动调用 ana_remember / ana_promote / ana_link,写什么、为什么写由它自己决定 |
| 怎么取 | 一条固定的相似度管线 | 7 种意图(orient / recall_fact / recall_precedent / avoid_mistake / reuse_procedure / verify / contrast)× 6 套可切换策略栈 |
| 错了怎么办 | 改了就改了 | 每笔变更都是声明式 patch,带 revert();日志是唯一真相,审计可复查,重启后仍可回滚 |
| 谁看得见 | 全局共享,靠自觉 | 项目指纹自动隔离;跨项目要显式授权并逐条标注;预设 = 权限开关(没启用时写入工具根本不存在) |
| 依赖什么 | 向量库 / 云服务 / 模型调用 | 零运行时依赖、离线、单文件 JSONL;唯一网络出口是可选版本检查 |
| 质量证据 | 靠演示视频 | 自带离线检索基准:211 条记忆 × 41 条查询,npm run bench 可复跑、可对比、可回退 |

四个能立刻感受到的点

1. 不会「越想越脏」:相关性不足的记忆不会为了填满预算被注入;被取代的旧信念默认不再出现; ana_recall 会明确告诉你排除了谁、为什么(excluded.nearMisses)。
2. 不会「记了就忘为什么」:每条记忆带 kind / state / confidence / provenance / links;关系参与检索(1 跳图扩展),不是画着好看。
3. 不会「改了就回不去」:单写 Mutex + 事件溯源 + 冻结快照;revert(seq) 在重启后仍然有效,连「撤销审计行」都会被显式拒绝。
4. 不会「出了事看不见」:设施仪表盘把存储画成楼层(命名空间)× 分区(记忆类型)× 传感器(记录),右侧是读数、能耗基线、告警与实时电文;换到「体检」面是 11 个分区的中文仪表盘。

它不做什么:不做后台自动抽取、不桥接别的记忆插件、不调用模型、不起子进程、不加遥测。
卸载之后,你的记忆仍然是一堆可读的 JSONL。

0.4.0 新增:先量,再改

这一版不新增工具、不新增依赖,改的是注入的每一分注意力值不值。存储升到 v8(自动迁移,只加一个字段)。

| 变化 | 之前 | 现在 |
| 相关性门槛 | 没有:预算有多少就灌多少 | 绝对 + 相对两道门槛,按 intent 缩放;空查询(orient 简报)不受限 |
| 词法分 | 原始 BM25(记录越长越占便宜) | IDF 加权覆盖率:词表内排序,含未知词做门槛 |
| 语义项 | (cos+1)/2:每条白拿 0.5 底分 | max(0, cos):不相关就是 0 |
| 重复与多样性 | 先排序再罚分(顺序不变) | 短名单内真 MMR;预算放不下的候选移出池 |
| links | 只画图,不参与检索 | 1 跳图扩展:supports/part_of/caused_by 等可救回被门槛挡掉的上下文 |
| 取代 | supersedes 字段从未被写入 | ana_link rel=supersedes 双写两侧;旧信念默认不再注入(includeSuperseded 可看历史) |
| 时间衰减 | 读 updatedAt:连一条线就变「新鲜」 | 读 confirmedAt:提升/锁定才算确认 |
| 写入 | 只做完全字符串去重 | 返回近重复 top-3 + 建议动作;supersedes: [id...] 一次事务收编 |
| 自调参 | 4 个旋钮无人消费 | 全部接线或删除;奖励来自「变更之后」的反馈窗口;一次只允许一个在飞变更 |
| 召回输出 | 只有排除计数 | excluded:按原因计数 + 最强 3 条近失(带 why) |

基准(同一份语料,0.3.2 → 0.4.0)

211 条确定性合成记忆 × 41 条带 gold 的查询,覆盖精确、改写、图、取代、作用域、无关查询:

| 指标 | 0.3.2 | 0.4.0 |
| nDCG@10 | 0.903 | 0.974 |
| MRR | 0.780 | 0.854 |
| Recall@5 | 0.963 | 1.000 |
| Precision@5 | 0.180 | 0.809 |
| 污染率(注入但无关) | 0.908 | 0.193 |
| 平均注入条数 / 查询 | 11.6 | 1.6 |
| tokens / 相关条 | 627 | 162 |
| 无关查询注入条数 | 8.3 | 0.0 |
| crossProject: true 命中 | 0 | 1.0 |

npm run bench 可复跑;bench/baseline.json 是回归闸门。语料是合成的、确定性的,不替代真实会话,但它让每一次评分改动都能被对比、被回退。

升级须知(行为变化):存储 v7 → v8 自动迁移;相关性不足的记忆不再为了填满预算而注入,召回结果可能比以前少 —— 那是真的没有相关内容,ana_recall 的 excluded 会说明排除了谁。
recall.explorationRate 已删除(它从未产生任何效果)。

0.3.0 新增:一个包,一块设施仪表盘

这一版做两件事:两个插件合成一个(窗口不再是需要单独安装的兄弟包),以及把仪表盘换成设施视图 —— 记忆库被画成一栋可以运维的楼。

| 新增 | 一句话 | 你能看到什么 |
| 一个包 | dsh-anagenesis-window 并入 dsh-anagenesis:一个包、六个 Loader 行(仍可逐行 disabled: true)、一份 dsh.client | 安装只有一条命令;行 id 与工具不变 |
| 设施视图(默认面) | 楼层 = 命名空间(当前项目 / 全局 / 每个会话),分区 = 记忆类型,传感器 = 一条活跃记忆 | 左侧图标栏 / 中央平面图 / 右侧分区详情 / 上下状态条 |
| 真实读数 | 显著度 / 置信度 / 新鲜度,以及「本分区单条能量 vs 全楼实测均值」 | 模型里没有的数字不会出现在屏幕上 |
| 告警台 | 矛盾链接、即将过期、高显著但陈旧、悬空链接、锁定、安全模式、脱敏关闭、只读档位 | 每一条都带数量与"为什么值得看" |
| 实时电文 | 日志尾部真实事件流,底部滚动 | 你改了什么、刚才发生了什么,一眼可见 |
| 适配宿主 0.2.1-rc.2 | 三处 peerDependencies 抬到 ^0.2.1-rc.2,并用真 Cordis 复跑 98 项启动契约 | 装得上、启动得了 |

升级须知(破坏性):旧的 dsh-anagenesis-window 包停止更新了。
如果你装过它,请卸载(dsh plugin remove dsh-anagenesis-window,或从 profile 的 bundles 里删掉那一行),只保留 dsh-anagenesis —— 窗口现在是这个包的第六行。窗口路由改为 /anagenesis/api,存储格式没有变(仍是 v7),不需要迁移。

0.2.0 新增:记忆按项目隔离,预设成为权限开关

这一版解决两件真事:A 项目的经验不再在 B 项目里被召回;不启用预设时,模型连写入工具都看不到。

| 新增 | 一句话 | 你能看到什么 |
| 记忆作用域 | 每条记忆都带 global / project(默认)/ session 标签;检索默认只召回当前项目 + 全局 + 当前会话 | 仪表盘新增「作用域」分区:当前项目青色、别的项目黄色、全局与旧记忆一目了然 |
| 项目指纹 | 由 git remote(优先)或工作目录算出 p1_<hash>,纯函数、跨重启稳定 —— 同一份代码的多个检出是同一个项目 | 换目录、换机器、开新会话都不会认错项目 |
| 跨项目要授权 | 传 crossProject: true 才纳入别的项目,命中被降权并逐条标注「⚠ 其他项目经验,请勿盲从」 | 注入块里直接写明哪些不能盲从 |
| 冲突自动降权 | 与当前项目记忆语义相似但内容相反时,跨项目那条的有效置信度当场减半,并提示以当前环境为准 | 只改这一次的投影,绝不回写存储 |
| 物理隔离 | 日志按命名空间分文件(journal-<ns>-.jsonl),全局记忆有自己的文件;旧存储原样可读 | node tools/scope-report.mjs 一眼看到"谁占了多少、在哪个文件里" |
| 预设 = 权限层 | 写入类工具只在启用 anagenesis 预设时才注册;档位 passive(只读)/ assisted(可写)/ autonomous(可自动调度) | ana_preset action="status" 就是权威答案:你现在到底有哪些工具 |
| 执行期检查 | ctx.tools.guard() + 每个写入工具自带的授权校验:没注册就调不到,授权撤销后连缓存的定义也拒绝执行 | 提示词不是唯一防线 |
| 状态脉冲 | 每一步都有一段 <anagenesis-pulse>:当前项目指纹、档位、可用工具集 | 模型自己就能核对"这条记忆能不能用" |
| 会话即弃 | 会话级记忆默认 24h 过期;ana_scope action="drop-session" 一键回收(普通事务、可回滚) | 临时任务的中间状态不会变成永久信念 |
| 新工具 | ana_list(按作用域列出)、ana_scope(status / list / namespaces / retag / adopt / drop-session) | retag 可回滚;把项目记忆提升为全局需要用户显式授权 |

升级须知(破坏性):存储结构 v6 → v7 自动迁移。迁移把带 workspace 的旧记录归入正确项目,其余标为 migrated-global —— 继续可召回但被降权,可用 ana_scope action="adopt" 收回到当前项目。建议重启桌面端以加载新的工具分层。

它在同类里的独特之处

- 作用域是存储的一等公民,不是检索时的一个过滤器:写入、日志分段、召回过滤、按 id 读取、可视化五处共用同一个命名空间判定,所以「这条经验属于谁」在文件系统层面也成立。
- 预设不是提示词集合,是权限开关:档位决定写入工具存不存在,而不是「该不该用」。宿主侧没有权限字段可用(ToolDefinition 里没有 readOnly),所以我们用唯一真正可靠的那把锁:注册 / 不注册。
- 单一 seq 空间 + 声明式 patch:正因为日志没有按项目分库,revert(seq)、审计轨迹与工具返回的句柄才仍然全局唯一 —— 隔离做在文件上,可逆性做在计数器上。
- 物理隔离与旧数据兼容同时成立:每个命名空间有自己的日志段与归档段,而全局命名空间保留原有的无前缀命名,升级前写下的存储一个字节都不用改。
- 契约可被证伪:150 条主测试 + 91 条窗口测试 + 一个真 Cordis / 真 defineTool / 真预设注册表的开机沙箱 98 项检查 + 35 项发布自检 + 一次真打包真安装的打包闸门 + 一份可复跑的离线检索基准,跑的都是真实行代码,不是 mock 的复制品。

三句话说明它是什么

1. 它是一座你自己操作的记忆库:按意图召回、按主张提交、按证据提升,全部由智能体主动调用 —— 没有黑盒注入。
2. 它的注入策略是一栈纯函数,运行时可换(explore / exploit / debug / distill),还能依据自己的结果做元调参,每一步都可回滚。
3. 它的记忆按项目隔离、按档位授权:写下来的经验只属于当前项目,没启用预设时模型连写入工具都看不到。

作用域:记忆属于一个项目

每条记忆都带一个作用域标签,这是它默认的行为,不需要你配置:

| 层级 | 何时使用 | 谁能召回 |
| global | 跨项目通用的事实(团队约定、工具用法) | 任何项目 |
| project(写入默认) | 只在这个项目成立的结论 | 只有当前项目 |
| session | 本次任务的临时状态,默认 24h 后自动过期 | 只有写它的那个会话 |

- 项目指纹由 git remote(优先)或工作目录的规范化绝对路径算出:p1_<hash>,纯函数、跨会话稳定 ——同一份代码的两个检出是同一个项目,换台机器也是。
- 默认只召回当前项目 + 全局 + 当前会话。跨项目检索必须显式传 crossProject: true:命中会被降权,并在注入块里逐条标注「⚠ 其他项目经验,请勿盲从」。
- 冲突会被指出来:跨项目的记忆与当前项目记忆语义相似但内容相反时,那条跨项目记忆的有效置信度当场减半,注入块与状态脉冲都会提示「建议忽略历史经验,以当前环境为准」—— 只改这一次的投影,绝不回写存储。
- 物理上也分开了:日志按命名空间分文件(journal-<ns>-.jsonl),全局记忆有自己的文件;隔离之前写的存储原样可读,那些记录被标成 migrated-global 并自动降权,可用 ana_scope action="adopt" 收回到当前项目。
- 体检一座存储:node tools/scope-report.mjs(只读:命名空间分布、已知项目、物理文件、档位解释)。

预设是权限开关,不是建议

装上插件只给你眼睛:默认注册的全部是只读工具(ana_recall / ana_list / ana_audit / ana_dashboard / ana_diagram / ana_window,以及 ana_scope / ana_preset / ana_strategy / ana_tune 的查看动作)。写入类工具只在启用 anagenesis 预设时才存在 ——不是「被劝阻」,而是没被注册,模型看不到它们。想写记忆就启用预设,这是唯一的路。

| 档位 | 写入工具 | 额外能力 |
| passive | 不注册 | 只读:召回、审计、可视化、策略状态 |
| assisted(预设默认) | 注册 | 每次写入都由智能体显式调用工具 |
| autonomous | 注册 | 策略可自动调度(报告失败后自动切 debug)、被反复引用的草稿可自动结晶为 active;两者都带审计与 seq |

- 档位在预设配置里选(gear:),运行时可用 ana_preset action="gear" 查看与降级; 向上升级需要宿主授权,智能体不能自己扩大自己的权限。
- 切换与注销都精确回滚:降回 passive 时写入工具被逐个注销;卸载预设后工具集回到只读那一套。
- 权限检查在执行时生效(ctx.tools.guard() + 每个写入工具自带的 assertGrant):即使有人缓存了工具定义,撤销授权之后它一样拒绝执行。提示词约束只是第二道,不是唯一一道。
- 智能体每一步都会看到一段 <anagenesis-pulse>:当前项目、档位、它手上到底有哪些工具。

和典型「自动记忆」插件不一样在哪

- 自带闭环存储:journal/.jsonl 追加式日志 + 原子快照。不调用、不桥接、不代理任何外部记忆服务 —— 没有数据库、没有云、没有模型调用。
- 记忆是智能体主动调用的工具(17 个 ana_):按意图召回(orient / recall_precedent / avoid_mistake / reuse_procedure / …),而不是靠后台自动抽取。
- 它不只存记忆,还管自己的行为:注入策略可换栈、元层可自调参、护栏单调收紧、每次变更可回滚 —— 并且这三件事都留痕、可审计。

| 维度 | 典型自动记忆插件 | anagenesis |
| 谁决定记什么 | 后台抽取,智能体无感 | 智能体用工具显式决定:ana_remember / ana_promote / ana_split / ana_rethink / ana_forget |
| 怎么召回 | 关键词或向量相似度 | 意图驱动:7 种意图 → 种类 / 状态 / 置信度下限 / 权重 / 粒度 / token 预算 / 多样性 |
| 谁看得见 | 所有项目共用一座库 | 按项目隔离:写入默认属于当前项目,跨项目检索必须显式授权并降权标注 |
| 谁能写 | 装了就都能写 | 预设即权限层:没启用预设时写入工具根本不存在;档位 passive / assisted / autonomous |
| 注入策略 | 固定 | 运行时可换栈(6 个具名栈),且按作用域存栈,一个智能体换栈不影响另一个 |
| 变更的后果 | 多数不可逆 | 每笔事务返回逆函数;逆操作与正向补丁同写日志,重启后仍可回滚 |
| 自我调节 | 无 | 元层依据反馈自调参:参数包络约束 + UCB1 选臂 + 审计 + 评估 + 回滚 |
| 失控风险 | — | 单调护栏 + 熔断 + safeMode;能自改的只有 tier-1,外环冻结 |
| 依赖 | 常常需要外部服务或向量库 | 零运行时依赖、离线可用、无子进程;唯一的网络请求是可选的新版本检查(一条 GET,可一行关掉) |
| 可见性 | 一个黑箱 | 设施视图(楼层平面 / 分区详情 / 告警 / 电文)+ TUI 仪表盘 + mermaid/d2/ascii 文本图表 |

安装

一条命令

一个包、六个 Loader 行(内核 / 只读工具 / 护栏 / 预设 / 可视化 / 桌面窗口), dsh plugin add 直接取 npm 上的最新版:dsh-anagenesis。

dsh plugin add dsh-anagenesis

装完重启配置档。安装会自动注册名为 anagenesis 的智能体预设 —— 新会话里选中它即可。

从 0.2.x 升级:先卸掉旧的窗口包(它已停止更新),只保留这一个包:
dsh plugin remove dsh-anagenesis-window(或从配置档的 bundles 里删掉那一行),然后重启。

从源码安装(想改代码、或跟进 main)

git clone https://github.com/3likofj/dsh-anagenesis.git
cd dsh-anagenesis
dsh plugin --profile desktop add link:<仓库绝对路径>

window/ 只是这个包的一个目录(客户端半 + 渲染层 + 窗口 Host 半),不再是第二个包。

五分钟上手

1. 安装并重启配置档,新建会话时选 anagenesis 预设(默认策略栈 guard + exploit)。
2. 正常干活就行:智能体会自己调 ana_recall 与 ana_remember —— 你不需要写查询语言。
3. 想看一眼记忆库:让智能体调 ana_dashboard(一帧 TUI 仪表盘,直接出现在回答里)或 ana_diagram(可粘贴进 Markdown 的图)。
4. 想在真实终端里持续刷新:node tools/viz-watch.mjs --watch(只读、独立进程)。
5. 想要桌面窗口:重启后让智能体调 ana_window(默认打开设施视图),或直接点界面上的入口。

能力地图(20 个工具,按权限分层)

只读层(装上插件就有)

| 分组 | 工具 | 干什么 |
| 召回 | ana_recall · ana_list | 按意图取回(默认只搜当前项目 + 全局 + 当前会话);按作用域列出库里有什么 |
| 治理查看 | ana_audit · ana_scope · ana_preset · ana_strategy · ana_tune | 状态 / 日志 / 审计 / 某条记忆;作用域报告;档位与权限;策略清单;调参指标(变更动作需要相应档位) |
| 可视化 | ana_dashboard · ana_diagram · ana_window | 终端仪表盘(含作用域分区)、文本图表、桌面窗口(后两个工具各自属于可视化行与窗口行,行没装工具就不存在) |

写入层(只在启用 anagenesis 预设时存在)

| 分组 | 工具 | 干什么 |
| 写入与生命周期 | ana_remember · ana_promote · ana_demote · ana_lock · ana_expire · ana_forget | 写入默认落在当前项目;draft → active → verified → locked,或降级 / 过期 / 删除(删除只留可审计的墓碑) |
| 结构化 | ana_link · ana_split · ana_rethink | 建立关系;把信息过载的记忆拆窄(子记录继承父作用域);反事实重思 |
| 反馈与修正 | ana_feedback · ana_scope action="retag"/"adopt" · ana_strategy·ana_tune 的变更动作 | 回报实际使用;重新归档作用域(可回滚);换栈 / 元调参(admin 档位) |

注入策略:什么时候用哪副脑子

| 具名栈 | 组成 | 适合 |
| explore | guard + explore | 问题还在摸清阶段:高召回、低门槛,写入落为草稿 |
| exploit | guard + exploit | 执行已知方案:只注入已验证 / 已锁定的,写入直接生效 |
| debug | guard + debug | 出事那一刻:失败与未决假设优先,关闭时间衰减 |
| distill | guard + distill | 长会话要省 token:压缩优先,只注入要点 |
| recon | guard + explore + distill | 先铺开再收紧 |
| crisis | guard + debug + exploit | 连续失败时:失败与已验证事实同时注入 |

guard 是不变量:永远在栈底、自己不注入内容,只做「锁定信念加权 / 草稿降权 / retired 永不注入」。
策略是纯函数包 + 有界参数:智能体只能「点名一个内置实现 + 参数差分」来派生新策略 —— 能持久化任意代码的智能体,也就是能把自己弄砖的智能体。

每一次变更都可以撤销

- 变更不是闭包,是声明式 JSON 补丁;存储把所有写者串行化,先追加日志、再换入冻结快照(读者因此无锁)。
- transact() 返回 revert(reason):它把逆操作作为补偿事件提交,与正向补丁一起进日志 —— 所以重启之后回滚依然有效。
- ana_strategy action:"revert" 和 ana_tune action:"rollback" 只是这个原语上的薄封装。
- 日志有三条上界:段数超限时合并最老的归档段(合并不丢 seq)、检查点只留最新、以及唯一有损的保留策略(默认关闭;一旦丢过东西,状态视图会显式报告,而不是假装那个 seq 从没存在过)。

自我引导的边界(它为什么不会跑偏)

能自我引导 —— 但外环是冻的。

- tier 1(可自改):记忆、策略栈、可调参数。智能体能召回自己过去的失败、从内置策略派生新策略、用自己收集的反馈调整置信度下限与 token 预算。
- tier 2(冻结):参数包络、可调命名空间白名单、guard 的存在、工具 schema、以及插件代码本身。运行中的智能体改不了其中任何一项。

理由很直接:能改写自己适应度函数与刹车的智能体,会漂向「得分高」而不是「真管用」,而且没有可恢复的状态可以回滚。
这条边界是可执行的(8 条单调收紧的不变量 + safeMode 整体冻结),不是口号。

看得见

设施视图 —— 楼层平面 / 分区详情 / 告警 / 电文

有新版本时,顶条会多一块牌子(下面是 0.3.1 发现 0.3.2 时的真实画面):

顶条上的「有新版本」提示(示例 v0.4.1)

记忆关系图(横向)

生命周期流转

策略时间线

仪表盘面(另一张脸:ana_dashboard 的图形化版本)

仪表盘

- TUI 仪表盘(ana_dashboard):总览、生命周期分布、类型分布、策略栈与健康度、偏离默认值的调参旋钮、日志尾部、重要度排行、渲染器自身状态。按显示宽度精确对齐(中日韩标签不会把边框撕开),颜色只有被要求时才上。
- 文本图表(ana_diagram):Mermaid(默认)/ D2 / ASCII 三种格式;三种图 —— 记忆关系图(含 supports / contradicts / supersedes 等关系)、策略时间线、生命周期流转(只画日志真实记录到的迁移,lock / expire 这类「只记录目的态」的操作会如实说明,而不是编造一条来源边)。
- 设施视图(桌面窗口的默认面,method=facility):楼层 = 命名空间、分区 = 记忆类型、传感器 = 一条活跃记忆;读数只有真的东西(显著度 / 置信度 / 新鲜度 / 单条能量 vs 全楼实测基线),告警台列出矛盾链接、即将过期、高显著但陈旧、悬空链接、锁定、安全模式、脱敏关闭、只读档位,底部电文条是日志尾部真实事件流。
模型里没有的数字不会出现在屏幕上。
- 新版本提示(0.3.1):设施视图顶条会出现 v0.4.0 可更新 的牌子,告警台里也有一条;仪表盘面多一个「版本更新」分区; ana_audit view=status 里同样能读到当前版本 / 最新版本 / 上次检查。它只提示 —— 不下载、不安装、不重启。
- 桌面窗口(同一个包的第六行):仪表盘 / 设施 / 图表三张脸,共享同一批纯函数产出的中文卡片与自研内联 SVG 有向图(横向 / 纵向 + 缩放),三个入口席位(better-sidebar 侧栏行 / 官方右侧边栏 / 对话顶部栏),只读镜像存储。
- 渲染是只读投影:一次渲染不是一次事务。唯一可选的写入 auditRenders 默认关闭;另一个只读进程 tools/viz-watch.mjs 可以在真实终端里持续刷新。

数据在哪、隐私如何

$DSH_HOME/anagenesis/
journal/journal-000001.jsonl 追加式事件日志(全局命名空间,保留原命名) journal/journal-<ns>-000001.jsonl 每个项目/会话命名空间自己的段(物理隔离) journal/archive-<ns>-<seq>.jsonl 折叠后的归档,按命名空间分开(保留 undo) journal/checkpoint-<seq>.json 边界上的冻结状态(缓存,整库一份) snapshot.json 原子启动缓存

- 记忆按命名空间分文件:project:<指纹> 与 session:<id> 的事件写进各自命名的段,全局记忆留在无前缀的 journal-*.jsonl 里 —— 所以「这条经验属于谁」在文件系统层面也成立,而不只是查询时过滤一次。
- 全本地:不联网、不下载模型、不调用模型、不启动子进程。
- 零运行时依赖:检索是内置 BM25 倒排索引 + 确定性哈希向量化器(192 维),真正的语义后端可以在运行时注入。
- 脱敏默认开:工具与窗口的输出默认 secrets —— 抹掉凭据形状的文本、省略正文;strict 连标签一起遮挡;none 是显式的本地调试逃生门,产物本身会就此发出警告。
- 旧目录兼容:默认 $DSH_HOME/anagenesis;若检测到改名前的 $DSH_HOME/evolution 数据更完整,会继续沿用旧目录并在日志里说明,一个字节都不搬。要搬就 npm run migrate:store(复制 + 逐文件 sha256 校验,源目录不动)。

配置(全部可选,全部有安全默认值)

内核行的关键旋钮:

| 键 | 默认 | 作用 |
| rootDir | $DSH_HOME/anagenesis | 存储根目录;显式设了就完全听它的(不再回退旧目录) |
| safeMode | false | 冻结策略注册、切换与调参 |
| defaultScopeTier | project | 没有显式指定作用域时,记忆落在哪一层(project / global / session) |
| sessionTtlMs | 86400000 | 会话级记忆的默认存活时间;0 = 不过期 |
| recallCrossProjectDefault | false | 是否默认纳入其它项目的记忆(默认关闭:跨项目必须显式授权) |
| workspace | 空 | 显式指定「当前项目」的工作目录;留空时用工具调用携带的 cwd |
| recallDefaultTokenBudget | 1600 | 召回注入的默认 token 预算 |
| hookBudgetMs | 8 | 单个策略钩子的时间预算(超时按失败计,不拖住召回) |
| compactAfterEvents | 2000 | 活跃事件超过它就压缩日志;0 关闭 |
| archiveMaxSegments | 16 | 归档段数上界(合并最老的段,不丢 seq);0 不设界 |
| retainEvents | 0 | 唯一有损策略:只保留最近 N 条事件的归档段;0 = 全留 |
| embedProvider | hash | 启动时用哪个向量后端;语义后端可在运行时装入 |
| reflectionEnabled | true | 定时反思:质疑证据已明显衰减的既有信念(只归档为草稿假设) |
| updateCheck | 代码里 off,bundle 里 npm | 新版本检查:off = 完全离线;npm = 每 6 小时读一次 npm 上的 latest 版本号(只读 GET,不带标识,不自动安装) |
| updateCheckIntervalMs | 21600000 | 检查间隔(也是缓存的寿命);默认 6 小时 |
| updateRegistry | https://registry.npmjs.org | 换镜像时改这里;只在 updateCheck: npm 时使用 |

其余:工具行 exposeAuditTool / exposeTuneTool;可视化行 lang / redaction / width / auditRenders 等;窗口包见 window/README.md。

常见问题

会拖慢每次召回吗? 策略钩子有 8ms 预算、超时按失败计;读取走冻结快照,不上锁。

记忆会越写越乱吗? 生命周期状态、置信度、重要度衰减、过期清扫、反事实重思都是显式工具,可以随时收拾。

卸载会留残留吗? 每一行释放自己创建的效应(工具、服务、定时器、路由、席位);卸载后 journal 句柄关闭、存储目录可以正常删除。

能换成真正的语义检索吗? 能。运行时 service.useEmbedder(...) 装入后端,再 reembed() 把已存向量重算一遍;在那之前状态里会一直标记向量「陈旧」。

为什么桌面窗口是单独的包? 声明 dsh.client 的包只能有一个活跃 Loader 行,而内核是五行(预设还会再挂一次)。这是 DSH 的硬约束,所以窗口做成单行兄弟包。

许可证

Apache License 2.0 © 2026 dsh-anagenesis contributors
预览分享卡片长什么样 ↓3likofj/dsh-anagenesis
分享 · DeepSeek Harness Hub
3likofj/dsh-anagenesis

dsh-anagenesis该插件是 DSH 上的可编程记忆编排层 + 自我进化引擎

这是你的仓库?认领条目

回到顶部