← 返回更新日志

OpenClaw v2026.2.22

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