Skip to content

Upgrade OpenClaw to 2026.4.25 - #26

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
upgrade-openclaw-2026.4.25
Open

Upgrade OpenClaw to 2026.4.25#26
github-actions[bot] wants to merge 1 commit into
mainfrom
upgrade-openclaw-2026.4.25

Conversation

@github-actions

Copy link
Copy Markdown

Automated Upgrade: 2026.3.11 → 2026.4.25

Test Results

Test Result
Docker image builds
Version matches Dockerfile
Config valid JSON + correct defaults
Config owned by openclaw user
Gateway process running
Gateway HTTP responds 200
Tailscale binary present
Channel plugins loaded
Backup config valid
openclaw doctor completes
App Platform E2E ✅ Passed

⚠️ Known Upstream Regressions

  • #71504: [Bug]: openclaw-lark 插件
  • #72668: [Bug]: <<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>子代理报告的内容没了
  • #62226: [Bug]: TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
  • #44818: [Bug]: .env proxy (HTTPS_PROXY) works for Gemini web search but not for Gemini memory embedding
  • #69229: [Bug]: tasks audit reports false-positive inconsistent_timestamps on succeeded/failed/running tasks

Review these before merging.

Release Notes

OpenClaw 2026.4.25

2026.4.25

Highlights

  • Voice replies get a full TTS upgrade: /tts latest, chat-scoped auto-TTS controls, personas, per-agent/per-account overrides, and new Azure Speech, Xiaomi, Local CLI, Inworld, Volcengine, and ElevenLabs v3 provider coverage. Thanks @leonchui, @zoujiejun, @solar2ain, @cshape, @xuruiray, @itsuzef, and @barronlroth.
  • Plugin startup and install paths move to the cold persisted registry, cutting broad manifest scans while making plugin update, repair, provider discovery, and install metadata more deterministic. Thanks @vincentkoc and @shakkernerd.
  • OpenTelemetry coverage expands across model calls, token usage, tool loops, harness runs, exec processes, outbound delivery, context assembly, and memory pressure with bounded low-cardinality attributes. Thanks @vincentkoc, @jlapenna, @Lidang-Jiang, and @oc-factus.
  • Browser automation gets safer tab URLs, iframe-aware role snapshots, CDP readiness tuning, headless one-shot launch, and deeper browser doctor probes for slow hosts. Thanks @beat843796 and @BenediktSchackenberg.
  • Control UI and setup flows add PWA/Web Push support, Crestodian first-run repair, TUI setup, context mode selection, and a shorter startup greeting. Thanks @eduardocruz, @SebTardif, and @kevinlin-openai.
  • Install/update hardening covers Windows, macOS, Linux, Docker, bundled plugin runtime deps, Node service restarts, LaunchAgent token rotation, and mixed-version gateway verification. Thanks @Kobevictor, @igormf, @abhinas90, @jsompis, @Solvely-Colin, and @gucasbrg.

Changes

  • TTS/WhatsApp: add /tts latest read-aloud support with duplicate suppression and /tts chat on|off|default session-scoped auto-TTS overrides, completing the on-demand voice-note UX for current-chat replies. Fixes #66032.
  • TTS/channels: resolve channel and account TTS overrides generically, enabling Feishu and QQBot accounts to deep-merge channels.<channel>.accounts.<id>.tts over global and per-agent TTS config. Thanks @sahilsatralkar.
  • TTS/agents: allow agents.list[].tts to override global messages.tts for per-agent voices, and make /tts audio, /tts status, and the tts agent tool honor the active voice/provider override while keeping shared provider credentials and preferences in the existing TTS config surface.
  • Providers/Azure Speech: add Azure Speech as a bundled TTS provider with Speech-resource auth, voice listing, SSML escaping, native Ogg/Opus voice-note output, and telephony output. (#51776) Thanks @leonchui.
  • Google Meet: add calendar-backed attendance export workflows, export manifests, dry-run previews, and tool parity for meeting records.
  • Control UI: add PWA install support and Web Push notifications for Gateway chat. (#44590) Thanks @eduardocruz.
  • Browser automation: add safe tab URLs in agent responses plus a CDP-native role snapshot fallback with iframe-aware refs, cursor-clickable detection, target attach preparation, and openclaw browser doctor --deep live snapshot probing.
  • CLI/image generation: expose generic --background on openclaw infer image generate and openclaw infer image edit, keep --openai-background as an OpenAI alias, and let fal image generation honor --output-format png|jpeg.
  • Browser/config: allow local managed Chrome launch discovery and post-launch CDP readiness timeouts to be raised for slower hosts such as Raspberry Pi. Fixes #66803. Thanks @beat843796.
  • Discord: allow channels.discord.voice.model to override the LLM used for voice channel responses while keeping STT and TTS on their existing media settings. (#64368) Thanks @mrdavey.
  • Browser/CLI: add openclaw browser start --headless as a one-shot local managed browser launch override without rewriting persisted browser config. Thanks @BenediktSchackenberg.
  • CLI/Crestodian/TUI: add the first-run setup helper, local planner fallback, full-TUI interactive Crestodian, startup progress indicators, context mode selector, and a shorter startup greeting. (#71720, #71760) Thanks @SebTardif and @kevinlin-openai.
  • Plugins: migrate the local plugin registry automatically during package install/update, keeping install metadata in the plugin index while indexing existing plugin manifests for the new cold registry path. Thanks @vincentkoc and @shakkernerd.
  • Plugins/doctor: make openclaw doctor --fix refresh the plugin index and cold registry index when needed without treating plugin install records as authored config. Thanks @vincentkoc and @shakkernerd.
  • Plugins/hooks: add before-agent-finalize hooks, cron jobId hook context, bounded native permission fingerprints, and Codex MCP hook relay support. (#71765, #71758, #71707) Thanks @vincentkoc and @pashpashpash.
  • Plugins/tokenjuice: bump the bundled tokenjuice runtime to 0.6.3. Thanks @vincentkoc.
  • Diagnostics/OTEL: align model-call GenAI span attributes with OpenTelemetry stability opt-in semantics, keeping legacy gen_ai.system by default while emitting gen_ai.provider.name under OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental. Thanks @vincentkoc.
  • Diagnostics/OTEL: support signal-specific OTLP endpoint overrides for traces, metrics, and logs via config or standard OTEL environment variables. Thanks @vincentkoc.
  • Diagnostics/OTEL: emit bounded telemetry exporter health diagnostics for startup and log-export failures without exporting raw error text. Thanks @vincentkoc.
  • Diagnostics/OTEL: export agent harness lifecycle telemetry as bounded openclaw.harness.run spans and openclaw.harness.duration_ms metrics so QA-lab, Codex, and future harnesses share one trace shape. Thanks @vincentkoc.
  • Diagnostics/trace: propagate W3C traceparent headers from trusted model-call trace context to provider transports while replacing caller-supplied traceparent values. Thanks @vincentkoc.
  • Diagnostics/Prometheus: add a bundled diagnostics-prometheus plugin with a protected gateway scrape route for low-cardinality diagnostics metrics. Thanks @vincentkoc.
  • Plugins/CLI: add openclaw plugins registry for explicit persisted-registry inspection and --refresh repair without making normal startup rescan plugin locations. Thanks @vincentkoc.
  • Plugins/CLI: make openclaw plugins list read the cold persisted registry snapshot by default, leaving module-aware diagnostics to plugins doctor and plugins inspect. Thanks @vincentkoc.
  • Plugins/startup: move gateway startup plugin planning onto the versioned cold registry index, with postinstall repair for older registry files that predate startup metadata. Thanks @vincentkoc.
  • Plugins/startup: normalize startup and provider plugin enablement through registry aliases so boot paths do not need the legacy manifest alias scan. Thanks @vincentkoc.
  • Providers/plugins: resolve provider ownership, provider discovery scopes, and catalog-hook provider ids from the cold plugin registry instead of rescanning manifests on those paths. Thanks @vincentkoc.
  • Plugins/registry: keep installed plugin index records focused on install/state/load paths and resolve plugin capabilities from manifests scoped to indexed plugins. Thanks @shakkernerd.
  • Plugins/registry: route cold manifest and capability lookups through the installed plugin index so setup, channels, config, secrets, doctor, and provider metadata paths avoid broad plugin-root scans before runtime execution. Thanks @shakkernerd.
  • CLI/models: speed up models list --all --provider <id> for static manifest-backed providers by loading catalog rows through the installed plugin index instead of broad manifest scans or runtime suppression hooks. Thanks @shakkernerd.
  • CLI/models: use OpenClaw Provider Index preview rows as the final cold fallback for installable providers, while keeping user config, installed manifests, and refreshed cache rows above provider-index metadata. Thanks @vincentkoc.
  • Providers/plugins: keep onboarding and auth-choice setup lists on cold manifest/install metadata and add Provider Index install metadata for not-yet-installed provider plugins. Thanks @vincentkoc.
  • Providers/plugins: keep provider setup guidance and configure auth imports on cold manifest metadata, with a regression guard against static provider-runtime imports on setup/configure list paths. Thanks @vincentkoc.
  • CLI/capabilities: keep capability command registration from importing the models auth runtime until model auth login actually runs. Thanks @vincentkoc.
  • CLI/configure: keep web-search configure prompts on cold plugin registry metadata until the user chooses managed search setup. Thanks @vincentkoc.
  • Plugins/chat commands: refresh the persisted plugin registry after /plugins enable and /plugins disable, matching the CLI mutation path. Thanks @vincentkoc.
  • Plugins/compat: mark OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY as a deprecated break-glass switch and point operators at registry repair instead. Thanks @vincentkoc.
  • Plugins/compat: expand the central compatibility registry with dated owners, replacements, and maximum three-month removal targets for legacy SDK, manifest, setup, registry-migration, and agent-runtime surfaces. Thanks @vincentkoc.
  • Plugins/registry: ignore stale persisted registry reads when plugin policy no longer matches current config, and stamp generated registry files with a do-not-edit warning. Thanks @vincentkoc.
  • Config/plugins: keep plugin command-alias validation on cold manifest metadata instead of importing the runtime alias resolver. Thanks @vincentkoc.
  • Security/plugins: keep web-search credential presence checks on cold config, env, and manifest metadata instead of importing web-search provider runtime. Thanks @vincentkoc.
  • Diagnostics/OTEL: surface provider request identifiers as bounded hashes on model-call diagnostics and span events, without exporting raw request IDs or metric labels. Thanks @Lidang-Jiang and @vincentkoc.
  • Plugins/diagnostics: add metadata-only model_call_started and model_call_ended hooks for provider/model call telemetry without exposing prompts, responses, headers, request bodies, or raw provider request IDs. Thanks @vincentkoc.
  • Diagnostics/OTEL: emit bounded context assembly diagnostics and export openclaw.context.assembled spans with prompt/history sizes but no prompt, history, response, or session-key content. Thanks @vincentkoc.
  • Diagnostics/OTEL: export existing tool-loop diagnostics as openclaw.tool.loop counters and spans without loop messages, session identifiers, params, or tool output. Thanks @vincentkoc.
  • Diagnostics/OTEL: export diagnostic memory samples and pressure as bounded memory histograms, counters, and pressure spans to help spot leak regressions without session or payload data. Thanks @vincentkoc.
  • Diagnostics/OTEL: add the GenAI gen_ai.client.token.usage histogram for input/output model usage while keeping session identifiers and aggregate cache counters out of the semantic metric. Thanks @vincentkoc.
  • Diagnostics/OTEL: add a bounded openclaw.agent label to OpenClaw token metrics so per-agent Grafana dashboards can group usage without exporting session identifiers. Thanks @oc-factus.
  • Plugins/install: consolidate managed plugin install metadata into the state-managed plugin index at plugins/installs.json, replacing the temporary plugins/installed-index.json path and removing plugins.installs as an authored config surface. Thanks @vincentkoc and @shakkernerd.
  • Diagnostics/OTEL: add the GenAI gen_ai.client.operation.duration histogram for model-call latency in seconds with bounded provider/model/API and error attributes. Thanks @vincentkoc.
  • Diagnostics/OTEL: add GenAI usage token attributes to model-usage spans, including cache read/write input token counts without session identifiers or prompt/response content. Thanks @vincentkoc.
  • Diagnostics/OTEL: include bounded GenAI operation, provider, and request-model attributes on model-usage spans so token usage remains self-describing without diagnostic identifiers. Thanks @vincentkoc.
  • Diagnostics/OTEL: keep model-usage span GenAI provider attributes aligned with the existing semantic-convention opt-in policy, using legacy gen_ai.system unless latest experimental GenAI conventions are enabled. Thanks @vincentkoc.
  • Diagnostics/OTEL: keep gen_ai.request.model present on GenAI token usage metrics with a bounded unknown fallback when model usage events do not include a model. Thanks @vincentkoc.
  • Docs/OTEL: document the GenAI token and model-call duration metrics, model-usage span attributes, and OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental provider-attribute behavior. Thanks @vincentkoc.
  • Docs: refresh the MCP, model provider, doctor, troubleshooting, BlueBubbles, media generation, TTS, subagents, skills, cron/tasks, exec approvals, and voice-call guides with structured Steps, Tabs, and Accordion content.
  • Diagnostics/trace: add an internal traceparent propagation helper that only formats trusted dispatcher metadata, keeping plugin-emitted diagnostic traces out of outbound propagation by default. Thanks @vincentkoc.
  • Diagnostics/OTEL: add bounded outbound message delivery lifecycle diagnostics and export them as low-cardinality delivery spans/metrics without message body, recipient, room, or media-path data. (#71471) Thanks @vincentkoc and @jlapenna.
  • Diagnostics/OTEL: emit bounded exec-process diagnostics and export them as openclaw.exec spans without exposing command text, working directories, or container identifiers. (#71451) Thanks @vincentkoc and @jlapenna.
  • Diagnostics/OTEL: support OPENCLAW_OTEL_PRELOADED=1 so the plugin can reuse an already-registered OpenTelemetry SDK while keeping OpenClaw diagnostic listeners wired. (#71450) Thanks @vincentkoc and @jlapenna.
  • Providers/Xiaomi: add MiMo TTS as a bundled speech provider with MP3/WAV output and voice-note Opus transcoding. Fixes #52376. (#55614) Thanks @zoujiejun.
  • Providers/ElevenLabs: include eleven_v3 in the bundled TTS model catalog so model selection surfaces can offer ElevenLabs v3. (#68321) Thanks @itsuzef.
  • Providers/Local CLI TTS: add a bundled local command speech provider with file/stdout input, voice-note Opus conversion, and telephony PCM output. (#56239) Thanks @solar2ain.
  • Providers/Inworld: add Inworld as a bundled speech provider with streaming TTS synthesis, voice listing, voice-note output, and PCM telephony output. (#55972) Thanks @cshape.
  • Providers/Volcengine: add Volcengine/BytePlus Seed Speech as a bundled TTS provider with API-key auth, native Ogg/Opus voice-note output, and MP3 audio-file output. (#55641) Thanks @xuruiray.
  • Android/Talk Mode: expose Talk Mode in the Voice tab with runtime-owned voice capture modes and microphone foreground-service escalation. Thanks @alex-latitude.
  • Providers/LiteLLM: register litellm as an image-generation provider so image_generate model=litellm/... calls and agents.defaults.imageGenerationModel.fallbacks entries resolve through the LiteLLM proxy. Thanks @zqchris.
  • Providers/fal: add Seedance 2.0 reference-to-video models with multi-image, video, and audio reference input mapping plus model-specific capability limits for video_generate. Thanks @shivanker.
  • Codex harness: require Codex app-server 0.125.0 or newer and cover native MCP PreToolUse, PostToolUse, and PermissionRequest payloads through the OpenClaw hook relay.
  • Agents/Codex: teach prompts and agents_list to surface native Codex app-server availability so agents prefer /codex ... over Codex ACP unless ACP/acpx is explicit. Thanks @vincentkoc.
  • ACPX/Droid: add Factory Droid to the live ACP bind Docker matrix, including .factory settings staging, FACTORY_API_KEY forwarding, and the single-agent test:docker:live-acp-bind:droid recipe.
  • TTS/personas: add provider-aware TTS personas with deterministic provider binding merges, /tts persona controls, gateway/CLI persona state, Google Gemini audio-profile-v1 prompt wrapping, and OpenAI instruction mapping. (#70748) Thanks @barronlroth.
  • Voice Wake: add trigger-based routing so macOS voice wake phrases can select a configured agent or session target, with Gateway routing APIs and node update events. (#30354) Thanks @longbiaochen.

Fixes

  • Auto-reply: poison inbound message dedupe after replay-unsafe provider/runtime failures so retries stay safe before visible progress but cannot duplicate messages after block output, tool side effects, or session progress. Fixes #69303; keeps #58549 and #64606 as duplicate validation. Thanks @martingarramon, @NikolaFC, and @zeroth-blip.
  • Logging/sessions: apply configured redaction patterns to persisted session transcript text and accept escaped character classes in safe custom redaction regexes, so transcript JSONL no longer keeps matching sensitive text in the clear. Fixes #42982. Thanks @panpan0000.
  • Agents/OpenAI: keep Responses web search compatible with minimal thinking by raising web_search requests to the lowest supported reasoning effort instead of sending a rejected minimal payload.
  • Agents/tools: honor the bundle-mcp allowlist token when deciding whether bundled MCP tools are available, so restricted tool policies can still enable bundled MCP without exposing unrelated tools.
  • Agents/model fallback: jump directly to a known later live-session model redirect instead of walking unrelated fallback candidates, while preserving the already-landed live-session/fallback loop guard. Fixes #57471; related loop family already closed via #58496. Thanks @yuxiaoyang2007-prog.
  • Skills/memory: restore Chokidar v5 hot reloads by watching concrete skill and memory roots with filters, including SKILL.md removals and deleted skill folders without broad workspace recursion. Fixes #27404, #33585, and #41606. Thanks @shelvenzhou, @08820048, and @rocke2020.
  • Discord/gateway: count failed health-monitor restart attempts toward cooldown and hourly caps, and evict stale account lifecycle state during channel reloads so repeated Discord gateway recovery cannot loop on old status. Fixes #38596. (#40413) Thanks @jellyAI-dev and @vashquez.
  • Plugins/CLI: let flag-driven openclaw channels add install the selected channel plugin from its default source without opening an interactive prompt, fixing published npm Telegram setup in stdin-closed automation.
  • Plugins/startup: load the default memory-core slot during Gateway startup when permitted so active-memory recall can call memory_search and memory_get without requiring an explicit plugins.slots.memory entry, while preserving plugins.slots.memory: "none".
  • Plugins/install: materialize plugin-owned root chunks in external bundled-runtime mirrors so staged plugin dependencies resolve under native ESM in packaged installs. Fixes #72058; supersedes #72084. Thanks @amnesia106 and @drvoss.
  • Plugins/CLI: prefer native require for compiled bundled plugin JavaScript before jiti so read-only config, status, device, and node commands avoid unnecessary transform overhead on slow hosts. Fixes #62842. Thanks @Effet.
  • Plugins/compat: inventory doctor-side deprecation migrations separately from runtime plugin compatibility so release sweeps preserve needed repairs while enforcing dated removal windows. Thanks @vincentkoc.
  • Plugins/compat: add missing dated compatibility records for legacy extension-api, memory registration, provider hook/type aliases, runtime aliases, channel SDK helpers, and approval/test utility shims. Thanks @vincentkoc.
  • Plugins/CLI: refresh the persisted registry after managed plugin files are removed so ClawHub uninstall cannot leave stale plugins list entries.
  • Plugins/CLI: make plugin install and uninstall config writes conflict-aware, clear stale denylist entries on explicit reinstall/removal, and delete managed plugin files only after config/index commit succeeds.
  • Plugins: fail plugins update when tracked plugin or hook updates error, keep bundled runtime-dependency repair behind restrictive allowlists, and reject package installs with unloadable extension entries.
  • Gateway/chat: keep duplicate attachment-backed chat.send retries with the same idempotency key on the documented in-flight path so aborts still target the real active run. Fixes #70139. Thanks @Feelw00.
  • Plugins: share package entrypoint resolution between install and discovery, reject mismatched runtimeExtensions, and cache bundled runtime-dependency manifest reads during scans.
  • WhatsApp/Web: keep quiet but healthy linked-device sessions connected by basing the watchdog on WhatsApp Web transport activity, while retaining a longer app-silence cap so frame activity cannot mask a stuck session forever. Fixes #70678; carries forward the focused #71466 approach and keeps #63939 as related configurable-timeout follow-up. Thanks @vincentkoc and @oromeis.
  • Onboarding/setup: keep first-run config reads, plugin compatibility notices, and post-model sanity checks on cold metadata paths unless the user chooses to browse all models, avoiding full plugin/runtime catalog work between prompts. Thanks @shakkernerd.
  • Onboarding/auth: run manifest-owned provider auth choices through scoped setup providers so selecting OpenAI Codex browser/device auth no longer loads every provider runtime before OAuth starts. Thanks @shakkernerd.
  • Onboarding/auth: keep the post-auth default-model policy lookup on manifest/setup metadata so the next prompt appears without loading broad provider runtime. Thanks @shakkernerd.
  • Onboarding/models: keep skip-auth and provider-scoped model picker prompts off the full global model catalog path, and cache provider catalog hook resolution so setup no longer stalls after auth on large plugin registries. Thanks @shakkernerd.
  • Gateway/Bonjour: suppress known @homebridge/ciao cancellation and network assertion failures through scoped process handlers so malformed mDNS packets or restricted VPS networking disable/restart Bonjour instead of crashing the gateway. Fixes #67578. Thanks @zenassist26-create.
  • Discord: keep late clicks on already-resolved exec approval buttons quiet when elevated mode auto-resolved the request, while still surfacing real approval submission failures. Fixes #66906. Thanks @rlerikse.
  • Agents/subagents: deliver completed yielded-subagent results back to no-thread requester routes via direct fallback when the dormant parent announce turn produces no visible reply, and add QA-lab coverage for the regression. Thanks @vincentkoc.
  • Gateway/Tailscale: let Tailscale-authenticated Control UI operator sessions with browser device identity skip the device-pairing round trip while still rejecting device-less and node-role connections. Refs #71986. Thanks @jokedul.
  • Doctor: honor OPENCLAW_SERVICE_REPAIR_POLICY=external by reporting gateway service health while skipping service install/start/restart/bootstrap, supervisor rewrites, and legacy service cleanup for externally managed environments. Thanks @shakkernerd.
  • CLI/update: run package post-update doctor with --fix so package updates repair config migrations before restart. Thanks @shakkernerd.
  • CLI/update: retry failed npm global updates with --omit=optional and ignore the superseded first failure when the fallback succeeds. Thanks @shakkernerd.
  • Plugins/uninstall: migrate and reset plugins.slots.contextEngine alongside memory slots when plugin ids change or selected plugins are removed. Thanks @shakkernerd.
  • Agents/Discord: keep raw Agent failed before reply runner failures out of Discord group/channel chats and show detailed runner errors in direct chats only when /verbose is enabled.
  • UI/Windows: quote resolved pnpm .cmd launcher paths before spawning UI install/build/test commands so Node installs under C:\Program Files no longer fail as C:\Program. Fixes #45275. Thanks @Kobevictor, @stoppieboy, and @iubns.
  • Codex/agent: translate --thinking minimal to low for modern Codex models (gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.2) at request build time so the first turn is accepted instead of paying a wasted call + retry-with-low fallback. Older Codex models still receive minimal directly. Fixes #71946. Thanks @hclsys.
  • Plugins/uninstall: remove tracked plugin files from their recorded managed extensions root even when the current state directory points somewhere else, so openclaw plugins uninstall --force does not leave the plugin discoverable. Thanks @shakkernerd.
  • Agents/runtime: add agentRuntime.id as the canonical config key, migrate legacy runtime-policy configs with openclaw doctor --fix, route canonical Anthropic models through claude-cli without passing CLI backend aliases to embedded harness selection, and load CLI backend owner plugins before channel startup. Fixes #71957. Thanks @WolvenRA.
  • CLI/update: guard Windows scheduled-task stops by state and timeout so auto-update restart cannot hang indefinitely on schtasks /End before stale-listener cleanup. Fixes #69970. Thanks @yangswld and @sherlock-huang.
  • Windows install/Lobster: execute pnpm.exe directly when npm_execpath points at the native pnpm binary, add an installed-package fallback for the Lobster embedded runtime, and include the Lobster runner regression test in Windows CI. Fixes #69456. Thanks @igormf.
  • Gateway/install: refresh loaded gateway service installs when the current service embeds stale gateway auth instead of returning already-installed, avoiding LaunchAgent token-mismatch loops after token rotation. Fixes #70752. Thanks @hyspacex.
  • Update: ignore bundled plugin .openclaw-install-stage directories during global install verification and packaged dist pruning so leftover runtime-dep staging files do not turn successful updates into unexpected packaged dist file failures. Fixes #71752. Thanks @waynegault.
  • CLI/update: fail package updates when post-update plugin sync fails and refresh legacy npm plugin install records before trusting unchanged artifacts, preventing successful updates from restarting with stale or failed plugin state. Thanks @vincentkoc and @shakkernerd.
  • Release/update: reject pre-populated bundled plugin .openclaw-install-stage directories, including mixed-case path variants, before package inventory generation so release tarballs cannot ship poisoned runtime-dependency staging debris. Fixes #71752. Thanks @hclsys.
  • Node runtime: keep node-host retry timers alive across Gateway restarts and exit on terminal credential pauses so supervised nodes do not become silent zombies. Fixes #69800. Thanks @meroli28.
  • Gateway/plugins: stop persisted WhatsApp auth state from activating bundled channel runtime-dependency repair during startup when channels.whatsapp is absent, avoiding npm/git stalls on packaged Linux installs. Fixes #71994. Thanks @xiao398008.
  • Gateway/device tokens: enforce caller-scope containment inside token rotation and revocation so pairing-only sessions cannot mutate higher-scope operator tokens. Fixes #71990. Thanks @coygeek.
  • Plugins/channels: keep security checks, thread-binding placement, provider summaries, health formatting, and message action labels on read-only or already-loaded channel metadata instead of importing full channel runtime. Thanks @shakkernerd.
  • Plugins/status: keep config-only channel labels and status security summaries from importing plugin runtime modules just to render metadata. Thanks @shakkernerd.
  • Sessions/channels: stop group-session metadata from loading bundled channel runtime just to classify #channel subjects, using only already-loaded channel capabilities on that path. Thanks @shakkernerd.
  • Plugins/channels: keep native command and native skill auto defaults on static channel metadata so config, audit, and command-list checks do not load channel runtime just to read those defaults. Thanks @shakkernerd.
  • CLI/channels: keep channel remove selection and all-channel capabilities summaries on read-only plugin metadata, loading channel runtime only for the selected mutation path. Thanks @shakkernerd.
  • CLI/models: keep Provider Index preview rows out of models list --all --provider <id> when the owning provider plugin is disabled, preserving config authority for cold catalog fallbacks. Thanks @shakkernerd.
  • CLI/model runs: keep openclaw infer model run on explicit OpenRouter models from loading the full provider catalog or inheriting chat-agent silent-reply policy, restoring non-empty one-shot probe output. Fixes #68791. Thanks @limpredator.
  • Installer/macOS: rerun Homebrew install steps without the gum spinner when raw-mode ioctl failures occur, and avoid claiming node@24 was installed when the Homebrew keg binary is missing. Fixes #70411. Thanks @1fanwang and @dad-io.
  • Installer: load nvm before Node.js detection so curl | bash installs respect nvm-managed Node instead of stale system Node. Fixes #49556. Thanks @heavenlxj.
  • Installer/Windows: route PowerShell install failures through a top-level handler so iwr ... | iex returns control to the current shell while direct script-file runs still exit non-zero. Fixes #38054. Thanks @PwrSrg.
  • CLI/Volta: respawn raw openclaw CLI runs through the named node shim when the current Node executable resolves to volta-shim, avoiding direct shim execution failures in non-interactive shells. Fixes #68672. Thanks @sanchezm86.
  • Installer: warn when multiple npm global roots contain OpenClaw installs, showing active Node/npm/openclaw plus each install path and version so stale version-manager installs are visible. Fixes #40839. Thanks @zhixianio.
  • Cron/tasks: recover completed cron task ledger records from durable run logs and job state before marking them lost, reducing false backing session missing audit errors for isolated cron runs and keeping offline CLI audit from treating its empty local cron active-job set as authoritative. Fixes #71963.
  • Docker: copy patched dependency files into runtime images so downstream pnpm install layers keep working. Fixes #69224. Thanks @gucasbrg.
  • Package: include patched dependency files in the published npm package so downstream installs can resolve patchedDependencies. (#69224) Thanks @gucasbrg and @vincentkoc.
  • Plugins/channels: treat malformed bundled channel plugin loaders that return undefined as unavailable instead of crashing config and help paths. Fixes #69044. Thanks @frankhli843 and @vincentkoc.
  • Scripts/watch: show corrupted dependency package-config recovery guidance when gateway:watch fails during watcher startup, without double-logging unrelated import failures. (#58780) Thanks @roytong9 and @vincentkoc.
  • Signal: read signal-cli RPC, health checks, and SSE events through Node's HTTP client so Node 24/25 fetch regressions do not break Signal sends or inbound events. Fixes #51716 and #53040. Thanks @Barukimang, @minupla, and @vincentkoc.
  • Skills/Docker: run npm-backed skill dependency installs with an OpenClaw-managed user prefix so non-root Docker images do not write to /usr/local. Fixes #59601. Thanks @chanjarster and @vincentkoc.
  • Agents/runtime: submit heartbeat, cron, and exec wakeups as transient runtime context instead of visible user prompts, keeping synthetic system work out of chat transcripts. Fixes #66496 and #66814. Thanks @jeades and @mandomaker.
  • Telegram: include native quote excerpts automatically for threaded replies and reply tags when the original Telegram text is available, without adding another config knob. Fixes #6975. Thanks @rex05ai.
  • Node/Linux: make openclaw node install enable and restart the openclaw-node systemd unit instead of the gateway unit on node-only VMs. Fixes #68287. Thanks @dlebee-agent.
  • Browser/CDP: retry transient raw-CDP WebSocket handshake failures before any browser command is sent, and reconnect stale persistent Playwright CDP sessions for safe tab-list reads without replaying mutating browser actions. Fixes #67728.
  • Gateway/Linux: retry systemctl --user enable after a second daemon reload when the freshly written gateway unit is not visible yet on migrated systemd installs. Fixes #65184. Thanks @liushuaiiu.
  • Telegram: preserve exact selected quote text when sending native quote replies, and retry with legacy replies if Telegram rejects quote parameters. (#71952) Thanks @rubencu.
  • Plugins/CLI: preserve manifest name, description, format, and source metadata in cold openclaw plugins list output without importing plugin runtime. Thanks @shakkernerd.
  • Security/audit: read channel exposure and plugin allowlist ownership from read-only plugin index metadata so cold audits do not depend on loaded channel runtime. Thanks @shakkernerd.
  • Plugins/chat: keep /plugins list, /plugins enable, and /plugins disable on the persisted plugin index path so chat plugin management does not load diagnostic/runtime plugin registries before execution. Thanks @shakkernerd.
  • Plugins/doctor: read workspace plugin status and legacy web-search ownership through installed-index manifest metadata instead of broad manifest registry scans. Thanks @shakkernerd.
  • CLI/agents: read channel provider status from read-only plugin index metadata for text agents list output instead of the loaded channel registry. Thanks @shakkernerd.
  • Logging: redact configured secret patterns at console and file-log sink exits so credentials that reach the logger are masked before terminal display or JSONL persistence. Fixes #67953. Thanks @Ziy1-Tan.
  • Gateway/services: refuse process and service mutations from an older OpenClaw binary when the config was last written by a newer version, preventing split-brain installs from stopping or rewriting newer gateway services. Fixes #57079.
  • Gateway: reserve /healthz and /readyz ahead of plugin, canvas, and Control UI HTTP stages so liveness/readiness probes still answer when a later route handler stalls. Fixes #69674. Thanks @Xike-Creek.
  • Logging: load logging.file and redaction settings directly from the active OpenClaw config path in bundled runtimes, so packaged gateways stop falling back to /tmp/openclaw. Fixes #59370, #67168, and #61295. Thanks @KeaneYan, @Pan9hu, and @zsjlovelike.
  • Logging: rotate file logs at logging.maxFileBytes, keep bounded numbered archives, and make long-lived rolling loggers follow the current-day file instead of suppressing diagnostics or writing stale dated files. Fixes #58583 and #62381. Thanks @jpeghead and @zhaoleink.
  • Agents/groups: treat clean empty assistant stops as silent NO_REPLY only for always-on groups where silent replies are allowed, while keeping direct and mention-gated sessions on the incomplete-turn retry path. Thanks @MagnaAI.
  • macOS/Node: keep native remote app nodes from advertising browser.proxy, start browser-capable CLI node services through the restored openclaw node start command, and show an actionable browser-control error when the local control service is missing. Fixes #66637.
  • Gateway/update: fail package updates when the restarted managed gateway reports the wrong version, including fallback restarts and JSON mode, avoiding false-success mixed-version restarts after macOS LaunchAgent updates. Fixes #71835. Thanks @abhinas90 and @jsompis.
  • Gateway/update: warn before package updates and bundled plugin runtime-dependency repairs when the target volume appears low on disk space, without blocking installs on best-effort filesystem checks. Fixes #71835. Thanks @abhinas90 and @jsompis.
  • Plugins/runtime deps: surface activated plugin load failures in health and fail package-update restart verification or doctor repair when bundled runtime deps still cannot load, avoiding false-success repairs. (#71883) Thanks @Solvely-Colin.
  • Gateway/Linux: include fnm aliases/default/bin in generated service PATHs and let doctor accept either modern fnm aliases or the legacy current/bin symlink, avoiding false PATH repair prompts. Fixes #68169. Thanks @richard-scott.
  • Installer/Linux: run apt installs with noninteractive dpkg and needrestart settings so fresh Ubuntu 24.04 curl | bash installs do not hang while installing Node.js, Git, or build tools. Fixes #41146. Thanks @iht76, @alexcarv318, @cs3gallery, @firofame, and @cgdusek.
  • Providers/Bedrock: defer the AWS SDK import until Bedrock discovery actually runs so plugin registration and setup stay lightweight on cold start. Fixes #71690. Thanks @jarvis-ai-gregmoser.
  • Installer/macOS: stop immediately when Homebrew node@24 installation fails and avoid printing PATH advice for missing Homebrew Node installs. Fixes #70411. Thanks @1fanwang.
  • WhatsApp: remove ack reactions after a visible reply when messages.removeAckAfterReply is enabled, matching other reaction-capable channels. Fixes #26183. Thanks @MrUnforsaken.
  • Providers/Z.AI: map OpenClaw thinking controls to Z.AI's thinking payload and add opt-in preserved thinking replay via params.preserveThinking, so GLM 5.x can keep prior reasoning_content when requested. Fixes #58680. Thanks @xuanmingguo.
  • Channels/status: keep read-only channel lists on manifest and package metadata by default, loading setup runtime only for explicit fallback callers. Thanks @shakkernerd.
  • Plugins: scope setup and web-provider metadata manifest reads to explicit plugin ids when callers already know the owning plugin set. Thanks @vincentkoc.
  • Plugins/onboarding: defer onboarding install-record index writes until the guarded config commit so setup failures cannot leave the plugin index ahead of openclaw.json. Thanks @shakkernerd.
  • Plugins/registry: resolve web provider ownership from the installed plugin index instead of broad manifest scans on secret, tool, and pricing paths. Thanks @shakkernerd.
  • Config/providers: accept video and audio in configured model input values and preserve them in provider catalog entries. Fixes #20721. Thanks @alvinttang.
  • Models/auth: honor the parent --agent flag for auth write commands (add, login, setup-token, paste-token, and the GitHub Copilot shortcut) so OAuth/API-key/token results are written to the requested agent store instead of the default agent. Fixes #71864. (#71933) Thanks @balric-seo.
  • TTS: strip model-emitted TTS directives from streamed block text before channel delivery, including directives split across adjacent blocks, while preserving the accumulated raw reply for final-mode synthesis. Fixes #38937.
  • TTS: keep explicit provider=... directive keys scoped to that provider and warn on unsupported keys instead of letting another speech provider consume overlapping keys. Fixes #60131.
  • TTS/Feishu: normalize final-mode streamed TTS-only audio before delivery so generated voice-note files use the same safe media path and native voice routing as normal final replies. Fixes #71920.
  • Feishu: transcribe inbound voice-note audio with the shared media audio path before agent dispatch and keep raw Feishu file_key payloads out of message text. Fixes #67120 and #61876.
  • Tasks: terminalize async Gateway agent task records from the Gateway run result while preserving aborted, failed, and cancelled outcomes instead of leaving completed runs stuck as active or lost. (#71905) Thanks @likewen-tech.
  • WhatsApp: let authorized group voice-note transcripts satisfy mention gating before reply dispatch, while keeping unmentioned transcripts in pending group history. Fixes #44908.
  • Media understanding: carry channel voice-note preflight state into attachment selection so WhatsApp, Feishu, Telegram, and Discord do not transcribe the same inbound audio twice. Fixes #70580.
  • TTS/BlueBubbles: deliver compatible auto-TTS audio as iMessage voice memo bubbles instead of plain MP3/CAF file attachments. Fixes #16848.
  • TTS: resolve voice-note and voice-memo routing from channel plugin capabilities instead of speech-core-owned channel id lists.
  • ACP: send subagent and async-task completion wakes to external ACP harnesses as plain prompts instead of OpenClaw internal runtime-context envelopes, while keeping those envelopes out of ACP transcripts.
  • TTS/status: show configured TTS model, voice, and sanitized custom endpoint in /status, preserve OpenAI-compatible TTS instructions on custom endpoints, and retry empty Microsoft/Edge TTS output once. Addresses #46602, #47232, and #43936. Thanks @leekuangtao, @Huntterxx, and @rex993.
  • Agents/Gateway: steer agent-driven config edits and restarts through the owner-only gateway tool, document config.schema.lookup as the field-doc source, and warn against using gateway stop && gateway start as a restart substitute on macOS. Fixes #71929. Thanks @ygc3817922006-sketch.
  • Media understanding/audio: inject a deterministic transcript placeholder for too-small voice notes so agents do not hallucinate transcription or provider failures. Fixes #48944. Thanks @eulicesl.

This is an automated version bump. Only the Dockerfile was changed.
If release notes mention config/schema changes, manual review is required.
Do not merge if there are known regressions above.

Docker test output
=== OpenClaw Upgrade Verification ===

Waiting for container openclaw-upgrade-test to be ready...
✓ Container is responsive (waiting for init to complete...)
✓ s6 init complete (crond up)
✓ Version: 2026.4.25
✓ Config is valid JSON
✓ tools.profile: coding
✓ Config owned by openclaw
✓ Auth mode: token
✓ Gateway process running
✓ Tailscale binary present
Waiting for gateway HTTP...
✓ Gateway HTTP: 200
✓ Config writable by openclaw user
✓ Channel plugins loaded: discord,signal,telegram,whatsapp
✓ Backup config (backup.yaml) is valid
✓ pnpm store excluded from backups
SKIP: Telegram channel probe (TELEGRAM_BOT_TOKEN not set)
✓ openclaw doctor completes

=== Upgrade Verification Results ===
  Passed:   13
  Failed:   0
  Warnings: 0

=== All upgrade verification tests passed ✅ ===

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants