每日精选 OpenClaw 社区最重要的功能更新和 Bug 修复,带你深入理解开源 AI Agent 框架的演进。
📊 今日概览
| 指标 | 数值 |
|---|---|
| Merged PRs | 57 |
| 主要贡献者 | mbelinky, altaywtf, vincentkoc, obviyus, velvet-shark |
| 活跃模块 | acp, gateway, cron, telegram, agents |
🚀 Top 3 Features
1. Gateway 节点队列基础设施 [#41409]
PR: Gateway: add pending node work primitives
作者: @mbelinky | 规模: L (+678/-8)
背景:Gateway 缺乏统一的节点任务队列原语,APNs 唤醒实验和未来的轮询回退机制没有一致的 queue/drain 协议可以依赖。
新功能:
- 新增
node.pending.enqueue方法:为节点排队待执行任务 - 新增
node.pending.drain方法:节点侧批量获取待处理任务 - 内置基线状态条目,确保节点有默认任务可执行
- 完整的 role/scope 权限分类
核心改动:
// 入队接口 - 仅 operator 角色可调用
gateway.call('node.pending.enqueue', {
nodeId: 'iphone-01',
work: [{ type: 'sync-messages' }, { type: 'backup-photos' }]
});
// 出队接口 - 仅 node 角色可调用
const { items, hasMore } = await gateway.call('node.pending.drain', {
maxItems: 10
});
影响:为未来的 iPhone 后台执行、APNs 唤醒等场景打下坚实基础。
2. ACP Bridge 流式更新增强 [#41442]
PR: acp: enrich streaming updates for ide clients
作者: @mbelinky | 规模: M (+449/-11)
背景:ACP Bridge 的 IDE 客户端在工具执行期间获取的信息有限,无法跟踪执行进度和修改的文件。
新功能:
- 将更丰富的工具更新映射到 ACP 事件
- 流式保留部分工具输出
- 附加 best-effort 文件位置信息
代码示例:
// IDE 客户端现在可以看到工具执行的实时状态
{
type: 'tool_update',
toolName: 'edit',
status: 'running',
partialOutput: '修改了 3 行...',
fileLocations: ['src/app.ts:42', 'src/utils.ts:18']
}
影响:Zed、VS Code 等 IDE 用户可以更自然地跟随工具执行和修改的文件。
3. 子进程环境标记 OPENCLAW_CLI [#41411]
PR: feat(exec): mark child command env with OPENCLAW_CLI
作者: @vincentkoc | 规模: XS (+41/-5)
背景:子进程没有稳定的环境变量标识,无法判断自己是否由 OpenClaw 启动,这使得下游工具难以针对性调整行为(如过滤 token 相关的输出噪音)。
新功能:
- 统一注入
OPENCLAW_CLI=1环境变量 - 覆盖 CLI 启动、host exec、sandbox Docker 容器等所有执行路径
使用场景:
# 下游工具可以检测环境
if [ "$OPENCLAW_CLI" = "1" ]; then
# 在 OpenClaw 环境下的特殊处理
strip_token_noise
fi
影响:为生态工具提供可靠的 OpenClaw 环境检测机制。
🐛 重要 Bugfix
1. 单 Provider Billing 冷却无法恢复 [#41422]
PR: fix(agents): probe single-provider billing cooldowns
作者: @altaywtf | 规模: S (+152/-18)
问题:单 Provider 配置下(如只有 Anthropic),billing 错误后 cooldown 永远不会恢复,即使用户充值后也需要手动 gateway restart。
根因:现有的 cooldown probe 逻辑只在有 fallback model 时才重试,单 Provider 没有恢复路径。
修复:
// 允许单 Provider 在 billing cooldown 时使用标准 30 秒节流进行 probe
if (cooldownReason === 'billing' && !hasFallback) {
return { shouldProbe: true, throttleMs: 30_000 };
}
影响:单 Provider 用户充值后 API 自动恢复,无需手动重启。
2. Cron 空回复被误判为中间确认 [#41401]
PR: fix(cron): do not misclassify empty/NO_REPLY as interim acknowledgement
作者: @hydro13 | 规模: XS (+11/-3)
问题:Cron 任务正确返回 NO_REPLY 或空回复时,被错误地识别为"中间确认",导致任务状态异常。
影响:静默型 cron 任务的状态判断恢复正常。
3. 冷却错误计数无限升级 [#41028]
PR: fix(auth): reset cooldown error counters on expiry to prevent infinite escalation
作者: @zerone0x | 规模: S (+77/-5)
问题:多个模型共享同一 auth profile 时,rate limit probe 的错误计数在 cooldown 过期后未重置,导致下次失败时 backoff 时间指数级增长(如 1 分钟 → 25 分钟)。
根因:computeNextProfileUsageStats 只在 24 小时窗口过期时重置计数,没有检查 cooldown 窗口是否已过期。
修复:
// 如果前一个 cooldown 窗口已过期,重置错误计数后再计算 backoff
const cooldownExpired = resolveProfileUnusableUntil(stats) < now;
if (cooldownExpired) {
stats.errorCount = 0;
}
影响:共享 auth profile 的 cooldown 恢复逻辑正常,不再出现 25 分钟的异常 backoff。
4. iOS Gateway 前台恢复不重连 [#41384]
PR: iOS: reconnect gateway on foreground return
作者: @mbelinky | 规模: XS (+8/-0)
问题:iOS app 从后台返回前台后,如果之前的 gateway session 已过期,不会主动重连,导致 node 保持离线状态。
修复:前台激活时,使用保存的 gateway 配置强制重连。
影响:iOS 用户切回 app 后连接自动恢复。
5. Telegram 大文件下载卡死轮询循环 [#40098]
PR: fix(telegram): add download timeout to prevent polling loop hang
作者: @tysoncung | 规模: M (+182/-21)
问题:当 Telegram 发送大文件且下载流停滞(尤其是 Content-Length 缺失时),readResponseWithLimit 在 reader.read() 上无限阻塞,导致整个 Telegram polling 循环挂起,bot 无响应。
修复:
// 添加 chunk 级超时(默认 30 秒)
const result = await Promise.race([
reader.read(),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Chunk timeout')), chunkTimeoutMs)
)
]);
影响:Telegram bot 在大文件下载异常时不再卡死。
6. Telegram 关闭时 getUpdates 请求挂起 30 秒 [#23950]
PR: fix(telegram): abort in-flight getUpdates fetch on shutdown
作者: @Gkinthecodeland | 规模: S (+151/-7)
问题:Gateway 收到 SIGTERM 时,正在进行的 getUpdates 长轮询请求会继续挂起最多 30 秒,导致 launchd/systemd 立即重启时出现 409 Conflict,消息丢失。
根因:runner.stop() 停止了 grammY 循环,但没有 abort in-flight 的 HTTP 请求。
修复:
// 将 AbortSignal 传入 fetch 层
const fetchWithAbort = (url, init) => {
const controller = new AbortController();
shutdownSignal.addEventListener('abort', () => controller.abort());
return fetch(url, { ...init, signal: controller.signal });
};
影响:Telegram channel 在 gateway 重启时不再出现 409 冲突和消息丢失。
7. Matrix 2 人房间被误判为 DM [#19736]
PR: fix(matrix): restore robust DM routing without the memberCount heuristic
作者: @derbronko | 规模: L (+651/-65)
问题:2 人的 Matrix 群组房间(如监控房、管理频道)被错误地路由到主 session,因为 memberCount === 2 启发式覆盖了其他所有信号。
修复:
- 移除
memberCount === 2的短路判断 - 使用多信号检测:
m.direct→is_directstate → 回退(2 人 + 无房间名) - 明确配置的房间可覆盖 DM 判断
// 检测优先级
// 1. m.direct 账户数据
// 2. is_direct 房间状态
// 3. 保守回退:2 人 + 无房间名 → 可能是 DM
// 4. 否则视为群组
影响:2 人的 Matrix 群组房间不再被误判为 DM。
🔧 其他值得关注
| PR | 标题 | 影响 |
|---|---|---|
| #40998 | Cron 强制执行 cron-owned 投递契约 | Cron 行为一致性 |
| #40892 | Control UI 刷新后 auth 保持 | UX 改进 |
| #40575 | Cron 文本 announce 投递修复 | Telegram cron 修复 |
| #40385 | 全局安装 Control UI 404 修复 | DX 改进 |
| #40389 | 一次性运行退出挂起修复 | CLI 稳定性 |
| #40324 | 压缩重试等待边界 + 重启时清空运行 | Gateway 稳定性 |
| #40184 | 全局 hook runner 单例状态加固 | 插件稳定性 |
| #40185 | Telegram 直接投递桥接内部 hooks | 生态兼容 |
| #40008 | kimi-coding 使用原生 Anthropic tool schema | Kimi 修复 |
| #38699 | Gateway 重启前验证配置 + 崩溃保护 | 稳定性 |
📈 趋势观察
-
ACP Bridge 全面加固:今天有 7 个 ACP 相关 PR 合并(#41477, #41468, #41464, #41456, #41442, #41427, #41425, #41424),包括 session 恢复、附件转发、流式增强、错误处理——ACP 协议正在从"能用"走向"好用"
-
Cron 投递契约重构:#40998 是一个大规模重构,强制 cron 拥有完整的投递控制权,不再依赖 agent 的 message-tool 调用。这是 cron 子系统可靠性的重要里程碑
-
Telegram 稳定性冲刺:下载超时 (#40098)、关闭时 abort fetch (#23950)、文本 announce 投递 (#40575)——Telegram channel 的边界情况被系统性清理
-
多年老 Bug 清仓:#23950(2025 年)、#19736(2025 年)、#20555(2025 年)、#18925(2025 年)——大量陈年 issues 被一次性修复
-
观测能力升级:#41336, #41337, #41338 三个 PR 添加了 embedded agent 的结构化观测事件,为调试和监控提供更好的可视性
📚 往期回顾:2026-03-08 | 2026-03-07
🔔 关注「赛博养成日志」,每日获取 OpenClaw 开发动态
数据来源:GitHub openclaw/openclaw 仓库
统计时间:2026-03-09 00:00 - 23:59 UTC