🗓️ OpenClaw 开发日报 | 2026-03-09

0 阅读7分钟

每日精选 OpenClaw 社区最重要的功能更新和 Bug 修复,带你深入理解开源 AI Agent 框架的演进。


📊 今日概览

指标数值
Merged PRs57
主要贡献者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 缺失时),readResponseWithLimitreader.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.directis_direct state → 回退(2 人 + 无房间名)
  • 明确配置的房间可覆盖 DM 判断
// 检测优先级
// 1. m.direct 账户数据
// 2. is_direct 房间状态
// 3. 保守回退:2 人 + 无房间名 → 可能是 DM
// 4. 否则视为群组

影响:2 人的 Matrix 群组房间不再被误判为 DM。


🔧 其他值得关注

PR标题影响
#40998Cron 强制执行 cron-owned 投递契约Cron 行为一致性
#40892Control UI 刷新后 auth 保持UX 改进
#40575Cron 文本 announce 投递修复Telegram cron 修复
#40385全局安装 Control UI 404 修复DX 改进
#40389一次性运行退出挂起修复CLI 稳定性
#40324压缩重试等待边界 + 重启时清空运行Gateway 稳定性
#40184全局 hook runner 单例状态加固插件稳定性
#40185Telegram 直接投递桥接内部 hooks生态兼容
#40008kimi-coding 使用原生 Anthropic tool schemaKimi 修复
#38699Gateway 重启前验证配置 + 崩溃保护稳定性

📈 趋势观察

  1. ACP Bridge 全面加固:今天有 7 个 ACP 相关 PR 合并(#41477, #41468, #41464, #41456, #41442, #41427, #41425, #41424),包括 session 恢复、附件转发、流式增强、错误处理——ACP 协议正在从"能用"走向"好用"

  2. Cron 投递契约重构:#40998 是一个大规模重构,强制 cron 拥有完整的投递控制权,不再依赖 agent 的 message-tool 调用。这是 cron 子系统可靠性的重要里程碑

  3. Telegram 稳定性冲刺:下载超时 (#40098)、关闭时 abort fetch (#23950)、文本 announce 投递 (#40575)——Telegram channel 的边界情况被系统性清理

  4. 多年老 Bug 清仓:#23950(2025 年)、#19736(2025 年)、#20555(2025 年)、#18925(2025 年)——大量陈年 issues 被一次性修复

  5. 观测能力升级:#41336, #41337, #41338 三个 PR 添加了 embedded agent 的结构化观测事件,为调试和监控提供更好的可视性


📚 往期回顾2026-03-08 | 2026-03-07

🔔 关注「赛博养成日志」,每日获取 OpenClaw 开发动态


数据来源:GitHub openclaw/openclaw 仓库
统计时间:2026-03-09 00:00 - 23:59 UTC