← 返回更新日志

OpenClaw v2026.3.7-beta.1 预发布

2026-03-08 · GitHub 原文
### 变更 - **Agents/context engine plugin interface**:新增 `ContextEngine` 插件槽,包含完整的生命周期钩子(`bootstrap`、`ingest`、`assemble`、`compact`、`afterTurn`、`prepareSubagentSpawn`、`onSubagentEnded`),基于槽位的注册机制及配置驱动的解析,`LegacyContextEngine` 包装器(保留现有压缩行为),通过 `AsyncLocalStorage` 为插件运行时提供作用域子代理运行时,以及 `sessions.get` 网关方法。使 `lossless-claw` 等插件能够提供替代的上下文管理策略,而无需修改核心压缩逻辑。未配置上下文引擎插件时,零行为变更。(#22201) 感谢 @jalehman。 - **ACP/persistent channel bindings**:新增持久化 Discord 频道和 Telegram 主题绑定存储、路由解析及 CLI/文档支持,使 ACP 线程目标在重启后依然存在,并可进行一致管理。(#34873) 感谢 @dutifulbob。 - **Telegram/ACP topic bindings**:在 `/acp spawn` 中接受 Telegram Mac Unicode 短横线选项前缀,支持 Telegram 主题线程绑定(`--thread here|auto`),将绑定主题的后续操作路由到 ACP 会话,添加带有前缀批准 ID 解析的可操作 Telegram 批准按钮,并在主题中置顶成功的绑定确认消息。(#36683) 感谢 @huntharo。 - **Telegram/topic agent routing**:在论坛群组和 DM 主题中支持每主题 `agentId` 覆盖,使主题能够路由到具有独立会话的专用代理。(#33647;基于 #31513) 感谢 @kesor 和 @Sid-Qin。 - **Web UI/i18n**:在控制界面中添加西班牙语(`es`)区域设置支持,包括区域检测、懒加载及支持区域的语言选择器标签。(#35038) 感谢 @DaoPromociones。 - **Onboarding/web search**:在配置向导中添加提供商选择步骤和完整提供商列表,并在入门过程中支持 SecretRef 引用模式。(#34009) 感谢 @kesku 和 @thewilloftheshadow。 - **Tools/Web search**:将 Perplexity 提供商切换为 Search API,提供结构化结果以及新的语言/区域/时间过滤器。(#33822) 感谢 @kesku。 - **Gateway**:为 `gateway.auth.token` 添加 SecretRef 支持,并配合身份验证模式保护措施。(#35094) 感谢 @joshavant。 - **Docker/Podman extension dependency baking**:新增 `OPENCLAW_EXTENSIONS`,使容器构建能将选定的捆绑扩展 npm 依赖预安装到镜像中,从而在容器部署中实现更快、更可复现的启动。(#32223) 感谢 @sallyom。 - **Plugins/before_prompt_build system-context fields**:新增 `prependSystemContext` 和 `appendSystemContext`,使静态插件指导可放置在系统提示空间,以实现提供商缓存并降低重复提示令牌成本。(#35177) 感谢 @maweibin。 - **Plugins/hook policy**:新增 `plugins.entries.<id>.hooks.allowPromptInjection`,在运行时验证未知类型的钩子名称,并在禁用提示注入时保留遗留的 `before_agent_start` 模型/提供商覆盖,同时剥离提示修改字段。(#36567) 感谢 @gumadeiras。 - **Hooks/Compaction lifecycle**:发出 `session:compact:before` 和 `session:compact:after` 内部事件,以及带有会话/计数元数据的插件压缩回调,使自动化能够一致地响应压缩运行。(#16788) 感谢 @vincentkoc。 - **Agents/compaction post-context configurability**:新增 `agents.defaults.compaction.postCompactionSections`,使部署能够选择在压缩后重新注入哪些 `AGENTS.md` 部分,同时在配置任何顺序的文档默认对时保留遗留回退行为。(#34556) 感谢 @efe-arv。 - **TTS/OpenAI-compatible endpoints**:新增 `messages.tts.openai.baseUrl` 配置支持(配置优先于环境变量)、端点感知指令验证,以及将 OpenAI TTS 请求路由到解析后的基 URL。(#34321) 感谢 @RealKai42。 - **Slack/DM typing feedback**:新增 `channels.slack.typingReaction`,使 Socket Mode DM 即使在 Slack 原生助手输入不可用时也能显示基于反应的处理状态。(#19816) 感谢 @dalefrieswthat。 - **Discord/allowBots mention gating**:新增 `allowBots: "mentions"`,仅接受提及机器人的机器人 authored 消息。感谢 @thewilloftheshadow。 - **Agents/tool-result truncation**:通过使用头尾截断保留重要尾部诊断信息来处理超大的工具结果,同时保持可配置的截断选项。(#20076) 感谢 @jlwestsr。 - **Cron/job snapshot persistence**:在 `ensureLoaded` 中的规范化持久化期间跳过备份,使 `jobs.json.bak` 保留编辑前的快照以供恢复,同时在显式用户驱动的写入时保留备份创建。(#35234) 感谢 @0xsline。 - **CLI**:使只读 SecretRef 状态流安全降级。(#37023) 感谢 @joshavant。 - **Tools/Diffs guidance**:恢复启用的 diff 的简短系统提示提示,同时将详细说明保留在配套技能中,使 diff 使用指导不进入用户提示空间。(#36904) 感谢 @gumadeiras。 - **Tools/Diffs guidance loading**:将 diff 使用指导从无条件的提示钩子注入移动到插件配套技能路径,减少无关回合的提示噪音,同时保持 diff 工具行为不变。(#32630) 感谢 @sircrumpet。 - **Docs/Web search**:移除 Brave 免费套餐的过时表述,并在 Brave 设置文档中用中性合规语言替换规范性的 AI 服务条款指导。(#26860) 感谢 @HenryLoenwind。 - **Config/Compaction safeguard tuning**:通过验证的配置表面和嵌入式运行器连接公开 `agents.defaults.compaction.recentTurnsPreserve` 和质量保护重试旋钮,并为真实配置加载和架构元数据提供回归覆盖。(#25557) 感谢 @rodrigouroz。 - **iOS/App Store Connect release prep**:在 `ai.openclaw.client` 下统一 iOS 捆绑标识符,刷新 Watch 应用图标,添加 Fastlane 元数据/截图自动化,并支持密钥链支持的 ASC 认证以上传。(#38936) 感谢 @ngutman。 - **Mattermost/model picker**:为 `/oc_model` 和 `/oc_models` 添加 Telegram 风格的交互式提供商/模型浏览,修复选择器回调更新,并在选择模型时发出正常的确认回复。(#38767) 感谢 @mukhtharcm。 - **Docker/multi-stage build**:将 Dockerfile 重构为多阶段构建,以生成不包含构建工具、源代码或 Bun 的最小运行时镜像;添加 `OPENCLAW_VARIANT=slim` 构建参数以生成 bookworm-slim 变体。(#38479) 感谢 @sallyom。 ### 破坏性变更 - **破坏性变更:** 网关身份验证现在要求在同时配置 `gateway.auth.token` 和 `gateway.auth.password`(包括 SecretRef)时显式设置 `gateway.auth.mode`。升级前请将 `gateway.auth.mode` 设置为 `token` 或 `password`,以避免启动/配对/TUI 失败。(#35094) 感谢 @joshavant。 ### 修复 - **Models/MiniMax**:停止在内置提供商目录、入门元数据和文档中宣传已移除的 `MiniMax-M2.5-Lightning`;将支持的快速层模型保留为 `MiniMax-M2.5-highspeed`。 - **Security/Config**:当 `loadConfig()` 遇到验证或读取错误时失败关闭,使无效配置无法静默回退到宽松的运行时默认值。(#9040) 感谢 @joetomasone。 - **Memory/Hybrid search**:在 `bm25RankToScore()` 中保留负 FTS5 BM25 相关性排序,使更强的关键字匹配排名高于较弱的匹配,而不是折叠或反转分数。(#33757) 感谢 @lsdcc01。 - **LINE/`requireMention` group gating**:在原始、`group:` 和 `room:` 键(包括账户范围的组配置)之间对齐入站和回复阶段 LINE 组策略解析,保留插件支持的回复阶段回退行为,并为仅前缀的组/室配置及回复阶段策略解析添加回归覆盖。(#35847) 感谢 @kirisame-wang。 - **Onboarding/local setup**:将未设置的本地 `tools.profile` 默认为 `coding` 而非 `messaging`,为新的本地安装恢复文件/运行时工具,同时保留用户显式设置的配置文件。(来自 #38241,与 #34958 重叠) 感谢 @cgdusek。 - **Gateway/Telegram stale-socket restart guard**:仅对发布事件活跃时间戳的频道应用陈旧套接字重启,防止 Telegram 提供商仅因长时间运行而被错误归类为陈旧,并避免升级后重启/配对风暴。(openclaw#38464) - **Onboarding/headless Linux daemon probe hardening**:将 `systemctl --user is-enabled` 探测失败视为非致命,以便入门流程在 SSH/无头 VPS 环境中显示安装指导前不会崩溃。(#37297) 感谢 @acarbajal-web。 - **Memory/QMD mcporter Windows spawn hardening**:当 `mcporter.cmd` 启动失败并出现 `spawn EINVAL` 时,通过裸 `mcporter` shell 解析重试,使 QMD 召回可以继续,而不是回退到内置内存搜索。(#27402) 感谢 @i0ivi0i。 - **Tools/web_search Brave language-code validation**:使 `search_lang` 处理与 Brave 支持的代码对齐(包括 `zh-hans`、`zh-hant`、`en-gb`、`pt-br`),将常见别名输入(`zh`、`ja`)映射到有效的 Brave 值,并在上游请求前拒绝不支持的代码,防止 422 失败。(#37260) 感谢 @heyanming。 - **Models/openai-completions streaming compatibility**:对于非原生 OpenAI 兼容端点的模型规范化,强制 `compat.supportsUsageInStreaming=false`,防止仅使用情况的流块在提供商流中触发 `choices[0]` 解析崩溃。(#8714) 感谢 @nonanon1。 - **Tools/xAI native web-search collision guard**:在路由到 xAI/Grok 模型提供商(包括 OpenRouter `x-ai/*`)时从工具注册中删除 OpenClaw `web_search`,以避免针对提供商原生 `web_search` 的重复工具名称请求失败。(#14749) 感谢 @realsamrat。 - **TUI/token copy-safety rendering**:将长凭据类混合字母数字令牌(包括带引号的形式)视为复制敏感,在渲染消毒中处理,以便格式化硬换行保护在显示前不会向身份验证类值注入可见空格。(#26710) 感谢 @jasonthane。 - **WhatsApp/self-chat response prefix fallback**:停止在未配置身份名称或响应前缀时强制将 `"[openclaw]"` 作为隐式出站响应前缀,使空白/默认前缀设置不会在自聊流程中意外注入品牌文本。(#27962) 感谢 @ecanmor。 - **Memory/QMD search result decoding**:接受仅包含 `file` URI(例如 `qmd://collection/path.md`)而没有 `docid` 的 `qmd search` 命中,通过管理的集合根解析它们,并保持多集合结果按文件回退键控,使有效的 QMD 命中不再折叠为空 `memory_search` 输出。(#28181) 感谢 @0x76696265。 - **Memory/QMD collection-name conflict recovery**:当 `qmd collection add` 因另一个集合已占用相同的 `path + pattern` 而失败时,从 `collection list` 检测冲突集合,移除它并重试添加,使代理范围管理的集合能够确定性地创建,而不是被静默跳过;还添加了仅警告的回退,当 qmd 元数据不可用时,避免破坏性猜测。(#25496) 感谢 @Ramsbaby。 - **Slack/app_mention race dedupe**:当 `app_mention` 分发在相同 `ts` 的 `message` 准备仍在进行时获胜,则抑制后续消息分发,使 Slack 的几乎同时传递不会产生重复回复;保持单次重试行为,并为丢弃和成功的消息准备结果添加回归覆盖。(#37033) 感谢 @Takhoffman。 - **Gateway/chat streaming tool-boundary text retention**:将助手增量段合并到每运行聊天缓冲区,以便在提供商在工具后发出助手段作为非前缀快照时,预工具文本在实时聊天增量/最终输出中得以保留。(#36957) 感谢 @Datyedyeguy。 - **TUI/model indicator freshness**:防止过时的会话快照覆盖新修补的模型选择(并在切换会话键时重置每会话新鲜度),使 `/model` 更新立即反映,而不是滞后一个或多个命令。(#21255) 感谢 @kowza。 - **TUI/final-error rendering fallback**:当聊天 `final` 事件没有可渲染的助手内容但包含信封 `errorMessage` 时,渲染格式化的错误文本而不是折叠为 `"(no output)"`,在会话中保留可操作的失败上下文。(#14687) 感谢 @Mquarmoc。 - **TUI/session-key alias event matching**:将会话键为规范别名(例如 `agent:<id>:main` 与 `main`)的聊天事件视为同一会话,同时保留跨代理隔离,使助手回复不再因严格的键格式不匹配而消失或出现在另一个终端窗口中。(#33937) 感谢 @yjh1412。 - **OpenAI Codex OAuth/login parity**:即使没有提供商插件,也保持 `openclaw models auth login --provider openai-codex` 在内置路径上,保留 Pi 生成的授权 URL 而不进行本地作用域重写,并在回调后停止针对公共 OpenAI Responses API 验证成功的 Codex 登录。(#37558;#36660 和 #24720 的后续) 感谢 @driesvints、@Skippy-Gunboat 和 @obviyus。 - **Agents/config schema lookup**:添加 `gateway` 工具操作 `config.schema.lookup`,使代理能够在编辑前一次检查一个配置路径,而无需将完整架构加载到提示上下文中。(#37266) 感谢 @gumadeiras。 - **Onboarding/API key input hardening**:从规范化密钥输入中剥离非 Latin-1 Unicode 伪影(同时保留 Latin-1 内容和内部空格),使格式错误的复制 API 密钥不会触发 HTTP 头 `ByteString` 构造崩溃;为共享规范化和 MiniMax 认证头使用添加回归覆盖。(#24496) 感谢 @fa6maalassaf。 - **Kimi Coding/Anthropic tools compatibility**:将 `anthropic-messages` 工具负载规范化为 OpenAI 风格的 `tools[].function` + 兼容的 `tool_choice`,当目标为 Kimi Coding 端点时,恢复在 v2026.3.2 后回归的工具调用工作流。(#37038) 感谢 @mochimochimochi-hub。 - **Heartbeat/workspace-path guardrails**:在心跳提示中附加显式工作区 `HEARTBEAT.md` 路径指导(并避免 `docs/heartbeat.md`),使心跳运行能够在打包的安装布局中可靠地定位工作区清单。(#37037) 感谢 @stofancy。 - **Subagents/kill-complete announce race**:当较晚的 `subagent-complete` 生命周期事件在较早的终止标记之后到达时,清除陈旧的终止抑制/清理标志并重新运行公告清理,使完成的运行不再被静默吞噬。(#37024) 感谢 @cmfinlan。 - **Agents/tool-result cleanup timeout hardening**:在嵌入式运行器关闭空闲超时时,清除挂起的工具调用状态而不持久化合成的 `missing tool result` 条目,防止超时清理毒害后续回合;添加回归覆盖以处理超时清除与刷新行为。(#37081) 感谢 @Coyote-Den。 - **Agents/openai-completions stream timeout hardening**:确保运行时 undici 全局调度器在嵌入式运行前使用扩展的流主体/头超时(包括 env-proxy 调度器模式),减少长生成过程中强制的中间流 `terminated` 失败;添加调度器选择和幂等重新配置的回归覆盖。(#9708) 感谢 @scottchguard。 - **Agents/fallback cooldown probe execution**:将模型回退中的显式速率限制冷却探测意图线程到嵌入式运行器身份验证配置文件选择,以便当所有配置文件因 `rate_limit` 而冷却时,同一提供商的回退尝试实际运行(而不是在运行前失败,显示 `No available auth profile`),同时保留默认冷却跳过行为,并在回退和运行器层添加回归测试。(#13623) 感谢 @asfura。 - **Cron/OpenAI Codex OAuth refresh hardening**:当 `openai-codex` 令牌刷新在账户 ID 提取上失败时,重用缓存的访问令牌而不是立即失败运行,并添加回归覆盖以保持非 Codex 和不相关的刷新失败不变。(#36604) 感谢 @laulopezreal。 - **TUI/session isolation for `/new`**:使 `/new` 分配唯一的 `tui-<uuid>` 会话键,而不是重置共享的代理会话,以便同一代理上的多个 TUI 客户端停止相互接收回复;还在终端中消毒 `/new` 和 `/reset` 失败文本。来自贡献者 PR #39238 by @widingmarcus-cyber。感谢 @widingmarcus-cyber。 - **Synology Chat/rate-limit env parsing**:将 `SYNOLOGY_RATE_LIMIT=0` 视为显式值,同时对于格式错误的环境值仍回退到默认限制,而不是部分解析它们。来自贡献者 PR #39197 by @scoootscooob。感谢 @scoootscooob。 - **Voice-call/OpenAI Realtime STT config defaults**:尊重显式的 `vadThreshold: 0` 和 `silenceDurationMs: 0`,而不是静默用默认值替换它们。来自贡献者 PR #39196 by @scoootscooob。感谢 @scoootscooob。 - **Voice-call/OpenAI TTS speed config**:尊重显式的 `speed: 0` 而不是静默用默认速度替换它。来自贡献者 PR #39318 by @ql-wade。感谢 @ql-wade。 - **launchd/runtime PID parsing**:拒绝来自 `launchctl print` 的 `pid <= 0`,以便守护进程状态解析器不再将内核/非运行哨兵值视为真实进程 ID。来自贡献者 PR #39281 by @mvanhorn。感谢 @mvanhorn。 - **Cron/file permission hardening**:对 cron 存储/备份/运行日志文件强制执行仅所有者(`0600`),并将 cron 存储 + 运行日志目录加固为 `0700`,包括来自旧安装的预存在目录。(#36078) 感谢 @aerelune。 - **Gateway/remote WS break-glass hostname support**:在入门验证和运行时网关连接检查中,对 `ws://` 主机名 URL(不仅是私有 IP 文字)尊重 `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1`,同时仍拒绝公共 IP 文字和非单播 IPv6 端点。(#36930) 感谢 @manju-rn。 - **Routing/binding lookup scalability**:按频道/账户预索引路由绑定,并在频道-账户缓存轮换时避免完整的绑定列表重新扫描,防止大型绑定配置中 `resolveAgentRoute` 的秒级停滞。(#36915) 感谢 @songchenghao。 - **Browser/session cleanup**:跟踪会话范围浏览器工具运行打开的浏览器标签,并在 `sessions.reset`/`sessions.delete` 运行时清理期间关闭跟踪的标签,防止孤立标签和会话拆除后浏览器内存无界增长。(#36666) 感谢 @Harnoor6693。 - **Plugin/hook install rollback hardening**:在规范安装基础下暂存安装,在发布前验证和运行依赖安装,并通过重命名而不是删除目标路径来恢复更新,减少安装失败期间的局部替换和符号链接重绑定风险。 - **Slack/local file upload allowlist parity**:通过 Slack 发送操作流水线传播 `mediaLocalRoots`,使工作区根附件通过 `assertLocalMediaAllowed` 检查,而非允许列表路径保持阻止。(综合:#36656;考虑自 #36516、#36496、#36493、#36484、#32648、#30888 的重叠)感谢 @2233admin。 - **Agents/compaction safeguard pre-check**:当会话没有真实对话消息时,在进入 Pi SDK 之前跳过嵌入式压缩,避免空闲会话上不必要的 LLM API 调用。(#36451) 感谢 @Sid-Qin。 - **Config/schema cache key stability**:使用增量哈希构建合并的架构缓存键,避免大型单字符串序列化,并防止高基数插件/频道元数据上的 `RangeError: Invalid string length`。(#36603) 感谢 @powermaster888。 - **iMessage/cron completion announces**:从用户可见的完成文本中剥离泄漏的内联回复标签(例如 `[[reply_to:6100]]`),使公告传递不暴露线程元数据。(#24600) 感谢 @vincentkoc。 - **Control UI/iMessage duplicate reply routing**:保持内部 webchat 回合在调度器传递上(而不是源频道重路由),使控制界面聊天不会将重复回复复制到 iMessage,同时保留 webchat-提供商中继的外部表面路由。修复 #33483。感谢 @alicexmolt。 - **Sessions/daily reset transcript archival**:在陈旧会话计划/每日重置期间,通过在滚动前捕获之前的会话条目来归档先前的转录文件,防止磁盘上孤立转录文件。(#35493) 感谢 @byungsker。 - **Feishu/group slash command detection**:在命令授权探测前规范化组提及包装器,使提及前缀的命令(例如 `@Bot/model` 和 `@Bot /reset`)被识别为网关命令而不是转发给代理。(#35994) 感谢 @liuxiaopai-ai。 - **Control UI/auth token separation**:在浏览器身份验证验证中保持共享网关令牌,同时为签名的设备负载保留缓存的设备令牌,防止重启/轮换后错误的 `device token mismatch` 断开连接。来自贡献者 PR #37382 by @FradSer。感谢 @FradSer。 - **Gateway/browser auth reconnect hardening**:停止将缺失的令牌/密码提交计为身份验证速率限制失败,并停止在不可恢复的身份验证错误上自动重新连接控制界面客户端,使配置错误的浏览器标签不再锁定健康会话。来自贡献者 PR #38725 by @ademczuk。感谢 @ademczuk。 - **Gateway/service token drift repair**:停止将共享身份验证令牌持久化到已安装的网关服务单元,将陈旧的嵌入式服务令牌标记为重新安装,并将无令牌服务环境视为规范,使令牌轮换/重启流程与配置/环境解析保持一致。来自贡献者 PR #28428 by @l0cka。感谢 @l0cka。 - **Control UI/agents-page selection**:保存代理配置更改并重新加载代理列表后保持编辑的代理被选中,使 `/agents` 不再弹回默认代理。来自贡献者 PR #39301 by @MumuTW。感谢 @MumuTW。 - **Gateway/auth follow-up hardening**:在守护程序审计和医生修复中保留 systemd `EnvironmentFile=` 优先级/来源血统,阻止共享密码覆盖流搭便车缓存的设备令牌,并在配置优先的网关 SecretRef 无法解析时失败关闭。后续 #39241。 - **Agents/context pruning**:在 `block.type` 读取前保护助手思考/文本字符估计 against 格式错误的块(缺失 `thinking`/`text` 字符串或空条目),使压缩不再因格式错误的提供商内容而崩溃。(openclaw#35146) 感谢 @Sid-Qin。 - **Agents/transcript policy**:在 `resolveTranscriptPolicy` 中将 `preserveSignatures` 设置为仅 Anthropic 处理,使 Anthropic 思考签名得以保留,而非 Anthropic 提供商保持不变。(#32813) 感谢 @Sid-Qin。 - **Agents/schema cleaning**:将 Venice + Grok 模型 ID 检测为 xAI 代理目标,在请求前剥离不支持的 JSON Schema 关键字,防止 Venice/Grok `Invalid arguments` 失败。(openclaw#35355) 感谢 @Sid-Qin。 - **Skills/native command deduplication**:通过 `listSkillCommandsForAgents` 中的规范 `skillName` 集中技能命令去重,使重复的后缀变体(例如 `_2`)不再在 Discord 之外的界面中显示。(#27521) 感谢 @shivama205。 - **Agents/xAI tool-call argument decoding**:在工具执行前解码 HTML 实体编码的 xAI/Grok 工具调用参数值(`&amp;`、`&quot;`、`&lt;`、`&gt;`、数字实体),使带有 shell 运算符和引用的命令不再因解析错误而失败。(#35276) 感谢 @Sid-Qin。 - **Linux/WSL2 daemon install hardening**:为 WSL 环境检测、WSL 特定 systemd 指导和 `systemctl --user is-enabled` 失败路径添加回归覆盖,使 WSL2/无头入门流程在总线不可用探测时继续视为非致命,同时保留真实权限错误。相关:#36495。感谢 @vincentkoc。 - **Linux/systemd status and degraded-session handling**:将降级但可访问的 `systemctl --user status` 结果视为可用,为真正不可用的用户总线情况保留早期错误,并将外部管理的运行服务报告为运行而不是 `not installed`。感谢 @vincentkoc。 - **Agents/thinking-tag promotion hardening**:在 `block.type` 读取前保护 `promoteThinkingTagsToBlocks` against 格式错误的助手内容条目(`null`/`undefined`),使格式错误的提供商负载不再在会话处理期间崩溃,同时保留直通行为。(#35143) 感谢 @Sid-Qin。 - **Gateway/Control UI version reporting**:对齐运行和浏览器客户端版本元数据以避免 `dev` 占位符,在第一次 UI websocket 连接前等待引导版本,并且仅将引导 `serverVersion` 转发到同源网关目标,以防止跨目标版本泄漏。(来自 #35230、#30928、#33928)感谢 @Sid-Qin、@joelnishanth 和 @MoerAI。 - **Control UI/markdown parser crash fallback**:捕获 `marked.parse()` 失败并回退到转义纯文本 `<pre>` 渲染,使格式错误的递归 markdown 不再在加载时崩溃控制界面会话渲染。(#36445) 感谢 @BinHPdev。 - **Control UI/markdown fallback regression coverage**:为解析器错误回退行为添加显式回归断言,使格式错误的 markdown 不再在未来 markdown/解析器升级中重新引入硬崩溃渲染路径的风险。(#36445) 感谢 @BinHPdev。 - **Web UI/config form**:将 `additionalProperties: true` 对象架构视为可编辑映射条目,而不是不支持的字段,使 Accounts 风格映射在表单模式下保持可编辑。(#35380,取代 #32072) 感谢 @stakeswky 和 @liuxiaopai-ai。 - **Feishu/streaming card delivery synthesis**:统一快照和增量流合并语义,应用重叠感知最终合并,抑制重复最终文本传递(包括文本+媒体最终数据包),在存在回复目标时优先主题线程 `message.reply` 路由,并调整卡片打印节奏以避免重复增量渲染。(来自 #33245、#32896、#33840)感谢 @rexl2018、@kcinzgg 和 @aerelune。 - **Feishu/group mention detection**:通过启动时探测的机器人显示名称传递监控调度,使 `requireMention` 检查针对当前机器人身份而不是过时配置名称进行比较,修复组中遗漏的 `@bot` 处理,同时保留多机器人误报保护。(#36317、#34271) 感谢 @liuxiaopai-ai。 - **Security/dependency audit**:通过在生成解析路径中将 `hono` 固定到 `4.12.5` 和 `@hono/node-server` 固定到 `1.19.10` 来修补传递的 Hono 漏洞。感谢 @shakkernerd。 - **Security/dependency audit**:将 `tar` 升级到 `7.5.10`(从 `7.5.9`)以解决高严重性硬链接路径遍历公告(`GHSA-qffp-2rhf-9h96`)。感谢 @shakkernerd。 - **Cron/announce delivery robustness**:为 cron 完成发送绕过待处理后代公告保护,确保命名代理公告路由具有出站会话条目,并且仅在实际尝试并失败公告发送时回退到直接传递。(来自 #35185、#32443、#34987)感谢 @Sid-Qin、@scoootscooob 和 @bmendonca3。 - **Cron/announce best-effort fallback**:在尝试公告失败后运行直接出站回退,即使传递配置为尽力而为,使 Telegram cron 发送不会在 `cron announce delivery failed` 警告后留下尝试但未传递的状态。 - **Auto-reply/system events**:恢复运行时系统事件到消息时间线(`System:` 行),在预置事件中保留思考提示解析,并将事件携带到延迟的后续/收集/积压提示中,以保持缓存行为稳定而不丢弃排队元数据。(#34794) 感谢 @anisoptera。 - **Security/audit account handling**:通过使用 `accounts` 的自有属性检查避免原型链账户 ID 的审计验证。(#34982) 感谢 @HOYALIM。 - **Cron/restart catch-up semantics**:在启动时重放中断的重复作业和错过的立即 cron 时间槽,而不重放中断的一次性作业,通过防护的错失时间槽探测避免格式错误计划的启动中止和重启后的重复触发漂移。(来自 #34466、#34896、#34625、#33206)感谢 @dunamismax、@dsantoreis、@Octane0411 和 @Sid-Qin。 - **Venice/provider onboarding hardening**:将每模型 Venice 完成令牌限制与发现元数据对齐,将不受信任的发现值夹紧到安全边界,将静态 Venice 回退目录与当前实时模型元数据同步,并禁用不支持函数调用的 Venice 模型的工具布线,使默认 Venice 设置不再因 `max_completion_tokens` 或不支持工具 400 而失败。修复 #38168。感谢 @Sid-Qin、@powermaster888 和 @vincentkoc。 - **Agents/session usage tracking**:在嵌入式 Pi 运行器错误退出时保留累积的使用元数据,使失败的回合仍根据真实使用更新会话 `totalTokens`,而不是陈旧先前的值。(#34275) 感谢 @RealKai42。 - **Slack/reaction thread context routing**:通过 Slack 原生 DM 频道 ID 传递入站上下文和线程工具解析,使反应目标在 DM `To=user:*` 会话(包括 `toolContext.currentChannelId` 回退行为)中一致解析。(来自 #34831;重叠 #34440、#34502、#34483、#32754)感谢 @dunamismax。 - **Subagents/announce completion scoping**:将嵌套直接子完成聚合范围限定到当前请求者运行窗口,硬化冻结完成捕获以进行确定性后代合成,并通过父代理公告回合和感知血统的内部事件路由完成公告传递。(#35080) 感谢 @tyler6204。 - **Nodes/system.run approval hardening**:在重新生成准备的 `rawCommand` 时使用显式 argv 变异信令,并覆盖 `system.run.prepare -> system.run` 交接,使直接 PATH 基础的 `nodes.run` 命令不再因 `rawCommand does not match command` 而失败。(#33137) 感谢 @Sid-Qin。 - **Models/custom provider headers**:将 `models.providers.<name>.headers` 传播到内联、回退和注册找到的模型解析,以便标头认证代理一致接收配置的请求头。(#27490) 感谢 @Sid-Qin。 - **Ollama/remote provider auth fallback**:为显式配置的 `models.providers.ollama` 条目(省略 `apiKey`)综合本地运行时身份验证密钥,使远程 Ollama 端点无需手动虚拟密钥设置即可运行,同时保留 env/配置文件/配置密钥优先级和缺失配置失败。(#11283) 感谢 @cpreecs。 - **Ollama/custom provider headers**:将解析的模型头转发到原生 Ollama 流请求,以便标头认证的 Ollama 代理接收配置的请求头。(#24337) 感谢 @echoVic。 - **Ollama/compaction and summarization**:为压缩、分支样式内部摘要和当前 `main` 上的 TTS 文本摘要注册自定义 `api: "ollama"` 处理,使原生 Ollama 模型不再在主运行循环外因 `No API provider registered for api: ollama` 而失败。感谢 @JaviLib。 - **Daemon/systemd install robustness**:将 `systemctl --user is-enabled` 退出码 4 `not-found` 响应视为未启用,通过组合 stderr/stdout 详细解析,使 Ubuntu 全新安装不再因 `systemctl is-enabled unavailable` 而失败。(#33634) 感谢 @Yuandiaodiaodiao。 - **Slack/system-event session routing**:通过频道/账户绑定(带发送者感知 DM 路由)解析反应/成员/钉/交互系统事件会话键,使入站 Slack 事件在多重账户设置中针对正确的代理会话,而不是默认为 `agent:main`。(#34045) 感谢 @paulomcg、@daht-mad 和 @vincentkoc。 - **Slack/native streaming markdown conversion**:停止在流开始/追加/停止路径中预规范化传递给 Slack 原生 `markdown_text` 的文本,防止 Markdown 样式因双重转换而损坏。(#34931) - **Gateway/HTTP tools invoke media compatibility**:通过仅允许媒体 `nodes` 在 HTTP 工具上下文中调用命令来保留直接 `/tools/invoke` 客户端的原始媒体负载访问,同时保持代理上下文媒体调用阻止以防止 base64 提示膨胀。(#34365) 感谢 @obviyus。 - **Security/archive ZIP hardening**:通过同目录临时文件加原子重命名提取 ZIP 条目,然后重新打开并在重命名后拒绝超出目标根的外部硬链接别名竞争。 - **Agents/Nodes media outputs**:添加专用 `photos_latest` 操作处理,阻止媒体返回 `nodes invoke` 命令,保持仅元数据 `camera.list` 调用允许,并将空 `photos_latest` 结果规范化为一致的响应形状,以防止 base64 上下文膨胀。(#34332) 感谢 @obviyus。 - **TUI/session-key canonicalization**:将 `openclaw tui --session` 值规范化为小写,使大写会话名称不再因网关/TUI 键不匹配而丢失实时流更新。(#33866、#34013) 感谢 @lynnzc。 - **iMessage/echo loop hardening**:从出站 iMessage 回复中剥离泄漏的助手内部脚手架,在重新进入入站处理前丢弃反射的助手内容消息,扩展回声缓存文本保留以用于延迟反射,并在放大到队列溢出前抑制重复循环流量。(#33295) 感谢 @joelnishanth。 - **Skills/workspace boundary hardening**:拒绝真实路径逃逸配置源根的工作区和额外目录技能根或 `SKILL.md` 文件,并跳过将这些逃逸技能同步到沙盒工作区。 - **Outbound/send config threading**:将解析的 SecretRef 配置传递到出站适配器和辅助发送路径,使发送流程不重新加载未解析的运行时配置。(#33987) 感谢 @joshavant。 - **gateway**:硬化 systemd、discord 和 node 主机之间的共享身份验证解析 (#39241) 感谢 @joshavant。 - **Secrets/models.json persistence hardening**:保持 SecretRef 管理的 api 键 + 头不持久化到生成的 models.json,扩展审计/应用覆盖,并硬化标记处理/序列化。(#38955) 感谢 @joshavant。 - **Sessions/subagent attachments**:从 `sessions_spawn` 架构中移除 `attachments[].content.maxLength` 以避免 llama.cpp GBNF 重复溢出,并在缓冲区分配前预检 UTF-8 字节大小,同时保持运行时文件大小强制不变。(#33648) 感谢 @anisoptera。 - **Runtime/tool-state stability**:从压缩后恢复悬空的 Anthropic `tool_use`,序列化长时间运行的 Discord 处理程序运行而不阻塞新的入站事件,并防止过时的忙碌快照抑制卡住频道恢复。(来自 #33630、#33583)感谢 @kevinWangSheng 和 @theotarr。 - **ACP/Discord startup hardening**:在网关重启时清理卡住的 ACP 工作程序子进程,在 Discord 启动协调期间解绑陈旧的 ACP 线程绑定,并为每个线程监听器添加看门狗超时,使卡住的回合不会阻止后续消息。(#33699) 感谢 @dutifulbob。 - **Extensions/media local-root propagation**:通过扩展 `sendMedia` 适配器(Google Chat、Slack、iMessage、Signal、WhatsApp)一致转发 `mediaLocalRoots`,保持非本地媒体行为同时恢复从配置根解析的本地附件解析。综合 #33581、#33545、#33540、#33536、#33528。感谢 @bmendonca3。 - **Gateway/plugin HTTP auth hardening**:当任何重叠的匹配路由需要身份验证时要求网关身份验证,在调度时阻止混合身份验证穿透,并在插件注册期间拒绝混合身份验证的精确/前缀路由重叠。 - **Feishu/video media send contract**:在 `msg_type: "media"` 上保持类 mp4 出站负载(包括回复和线程内回复路径),使视频渲染为媒体而不是降级为文件链接行为,同时保留现有非视频文件子类型处理。(来自 #33720、#33808、#33678)感谢 @polooooo、@dingjianrui 和 @kevinWangSheng。 - **Gateway/security default response headers**:为所有响应的基线网关 HTTP 安全头添加 `Permissions-Policy: camera=(), microphone=(), geolocation=()`。(#30186) 感谢 @habakan。 - **Plugins/startup loading**:延迟初始化插件运行时,将启动关键插件 SDK 导入拆分为 `openclaw/plugin-sdk/core` 和 `openclaw/plugin-sdk/telegram`,并为插件兼容性保留 `api.runtime` 反射语义。(#28620) 感谢 @hmemcpy。 - **Plugins/startup performance**:通过短进程内缓存减少突发插件发现/清单开销,跳过导入通过槽选择禁用的捆绑内存插件,并通过运行时根别名路由加速遗留根 `openclaw/plugin-sdk` 兼容性,同时保留向后兼容性。感谢 @gumadeiras。 - **Build/lazy runtime boundaries**:在 Slack 斜杠处理、Telegram 审计、CLI 发送依赖、内存回退和出站传递路径中用专用延迟运行时边界替换无效的动态导入站点,同时保留行为。(#33690) 感谢 @gumadeiras。 - **Gateway/password CLI hardening**:添加 `openclaw gateway run --password-file`,警告使用内联 `--password` 因为它可能通过进程列表泄露,并将 env/文件支持的密码输入记录为首选启动路径。修复 #27948。感谢 @vibewrk 和 @vincentkoc。 - **Config/heartbeat legacy-path handling**:自动将顶级 `heartbeat` 迁移到 `agents.defaults.heartbeat`(具有保留显式默认的合并语义),并在详细无效配置路径中保留非可迁移遗留条目的启动失败,而不是通用迁移失败错误。(#32706) 感谢 @xiwan。 - **Plugins/SDK subpath parity**:跨捆绑频道/扩展(Discord、Slack、Signal、iMessage、WhatsApp、LINE 和捆绑配套插件)扩展插件 SDK 子路径,通过构建/导出/类型/运行时连接,使作用域导入在源和分发中一致解析,同时保留兼容性。(#33737) 感谢 @gumadeiras。 - **Google/Gemini Flash model selection**:将内置 `gemini-flash` 默认值和文档/示例从不存在的 `google/gemini-3.1-flash-preview` ID 切换到工作的 `google/gemini-3-flash-preview`,同时规范仍使用旧 Flash 3.1 别名的遗留 OpenClaw 配置。 - **Plugins/bundled scoped-import migration**:将捆绑插件从整体 `openclaw/plugin-sdk` 导入迁移到注册和启动敏感运行时文件中的范围子路径(或 `openclaw/plugin-sdk/core`),添加 CI/发布保护以防止回归,并为外部/社区插件保留根 `openclaw/plugin-sdk` 支持。感谢 @gumadeiras。 - **Routing/session duplicate suppression synthesis**:对齐共享会话传递上下文继承、频道配对路由字段合并和回复表面目标匹配,使 dmScope=main 回合避免跨表面重复回复,同时线程感知转发保持预期路由语义。(来自 #33629、#26889、#17337、#33250)感谢 @Yuandiaodiaodiao、@kevinwildenradt、@Glucksberg 和 @bmendonca3。 - **Routing/legacy session route inheritance**:为遗留频道会话键(`agent:<agent>:<channel>:<peer>` 和 `...:thread:<id>`)保留外部路由元数据继承,使 `chat.send` 不错误回退到 webchat,当有效的传递上下文存在时。后续 #33786。 - **Routing/legacy route guard tightening**:要求遗留会话键频道提示匹配保存的传递频道,然后才继承外部路由元数据,防止像 `agent:<agent>:work:<ticket>` 这样的自定义命名空间键继承陈旧的非 webchat 路由。 - **Gateway/internal client routing continuity**:通过要求外部传递的显式 `deliver: true`,防止 webchat/TUI/UI 回合继承陈旧的外部回复路由,将主会话外部继承范围限定到非 Webchat/UI 客户端,并在识别主会话连续性时尊重配置的 `session.mainKey`。(来自 #35321、#34635、#35356)感谢 @alexyyyander 和 @Octane0411。 - **Security/auth labels**:从用户可见的身份验证状态标签中移除令牌和 API 密钥片段,使 `/status` 和 `/models` 不暴露凭据片段。(#33262) 感谢 @cu1ch3n。 - **Models/MiniMax portal vision routing**:将 `MiniMax-VL-01` 添加到 `minimax-portal` 提供商,通过 MiniMax VLM 端点路由门户图像理解,并协调媒体自动选择以及 Telegram 贴纸描述与共享门户图像提供商路径。(#33953) 感谢 @tars90percent。 - **Auth/credential semantics**:将配置文件资格 + 探测诊断与 SecretRef/过期规则对齐,并硬化浏览器下载原子写入。(#33733) 感谢 @joshavant。 - **Security/audit denyCommands guidance**:为未知 `gateway.nodes.denyCommands` 条目建议可能的精确节点命令 ID,使无效的拒绝列表条目更容易纠正。(#29713) 感谢 @liquidhorizon88-bot。 - **Agents/overload failover handling**:将过载的提供商失败与速率限制/状态超时分开分类,在重试/故障转移前添加短过载退避,将过载的提示/助手失败记录为临时身份验证配置文件冷却(具有可探测的同一提供商回退),而不是将其视为持久身份验证/计费失败,并保持一次性 cron 重试分类对齐,使过载的回退摘要仍计为临时重试。 - **Docs/security hardening guidance**:记录 Docker `DOCKER-USER` + UFW 策略,并从 Docker 安装文档添加 VPS/公共主机设置的交叉链接。(#27613) 感谢 @dorukardahan。 - **Docs/security threat-model links**:在安全文档中用 Mintlify 兼容的根相对路由替换相对 `.md` 链接,防止内部导航中断。(#27698) 感谢 @clawdoo。 - **Plugins/Update integrity drift**:避免从非固定规范更新 npm 安装的插件时错误的完整性漂移提示,同时为精确固定版本保留漂移检查。(#37179) 感谢 @vincentkoc。 - **iOS/Voice timing safety**:保护系统语音开始/完成回调到活动发音,以避免在快速停止/重启循环期间错误归属的开始事件。(#33304) 感谢 @mbelinky;原始实现方向由 @ngutman。 - **Gateway/chat.send command scopes**:要求 `operator.admin` 用于通过网关聊天客户端路由的持久 `/config set|unset` 写入,同时保持 `/config show` 对正常写入范围操作客户端可用,保留消息频道配置命令行为而不将 RPC 写入范围扩大为管理员配置变异。感谢 @tdjackey 报告。 - **iOS/Talk incremental speech pacing**:允许长无标点助手块在安全空白边界开始说话,以便语音响应更早开始,而不是等待终端标点。(#33305) 感谢 @mbelinky;原始实现由 @ngutman。 - **iOS/Watch reply reliability**:使 watch 会话激活等待器在并发请求下健壮,以便状态/发送调用不再间歇性挂起,并使委托回调与 Swift 6 actor 安全对齐。(#33306) 感谢 @mbelinky;原始实现由 @Rocuts。 - **Docs/tool-loop detection config keys**:对齐 `docs/tools/loop-detection.md` 示例和字段名称与当前 `tools.loopDetection` 架构,防止过时键的复制粘贴验证失败。(#33182) 感谢 @Mylszd。 - **Gateway/session agent discovery**:在 `listConfiguredAgentIds` 中包含磁盘扫描的代理 ID,即使 `agents.list` 已配置,使仅磁盘/ACP 代理会话在网关会话聚合和列表中可见。(#32831) 感谢 @Sid-Qin。 - **Discord/inbound debouncer**:在到达去抖动队列前跳过机器人自己的 MESSAGE_CREATE 事件,避免繁忙服务器中的自触发减速。感谢 @thewilloftheshadow。 - **Discord/Agent-scoped media roots**:通过 Discord 监控回复传递(消息 + 组件交互路径)传递 `mediaLocalRoots`,使本地媒体附件尊重每个代理工作区根而不是回退到默认全局根。感谢 @thewilloftheshadow。 - **Discord/slash command handling**:在频道中拦截基于文本的斜杠命令,将插件命令注册为原生,并为空斜杠运行发送回退确认,使交互不挂起。感谢 @thewilloftheshadow。 - **Discord/thread session lifecycle**:当线程存档时重置线程范围会话,以便重新打开线程新鲜开始而不删除转录历史。感谢 @thewilloftheshadow。 - **Discord/presence defaults**:在就绪时发送在线状态更新,当未配置自定义状态时,使机器人不再默认离线。感谢 @thewilloftheshadow。 - **Discord/typing cleanup**:在静默/NO_REPLY 运行后通过将运行标记为完成再调度空闲清理来停止输入指示器。感谢 @thewilloftheshadow。 - **ACP/sandbox spawn parity**:阻止 `/acp spawn` 来自具有相同主机运行时保护的沙盒请求者会话(已为 `sessions_spawn({ runtime: "acp" })` 强制执行),保持非沙盒 ACP 流程同时关闭命令路径策略缺口。感谢 @patte。 - **Discord/config SecretRef typing**:将 Discord 账户令牌配置类型与 SecretInput 对齐,以便 SecretRef 令牌类型检查。(#32490) 感谢 @scoootscooob。 - **Discord/voice messages**:使用 JSON fetch 调用请求上传槽,使语音消息上传不再因内容类型错误而失败。感谢 @thewilloftheshadow。 - **Discord/voice decoder fallback**:放弃原生 Opus 依赖并使用 opusscript 进行语音解码,以避免原生 opus 安装。感谢 @thewilloftheshadow。 - **Discord/auto presence health signal**:添加运行时可用性驱动的状态更新和连接状态报告,以改进健康监控和操作员可见性。(#33277) 感谢 @thewilloftheshadow。 - **HEIC image inputs**:在网关 HTTP API 中接受 HEIC/HEIF `input_image` 源,在提供商交付前规范化为 JPEG,并记录扩展的默认 MIME 允许列表。感谢 @vincentkoc。 - **Gateway/HEIC input follow-up**:保持非 HEIC `input_image` MIME 处理不变,使 HEIC 测试密封,并对聊天完成 `maxTotalImageBytes` 强制执行规范化后图像负载大小。感谢 @vincentkoc。 - **Telegram/draft-stream boundary stability**:在助手消息/工具边界实现 DM 草稿预览,在最终交付前序列化车道边界回调,并将预览清理范围限定到活动预览,使多步骤 Telegram 流不再丢失、覆盖或留下陈旧的预览气泡。(#33842) 感谢 @ngutman。 - **Telegram/DM draft finalization reliability**:在将草稿最终化视为传递之前要求验证的最终文本草稿发射,并在最终草稿传递未确认时回退到正常负载发送(防止缺失最终响应并保留媒体/按钮传递)。(#32118) 感谢 @OpenCils。 - **Telegram/DM draft final delivery**:将仅文本 `sendMessageDraft` 预览实现为一个永久最终消息并跳过重复的最终负载发送,同时保留实现失败时的回退行为。(#34318) 感谢 @Brotherinlaw-13。 - **Telegram/DM draft duplicate display**:实现真实最终消息后清除陈旧的 DM 草稿预览,包括 DM 主题查找失败时的无主题回退,使部分流不再短暂显示重复回复。(#36746) 感谢 @joelnishanth。 - **Telegram/draft preview boundary + silent-token reliability**:在迟到部分/消息开始竞争期间稳定答案车道消息边界,在正确边界保留/重置最终化的预览状态,并抑制 `NO_REPLY` 前导片段泄漏,而不产生广泛的心跳前缀误报。(#33169) 感谢 @obviyus。 - **Telegram/native commands `commands.allowFrom` precedence**:使原生 Telegram 命令将 `commands.allowFrom` 作为命令特定授权源(包括群组聊天)尊重,而不是回退到频道发送者允许列表。(#28216) 感谢 @toolsbybuddy 和 @vincentkoc。 - **Telegram/`groupAllowFrom` sender-ID validation**:恢复仅发送者运行时验证,使负聊天/组 ID 保持无效条目而不是显示接受但仍无法授权组访问。(#37134) 感谢 @qiuyuemartin-max 和 @vincentkoc。 - **Telegram/native group command auth**:在群组和论坛主题中授权原生命令 against `groupAllowFrom` 和每组/主题发送者覆盖,同时保持授权拒绝回复在原始主题线程中。感谢 @edwluo。 - **Telegram/named-account DMs**:当命名 Telegram 账户回退到默认代理时,通过保持群组失败关闭但为 DM 推导每账户会话密钥(包括身份链接规范化和回归覆盖)来恢复非默认账户 DM 路由。(来自 #32426;修复 #32351)感谢 @chengzhichao-xydt。 - **Discord/audit wildcard warnings**:在计算未解析的 guild 频道时忽略 `"*"` 通配符键,使 doctor/status 不再在允许所有配置上警告。(#33125) 感谢 @thewilloftheshadow。 - **Discord/channel resolution**:将裸数字收件人默认为频道,用安全回退硬化允许列表数字 ID 处理,并避免入站 WS 心跳停滞。(#33142) 感谢 @thewilloftheshadow。 - **Discord/chunk delivery reliability**:使用 REST 客户端时保持块顺序,并在 429/5xx 上使用账户重试设置重试块发送。(#33226) 感谢 @thewilloftheshadow。 - **Discord/mention handling**:添加基于 ID 的提及格式化 + 缓存重写,将入站提及解析为显示名称,并添加可选的 ignoreOtherMentions 门控(排除 @everyone/@here)。(#33224) 感谢 @thewilloftheshadow。 - **Discord/media SSRF allowlist**:在入站媒体 SSRF 策略中允许 Discord CDN 主机名(包括通配符域),防止代理/VPN 假 IP 块。(#33275) 感谢 @thewilloftheshadow。 - **Telegram/device pairing notifications**:在 `/pair qr` 上自动武装一次性通知,在新配对请求上自动 ping,并在 ping 未到达时通过 `/pair approve latest` 添加手动回退。(#33299) 感谢 @mbelinky。 - **Exec heartbeat routing**:将 exec 触发的心跳唤醒范围限定到代理会话键,使不相关的代理不再被 exec 事件唤醒,同时为非规范会话键保留遗留无范围行为。(#32724) 感谢 @altaywtf。 - **macOS/Tailscale remote gateway discovery**:当 Bonjour 和广域网 DNS-SD 发现返回无网关时,添加 Tailscale Serve 回退对等探测路径(`wss://<peer>.ts.net`),并从 macOS 入门刷新两条发现路径。(#32860) 感谢 @ngutman。 - **iOS/Gateway keychain hardening**:将网关元数据和 TLS 指纹移动到设备密钥链存储,并具有更安全的迁移行为和回滚安全写入,以减少升级期间凭据丢失风险。(#33029) 感谢 @mbelinky。 - **iOS/Concurrency stability**:在相机和网关连接路径中用锁保护访问模式替换危险共享状态访问,以减少负载下的崩溃风险。(#33241) 感谢 @mbelinky。 - **iOS/Security guardrails**:将生产 API 密钥源限制为应用配置,并使深度链接确认提示更安全,通过合并排队请求而不是静默丢弃它们。(#33031) 感谢 @mbelinky。 - **iOS/TTS playback fallback**:通过从 PCM 切换到 MP3 保持语音播放弹性,当提供商格式支持不可用时,同时避免在通用本地播放错误上粘性回退。(#33032) 感谢 @mbelinky。 - **Plugin outbound/text-only adapter compatibility**:允许仅实现 `sendText`(无 `sendMedia`)的直接传递频道插件保持出站能力,在 `sendMedia` 缺失时优雅回退到媒体负载的文本传递,并明确失败无文本回退的仅媒体负载。(#32788) 感谢 @liuxiaopai-ai。 - **Telegram/multi-account default routing clarity**:仅对没有显式默认的模糊(2+)账户设置警告,为频道路由和 Telegram 配置添加 `openclaw doctor` 警告,并记录频道路由和 Telegram 配置的显式默认指导。(#32544) 感谢 @Sid-Qin。 - **Telegram/plugin outbound hook parity**:在 Telegram 回复传递中运行 `message_sending` + `message_sent`,包括回复路径钩子元数据(`mediaUrls`、`threadId`),并在钩子清空文本且无出站消息传递时报告 `message_sent.success=false`。(#32649) 感谢 @KimGLee。 - **CLI/Coding-agent reliability**:切换默认 `claude-cli` 非交互参数为 `--permission-mode bypassPermissions`,自动规范化遗留 `--dangerously-skip-permissions` 后端覆盖为现代权限模式形式,对齐 coding-agent + live-test 文档与非 PTY Claude 路径,并在 CLI watchdog 无输出超时终止运行时发出会话系统事件心跳通知。(#28610、#31149、#34055)。感谢 @niceysam、@cryptomaltese 和 @vincentkoc。 - **Gateway/OpenAI chat completions**:解析活动回合 `image_url` 内容部分(包括参数化数据 URI 和受保护的 URL 源),将它们作为多模态 `images` 转发,接受仅图像用户回合,强制执行每请求图像部分/字节预算,默认 URL 基础图像获取为禁用除非配置显式启用,并在缓存跟踪/提供商负载诊断中编辑图像 base64 数据。(#17685) 感谢 @vincentkoc - **ACP/ACPX session bootstrap**:当 `sessions ensure` 返回无会话标识符时使用 `sessions new` 重试,使 ACP 生成避免受影响代理上的 `NO_SESSION`/`ACP_TURN_FAILED` 失败。(#28786、#31338、#34055)。感谢 @Sid-Qin 和 @vincentkoc。 - **ACP/sessions_spawn parent stream visibility**:为 `runtime: "acp"` 添加 `streamTo: "parent"`,将初始子运行进度/无输出/完成更新作为系统事件转发回请求者会话(而不是直接子传递),并发出可尾部会话范围中继日志(`<sessionId>.acp-stream.jsonl`,在可用时作为 `streamLogPath` 返回),改进被阻止或长时间运行的 harness 回合的编排器可见性。(#34310、#29909;从 #34055 重新打开)。感谢 @vincentkoc。 - **Agents/bootstrap truncation warning handling**:在嵌入式 + CLI 运行时、`/context` 和 `openclaw doctor` 中统一引导预算/截断分析;添加 `agents.defaults.bootstrapPromptTruncationWarning`(`off|once|always`,默认 `once`)并持久化警告签名元数据,使截断警告一致且跨回合去重。(#32769) 感谢 @gumadeiras。 - **Agents/Skills runtime loading**:将运行配置传播到嵌入式尝试和压缩技能条目加载,以便当技能快照未已提供解析条目时,显式启用的捆绑配套技能一致发现。感谢 @gumadeiras。 - **Agents/Session startup date grounding**:在启动/后压缩 AGENTS 上下文中替换 `YYYY-MM-DD` 占位符,并为 `/new` 和 `/reset` 提示附加运行时当前时间行,使每日内存引用正确解析。(#32381) 感谢 @chengzhichao-xydt。 - **Agents/Compaction template heading alignment**:更新 AGENTS 模板部分名称为 `Session Startup`/`Red Lines` 并保留遗留 `Every Session`/`Safety` 回退提取,使后压缩上下文跨模板版本保持完整。(#25098) 感谢 @echoVic。 - **Agents/Compaction continuity**:扩展阶段摘要合并指令以保留活动任务状态、批次进度、最新用户请求和后续承诺,使压缩交接保留进行中工作上下文。(#8903) 感谢 @joetomasone。 - **Agents/Compaction safeguard structure hardening**:要求精确的回退摘要标题,在提示嵌入前消毒不受信任的压缩指令文本,并在保留所有回合时保持结构化部分。(#25555) 感谢 @rodrigouroz。 - **Gateway/status self version reporting**:使 `openclaw status` 中的网关自版本优先运行时 `VERSION`(同时保留显式 `OPENCLAW_VERSION` 覆盖),防止升级后陈旧的应用程序版本输出。(#32655) 感谢 @liuxiaopai-ai。 - **Memory/QMD index isolation**:与 `XDG_CONFIG_HOME` 一起设置 `QMD_CONFIG_DIR`,使 QMD 配置状态保持每代理,尽管上游 XDG 处理错误,防止跨代理集合索引和 excess disk/CPU 使用。(#27028) 感谢 @HenryLoenwind。 - **Memory/QMD collection safety**:当 QMD `collection list` 仅报告名称而无路径元数据时停止破坏性集合重新绑定,防止 `memory search` 在重新添加失败时丢弃现有集合。(#36870) 感谢 @Adnannnnnnna。 - **Memory/QMD duplicate-document recovery**:检测 `UNIQUE constraint failed: documents.collection, documents.path` 更新失败,重建一次管理的集合并重试更新,使周期性 QMD 同步恢复而不是每次运行失败;包括回归覆盖以避免过度匹配不相关的唯一约束。(#27649) 感谢 @MiscMich。 - **Memory/local embedding initialization hardening**:为瞬态初始化重试和混合 `embedQuery` + `embedBatch` 并发启动添加回归覆盖,以锁定单次飞行初始化行为。(#15639) 感谢 @SubtleSpark。 - **CLI/Coding-agent reliability**:切换默认 `claude-cli` 非交互参数为 `--permission-mode bypassPermissions`,自动规范化遗留 `--dangerously-skip-permissions` 后端覆盖为现代权限模式形式,对齐 coding-agent + live-test 文档与非 PTY Claude 路径,并在 CLI watchdog 无输出超时终止运行时发出会话系统事件心跳通知。与 #28261 相关。来自贡献者 PR #28610 和 #31149。感谢 @niceysam、@cryptomaltese 和 @vincentkoc。 - **ACP/ACPX session bootstrap**:当 `sessions ensure` 返回无会话标识符时使用 `sessions new` 重试,使 ACP 生成避免受影响代理上的 `NO_SESSION`/`ACP_TURN_FAILED` 失败。与 #28786 相关。来自贡献者 PR #31338。感谢 @Sid-Qin 和 @vincentkoc。 - **LINE/auth boundary hardening synthesis**:跨配对存储账户范围、DM/组允许列表分离、失败关闭 webhook 身份验证/运行时行为以及重放/重复控制(包括飞行中重放保留和成功后重复标记)强制执行严格的 LINE webhook 身份验证/授权边界语义。(来自 #26701、#26683、#25978、#17593、#16619、#31990、#26047、#30584、#18777)感谢 @bmendonca3、@davidahmann、@harshang03、@haosenwang1018、@liuxiaopai-ai、@coygeek 和 @Takhoffman。 - **LINE/media download synthesis**:修复文件媒体下载处理以及跨重叠 LINE 回归的 M4A 音频分类。(来自 #26386、#27761、#27787、#29509、#29755、#29776、#29785、#32240)感谢 @kevinWangSheng、@loiie45e、@carrotRakko、@Sid-Qin、@codeafridi 和 @bmendonca3。 - **LINE/context and routing synthesis**:修复组/室对等路由和命令授权上下文传播,并在混合成功 webhook 批次中保持处理后续事件。(来自 #21955、#24475、#27035、#28286)感谢 @lailoo、@mcaxtr、@jervyclaw、@Glucksberg 和 @Takhoffman。 - **LINE/status/config/webhook synthesis**:修复来自快照/配置状态的错误阳性,并接受 LINE webhook HEAD 探测以实现兼容性。(来自 #10487、#25726、#27537、#27908、#31387)感谢 @BlueBirdBack、@stakeswky、@loiie45e、@puritysb 和 @mcaxtr。 - **LINE cleanup/test follow-ups**:将清理/测试经验折叠到综合审查路径,同时保持运行时更改专注于回归修复。(来自 #17630、#17289)感谢 @Clawborn 和 @davidahmann。 - **Mattermost/interactive buttons**:添加交互式按钮发送/回调支持,具有基于目录的频道/用户目标解析,并通过账户范围 HMAC 验证和发送者范围 DM 路由硬化回调。(#19957) 感谢 @tonydehnke。 - **Feishu/groupPolicy legacy alias compatibility**:在架构解析和运行时策略检查中将遗留 `groupPolicy: "allowall"` 视为 `open`,使预期的开放组配置在 `groupAllowFrom` 为空时不再静默丢弃组消息。(来自 #36358)感谢 @Sid-Qin。 - **Mattermost/plugin SDK import policy**:在 Mattermost 提及门控路径/测试中用范围子路径(`openclaw/plugin-sdk/compat` 和 `openclaw/plugin-sdk/mattermost`)替换剩余的单一 `openclaw/plugin-sdk` 导入,以便 `pnpm check` 在基线上通过 `lint:plugins:no-monolithic-plugin-sdk-entry-imports`。(#36480) 感谢 @Takhoffman。 - **Telegram/polls**:向频道操作发现和工具/CLI 轮询流添加 Telegram 轮询操作支持,多账户可发现性门控到实际可以执行轮询的账户(`sendMessage` + `poll`)。(#36547) 感谢 @gumadeiras。 - **Agents/failover cooldown classification**:停止将通用 `cooling down` 文本视为提供商 `rate_limit`,使健康模型不再显示错误的全局冷却/速率限制警告,而显式 `model_cooldown` 标记仍触发故障转移。(#32972) 感谢 @stakeswky。 - **Agents/failover service-unavailable handling**:停止将裸代理/CDN `service unavailable` 错误视为提供商过载,同时通过超时/故障转移路径保持可重试,使临时中断不再显示错误的速率限制警告或阻止回退。(#36646) 感谢 @jnMetaCode。 - **Plugins/HTTP route migration diagnostics**:将遗留 `api.registerHttpHandler(...)` 加载器失败重写为可操作的迁移指导,使 doctor/插件诊断将操作员指向 `api.registerHttpRoute(...)` 或 `registerPluginHttpRoute(...)`。(#36794) 感谢 @vincentkoc - **Doctor/Heartbeat upgrade diagnostics**:当心跳传递配置为隐式 `directPolicy` 时警告,以便升级将直接/DM 行为显式固定而不是依赖当前默认值。(#36789) 感谢 @vincentkoc。 - **Agents/current-time UTC anchor**:在共享 cron 风格提示上下文中附加机器可读的 UTC 后缀以及本地 `Current time:` 行,使代理能够比较 UTC 时间戳的工作区时间戳,而无需时区数学。(#32423) 感谢 @jriff。 - **Ollama/local model handling**:在合并刷新期间保留显式较低的 `contextWindow` / `maxTokens` 覆盖,并保持原生 Ollama 流式回复在真实内容开始流式后不再表面回退 `thinking` / `reasoning` 文本。(#39292) 感谢 @vincentkoc。 - **TUI/webchat command-owner scope alignment**:将具有 `operator.admin` 的内部频道网关会话视为命令身份验证中的所有者授权,恢复受影响 TUI/webchat 会话的 cron/gateway/连接器工具访问,同时保持外部频道在基于身份的所有者检查上。(来自 #35666、#35673、#35704) 感谢 @Naylenv、@Octane0411 和 @Sid-Qin。 - **Discord/inbound timeout isolation**:将入站工作程序超时跟踪与监听器超时预算分开,使排队的 Discord 回复不再在监听器看门狗窗口期间中途运行时被丢弃。(#36602) 感谢 @dutifulbob。 - **Memory/doctor SecretRef handling**:将 SecretRef 支持的内存搜索 API 密钥视为已配置,并具有显式未解析秘密错误而不是崩溃地失败嵌入设置。(#36835) 感谢 @joshavant。 - **Memory/flush default prompt**:在默认内存刷新运行期间禁止带时间戳的变体文件名,使持久注释保持在规范的每日 `memory/YYYY-MM-DD.md` 文件中。(#34951) 感谢 @zerone0x。 - **Agents/reply delivery timing**:在等待压缩重试之前刷新嵌入式 Pi 块回复,以便已生成的助手回复在压缩等待完成前到达频道。(#35489) 感谢 @Sid-Qin。 - **Agents/gateway config guidance**:停止通过代理 `gateway` 工具暴露 `config.schema`,从提示/文档指导中移除告诉代理调用它的内容,并保持代理使用 `config.get` 加上 `config.patch`/`config.apply` 进行配置更改。(#7382) 感谢 @kakuteki。 - **Provider/KiloCode**:在格式错误的发现行后保留重复模型,并在代理推理注入跳过时剥离遗留 `reasoning_effort`。(#32352) 感谢 @pandemicsyn 和 @vincentkoc。 - **Agents/failover**:将周期性提供商限制耗尽文本(例如 `Weekly/Monthly Limit Exhausted`)分类为 `rate_limit`,同时将显式 `402 Payment Required` 变体保留在计费中,使故障转移继续而不错误分类计费包装的配额错误。(#33813) 感谢 @zhouhe-xydt。 - **Mattermost/interactive button callbacks**:允许外部回调基 URL 并停止需要环回来源请求,使按钮点击在 Mattermost 通过 Tailscale、LAN 或反向代理到达网关时工作。(#37543) 感谢 @mukhtharcm。 - **Gateway/chat.send route inheritance**:为频道范围会话保持显式外部传递,同时防止共享主和其他频道无关的 webchat 会话继承陈旧的外部路由,使控制界面回复保持在 webchat 而不破坏选定的频道目标会话。(#34669) 感谢 @vincentkoc。 - **Telegram/Discord media upload caps**:使出站上传尊重频道 `mediaMaxMb` 配置,将 Telegram 的默认媒体上限提高到 100MB,并移除保持某些 Telegram 上传在 16MB 的 MIME 回退限制。感谢 @vincentkoc。 - **Skills/nano-banana-pro resolution override**:在图像编辑期间尊重显式 `--resolution` 值,并且仅在标志省略时从输入图像自动检测输出大小。(#36880) 感谢 @shuofengzhang 和 @vincentkoc。 - **Skills/openai-image-gen CLI validation**:提前验证 `--background` 和 `--style` 输入,规范化支持的值,并在这些标志对不兼容模型被忽略时警告。(#36762) 感谢 @shuofengzhang 和 @vincentkoc。 - **Skills/openai-image-gen output formats**:提前验证 `--output-format` 值,规范化别名如 `jpg -> jpeg`,并在标志对不兼容模型被忽略时警告。(#36648) 感谢 @shuofengzhang 和 @vincentkoc。 - **ACP/skill env isolation**:从 ACP harness 子进程环境中剥离技能注入的 API 密钥,使 Codex CLI 等工具保留自己的身份验证流,而不是继承来自活动技能的计费提供商密钥。(#36316) 感谢 @taw0002 和 @vincentkoc。 - **WhatsApp media upload caps**:使出站媒体发送和自动回复尊重 `channels.whatsapp.mediaMaxMb` 并具有每账户覆盖,使入站和出站限制使用相同的频道配置。感谢 @vincentkoc。 - **Windows/Plugin install**:当 OpenClaw 在 Windows 上通过 Bun 运行且 `npm-cli.js` 不与运行时二进制并置时,回退到通过现有 `cmd.exe` 包装器的 `npm.cmd`/`npx.cmd`,使 `openclaw plugins install` 不再因 `spawn EINVAL` 而失败。(#38056) 感谢 @0xlin2023。 - **Telegram/send retry classification**:在发送流程中重试 grammY `Network request ... failed after N attempts` 信封,而不将普通 `Network request ... failed!` 包装器重新分类为临时,恢复预期的重试路径,同时保持广泛的发送上下文消息匹配紧密。(#38056) 感谢 @0xlin2023。 - **Gateway/probes**:当控制界面在 `/` 挂载时保持 `/health`、`/healthz`、`/ready`、`/readyz` 可访问,保留插件拥有的路由在这些路径上的优先级,并使 `/ready` 和 `//readyz` 报告频道支持的就绪状态并带有启动宽限期以及 `503` 在断开连接的管理频道上,而 `/health` 和 `/healthz` 保持浅存活探测。(#18446) 感谢 @vibecodooor、@mahsumaktas 和 @vincentkoc。 - **Feishu/media downloads**:现在客户端级别 `httpTimeoutMs` 应用于请求,从 SDK 方法调用中删除无效的超时字段。(#38267) 感谢 @ant1eicher 和 @thewilloftheshadow。 - **PI embedded runner/Feishu docs**:将发送者身份传播到嵌入式尝试,使 Feishu doc 自动授权恢复请求者访问嵌入式运行器执行。(#32915) 感谢 @cszhouwei。 - **Agents/usage normalization**:在压缩核算前规范化缺失或部分的助手使用快照,使 `openclaw agent --json` 不再在提供商负载省略 `totalTokens` 或相关使用字段时崩溃。(#34977) 感谢 @sp-hk2ldn。 - **Venice/default model refresh**:将内置 Venice 默认切换到 `kimi-k2-5`,更新入门别名,并刷新 Venice 提供商文档/推荐以匹配当前私有和匿名目录。(来自 #12964)修复 #20156。感谢 @sabrinaaquino 和 @vincentkoc。 - **Agents/skill API write pacing**:添加将技能驱动的外部 API 写入视为默认速率限制的全局提示保护措施,使运行器偏好批处理写入,避免紧密请求循环,并尊重 `429`/`Retry-After`。感谢 @vincentkoc。 - **Google Chat/multi-account webhook auth fallback**:当 `channels.googlechat.accounts.default` 携带共享 webhook 受众/路径设置(例如配置规范化后)时,为命名账户继承这些默认值,同时保留顶级和每账户覆盖,使入站 webhook 验证不再对缺失重复受众字段的命名账户静默失败。修复 #38369。 - **Models/tool probing**:将工具能力探测预算从 32 提升到 256 令牌,使在返回所需工具调用前花费令牌进行思考的推理模型不太可能被错误分类为不支持工具。(#7521) 感谢 @jakobdylanc。 - **Gateway/transient network classification**:将包装的 `...: fetch failed` 传输消息视为临时,同时避免像 `Web fetch failed (404): ...` 这样的广泛匹配,防止 Discord 重新连接包装器在网关崩溃而不抑制非网络工具失败。(#38530) 感谢 @xinhuagu。 - **ACP/console silent reply suppression**:在 `openclaw agent` 日志/传递前过滤 ACP `NO_REPLY` 前导片段和仅静默最终输出,使控制台支持的 ACP 会话不再泄漏 `NO`/`NO_REPLY` 占位符。(#38436) 感谢 @ql-wade。 - **Feishu/reply delivery reliability**:在 Feishu 回复选项中禁用块流式传输,使纯文本自动渲染回复不再在最终传递前静默丢弃。(#38258) 感谢 @xinhuagu。 - **Agents/reply MEDIA delivery**:在块/最终传递前规范本地助手 `MEDIA:` 路径,保持媒体去重与消息工具发送对齐,并包含格式错误的媒体规范化失败,使生成的文件可靠发送而不是回退到空响应。(#38572) 感谢 @obviyus。 - **Sessions/bootstrap cache rollover invalidation**:在自动回复、命令和隔离 cron 会话解析器中现有 `sessionKey` 滚动到新 `sessionId` 时清除缓存的工作区引导快照,使 `AGENTS.md`/`MEMORY.md`/`USER.md` 更新在每日、空闲或强制会话重置后重新加载,而不是在网关重启前保持陈旧。(#38494) 感谢 @LivingInDrm。 - **Gateway/Telegram polling health monitor**:跳过 Telegram 长轮询频道的陈旧套接字重启,并通过共享健康评估线程频道身份,使轮询连接不在 WebSocket 陈旧套接字启发式上重启。(#38395) 感谢 @ql-wade 和 @Takhoffman。 - **Daemon/systemd fresh-install probe**:在运行 `systemctl --user is-enabled` 前检查 OpenClaw 的管理用户单元,使首次 Linux 安装不再在通用缺失单元探测错误上失败。(#38819) 感谢 @adaHubble。 - **Gateway/container lifecycle**:允许 `openclaw gateway stop` 向 SIGTERM 非管理网关监听器,并在无服务管理器时 `openclaw gateway restart` 向单个非管理监听器发送 SIGUSR1,使容器和基于监管者的部署不再被 `service disabled` 无操作响应阻止。修复 #36137。感谢 @vincentkoc。 - **Gateway/Windows restart supervision**:通过带引号辅助脚本命令路径的预定任务重新启动任务管理的网关,区分每个平台的重启能力监管者,并在自重启期间停止孤立的 Windows 网关子进程。(#38825) 感谢 @obviyus。 - **Telegram/native topic command routing**:通过相同的对话路由解析论坛主题原生命令,使主题 `agentId` 覆盖和绑定主题会话目标为活动会话而不是默认主题父会话。(#38871) 感谢 @obviyus。 - **Markdown/assistant image hardening**:在控制界面、导出 HTML 和共享 Swift 聊天中将远程 markdown 图像展平为纯文本,同时保持内联 `data:image/...` markdown 可渲染,使模型输出不再触发自动远程图像获取。(#38895) 感谢 @obviyus。 - **Config/compaction safeguard settings**:通过 `loadConfig()` 回归测试 `agents.defaults.compaction.recentTurnsPreserve` 并覆盖新的帮助元数据条目,使暴露的保留旋钮通过架构验证和配置 UX 保持连接。(#25557) 感谢 @rodrigouroz。 - **iOS/Quick Setup presentation**:当网关已配置(活动连接配置、最后已知连接、首选网关或手动主机)时跳过自动快速设置,使重新连接安装不再被提示再次连接。(#38964) 感谢 @ngutman。 - **CLI/Docs memory help accuracy**:澄清 `openclaw memory status --deep` 行为并使内存命令示例/文档与当前搜索选项对齐。(#31803) 感谢 @JasonOA888 和 @Avi974。 - **Auto-reply/allowlist store account scoping**:保持 `/allowlist ... --store` 写入范围限定到选择的账户,并在移除默认账户存储访问时清除遗留无范围条目,防止跨账户默认允许列表从遗留配对存储读取渗漏。感谢 @tdjackey 报告和 @vincentkoc 修复。 - **Security/Nostr**:通过失败关闭非环回转发的客户端头(`x-forwarded-for` / `x-real-ip`)并拒绝 `sec-fetch-site: cross-site` 来硬化配置文件突变/导入环回保护;为代理转发和浏览器跨站点突变尝试添加回归覆盖。 - **CLI/bootstrap Node version hint maintenance**:用 `MIN_NODE_MAJOR` 插值替换 `openclaw.mjs` 中硬编码的 nvm `22` 指令,以便未来最小 Node 提升保持启动指导自动同步。(#39056) 感谢 @onstash。 - **Discord/native slash command auth**:在 guild 斜杠命令预分发授权中尊重 `commands.allowFrom.discord`(和 `commands.allowFrom["*"]`),使允许列表发送者不再被错误拒绝为未授权。(#38794) 感谢 @jskoiz 和 @thewilloftheshadow。 - **Outbound/message target normalization**:当提供显式 `target` 时忽略空遗留 `to`/`channelId` 字段,使有效目标基础发送不再失败遗留参数验证;包括回归覆盖。(#38944) 感谢 @Narcooo。 - **Models/auth token prompts**:保护取消的手动令牌提示,以便 `Symbol(clack:cancel)` 值不能持久化到身份验证配置文件中;为取消的 `models auth paste-token` 添加回归覆盖。(#38951) 感谢 @MumuTW。 - **Gateway/loopback announce URLs**:将 `http://` 和 `https://` 别名与 websocket URL 相同的环回/私有网络策略处理,使环回 cron 公告传递不再失败安全 URL 验证。(#39064) 感谢 @Narcooo。 - **Models/default provider fallback**:当硬编码默认提供商从 `models.providers` 移除时,从配置的提供商解析默认值,而不是在状态输出中报告陈旧的已移除提供商默认值。(#38947) 感谢 @davidemanuelDEV。 - **Agents/cache-trace stability**:保护稳定字符串化 against 跟踪负载中的循环引用,使接近限制的负载不再因 `Maximum call stack size exceeded` 而崩溃;添加回归覆盖。(#38935) 感谢 @MumuTW。 - **Extensions/diffs CI stability**:在 `extensions/diffs/index.test.ts` 的 `localReq` 测试辅助中添加 `headers`,使转发提示检查不再因 `req.headers` 未定义而崩溃。(取代 #39063)感谢 @Shennng。 - **Agents/compaction thresholding**:将 `agents.defaults.contextTokens` 上限应用到传递到嵌入式运行和 `/compact` 会话创建的模型,使自动压缩阈值使用有效上下文窗口,而不是原生模型最大上下文。(#39099) 感谢 @MumuTW。 - **Models/merge mode provider precedence**:当 `models.mode: "merge"` 激活且配置显式设置提供商 `baseUrl` 时,保持配置为真相来源而不是保留陈旧的运行时 `models.json` `baseUrl` 值;包括规范化的提供商键覆盖。(#39103) 感谢 @BigUncle。 - **UI/Control chat tool streaming**:通过启用 `tool-events` 能力、修复流/事件关联以及在工具结果和终端事件周围重置/重新加载流状态,在 webchat 中实时渲染工具事件,无需刷新。(#39104) 感谢 @jakepresent。 - **Models/provider apiKey persistence hardening**:当提供商 `apiKey` 值等于已知提供商环境变量值时,将规范环境变量名称持久化到 `models.json` 而不是解析的纯文本密钥。(#38889) 感谢 @gambletan。 - **Discord/model picker persistence check**:在分派后添加短暂的定居延迟,然后再读回会话模型状态,使选择器确认在成功模型切换后停止报告错误的差异警告。(#39105) 感谢 @akropp。 - **Agents/OpenAI WS compat store flag**:当模型兼容设置 `supportsStore: false` 时从 `response.create` 负载中省略 `store`,防止严格的 OpenAI 兼容提供商因未知字段错误而拒绝 websocket 请求。(#39113) 感谢 @scoootscooob。 - **Config/validation log sanitization**:在记录前消毒配置验证问题路径/消息,使控制字符和 ANSI 转义序列不能从格式错误的配置内容注入误导性终端输出。(#39116) 感谢 @powermaster888。 - **Agents/compaction counter accuracy**:在压缩计数器中计数成功的溢出触发自动压缩(`willRetry=true`),同时仍排除中止/无结果事件,使 `/status` 反映实际保护压缩活动。(#39123) 感谢 @MumuTW。 - **Gateway/chat delta ordering**:在发出工具 `start` 事件前刷新缓冲的助手增量,使预工具文本在工具卡片前传递到控制界面,避免流式中的瞬态文本/工具排序伪影。(#39128) 感谢 @0xtangping。 - **Voice-call plugin schema parity**:添加缺失的清单 `configSchema` 字段(`webhookSecurity`、`streaming.preStartTimeoutMs|maxPendingConnections|maxPendingConnectionsPerIp|maxConnections`、`staleCallReaperSeconds`),使网关 AJV 验证接受已支持的运行时配置而不是因 `additionalProperties` 错误失败。(#38892) 感谢 @giumex。 - **Agents/OpenAI WS reconnect retry accounting**:避免在重新连接失败同时发出 `error` 和 `close` 时双重重试调度,使重试预算跟踪实际重新连接尝试而不是早期耗尽。(#39133) 感谢 @scoootscooob。 - **Daemon/Windows schtasks runtime detection**:使用语言无关的 `Last Run Result` 运行代码(`0x41301`/`267009`)作为主要运行信号,使 `openclaw node status` 不再在非英语 Windows 区域设置上将活动任务错误报告为停止。(#39076) 感谢 @ademczuk。 - **Usage/token count formatting**:将近百万令牌计数舍入到百万(`1.0m`)而不是 `1000k`,并为 `999_499` 和 `999_500` 提供显式边界覆盖。(#39129) 感谢 @CurryMessi。 - **Gateway/session bootstrap cache invalidation ordering**:仅在活动嵌入式运行关闭等待完成后清除引导快照,防止濒死运行在 `/new`/`sessions.reset` 回合之间重新填充陈旧缓存。(#38873) 感谢 @MumuTW。 - **Browser/dispatcher error clarity**:在浏览器获取错误中保留调度器端失败上下文,同时仍附加操作员指导和显式无重试模型提示,防止误导性 `"Can't reach service"` 包装并避免 LLM 重试循环。(#39090) 感谢 @NewdlDewdl。 - **Telegram/polling offset safety**:在轮询启动前确认持久化偏移,同时将存储的 `lastUpdateId` 值验证为非负安全整数(带有溢出保护),使格式错误的偏移状态不会导致更新跳过/丢弃。(#39111) 感谢 @MumuTW。 - **Telegram/status SecretRef read-only resolution**:在仅配置/状态检查中解析 env 支持的机器人令牌 SecretRef,同时尊重提供商源/默认和环境允许列表,使状态不再崩溃或报告错误的就绪令牌对于不允许的提供商。(#39130) 感谢 @neocody。 - **Agents/OpenAI WS max-token zero forwarding**:在 websocket `response.create` 负载中将 `maxTokens: 0` 视为显式值(而不是作为虚假值丢弃),为零令牌转发提供回归覆盖。(#39148) 感谢 @scoootscooob。 - **Podman/.env gateway bind precedence**:在 `run-openclaw-podman.sh` 中源 `.env` 后评估 `OPENCLAW_GATEWAY_BIND`,使 env 文件覆盖被尊重。(#38785) 感谢 @majinyu666。 - **Models/default alias refresh**:将 `gpt` 提升到 `openai/gpt-5.4` 并将 Gemini 默认提升到 `gemini-3.1` 预览别名(包括规范化/默认连接)以跟踪当前模型 ID。(#38638) 感谢 @ademczuk。 - **Config/env substitution degraded mode**:在配置读取中将缺失的 `${VAR}` 解析从硬失败转换为警告支持的回退行为,同时防止未解析的占位符被接受为网关凭据。(#39050) 感谢 @akz142857。 - **Discord inbound listener non-blocking dispatch**:使 `MESSAGE_CREATE` 监听器交接异步(无每个监听器队列阻塞),使长时间运行不再停滞无关入站事件。(#39154) 感谢 @yaseenkadlemakki。 - **Daemon/Windows PATH freeze fix**:停止将安装时间 `PATH` 快照持久化到预定任务脚本,使运行时工具查找遵循当前主机 PATH 更新;还刷新静默本地最终输出的本地 TUI 历史。(#39139) 感谢 @Narcooo。 - **Gateway/systemd service restart hardening**:通过显式运行端口在服务绑定前清除陈旧的网关监听器,添加重启陈旧 pid 端口覆盖支持,调整 systemd 启动/停止/退出处理,并且仅在服务管理的运行时禁用分离子模式,使 cgroup 停止语义可靠清理后代。(#38463) 感谢 @spirittechie。 - **Discord/plugin native command aliases**:让插件声明提供商特定的斜杠名称,以便原生 Discord 注册可以避免内置命令冲突;捆绑 Talk 语音插件现在在 Discord 上原生使用 `/talkvoice` 同时保留文本 `/voice`。 - **Daemon/Windows schtasks status normalization**:仅从语言无关的数字 `Last Run Result` 代码(无语言字符串匹配)派生的运行时状态,并在数字结果数据不可用时显示未知,防止区域特定错误分类漂移。(#39153) 感谢 @scoootscooob。 - **Telegram/polling conflict recovery**:在 `getUpdates` 409 冲突上重置轮询 `webhookCleared` 锁存器,使 webhook 清理在重启周期上重新运行,轮询避免无限冲突循环。(#39205) 感谢 @amittell。 - **Heartbeat/requests-in-flight scheduling**:停止推进 `nextDueMs` 并在请求飞行中跳过时避免立即 `scheduleNext()` 计时器覆盖,使唤醒层重试冷却被尊重,并且心跳节奏不再在持续争用下漂移。(#39182) 感谢 @MumuTW。 - **Memory/SQLite contention resilience**:在每次同步存储和 QMD 连接打开时重新应用 `PRAGMA busy_timeout`,使进程重启/重新打开在锁争用下不再恢复到立即 `SQLITE_BUSY` 失败。(#39183) 感谢 @MumuTW。 - **Gateway/webchat route safety**:阻止 webchat/控制界面客户端在频道范围会话上继承存储的外部传递路由(同时为 UI/TUI 客户端保留路由继承),防止范围聊天的跨频道泄漏。(#39175) 感谢 @widingmarcus-cyber。 - **Telegram error-surface resilience**:当分发/去抖动处理失败时返回用户可见的回退回复而不是静默,同时保留草稿流清理和尽力而为的线程范围回退传递。(#39209) 感谢 @riftzen-bit。 - **Gateway/password auth startup diagnostics**:检测 `gateway.auth.password` 中的未解析提供商引用对象,并失败并显示特定的引导秘密错误消息而不是通用配置错误输出。(#39230) 感谢 @ademczuk。 - **Agents/OpenAI-responses compatibility**:当 `supportsStore=false` 时剥离不支持的 `store` 负载字段(包括 OpenAI 兼容非 OpenAI 提供商),同时保留服务器压缩负载行为。(#39219) 感谢 @ademczuk。 - **Agents/model fallback visibility**:当配置的模型 ID 无法解析并应用回退时警告,具有日志安全消毒的模型文本以防止警告输出中的控制序列注入。(#39215) 感谢 @ademczuk。 - **Outbound delivery replay safety**:使用两阶段传递 ACK 标记(`.json` -> `.delivered` -> 取消链接)和启动标记清理,使发送和清理之间的崩溃窗口不会重放已传递的消息。(#38668) 感谢 @Gundam98。 - **Nodes/system.run approval binding**:通过网关转发携带准备的批准计划,并在批准到执行之间绑定解释器样式脚本操作数,使后批准脚本重写被拒绝而未经更改的批准脚本运行保持工作。感谢 @tdjackey 报告。 - **Nodes/system.run PowerShell wrapper parsing**:将 `pwsh`/`powershell` `-EncodedCommand` 形式视为 shell 包装器负载,使允许列表模式仍需要批准而不是回退到普通 argv 分析。感谢 @tdjackey 报告。 - **Control UI/auth error reporting**:将通用浏览器 `Fetch failed` websocket 关闭错误映射回可操作的网关身份验证消息(`gateway token mismatch`、`authentication failed`、`retry later`),使仪表板断开连接停止隐藏凭据问题。来自贡献者 PR #28608 by @KimGLee。感谢 @KimGLee。 - **Media/mime unknown-kind handling**:对于缺失/无法识别的 MIME 种类返回 `undefined`(不是 `"unknown"`),并对未知远程媒体使用文档大小回退上限,防止幻影 `<media:unknown>` Signal 事件被视为真实消息。(#39199) 感谢 @nicolasgrasset。 - **Nodes/system.run allow-always persistence**:在允许列表分析期间尊重 shell 注释语义,使 `#` 尾部负载从不执行不被持久化为受信任的后续命令。感谢 @tdjackey 报告。 - **Signal/inbound attachment fan-in**:转发所有成功获取的入站附件通过 `MediaPaths`/`MediaUrls`/`MediaTypes`(而不仅仅是第一个),并改进提及门控挂起历史中的多附件占位符摘要。(#39212) 感谢 @joeykrug。 - **Nodes/system.run dispatch-wrapper boundary**:在深度边界保持 shell 包装器批准分类活动,使 `env` 包装器堆栈无法在没有预期批准门的情况下到达 `/bin/sh -c` 执行。感谢 @tdjackey 报告。 - **Docker/token persistence on reconfigure**:在 `docker-setup.sh` 重运行中重用现有的 `.env` 网关令牌并对齐 compose 令牌 env 默认值,使 Docker 安装停止静默轮换令牌并破坏现有仪表板会话。来自贡献者 PR #33097 by @chengzhichao-xydt。感谢 @chengzhichao-xydt。 - **Agents/strict OpenAI turn ordering**:对严格的 OpenAI 兼容提供商(例如通过 `openai-completions` 的 vLLM/Gemma)应用助手优先转录引导消毒,而不添加 Google 特定会话标记,防止助手优先历史拒绝。(#39252) 感谢 @scoootscooob。 - **Discord/exec approvals gateway auth**:将解析的共享网关凭据传递到 Discord exec-approvals 网关客户端,使令牌认证安装停止因 `gateway token mismatch` 而失败批准。与 #38179 相关。感谢 @0riginal-claw 的相邻 PR #35147 调查。 - **Subagents/workspace inheritance**:将父工作区目录传播到生成的子代理运行,使子会话可靠继承工作区范围指令(`AGENTS.md`、`SOUL.md` 等),而不通过工具调用参数暴露工作区覆盖。(#39247) 感谢 @jasonQin6。 - **Exec approvals/gateway-node policy**:即使运行时默认更严格,也尊重 `exec-approvals.json` 中的显式 `ask=off`,使受信任的完整/关闭设置停止在网关和节点 exec 路径上重新提示。来自贡献者 PR #26789 by @pandego。感谢 @pandego。 - **Exec approvals/config fallback**:当 `tools.exec.ask` 未设置时从 `exec-approvals.json` 继承 `ask`,使本地完整/关闭默认不再回退到 `on-miss` 用于 exec 工具和 `nodes run`。来自贡献者 PR #29187 by @Bartok9。感谢 @Bartok9。 - **Exec approvals/allow-always shell scripts**:为包装器调用如 `bash scripts/foo.sh` 持久化和匹配脚本路径,同时仍阻止 `-c`/`-s` 包装器绕过。来自贡献者 PR #35137 by @yuweuii。感谢 @yuweuii。 - **Queue/followup dedupe across drain restarts**:队列重新创建后对重传递的 `message_id` 值去重,使繁忙会话后续操作在重放入站事件时不再重复。来自贡献者 PR #33168 by @rylena。感谢 @rylena。 - **Telegram/preview-final edit idempotence**:将草稿最终化期间的 `message is not modified` 错误视为已传递,使部分流最终回复不再回退到重复发送。来自贡献者 PR #34983 by @HOYALIM。感谢 @HOYALIM。 - **Telegram/DM streaming transport parity**:对所有 DM 流车道使用消息预览传递,以便最终传递可以编辑活动预览而不是发送重复最终输出。来自贡献者 PR #38906 by @gambletan。感谢 @gambletan。 - **Telegram/DM draft streaming restoration**:为 DM 答案流恢复原生 `sendMessageDraft` 预览传递,同时保持推理在消息传递上,具有回归覆盖以保持草稿最终化不发送重复最终输出。(#39398) 感谢 @obviyus。 - **Telegram/send retry safety**:仅对预连接失败重试非幂等发送路径并使自定义重试谓词严格,防止模糊重新连接重试发送重复消息。来自贡献者 PR #34238 by @hal-crackbot。感谢 @hal-crackbot。 - **ACP/run spawn delivery bootstrap**:停止为一次性 `mode: "run"` ACP 生成重用请求者内联传递目标,使新鲜运行模式工作程序在隔离中引导而不是继承线程绑定会话传递行为。(#39014) 感谢 @lidamao633。 - **Discord/DM session-key normalization**:当发送者匹配时,将遗留 `discord:dm:*` 和幻影直接消息 `discord:channel:<user>` 会话键重写为 `discord:direct:*`,使多重代理 Discord DMs 停止落入空频道形状会话并恢复正确回复。 - **Discord/native slash session fallback**:将空配置绑定会话键视为缺失,使 `/status` 和其他原生命令回退到路由的斜杠会话和路由的频道会话,而不是清空 Discord 会话键在正常频道绑定中。 - **Agents/tool-call dispatch normalization**:在 `toolCall`、`toolUse` 和 `functionCall` 块跨提供商前缀工具名称之前规范,同时保留剥离提供商包装器时的多段工具后缀,使格式错误但可恢复的工具名称不再因 `Tool not found` 而失败。(#39328) 感谢 @vincentkoc。 - **Agents/parallel tool-call compatibility**:仅对 `openai-completions` 和 `openai-responses` 负载尊重 `parallel_tool_calls` / `parallelToolCalls` 额外参数,在配置和运行时层保留更高优先级别名覆盖,并忽略无效的非布尔值,使单工具调用提供商如 NVIDIA 托管的 Kimi 停止在强制并行工具调用负载上失败。(#37048) 感谢 @vincentkoc。 - **Config/invalid-load fail-closed**:停止将 `INVALID_CONFIG` 转换为空运行时配置,仅通过显式尽力而为的诊断读取保持有效设置可用,并使只读 CLI 诊断通过该路径路由,使未知键不再静默丢弃安全敏感配置。(#28140) 感谢 @bobsahur-robot 和 @vincentkoc。 - **Agents/codex-cli sandbox defaults**:将内置 Codex 后端从 `read-only` 切换到 `workspace-write`,使生成的编码运行可以开箱即用地编辑文件。来自贡献者 PR #39336 by @0xtangping。感谢 @0xtangping。 - **Gateway/health-monitor restart reason labeling**:为干净频道断开重启报告 `disconnected` 而不是 `stuck`,使操作员日志区分套接字下降与真正卡住的频道。(#36436) 感谢 @Sid-Qin。 - **Control UI/agents-page overrides**:编辑继承的代理时自动创建最小每代理配置条目,使模型/工具/技能更改启用保存,并且继承的模型回退可以通过写入仅主覆盖清除。来自贡献者 PR #39326 by @dunamismax。感谢 @dunamismax。 - **Gateway/Telegram webhook-mode recovery**:添加 `webhookCertPath` 在 webhook 注册期间重新上传自签名证书,并为 webhook 模式频道跳过陈旧套接字检测,使 Telegram webhook 设置存活健康监控重启。来自贡献者 PR #39313 by @fellanH。感谢 @fellanH。 - **Discord/config schema parity**:添加 `channels.discord.agentComponents` 到严格 Zod 配置架构,使有效的 `agentComponents.enabled` 设置(根和账户范围)不再因未识别键验证错误而失败。来自贡献者 PR #39378 by @gambletan。感谢 @gambletan 和 @thewilloftheshadow。 - **ACPX/MCP session bootstrap**:将配置的 MCP 服务器注入 ACP `session/new` 和 `session/load` 用于 acpx 支持的会话,恢复 Canva 和其他外部 MCP 工具。来自贡献者 PR #39337。感谢 @goodspeed-apps。 - **Control UI/Telegram sender labels**:在消毒的聊天历史中保留入站发送者标签,使仪表板用户消息组正确分割并显示真实组成员名而不是 `You`。(#39414) 感谢 @obviyus。