← 返回更新日志

OpenClaw v2026.2.22-beta.1 预发布

2026-02-23 · GitHub 原文
### 变更内容 - **提供商/Mistral**:新增对 Mistral 提供商的支持,包括记忆嵌入和语音支持。(#23845) 感谢 @vincentkoc。 - **更新/核心**:为软件包安装添加一个可选的、默认关闭的内置自动更新器 (`update.auto.*`),具有稳定的滚动延迟+抖动和 Beta 版每小时更新频率。 - **CLI/更新**:添加 `openclaw update --dry-run` 命令,用于预览频道/标签/目标/重启操作,而不会修改配置、安装、同步插件或重启。 - **配置/UI**:添加基于标签的设置筛选,并扩展配置标签/帮助文本,使仪表板配置屏幕中的字段更易于发现和理解。 - **频道/Synology Chat**:添加一个原生的 Synology Chat 频道插件,支持 Webhook 入口、直接消息路由、出站发送/媒体支持、每账户配置和 DM 策略控制。(#23012) - **iOS/通话**:预取 TTS 片段并抑制预期的语音取消错误,以实现更流畅的通话播放。(#22833) 感谢 @ngutman。 - **记忆/FTS**:为仅 FTS 搜索模式中的查询扩展添加西班牙语和葡萄牙语停用词过滤,改善这两种语言的对话回忆。感谢 @vincentkoc。 - **记忆/FTS**:为仅 FTS 搜索模式添加日语感知的查询扩展分词和停用词过滤(包括混合脚本术语,如 ASCII + 片假名)。感谢 @vincentkoc。 - **记忆/FTS**:为仅 FTS 搜索模式中的查询扩展添加韩语停用词过滤和助词感知的关键词提取(包括混合韩语/英语词干)。(#18899) 感谢 @ruypang。 - **记忆/FTS**:为仅 FTS 搜索模式中的查询扩展添加阿拉伯语停用词过滤,以减少阿拉伯语记忆搜索中的对话填充词。感谢 @vincentkoc。 - **Discord/白名单**:将已解析的 Discord 白名单名称规范化为 ID,并拆分解析流程以实现更清晰的失败即关闭行为。 - **频道/配置**:使用共享解析器和规范迁移路径统一频道预览流配置处理。 - **网关/认证**:在共享解析器助手上统一调用/探测/状态/认证凭据源优先级,并在网关入口点实现表驱动的对等覆盖。 - **网关/认证**:重构网关凭据解析和 WebSocket 认证握手路径,以使用共享的、类型化的认证上下文,包括在连接帧和测试中显式支持 `auth.deviceToken`。 - **技能**:从此仓库中移除捆绑的 `food-order` 技能;改为从 ClawHub 管理/安装它。 - **文档/子代理**:将线程绑定的会话引导改为频道优先,而非 Discord 特定,并明确列出支持线程的频道。(#23589) 感谢 @osolmaz。 ### 修复内容 - **安全/CLI**:在打印配置路径之前,对 `openclaw config get` 输出中的敏感值进行编辑,防止凭据泄露到终端输出/历史记录中。(#13683) 感谢 @SleuthCo。 - **安装/Discord 语音**:使 `@discordjs/opus` 成为可选依赖项,这样当原生 Opus 构建失败时,`openclaw` 安装/更新不再硬性失败,同时保持 `opusscript` 作为 Discord 语音流的运行时回退解码器。(#23737, #23733, #23703) 感谢 @jeadland, @Sheetaa 和 @Breakyman。 - **Docker/设置**:在 `docker-setup.sh` 期间预创建 `$OPENCLAW_CONFIG_DIR/identity`,以便需要设备身份(例如 `devices list`)的 CLI 命令在限制性绑定挂载上避免 `EACCES ... /home/node/.openclaw/identity` 失败。(#23948) 感谢 @ackson-beep。 - **执行/后台**:当未设置显式超时时,停止将默认执行超时应用于后台会话(`background: true` 或显式 `yieldMs`),以便长时间运行的后台作业不再在默认超时边界处终止。(#23303) - **Slack/线程化会话**:通过移除会话初始化、线程历史记录获取和回复提示上下文注入中的仅首轮限制,保持父会话分叉和线程历史记录上下文在首轮之后仍处于活动状态。(#23843, #23090) 感谢 @vincentkoc 和 @Taskle。 - **Slack/线程化**:当 Slack 自动填充顶级 `thread_ts` 时,尊重 `replyToMode`;当 `replyToMode` 为 `off` 时,忽略内联的 `replyToId` 指令标签,以便除非显式配置,否则线程强制保持禁用状态。(#23839, #23320, #23513) 感谢 @vincentkoc 和 @dorukardahan。 - **Slack/扩展**:将 `message read` 的 `threadId` 转发给 `readMessages`,并使用传递上下文的 `threadId` 作为出站 `thread_ts` 的回退,以便扩展回复/读取保持在正确的 Slack 线程中。(#22216, #22485, #23836) 感谢 @vincentkoc, @lan17 和 @dorukardahan。 - **Slack/上传**:在调用拒绝非频道 ID 的 `files.uploadV2` 之前,通过 `conversations.open` 将裸用户 ID(U 前缀)解析为 DM 频道 ID。`chat.postMessage` 直接容忍用户 ID,但 `files.uploadV2` → `completeUploadExternal` 会针对 `^[CGDZ][A-Z0-9]{8,}$` 验证 `channel_id`,导致代理在 DM 对话中回复媒体时出现 `invalid_arguments` 错误。 - **Webchat/聊天**:将助手的 `final` 负载消息直接应用于聊天状态,以便发送的轮次无需等待完整的历史记录刷新周期即可渲染。(#14928) 感谢 @BradGroux。 - **Webchat/聊天**:对于带外最终事件(例如工具调用侧运行),直接附加提供的最终助手负载,而不是强制进行瞬态历史记录重置。(#11139) 感谢 @AkshayNavle。 - **Webchat/性能**:仅在最终负载缺少可渲染的助手消息时,在最终事件后重新加载 `chat.history`,避免在正常轮次上进行昂贵的完整历史记录刷新。(#20588) 感谢 @amzzzzzzz。 - **Webchat/会话**:当内部 `chat.send` 轮次在 `webchat` 下运行时,保留外部会话路由元数据,以便显式频道键控的会话(例如 Telegram)不再被重写为 `webchat` 并错误路由后续传递。(#23258) 感谢 @binary64。 - **Webchat/会话**:在 `/new` 和 `/reset` 轮换中保留现有会话的 `label`,以便重置后的会话在会话历史记录列表中仍可被发现。(#23755) 感谢 @ThunderStormer。 - **网关/聊天 UI**:从非流式最终 webchat 广播(包括 `chat.inject`)中剥离内联回复/音频指令标签,同时当标签是整个回复时保留空字符串消息内容。(#23298) 感谢 @SidQin-cyber。 - **聊天/UI**:从显示的聊天历史记录、实时聊天事件输出和会话预览片段中剥离内联回复/音频指令标签(`[[reply_to_current]]`、`[[reply_to:<id>]]`、`[[audio_as_voice]]`),防止控制标签泄露到用户可见的界面。 - **网关/聊天 UI**:使用与 `chat.history` 相同的信封/非受信任上下文剥离方法,清理非流式最终的 `chat.send`/`chat.inject` 负载文本,防止 `<<<EXTERNAL_UNTRUSTED_CONTENT...>>>` 包装标记在 Control UI 聊天中渲染。(#24012) 感谢 @mittelaltergouda。 - **Telegram/媒体**:当媒体下载失败(非大小错误)时,向用户发送 Telegram 回复,而不是静默丢弃消息。 - **Telegram/Webhook**:保持 webhook 监视器活动,直到网关中止信号触发,防止错误的频道退出和立即的 webhook 自动重启循环。 - **Telegram/轮询**:在监视器启动时重试可恢复的设置时网络故障,并在重试前等待运行程序关闭,以避免重叠的轮询会话。 - **Telegram/轮询**:在启动长轮询 `getUpdates` 之前清除 Telegram webhook(`deleteWebhook`),包括对瞬态清理失败的重试处理。 - **Telegram/Webhook**:添加 `channels.telegram.webhookPort` 配置支持,并通过插件启动线路将其传递给监视器监听器。 - **浏览器/扩展中继**:重构 MV3 工作线程,以在中断连接时保持调试器连接,使用有界退避+抖动自动重新连接,通过 `chrome.storage.session` 持久化和重新水化附加的标签页状态,从 `target_closed` 导航分离中恢复,保护过时的套接字处理程序,强制执行每标签页操作锁和每请求超时,并添加生命周期保活/徽章刷新钩子(`alarms`、`webNavigation`)。(#15099, #6175, #8468, #9807) - **浏览器/中继**:仅当扩展 WebSocket 处于 `OPEN` 状态时才视为已连接,当过时的 `CLOSING/CLOSED` 扩展套接字残留时允许重新连接,并保护过时的套接字消息/关闭处理程序,以便延迟事件无法清除活动中继状态;包括对实时重复 `409` 拒绝和立即重新连接后竞争条件的回归覆盖。(#15099, #18698, #20688) - **浏览器/远程 CDP**:扩展过时目标恢复,使 `ensureTabAvailable()` 现在为远程 CDP 配置文件重用唯一可用的标签页(与扩展配置文件行为相同),同时在存在多个标签页时保留严格的 `tab not found` 错误;包括远程配置文件回归测试。(#15989) - **网关/配对**:在设备认证验证期间,将 `operator.admin` 视为满足其他 `operator.*` 范围检查,以便本地 CLI/TUI 会话停止为配对/批准范围的命令进入配对所需循环。(#22062, #22193, #21191) 感谢 @Botaccess, @jhartshorn 和 @ctbritt。 - **网关/配对**:自动批准环回 `scope-upgrade` 配对请求(包括设备令牌重新连接),以便本地客户端在配对所需的范围提升时不会断开连接。(#23708) 感谢 @widingmarcus-cyber。 - **网关/范围**:在 CLI、Control UI 和 macOS 客户端的默认操作员连接范围包中包含 `operator.read` 和 `operator.write`,以便写入范围的公告/子代理后续调用在环回网关上不再遇到 `pairing required` 断开连接。(#22582) 感谢 @YuzuruS。 - **网关/配对**:将 operator.admin 配对令牌视为满足 operator.write 请求,以便旧设备停止循环通过 2026.2.19 版本引入的范围升级提示。(#23125, #23006) 感谢 @vignesh07。 - **网关/重启**:通过保持 `openclaw.mjs -> dist/entry.js` 引导检测显式化,为进程内重启回退路径重新获取网关锁,并收紧重启循环回归覆盖,修复重启循环边缘情况。(#23416) 感谢 @jeffwnli。 - **网关/锁**:使用可选的网关端口可达性作为主要的过时锁存活性信号(并将网关运行循环锁获取连接到已解析的端口),减少在不干净退出后错误的“已在运行”锁定。(#23760) 感谢 @Operative-001。 - **传递/队列**:在已知的永久性传递错误(例如无效收件人或缺少对话引用)时,立即隔离队列条目,将其移动到 `failed/` 而不是在每次重启时重试。(#23794) 感谢 @aldoeliacim。 - **Cron/状态**:在持久化的 cron 状态、完成事件和运行历史记录中,将执行结果(`lastRunStatus`)与传递结果(`lastDeliveryStatus`)分开,以便失败/未知的公告传递可见,而不会与运行错误混淆。 - **Cron/传递**:将具有显式线程/主题目标的纯文本公告作业通过直接出站传递路由,以便论坛/线程目标不会被中间公告轮次丢弃。(#23841) 感谢 @AndrewArto。 - **Cron**:在计时器循环中遵守 `cron.maxConcurrentRuns`,以便到期的作业可以执行到配置的并行度,而不是总是串行运行。(#11595) 感谢 @Takhoffman。 - **Cron/运行**:对手动 `cron.run` 执行强制执行与计时器驱动运行相同的每作业超时保护,包括对独立代理作业的中止传播,以便强制运行不能无限期地阻塞。(#23704) 感谢 @tkuehnl。 - **Cron/运行**:在释放 cron 锁之前持久化手动运行的 `runningAtMs` 标记,以便重叠的计时器滴答声不能同时启动同一个作业。 - **Cron/启动**:对启动追赶重放运行强制执行每作业超时保护,以便错过的独立作业在网关启动恢复期间不能无限期挂起。 - **Cron/主会话**:在重试 `wakeMode=now` 心跳争用循环时,遵守中止/超时信号,以便主目标 cron 运行及时停止,而不是等待整个繁忙重试窗口。 - **Cron/调度**:对于 `every` 作业,在重启后仍处于未来时,优先使用 `lastRunAtMs + everyMs`,然后回退到锚定调度以追赶窗口,使 NEXT 计时与上次成功的节奏匹配。(#22895) 感谢 @SidQin-cyber。 - **Cron/服务**:在 cron 锁之外执行手动 `cron.run` 作业(同时仍原子地持久化开始/完成状态),以便 `cron.list` 和 `cron.status` 在长时间强制运行期间保持响应。(#23628) 感谢 @dsgraves。 - **Cron/计时器**:在 `onTimer` 活动执行时保持看门狗重新检查计时器处于待命状态,以便调度程序即使在到期运行滴答声长时间停滞时也能继续轮询。(#23628) 感谢 @dsgraves。 - **Cron/运行日志**:清理已解决的每路径运行日志写入队列条目,以便长时间运行的 cron 正常运行时间不会在内存中保留过时的 Promise 簿记。 - **Cron/隔离**:为隔离的 cron 运行强制使用新的会话 ID,以便 `sessionTarget="isolated"` 的执行永远不会重用先前的运行上下文。(#23470) 感谢 @echoVic。 - **插件/安装**:在 `npm install --omit=dev` 之前,从复制的插件清单中剥离 `workspace:*` devDependency 条目,防止 npm 发布的频道插件(包括飞书和 MS Teams)出现 `EUNSUPPORTEDPROTOCOL` 安装失败。 - **飞书/插件**:为全局安装恢复捆绑的飞书 SDK 可用性,并在插件版本同步期间从插件 `devDependencies` 中剥离 `openclaw: workspace:*`,以便 npm 安装的飞书插件不会依赖安装失败。(#23611, #23645, #23603) - **配置/频道**:通过写入 `channels.<id>.enabled=true`(而不是 `plugins.entries.<id>`)自动启用内置频道,并停止将内置频道添加到 `plugins.allow`,防止 `plugins.entries.telegram: plugin not found` 验证失败。 - **配置/频道**:当 `plugins.allow` 处于活动状态时,自动启用/启用流程现在也将配置的内置频道加入白名单,以便 `channels.<id>.enabled=true` 不会被限制性插件白名单阻止。 - **插件/发现**:忽略扫描的扩展备份/禁用目录模式(例如 `.backup-*`、`.bak`、`.disabled*`),并将更新程序备份目录移动到 `.openclaw-install-backups` 下,防止来自存档副本的重复插件 ID 冲突。 - **插件/CLI**:使 `openclaw plugins enable` 和插件安装/链接流程通过共享的插件启用策略更新白名单,以便启用的插件不会因白名单不匹配而被禁用。(#23190) 感谢 @downwind7clawd-ctrl。 - **安全/语音通话**:通过添加严格的启动前超时、待处理/每 IP 连接限制和流式端点的总连接上限,加固媒体流 WebSocket 处理,防止预认证空闲连接 DoS。此功能将在下一个 npm 版本中发布。感谢 @jiseoung 报告。 - **安全/会话**:从 `sessions_history` 工具输出中编辑敏感令牌模式,并在发生屏蔽时显示 `contentRedacted` 元数据。(#16928) 感谢 @aether-ai-agent。 - **安全/执行**:停止信任 `PATH` 派生的目录进行安全二进制文件白名单检查,添加显式的 `tools.exec.safeBinTrustedDirs`,并将安全二进制文件 shell 执行固定到已解析的绝对可执行路径,防止二进制文件影子攻击绕过批准。此功能将在下一个 npm 版本中发布。感谢 @tdjackey 报告。 - **安全/提升权限**:仅将 `tools.elevated.allowFrom` 与发送者身份匹配(而不是收件人 `ctx.To`),关闭了 `/elevated` 授权的收件人令牌绕过漏洞。此功能将在下一个 npm 版本中发布。感谢 @jiseoung 报告。 - **安全/飞书**:为 DM/群组发送者授权强制执行仅 ID 的白名单匹配,在检查期间规范化飞书 ID 前缀,并忽略可变的显示名称,防止显示名称冲突满足白名单条目。此功能将在下一个 npm 版本中发布。感谢 @jiseoung 报告。 - **安全/群组策略**:通过要求显