← 返回更新日志

OpenClaw v2026.2.14

2026-02-15 · GitHub 原文
### 变更内容 - **Telegram**:通过 `openclaw message poll` 添加投票发送功能(支持设置时长秒数、静默发送、匿名控制)。(#16209) 感谢 @robbyczgw-cla。 - **Slack/Discord**:为私信访问控制添加 `dmPolicy` 和 `allowFrom` 配置别名;原有的 `dm.policy` 和 `dm.allowFrom` 键仍受支持,`openclaw doctor --fix` 可以迁移它们。 - **Discord**:允许执行批准提示通过 `channels.discord.execApprovals.target` 定向到频道或同时定向到私信+频道。(#16051) 感谢 @leonnardo。 - **沙盒**:添加 `sandbox.browser.binds` 以独立于执行容器配置浏览器容器的绑定挂载。(#16230) 感谢 @seheepeak。 - **Discord**:为消息路由决策添加调试日志记录,以改进 `--debug` 跟踪。(#16202) 感谢 @jayleekr。 ### 修复内容 - **CLI/插件**:确保 `openclaw message send` 在通过插件支持的通道成功交付后退出,避免一次性发送操作挂起。(#16491) 感谢 @yinghaosang。 - **CLI/插件**:在 `openclaw message` 退出(成功和失败路径)前运行已注册插件的 `gateway_stop` 钩子,以便插件支持的通道可以清理一次性 CLI 资源。(#16580) 感谢 @gumadeiras。 - **WhatsApp**:优先使用每个账户的 `dmPolicy` 覆盖设置(账户级设置现在对于入站私信优先于通道默认设置)。(#10082) 感谢 @mcaxtr。 - **Telegram**:当 `channels.telegram.commands.native` 为 `false` 时,从 `setMyCommands` 菜单注册中排除插件命令,同时保持插件斜杠命令处理器可调用。(#15132) 感谢 @Glucksberg。 - **LINE**:对于开发者控制台的“验证”请求(`{"events":[]}`),即使没有 `X-Line-Signature` 也返回 200 OK,同时仍要求真实交付的请求必须包含签名。(#16582) 感谢 @arosstale。 - **Cron**:当设置了 `delivery.to` 时,直接交付纯文本输出,以便 Cron 接收者获得完整输出而非摘要。(#16360) 感谢 @thewilloftheshadow。 - **Cron/Slack**:在 Cron 作业交付出站消息时,保留代理身份(名称和图标)。(#16242) 感谢 @robbyczgw-cla。 - **媒体**:加载出站媒体时接受带 `MEDIA:` 前缀的路径(宽松的空格处理),以防止因工具返回的本地媒体路径导致 `ENOENT` 错误。(#13107) 感谢 @mcaxtr。 - **代理**:无论详细级别如何,都将工具结果媒体(截图、图像、音频)交付到通道。(#11735) 感谢 @strelov1。 - **代理/图像工具**:通过将活动工作空间目录包含在本地媒体允许列表中,允许工作空间本地的图像路径,并信任沙盒已验证的路径,以防止错误的“不在允许目录下”拒绝。(#15541) - **代理/图像工具**:将有效的工作空间根目录传播到工具连接中,以便在没有显式 `workspaceDir` 的情况下运行时,默认接受工作空间本地的图像路径。(#16722) - **BlueBubbles**:在群聊信封中包含发送者身份,并将干净的消息文本传递给代理提示,与 iMessage/Signal 格式保持一致。(#16210) 感谢 @zerone0x。 - **CLI**:修复惰性核心命令注册,使顶级维护命令(`doctor`、`dashboard`、`reset`、`uninstall`)能正确解析,而不是暴露一个非功能的 `maintenance` 占位符命令。 - **CLI/仪表板**:当 `gateway.bind=lan` 时,生成 localhost 仪表板 URL 以满足浏览器安全上下文要求,同时保留非 LAN 绑定的行为。(#16434) 感谢 @BinHPdev。 - **TUI/网关**:从 `gateway.bind` 模式(tailnet/lan)解析本地网关目标 URL,而不是硬编码 localhost,以便当网关绑定到非环回地址时 `openclaw tui` 能够连接。(#16299) 感谢 @cortexuvula。 - **TUI**:在 `openclaw tui` 中优先使用显式的 `--session <key>`,即使 `session.scope` 是 `global`,以便命名会话不再折叠到共享的全局历史记录中。(#16575) 感谢 @cinqu。 - **TUI**:在可搜索的选择列表中,使用可用的终端宽度显示会话名称。(#16238) 感谢 @robbyczgw-cla。 - **TUI**:重构可搜索选择列表的描述布局,并为 ANSI 高亮宽度边界添加回归覆盖。 - **TUI**:当不同的运行并发完成时,保留正在传输的流式回复(避免在流传输中途清除活动运行或重新加载历史记录)。(#10704) 感谢 @axschr73。 - **TUI**:当后续工具边界增量暂时省略较早的文本块时,保持工具执行前流式传输的文本可见。(#6958) 感谢 @KrisKind75。 - **TUI**:对 ANSI/控制字符过多的历史文本进行清理,对类似二进制的行进行编辑,并在渲染前分割病态长的无间断标记,以防止在包含二进制附件历史记录时启动崩溃。(#13007) 感谢 @wilkinspoe。 - **TUI**:通过将中等长度的无间断标记分块并添加快速路径清理防护,来增强窄终端下的渲染时清理器,以减少对正常文本的开销。(#5355) 感谢 @tingxueren。 - **TUI**:使用终端默认前景色(而非固定的浅色 ANSI 颜色)渲染助手正文文本,以便在浅色主题(如 Solarized Light)上保持可读的对比度。(#16750) 感谢 @paymog。 - **TUI/钩子**:通过 `sessions.reset` 传递显式的重置原因(`new` 与 `reset`),并为网关触发的重置发出内部命令钩子,以便在 TUI/webchat 中触发 `/new` 钩子工作流。 - **Cron**:通过使用维护重新计算语义,防止 `cron list`/`cron status` 静默跳过逾期的重复作业。(#16156) 感谢 @zerone0x。 - **Cron**:在 `cron update` 期间,修复已更新作业缺失/损坏的 `nextRunAtMs`,而无需全局重新计算不相关的到期作业。(#15750) - **Cron**:对于运行中被中断的作业(陈旧的 `runningAtMs` 标记),在启动时跳过错过的作业重放,防止自重启作业(如更新任务)出现重启循环。(#16694) 感谢 @sbmilburn。 - **Discord**:记录入站消息时优先使用网关公会 ID,以便缓存未命中的公会不会显示为 `guild=dm`。感谢 @thewilloftheshadow。 - **Discord**:将每个公会的空 `channels: {}` 配置映射视为无通道允许列表(而非全部拒绝),以便没有显式通道条目的 `groupPolicy: "open"` 公会继续接收消息。(#16714) 感谢 @xqliu。 - **模型/CLI**:在 `models status` 字符串修剪路径时添加防护,防止因格式错误的非字符串配置值导致崩溃。(#16395) 感谢 @BinHPdev。 - **网关/子代理**:在交付错误时保留排队的公告项和摘要状态,重试失败的公告清空,并避免在超时/失败时丢弃未发送的公告。(#16729) 感谢 @Clawdette-Workspace。 - **网关/会话**:在 `sessions.reset` 之前中止活动的嵌入式运行并清除排队的会话工作,如果运行未及时停止则返回不可用。(#16576) 感谢 @Grynn。 - **会话/代理**:针对不匹配的代理上下文,通过保留显式的存储根目录并添加安全绝对路径回退到正确的代理会话目录,来增强转录路径解析。(#16288) 感谢 @robbyczgw-cla。 - **代理**:围绕嵌入式 `session.compact()` 添加安全超时,以确保停滞的压缩运行结束并释放被阻塞的会话通道。(#16331) 感谢 @BinHPdev。 - **代理**:保持未解决的突变工具失败可见,直到同一操作重试成功;将突变错误展示范围限定在突变调用(包括 `session_status` 模型更改);并在出站回复中对重复的失败警告进行去重。(#16131) 感谢 @Swader。 - **代理/进程/引导**:保留无限制的 `process log` 仅偏移量分页(仅当同时省略 `offset` 和 `limit` 时才应用默认尾部),并在注入的引导内容(包括标记)中强制执行严格的 `bootstrapTotalMaxChars` 预算,当剩余预算太小时跳过额外注入。(#16539) 感谢 @CharlieGreenman。 - **代理/工作空间**:持久化引导初始化状态,以便部分初始化的工作空间恢复一次缺失的 `BOOTSTRAP.md`,而完成初始化后即使运行时文件后来被重新创建,BOOTSTRAP 也会保持删除状态。感谢 @gumadeiras。 - **代理/工作空间**:当核心工作空间文件在部分初始化的工作空间中被植入时,创建 `BOOTSTRAP.md`,同时保持 BOOTSTRAP 在初始化删除后为一次性。(#16457) 感谢 @robbyczgw-cla。 - **代理**:将压缩期间的外部超时中止与内部超时同等分类,防止不必要的身份验证配置文件轮换,并保留压缩超时快照回退行为。(#9855) 感谢 @mverrilli。 - **代理**:将空流提供者失败(`request ended without sending any chunks`)视为超时类故障转移信号,启用身份验证配置文件轮换/回退,并显示友好的超时消息而非原始提供者错误。(#10210) 感谢 @zenchantlive。 - **代理**:在工具启动诊断中将 `read` 工具的 `file_path` 参数视为有效,以避免在使用别名参数时出现错误的“read 工具调用时没有路径”警告。(#16717) 感谢 @Stache73。 - **Ollama/代理**:避免对 Ollama 模型强制实施 `<final>` 标签强制执行,因为这可能会抑制所有输出为 `(no output)`。(#16191) 感谢 @Glucksberg。 - **插件**:当通过多个路径(配置/工作空间/全局 vs 捆绑)发现同一扩展时,抑制错误的重复插件 ID 警告,但仍对真正的重复项发出警告。(#16222) 感谢 @shadril238。 - **技能**:仅在刷新技能快照时监视 `SKILL.md`,以避免在大型数据树中耗尽文件描述符。(#11325) 感谢 @household-bard。 - **内存/QMD**:使 `memory status` 为只读,跳过 QMD 启动更新/嵌入副作用,仅用于状态检查。 - **内存/QMD**:当内置回退初始化失败时(例如缺少嵌入 API 密钥),保留原始的 QMD 失败,而不是用回退初始化错误替换它们。 - **内存/内置**:通过从持久化的索引元数据(而非进程启动默认值)派生仅状态管理器的脏状态,使 `memory status` 的脏报告在多次调用间保持稳定。(#10863) 感谢 @BarryYangi。 - **内存/QMD**:限制 QMD 命令输出缓冲,以防止病态的 `qmd` 命令输出导致内存耗尽。 - **内存/QMD**:每个请求解析一次 qmd 范围键,以避免在范围检查中重复解析。 - **内存/QMD**:在回退到前缀查找之前,使用精确的 docid 匹配查询 QMD 索引,以获得更好的召回正确性和索引效率。 - **内存/QMD**:将结果限制传递给 `search`/`vsearch` 命令,以便 QMD 可以更早地限制结果。 - **内存/QMD**:当在 QMD 读取中请求 `from/lines` 窗口时,避免读取完整的 Markdown 文件。 - **内存/QMD**:在同步期间跳过重写未更改的会话导出 Markdown 文件,以减少磁盘抖动。 - **内存/QMD**:通过从有噪声的 `stdout` 中提取第一个 JSON 数组,使 QMD 结果 JSON 解析对噪声命令输出具有弹性。 - **内存/QMD**:在 qmd JSON 解析中,将带前缀的 `no results found` 标记输出视为空结果集。(#11302) 感谢 @blazerui。 - **内存/QMD**:通过为每个托管集合运行一次 `qmd query -c <collection>` 并按最佳分数合并(也用于 `search`/`vsearch` 回退到查询),避免多集合 `query` 排名损坏。(#16740) 感谢 @volarian-vai。 - **内存/QMD**:检测空字节 `ENOTDIR` 更新失败,重建托管集合一次,并重试更新以自我修复损坏的集合元数据。(#12919) 感谢 @jorgejhms。 - **内存/QMD/安全**:为 QMD 范围规则添加 `rawKeyPrefix` 支持,并保留传统的 `keyPrefix: "agent:..."` 匹配,防止在操作符匹配代理前缀会话键时绕过范围拒绝。 - **内存/内置**:将内存监视器目标缩小到 Markdown 全局模式,并忽略依赖项/venv 目录,以减少内存同步启动时的文件描述符压力。(#11721) 感谢 @rex05ai。 - **安全/内存-LanceDB**:将回忆的记忆视为不受信任的上下文(转义注入的记忆文本 + 显式的非指令框架),在自动捕获期间跳过可能的提示注入负载,并将自动捕获限制为用户消息,以降低记忆中毒风险。(#12524) 感谢 @davidschmid24。 - **安全/内存-LanceDB**:要求显式的 `autoCapture: true` 选择加入(现在默认禁用),以防止自动捕获 PII,除非操作员有意启用。(#12552) 感谢 @fr33d3m0n。 - **诊断/内存**:修剪过时的诊断会话状态条目,并限制跟踪的会话状态数量,以防止长时间运行的网关出现无限制的内存增长。(#5136) 感谢 @coygeek 和 @vignesh07。 - **网关/内存**:在运行完成/中止时清理 `agentRunSeq` 跟踪,并强制执行维护时限制修剪,以防止长时间运行期间序列映射无限制增长。(#6036) 感谢 @coygeek 和 @vignesh07。 - **自动回复/内存**:通过驱逐最旧的条目并删除重置(`false`)标志,限制 `ABORT_MEMORY` 增长,以便中止状态跟踪在长时间运行期间不会无限制增长。(#6629) 感谢 @coygeek 和 @vignesh07。 - **Slack/内存**:通过 TTL + 最大大小修剪限制线程启动器缓存增长,防止长时间运行的 Slack 网关累积无限制的线程缓存状态。(#5258) 感谢 @coygeek 和 @vignesh07。 - **出站/内存**:通过最大大小驱逐和主动 TTL 修剪限制目录缓存增长,防止长时间运行的网关累积无限制的目录条目。(#5140) 感谢 @coygeek 和 @vignesh07。 - **技能/内存**:从远程技能缓存中移除断开连接的节点,防止长时间运行期间累积过时的节点元数据。(#6760) 感谢 @coygeek。 - **沙盒/工具**:使沙盒文件工具支持绑定挂载感知(包括绝对容器路径),并对写入强制执行只读绑定语义。(#16379) 感谢 @tasaankaeris。 - **媒体/安全**:默认允许从 OpenClaw 状态 `workspace/` 和 `sandboxes/` 根目录读取本地媒体,以便生成的工 作空间媒体可以在不绕过全局路径安全检查的情况下交付。(#15541) 感谢 @lanceji。 - **媒体/安全**:通过要求调用者在标记路径为已验证时提供显式的 `readFile` 覆盖,并拒绝文件系统根目录的 `localRoots` 条目,来增强本地媒体允许列表绕过防护。(#16739) - **Discord/安全**:增强语音消息媒体加载的安全性(SSRF + 允许的本地根目录检查),防止工具提供的路径/URL 被用于探测内部 URL 或读取任意本地文件。 - **安全/BlueBubbles**:要求为本地出站媒体路径读取提供显式的 `mediaLocalRoots` 允许列表,以防止本地文件泄露。(#16322) 感谢 @mbelinky。 - **安全/BlueBubbles**:当多个 webhook 目标匹配相同的 guid/密码时,拒绝模糊的共享路径 webhook 路由。 - **安全/BlueBubbles**:通过仅接受来自直接 localhost 环回请求的无密码 webhook(现在转发/代理的请求需要密码),增强反向代理后的 BlueBubbles webhook 身份验证。感谢 @simecek。 - **飞书/安全**:增强媒体 URL 获取的安全性,防止 SSRF 和本地文件泄露。(#16285) 感谢 @mbelinky。 - **安全/Zalo**:当多个 webhook 目标匹配相同的密钥时,拒绝模糊的共享路径 webhook 路由。 - **安全/Nostr**:要求环回源,并阻止跨源个人资料突变/导入尝试。感谢 @vincentkoc。 - **安全/Signal**:增强安装期间 signal-cli 存档提取的安全性,防止路径遍历到安装根目录之外。 - **安全/钩子**:将钩子转换模块限制在 `~/.openclaw/hooks/transforms` 目录内(防止通过配置进行路径遍历/逃逸模块加载)。配置说明:`hooks.transformsDir` 现在必须位于