3likofj/dsh-anagenesis

dsh-anagenesis

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

待分类agent-memoryagentic-aiai-agents

dsh-anagenesis

English · 更新日志 · Apache-2.0

给 Agent 一套它自己管得住、你也看得见的记忆。
不是又一个"自动记忆黑箱":记忆操作是 Agent 手里的工具,注入策略运行时可换,
每次变更都带逆操作,自我调参有边界、有审计、能回滚 —— 而整个存储自包含、离线、零依赖。

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_,纯函数、跨重启稳定 —— 同一份代码的多个检出是同一个项目 · 换目录、换机器、开新会话都不会认错项目 跨项目要授权 · 传 crossProject: true 才纳入别的项目,命中被降权并逐条标注「⚠ 其他项目经验,请勿盲从」 · 注入块里直接写明哪些不能盲从 冲突自动降权 · 与当前项目记忆语义相似但内容相反时,跨项目那条的有效置信度当场减半,并提示以当前环境为准 · 只改这一次的投影,绝不回写存储 物理隔离 · 日志按命名空间分文件(journal--*.jsonl),全局记忆有自己的文件;旧存储原样可读 · node tools/scope-report.mjs 一眼看到"谁占了多少、在哪个文件里" 预设 = 权限层 · 写入类工具只在启用 `anagenesis` 预设时才注册;档位 passive(只读)/ assisted(可写)/ autonomous(可自动调度) · ana_preset action="status" 就是权威答案:你现在到底有哪些工具 执行期检查 · ctx.tools.guard() + 每个写入工具自带的授权校验:没注册就调不到,授权撤销后连缓存的定义也拒绝执行 · 提示词不是唯一防线 状态脉冲 · 每一步都有一段 `:当前项目指纹、档位、可用工具集 · 模型自己就能核对"这条记忆能不能用" **会话即弃** · 会话级记忆默认 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)、审计轨迹与工具返回的句柄

才仍然全局唯一 —— 隔离做在文件上,可逆性做在计数器上。

  • 物理隔离与旧数据兼容同时成立:每个命名空间有自己的日志段与归档段,而全局命名空间保留原有的无前缀

命名,升级前写下的存储一个字节都不用改。

  • 契约可被证伪:108 条主测试 + 89 条窗口测试 + 一个真 Cordis / 真 defineTool / 真预设注册表的开机沙箱

98 项检查 + 一次真打包真安装的打包闸门,跑的都是真实行代码,不是 mock 的复制品。

三句话说明它是什么

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

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

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

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

  • 项目指纹由 git remote(优先)或工作目录的规范化绝对路径算出:p1_,纯函数、跨会话稳定 ——

同一份代码的两个检出是同一个项目,换台机器也是。

  • 默认只召回当前项目 + 全局 + 当前会话。跨项目检索必须显式传 crossProject: true:命中会被降权,

并在注入块里逐条标注「⚠ 其他项目经验,请勿盲从」。

  • 冲突会被指出来:跨项目的记忆与当前项目记忆语义相似但内容相反时,那条跨项目记忆的有效置信度当场减半,

注入块与状态脉冲都会提示「建议忽略历史经验,以当前环境为准」—— 只改这一次的投影,绝不回写存储。

  • 物理上也分开了:日志按命名空间分文件(journal--*.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(预设默认) · 注册 · 每次写入都由 Agent 显式调用工具 autonomous · 注册 · 策略可自动调度(报告失败后自动切 debug)、被反复引用的草稿可自动结晶为 active;两者都带审计与 seq

  • 档位在预设配置里选(gear:),运行时可用 ana_preset action="gear" 查看与降级;

向上升级需要宿主授权,Agent 不能自己扩大自己的权限。

  • 切换与注销都精确回滚:降回 passive 时写入工具被逐个注销;卸载预设后工具集回到只读那一套。
  • 权限检查在执行时生效(ctx.tools.guard() + 每个写入工具自带的 assertGrant):

即使有人缓存了工具定义,撤销授权之后它一样拒绝执行。提示词约束只是第二道,不是唯一一道。

  • Agent 每一步都会看到一段 ``:当前项目、档位、它手上到底有哪些工具。

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

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

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

安装

一条命令

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

dsh plugin add dsh-anagenesis

装完重启 profile。安装会自动注册名为 `anagenesis` 的 Agent 预设 —— 新会话里选中它即可。

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

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

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

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

五分钟上手

  1. 安装并重启 profile,新建会话时选 `anagenesis` 预设(默认策略栈 guard + exploit)。
  2. 正常干活就行:Agent 会自己调 ana_recall 与 ana_remember —— 你不需要写查询语言。
  3. 想看一眼记忆库:让 Agent 调 ana_dashboard(一帧 TUI 仪表盘,直接出现在回答里)或 ana_diagram(可粘贴进 Markdown 的图)。
  4. 想在真实终端里持续刷新:node tools/viz-watch.mjs --watch(只读、独立进程)。
  5. 想要桌面窗口:重启后让 Agent 调 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 永不注入"。 策略是纯函数包 + 有界参数:Agent 只能"点名一个内置实现 + 参数差分"来派生新策略 —— 能持久化任意代码的 Agent,也就是能把自己弄砖的 Agent。

每一次变更都可以撤销

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

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

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

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

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

看得见

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

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

  • TUI 仪表盘(ana_dashboard):总览、生命周期分布、类型分布、策略栈与健康度、偏离默认值的调参旋钮、日志尾部、重要度排行、渲染器自身状态。按显示宽度精确对齐(中日韩标签不会把边框撕开),颜色只有被要求时才上。
  • 文本图表(ana_diagram):Mermaid(默认)/ D2 / ASCII 三种格式;三种图 —— 记忆关系图(含 supports / contradicts / supersedes 等关系)、策略时间线、生命周期流转(只画日志真实记录到的迁移,lock / expire 这类"只记录目的态"的操作会如实说明,而不是编造一条来源边)。
  • 设施视图(桌面窗口的默认面,method=facility):楼层 = 命名空间、分区 = 记忆类型、传感器 = 一条活跃记忆;

读数只有真的东西(显著度 / 置信度 / 新鲜度 / 单条能量 vs 全楼实测基线),告警台列出矛盾链接、即将过期、 高显著但陈旧、悬空链接、锁定、安全模式、脱敏关闭、只读档位,底部电文条是日志尾部真实事件流。 模型里没有的数字不会出现在屏幕上。