openclaw 小龙虾 2026.4.10 更新说明
📊 统计概览
| 类别 | 数量 |
|---|---|
| PR 总数 | ~80+ |
| 安全相关 | 15+ |
| Bug 修复 | 30+ |
| 新功能 | 3 个主要特性 |
| 贡献者 | 25+ 位 |
🆕 重大新功能
1. Codex 原生集成 (#64298, #64300)
新增 bundled Codex provider 和 plugin-owned app-server harness
codex/gpt-*模型使用 Codex 专属路径- 原生线程管理、模型发现、compaction
- OAuth 认证由 Codex 管理
openai/gpt-*保持原有 OpenAI provider 路径不变- 添加 Codex OAuth 必需 scope,清晰分类 provider/runtime 失败
- 自动 approved host exec 不可用时停止建议
- 添加 OpenAI/Codex 工具 schema 兼容性
- 保留 embedded-run 重放/活跃状态,跨 compaction 重试和突变副作用保持一致
影响: 使用 GPT 系列模型的用户可测试 codex/gpt-* 路径,享受更好的 compaction 和原生线程管理。
2. Active Memory 插件 (#63286) ⭐ 推荐关注
新增可选的 Active Memory 插件,为 OpenClaw 提供专用记忆子代理
- 在主回复前自动拉取相关偏好、上下文和过往详情
- 无需用户手动说"记住这个"或"搜索记忆"
- 三种上下文模式:
message/recent/full - 支持高级 prompt/thinking 覆盖调优
- 可选转录持久化用于调试
- 文档:https://docs.openclaw.ai/concepts/active-memory
影响: 显著减少手动记忆管理负担,建议启用。
3. macOS 本地语音 (#63539)
实验性本地 MLX speech provider
- 明确的 provider 选择
- 本地语音播放
- 中断处理
- system-voice 回退
影响: macOS 用户可使用本地语音合成,减少对外部 TTS 服务的依赖。
🔒 安全加固(本轮重点)
浏览器/SSRF 防御全面收紧 (#61404, #63332, #63882, #63885, #63889, #64367, #64370, #64371)
- 收紧浏览器和沙盒导航防御
- 严格 SSRF 默认值
- 主机名白名单
- 交互驱动的 redirects 防护
- 子帧防护
- CDP 发现加固
- 现有会话和 tab actions 保护
- noVNC 防护
- 标记 span 消毒
- Docker CDP 源范围强制执行
执行层安全 (#62333, #62661, #62662, #63277, #63551, #63553, #63886, #63890, #63891, #64459)
- exec preflight 读取加固
- host env denylisting
- 节点输出边界
- 出站 host-media 读取保护
- profile-mutation 授权
- 插件安装依赖扫描
- ACPX tool hooks
- Gmail watcher token 脱敏
- 超大 realtime WebSocket 帧处理
其他安全修复
| PR | 修复内容 |
|---|---|
| #64372 | Hooks 安全:标记 agent hook 系统事件为 untrusted,消毒 hook 显示名称 |
| #64459 | 媒体安全:honour sender-scoped toolsBySender 策略,防止拒绝的发送者通过附件触发主机文件泄露 |
| #64367 | 浏览器安全:strict-policy 下拒绝主机名导航,除非是白名单例外或 IP 字面量 |
| #63271, #63495 | QQBot 安全:强制执行出站本地文件路径的媒体存储边界,SSRF 防护媒体获取 |
🛠️ 渠道与平台
飞书 (Feishu)
- 标准化 User-Agent,注册 bot 为 AI agent,确保部署身份一致 (#63835)
/btw侧问通过有界带外通道路由 (#64225)- Webhook:通过 pre-auth guard 读取 webhook body,未认证流量受 body budget 保护
Microsoft Teams
- 新增消息操作:pin、unpin、read、react、列出 reactions (#53432)
- 恢复个人 DM 媒体下载、Bot Framework 对话、OneDrive/SharePoint 共享文件
- Graph-backed chat IDs 支持
- 接受 Bot Framework audience tokens
- 防止 feedback-learning 文件名冲突
- 长工具链通过 typing indicators 保持活跃
- 添加 SSO 登录回调
- 注入父上下文用于 thread replies
- Cron 公告投递到 Teams conversation IDs
- 修复媒体发送静默丢文件问题,附件现在正确送达 (#64478, #64492)
- 重连间隙保持 inbound replies、media、composing indicators、queued outbound deliveries
- 监听器回来后支持 fresh retry-eligible sends
QQBot
- 流式传输:通过
streaming.mode配置(partial/off,默认partial),支持增量回复 (#63746) - 配置:允许
channels.qqbot和 accounts 中的额外字段,扩展构建不因 schema validation 失败 (#64075)
Discord
- 更新 Carbon 到 v0.15.0
- 自动线程名兼容 reasoning 模型,title generation 有足够 output budget (#64172)
- TTS:自动语音回复通过 native voice-note 路径,接收 Opus 语音消息而非普通音频附件 (#64096)
- 沙盒:包含 image 在沙盒媒体参数规范化中,防止 event cover images 绕过沙盒路径重写 (#64377)
Matrix
- 多账号 room scoping 一致
- 加密迁移在适当时保持 warning-only
- 有序 block streaming
- 显式 Matrix block-streaming opt-in
- 验证/bootstrap 从 packaged runtime entry 解析 (#58449, #59249, #59266, #64373)
- 部分流式传输:添加 MSC4357 live markers 到 draft preview sends 和 edits (#63513)
Telegram
- 安全:收紧 allowFrom 发送者验证,保持 allowlist 报告与命令认证检查同步
iMessage
- 区分正常 DM outbound 和 true self-chat,使用 destination_caller_id + chat participants
- 保留 multi-handle self-chat aliases
- 丢弃模糊的 reflected echoes
- 剥离 wrapped imsg RPC text fields (#61619, #63868, #63980, #63989, #64000)
🧠 网关与代理
网关启动优化 (#63480)
- Tailscale 暴露和网关更新检查提前,不等待 channel/plugin 启动
- 远程运营商在启动 sidecars 卡住时不会被锁死
- WebSocket RPC 在启动期间保持可用
chat.history等待启动 sidecars 完成后才开放,防止同步历史读取卡住启动- 延迟插件重载后刷新 advertised gateway methods
- 预 auth WebSocket upgrade budget 在 no-handler 503 路径之前执行
会话与模型
| 修复 | PR |
|---|---|
| 保留 catalog-backed session model labels | #61382, #62493 |
| provider-qualified context limits 保留 | #61382, #62493 |
| 元数据不可用时保持已限定的 session model refs | #61382, #62493 |
| 状态显示配置的 fallback models | #33111 |
| bare sessions.create aliases 如 main 限定到请求的 agent | #58207 |
| 网关 /new 和 /reset 发射 typed before_reset hook | #53872 |
子代理
- 去重完成的 completion announces,避免重复注入 internal-context turn (#61525)
- 保留 archived delete-mode runs 直到 sessions.delete 成功 (#61801)
- 防止重叠 archive sweeps 重复 in-flight cleanup 尝试 (#61801)
执行 (Exec)
- 修复 subagent exec 在 run 结束后产生 stdout/stderr 导致的崩溃 (#62821)
- 修复 "Agent listener invoked outside active run" 错误
- 沙盒工具
tools.exec.host=auto会话不 honor per-callhost=node或host=gateway覆盖 (#63880) - 扩展 exec 完成检测覆盖本地后台 exec 格式 (#64376)
⏰ 定时任务 (Cron)
| 修复 | 描述 | PR |
|---|---|---|
| 零时间戳自愈 | nextRunAtMs <= 0 视为无效,损坏的零时间戳自愈 |
#63507 |
| 认证 profile 一致性 | 隔离 cron job 解析 auth profile 一致 | #62797 |
| non-owner 身份运行 | 定时 agent turn 以 non-owner 发送者运行,owner-only 工具不可用 | #63878 |
| 工具 schema 严格友好 | 保留 failureAlert=false、nullable agentId/sessionKey |
#55043 |
🌙 Dreaming/记忆
Dreaming
- Scene 和 Diary 界面简化 (#64035)
- 保留未知 phase 状态
- 稳定 waiting-entry 排序
- 需要
operator.admin用于持久化/dreaming on|off变更 (#63872) - 从启动配置和运行时生命周期变更调和 managed dreaming cron (#63873, #63929, #63938)
- 心跳触发的 dreaming 检查期间才恢复 managed dreaming cron 状态
- 启动插件注册 hook 在 workspace hook 重载后保持活跃 (#62327, #64258)
记忆
- 接受 dreaming config 当 memory-lancedb 拥有 memory slot (#63874)
- 显式选择的 memory-slot plugin 在网关启动期间加载 (#64423)
- 限制性 allowlists 和隐式默认 memory slots 不自动启动不相关的 memory plugins
Diary
- 幂等叙事子代理运行 (#63876)
- 保留 restrictive DREAMS.md 权限在 atomic writes 期间
- 表面 temp cleanup 失败
- 重复 sweep 不双重运行相同叙事请求
- 不静默削弱 diary 安全
🛠️ 配置与插件
配置验证
| 修复 | PR |
|---|---|
| 严格 schema union 失败显示实际违规字段 | #40841 |
| 交互式文本输入 coercer integer-typed plugin config 字段 | #63346 |
| 强制重安装保留安全自定义 service env vars | #63136 |
| 合并之前的自定义 PATH segments | #63136 |
| 停止移除的 managed env keys 作为自定义 carryover 持久化 | #63136 |
| Discord ID coercer safe integer numeric 为字符串 | #45125 |
BlueBubbles 接受 enrichGroupParticipantsFromContacts |
#56889 |
| 写入配置保留 disabled plugin entries | #54971, #63296 |
插件
- 重复
registerService调用视为幂等 (#62033, #64128) - 插件拥有的命令别名元数据用于
plugins.allow包含 runtime 命令名 (#64191, #64242) - 保留
plugins.slots.contextEngine通过规范化 (#64192) - 显式选择的 workspace context-engine plugins 保持启用
🎨 控制 UI
BTW 侧问
/btw侧结果渲染为 dismissible ephemeral cards (#64290)- 活跃运行期间立即发送
/btw - 重置流程清除 stale BTW cards
- webchat 匹配预期的 detached side-question 行为
Dreaming UI
- 保持 Dreaming trace area 包含和可滚动 (#63875)
- 覆盖不再覆盖 tabs 或撑破页面布局
其他 UI 修复
| 修复 | PR |
|---|---|
| 压缩指示器在 retry-pending 状态直到 run 完成 | #55132 |
| TUI 切换会话时重置 footer activity 为 idle | #63988 |
/context detail 比较 tracked prompt estimate 与 cached context usage |
#28391 |
🐛 关键 Bug 修复
| 修复 | 影响 | PR |
|---|---|---|
| WhatsApp 媒体发送静默丢文件 | 附件现在正确送达 | #64478, #64492 |
| 子代理完成通知重复注入 | 去重,避免重复 turn | #61525 |
| subagent exec 在 run 结束后崩溃 | 修复 "Agent listener invoked outside active run" | #62821 |
| 网关配置错误导致 systemd 重启风暴 | 退出码 EX_CONFIG + 防止重启 | #63913 |
| Qwen XML 工具调用泄漏到可见回复 | 已过滤 | #63999, #64214 |
| 心跳 HEARTBEAT.md 注释标记误触发 | 已修复 | #61690, #63434 |
/btw 侧问在工具使用后 turn 失效 |
剥离 replayed tool blocks、hidden reasoning | #64218, #64219 |
| Gemini 工具 schema orphaned required entries | provider validation 不再拒绝 | #64284 |
| vLLM reasoning 空 tool_calls 数组挂起 | 忽略空数组,reset false toolUse stop reasons | #61197, #61534 |
| Fireworks/FirePass Kimi K2.5 Turbo reasoning 泄漏 | 强制 thinking off | #63607 |
| Claude CLI 继承 Anthropic auth/header 环境别名 | 启动前清除 | - |
| OpenAI compat 非流式响应返回真实 usage | 包含 stream_options.include_usage 支持 | #62986 |
📚 文档与国际化
- 文档 i18n:分块原始文档翻译 (#62969, #63808)
- 拒绝截断的 tagged outputs
- 避免模糊的 body-only wrapper unwrapping
- 从终止的 Pi 翻译会话恢复
- 不改变默认
openai/gpt-5.4路径
🔧 其他修复
网关
commands.listRPC 供远程客户端发现 runtime-native、text、skill、plugin 命令 (#62656)- 保持
commands.listskill entries 分类为 tools (#64147) - 包含 provider-aware plugin nativeName metadata
模型与回退
/models选择在瞬态主模型失败和配置重载后保持 (#61472, #64196, #64471)- 允许 timeout cooldown probes
- 分类 OpenRouter no-endpoints 响应
- 检测 llama.cpp context overflows
- 保持 provider/runtime context metadata 稳定通过重载
对话绑定
- 规范化 focused/current conversation ids
- 保留绑定 metadata 在 account 和 Discord rebinds
- 避免 stale Discord lifecycle windows
- 保持 generic activity touches 持久化
其他
| 修复 | PR |
|---|---|
| 心跳间隔和 prompt 字段在 tasks block 外不泄漏 | #64488 |
心跳接受和 honor agents.defaults.heartbeat.timeoutSeconds |
#64491 |
| 设备配对隐式 approve selection preview-only | #64160 |
| 需要 approve 精确 request ID | #64160 |
| 防止 latest-request races 在设备配对期间 | #64160 |
| QR bootstrap auth 优先于 Tailscale auth 分类 | #59232 |
| 配对失败关闭无 device tokens 的记录 | - |
| 拒绝不匹配请求 device roles 的 pairing approvals | - |
| ACP/gateway chat 分类 lifecycle errors | - |
| Claude CLI skills 传入 eligible OpenClaw skills | #62686, #62723 |
| 原生 Claude Code skill resolution | #62686, #62723 |
| per-run skill env/API key injection | #62686, #62723 |
| 回复/技能:保持 resolved skill 和 memory secret config 稳定 | #64249 |
| 任务:取消卡住的后台任务 | #62506 |
| Windows exec:supervisor waits 从 child exit state | #64072 |
| 浏览器沙盒:防止 CDP startup hangs | #62873 |
| 浏览器控制:自动生成 auth tokens | #63280, #63957 |
| 浏览器/act:集中 /act 请求规范化和执行分发 | #63977 |
💡 升级建议
- Active Memory 插件 值得启用——自动上下文拉取,减少手动记忆管理
- 安全加固 对 3.5GB 服务器是好事——更严格的边界意味着更少的意外资源消耗
- Codex 集成 如果使用 GPT 系列模型,可测试
codex/gpt-*路径看 compaction 效果 - 本轮无破坏性变更,升级风险低
- 建议升级后检查 cron job 状态,确认零时间戳自愈生效
翻译整理:芙宁娜 🎭
官方中文文档
#openclaw #小龙虾
https://www.fireself.cn/post/oPOu6Uc7
