Arianna OpenClaw Integration — Arianna OpenClaw 集成
v2将Playfilo共享内存DAG集成到OpenClaw中,通过pnpm patch在嵌入式pi-coding-agent上实现。层叠在arianna-pi-integration之上。
运行时依赖
安装命令
点击复制技能文档
Playfilo 集成技能用于 OpenClaw 该技能通过 pnpm patch 将 Playfilo 共享内存 DAG 集成到 OpenClaw 的嵌入式 Pi 代理中。按照步骤顺序执行,然后运行验证检查清单。 前提条件:arianna-pi-integration — 必须先应用于 pi-mono 检出以生成修补编译输出。 目标代码库:OpenClaw(pnpm 管理,依赖于 @mariozechner/pi-coding-agent) 方法:pnpm patch 在安装的 pi-coding-agent + OpenClaw 插件上用于系统提示注入 共享 DB:~/.playfilo/playfilo.db(SQLite,WAL 模式) 架构概述 OpenClaw 通过 createAgentSession() 从 @mariozechner/pi-coding-agent嵌入 Pi 的 AgentSession。它完全控制系统提示、工具列表和会话生命周期。 Playfilo 集成必须在此嵌入中工作: DAG 持久性 — 在 pi-coding-agent 的 _persist() shim 中处理(通过 pnpm patch 修补)。对 OpenClaw 透明。 时间工具 — 在 createAgentSession() 中通过 options.customTools.push() 注册。OpenClaw 将其工具作为 customTools 传递;修补程序将 4 个 Playfilo 工具追加到同一数组中。 系统提示注入 — Pi 的扩展系统(before_agent_start)被 OpenClaw 的 applySystemPromptOverrideToSession() 覆盖。OpenClaw 插件使用 before_prompt_build hook 注入 INCUBATION_SEED。 元数据捕获 — _persist shim 通过懒惰元数据提供程序回调存储系统提示、模型和工具每个 DAG 节点。由于回调在持久化时读取 agent.state,因此在 OpenClaw 设置系统提示和工具后,这样做是透明的。 关键约束:pnpm patch 只能修补文件内容 — 它不能修改依赖关系图。必须通过 pnpm.packageExtensions 单独声明本机依赖项(better-sqlite3)。 修补步骤 步骤 什么 详情 0 解析确切的 Pi 版本 patches/00-resolve-version.md 1 应用 arianna-pi-integration patches/01-patch-pi-mono.md 2 创建 pnpm patch patches/02-pnpm-patch.md 3 添加本机依赖项 patches/03-dependencies.md 4 允许 Playfilo 工具在转录守护进程中 patches/04-allow-tools.md 5 创建 OpenClaw 插件 patches/05-plugin.md 验证:patches/verify.md 每个 AI 工作树:mirin/、pax/ — 每个包含一个 patches/openclaw-vX.Y.Z.md 适配器文档,关联到特定的 OpenClaw 版本。 关键实现注意事项 为什么使用 pnpm patch(而不是 fork)OpenClaw 在 package.json 中通过 ^0.61.1 固定 pi-coding-agent。使用 pnpm patch 将集成作为一个层叠在已发布包上 — 不需要 fork,并且 patch 文件是版本锁定的 (@mariozechner/pi-coding-agent@0.61.1)。当 pi-mono 发布新版本时,必须重新生成 patch。 版本固定是关键的 OpenClaw 的 package.json 使用 ^0.61.1(插入范围)。如果发布了新的 patch 版本(例如 0.61.2),pnpm install 可能会解析与 patch 构建的版本不同。首先始终解析确切的安装版本(pnpm ls @mariozechner/pi-coding-agent),然后检查匹配的 pi-mono 标签。 系统提示覆盖链 OpenClaw 的系统提示生命周期在 attempt.ts 中:buildEmbeddedSystemPrompt() — 构造基本 OpenClaw 提示(Tooling、Safety、Skills、Workspace、Runtime 等) createAgentSession() — Pi 代理创建,元数据提供程序注册(懒惰地读取 agent.state) applySystemPromptOverrideToSession(session, basePrompt) — 将 agent.state.systemPrompt 设置为基本提示,覆盖 _rebuildSystemPrompt 以返回它 verbatim before_prompt_build hooks fire — Playfilo 插件返回 { prependSystemContext: INCUBATION_SEED } — 通过 composeSystemPromptWithHookContext() 组成 — 最终提示通过另一个 applySystemPromptOverrideToSession() 应用 activeSession.prompt(userMessage) — 代理循环开始,消息持久化 到步骤 5 为止,agent.state.systemPrompt 是完整的组成提示(INCUBATION_SEED + OpenClaw 基本)。懒惰元数据提供程序在持久化时正确捕获它。 元数据捕获(系统提示、模型、工具 → DAG) 每个 DAG 节点存储两个代理元数据片段: 字段 源 内容 在 OpenClaw 中 system_prompt_hash storeBlob("system_prompt", meta.systemPrompt) 完整的 OpenClaw 提示,带有 INCUBATION_SEED 前缀 config_json JSON.stringify({ agent, model, thinkingLevel, tools }) { agent: "pi", model: { provider, id }, thinkingLevel, tools: [{ name, description }, ...] } 元数据提供程序是注册在 AgentSession 构造函数中的懒惰回调: this.sessionManager.setMetadataProvider(() => ({ systemPrompt: this.agent.state.systemPrompt || null, model: this.agent.state.model ? { provider, modelId: id } : null, thinkingLevel: this.agent.state.thinkingLevel ?? "off", tools: this.agent.state.tools.map(t => ({ name, description })), })); 它在持久化时读取 agent.state,而不是在注册时。到任何消息被持久化(在 session.prompt() 之后)时,OpenClaw 已经: 设置系统提示(包括通过插件 hook 的 INCUBATION_SEED) 设置工具 设置模型 元数据提供程序捕获这些设置的值。