@hy-sde-org dsh-memory
代理策划的长视界记忆 为深寻挽具- ctx.memory
服务及其提供程序注册中心,从 @oh-my-pi
编码代理内存表面(端口位于
hy-sde叉). 记忆是持久的,
项目范围 数据,代理用
retain/recall/reflect/memory_edit/learn 工具(由
@hy-sde-org/dsh-tool-memory),确实如此 在下一个开始时重新加载
会话 通过及时注射。它补充了DSH的会话查询和
压缩而不是重叠:那些回放对话历史,
这家银行会回答“我们在这里决定了什么/更喜欢什么/学到了什么?”
这是一个 独立插件构建线束集成(主机平面)
memory 把船划进 cordis.patch.yml,以及代理平面工具
@hy-sde-org/dsh-tool-memory. 上游的深寻线束里没有
(dsh-v0.2.0-rc.2 (后来)需要改变。
只有 local 后端 船只。注册表保持接缝打开
后见之明/记忆模式的提供商——未来的提供商会注册一个
MemoryBackend 同样的工具不会改变。
安装
pnpm install --global @deepseek-ai/dsh
直接来自npm(已发布)
这两个包都发布在npm注册表的 hy-sde-org
组织(@hy-sde-org/dsh-memory 和 @hy-sde-org/dsh-tool-memory,
版本 0.2.0-rc.2). 添加服务,然后通过预设挂载工具:
# one command; the tool package comes in as a transitive dependency
dsh plugin --profile web add @hy-sde-org/dsh-memory @hy-sde-org/dsh-tool-memory
然后复制 examples/agent-preset/ 从已安装的包(或此repo)
来 ~/.dsh/.agent-presets/<id>/ 并在Web UI预设选择器中选择它
(或 dsh agent). 预设行使用 @hy-sde-org/dsh-tool-memory.
从git签出(预发布/开发)
git clone [email protected]:hy-sde/dsh-plugins.git
cd dsh-plugins
pnpm install
pnpm --filter @hy-sde-org/dsh-memory build
MEMORY_TGZ="$(cd dsh-memory/packages/memory && pnpm pack --pack-destination /tmp | tail -n 1)"
TOOLMEMORY_TGZ="$(cd dsh-memory/packages/tool-memory && pnpm pack --pack-destination /tmp | tail -n 1)"
dsh plugin --profile web add "$MEMORY_TGZ" "$TOOLMEMORY_TGZ"
布局
服务是主机平面的:存储是交叉的持久项目数据
会话,所以 cordis.patch.yml 在配置文件中插入一行;这个
每个会话工具解决这个问题。数据存在于 <harness home>/memories/<project>/
哪里 <project> 是一个编码的绝对CWD -每个项目一个内存根,
由它的每个会话和工具共享。
每个项目根包含三个工件:
bank.jsonl.zstd-编写的可编辑工作条目retain(身份证、 内容、上下文、来源、重要性、时间戳、活动标志)。支持memory_edit. 磁盘上的容器是与线束相同的zstd帧格式 会话日志使用:每个保存批处理是一个checksum Zstandard帧 (连接,仅追加,自我修复)。前重命名明文bank.jsonl仍然是读的,并且在第一次写时被迁移;集compression: 'none'在LocalMemoryConfig对于原始行追加 格式。编解码器包含在此包中(/frame-codec子路径,node:zlib只有)。learned.md- new -first, deduped, capped(100)课子弹由learn;omp保持相同的格式和规范化。幸存了下来 整合;learn写是注入中和和秘密编辑的。memory_summary.md-可选的综合汇总(手工或工具维护) 那recall,reflect、提示注射面。
服务API
const memory = ctx.memory // MemoryService
await memory.save({ cwd }, { content, context, source, importance })
await memory.learn({ cwd }, { content, context })
await memory.search({ cwd }, 'query', { limit: 10 })
await memory.edit({ cwd }, 'update' | 'forget' | 'invalidate', { id, content, importance, replacementId })
await memory.summaries({ cwd }) // { summary?, learned?, block }
await memory.status({ cwd })
await memory.clear({ cwd })
后端注册到服务中: memory.register(backend) 返回一个
处理者, memory.resolve() 返回配置的(默认:first)
后端。突变发出 memory/change ({ cwd }),所以进程内消费者
可以使缓存无效。
一、 MemoryBackend 一打方法结束了吗 @hy-sde-org/dsh-memory/types;
运来的那个, LocalMemoryBackend,为纯节点(node:fs)用…
进程内的每个文件写链,所以从兄弟会话并发保存可以
永远不要把对方的信弄丢。
memory:// 内部url
当主机组合挂载时 @hy-sde-org/dsh-internal-urls (共享
注册表后面的读取/grep工具),这个插件注册一个 memory://
计划 ctx.internalUrls -每个进程一次,via ctx.inject,它是
在没有注册表的组合中优雅的无操作。每个已解决的资源
是 immutable: true:代理永远不会通过
file-shaped URL; memory_edit 是突变面。
两种URL形式:
memory://root-项目的合并内存概述(摘要+ 吸取教训+工作库,同块提示注入使用)。 空项目将读取“项目内存为空”指针。memory://<id>-一个完整的存储条目,带有元数据头 (id,source,importance,timestamp,readonly). id是一样的 的recall/reflect表面:银行行由他们m_*我,教训是lesson_<hash>(只读),合并摘要为summary_0(只读)。读取的范围限定在调用会话的项目(cwd)。
修正误差,沿着上游的oh-my-pi
(coding-agent/src/internal-urls/memory-protocol.ts) HINDSIGHT_UNADDRESSABLE
模式:
- 没有可寻址 -选择的后端没有
readEntry(一个 不可寻址存储):“The…内存后端不能通过 内存://<id>",指向recall/reflect. - 没有找到 id在这个项目中不存在(或者已经退役了)
“记忆
…在这个项目中不存在”,指的是recall/memory_edit. - 丢失的名称空间、丢失的cwd、未注册的后端和路径
root/和id都得到自己的纠正信息。
完成: complete() 返回 root 加上每个可寻址条目id
(listEntries,最新的第一,上限为50)与一行内容预览;
后端只实现 readEntry 回到a <id> 占位符,
一个两者都没有的人只完成了 root。这个 memory:// 计划永远
接受一个路径(后端形状,而不是文件形状)。
配置( memory 行)
| 关键 | 默认的 | 意义 |
|---|---|---|
root | <harness home>/memories | 记忆根(~/$HOME 扩大)。 |
backend | 第一次注册 | 服务委托的后端id。 |
defaultImportance | 0.7 | 基线重要性是指保存忽略了它。 |
searchLimit | 10 | 一次搜索的默认结果上限。 |
每个条目上限:银行内容4000个字符,银行上下文800个字符,课程内容
2000年,课程内容400节,课程上限为100节,最新第一。所有存储的文本
通过注入中和(控制字符), </引号, ~~~ 围栏)
然后是秘密编辑,写和读。
测试
pnpm -r --filter @hy-sde-org/dsh-memory test