diff --git a/CHANGELOG.md b/CHANGELOG.md index d6ddc159bc3..257160fcc7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,8 @@ Docs: https://docs.openclaw.ai ### Fixes +- Agents/OpenAI: default GPT-5 API-key sessions to the SSE Responses transport unless WebSocket is explicitly selected, restoring replies in fresh Control UI and WebChat beta installs where the auto WebSocket path connected but produced no model events. +- Updates/plugins: keep packaged upgrades and beta external plugin installs on stable runtime aliases and matching prerelease npm specs, avoiding stale WebChat runtime chunks and old Twitch packages after upgrading from 2026.4.29. - Codex/app-server: resolve managed binaries from bundled `dist` chunks and from the `@openai/codex` package bin when installs do not provide a nearby `.bin/codex` shim, avoiding false missing-binary startup failures. - Status: show the `openai-codex` OAuth profile for `openai/gpt-*` sessions running through the native Codex runtime instead of reporting auth as unknown. (#76197) Thanks @mbelinky. - Plugins/ClawHub: use the ClawHub artifact resolver response as the install decision before downloading, keeping legacy ZIP fallback and future ClawPack npm-pack installs on the same explicit resolver path. Thanks @vincentkoc. diff --git a/docs/concepts/model-providers.md b/docs/concepts/model-providers.md index d1f39c38f50..8f664f07c62 100644 --- a/docs/concepts/model-providers.md +++ b/docs/concepts/model-providers.md @@ -92,9 +92,9 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no** `models. - Example models: `openai/gpt-5.5`, `openai/gpt-5.4-mini` - Verify account/model availability with `openclaw models list --provider openai` if a specific install or API key behaves differently. - CLI: `openclaw onboard --auth-choice openai-api-key` -- Default transport is `auto` (WebSocket-first, SSE fallback) +- Default transport is `sse` for GPT-5 API-key models while the native WebSocket path is under investigation; set `transport: "auto"` or `"websocket"` explicitly to opt back in - Override per model via `agents.defaults.models["openai/"].params.transport` (`"sse"`, `"websocket"`, or `"auto"`) -- OpenAI Responses WebSocket warm-up defaults to enabled via `params.openaiWsWarmup` (`true`/`false`) +- OpenAI Responses WebSocket warm-up is used only when WebSocket transport is selected and can be controlled via `params.openaiWsWarmup` (`true`/`false`) - OpenAI priority processing can be enabled via `agents.defaults.models["openai/"].params.serviceTier` - `/fast` and `params.fastMode` map direct `openai/*` Responses requests to `service_tier=priority` on `api.openai.com` - Use `params.serviceTier` when you want an explicit tier instead of the shared `/fast` toggle diff --git a/extensions/acpx/package.json b/extensions/acpx/package.json index 988b87396d4..d84eb716fb3 100644 --- a/extensions/acpx/package.json +++ b/extensions/acpx/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/acpx", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw ACP runtime backend", "repository": { "type": "git", @@ -25,10 +25,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/alibaba/package.json b/extensions/alibaba/package.json index 431e3fe8bb9..9cd04ddff83 100644 --- a/extensions/alibaba/package.json +++ b/extensions/alibaba/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/alibaba-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Alibaba Model Studio video provider plugin", "type": "module", diff --git a/extensions/amazon-bedrock-mantle/package.json b/extensions/amazon-bedrock-mantle/package.json index 753d680f7e6..126021fdd3d 100644 --- a/extensions/amazon-bedrock-mantle/package.json +++ b/extensions/amazon-bedrock-mantle/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/amazon-bedrock-mantle-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Amazon Bedrock Mantle (OpenAI-compatible) provider plugin", "type": "module", diff --git a/extensions/amazon-bedrock/package.json b/extensions/amazon-bedrock/package.json index 6bb2dc432b5..a0de320db9d 100644 --- a/extensions/amazon-bedrock/package.json +++ b/extensions/amazon-bedrock/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/amazon-bedrock-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Amazon Bedrock provider plugin", "type": "module", diff --git a/extensions/anthropic-vertex/package.json b/extensions/anthropic-vertex/package.json index 7abfb68eba9..65b4a85fcec 100644 --- a/extensions/anthropic-vertex/package.json +++ b/extensions/anthropic-vertex/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/anthropic-vertex-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Anthropic Vertex provider plugin", "type": "module", diff --git a/extensions/anthropic/package.json b/extensions/anthropic/package.json index 70cd6bdeb36..4e747075c12 100644 --- a/extensions/anthropic/package.json +++ b/extensions/anthropic/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/anthropic-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Anthropic provider plugin", "type": "module", diff --git a/extensions/arcee/package.json b/extensions/arcee/package.json index e8923b3b169..859298c6c9d 100644 --- a/extensions/arcee/package.json +++ b/extensions/arcee/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/arcee-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Arcee provider plugin", "type": "module", diff --git a/extensions/azure-speech/package.json b/extensions/azure-speech/package.json index 7549901defd..50cb843d351 100644 --- a/extensions/azure-speech/package.json +++ b/extensions/azure-speech/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/azure-speech", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Azure Speech plugin", "type": "module", diff --git a/extensions/bluebubbles/package.json b/extensions/bluebubbles/package.json index f26a455bf33..56b677e7691 100644 --- a/extensions/bluebubbles/package.json +++ b/extensions/bluebubbles/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/bluebubbles", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw BlueBubbles channel plugin", "repository": { "type": "git", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -53,10 +53,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/bonjour/package.json b/extensions/bonjour/package.json index 63d3d2ef82a..d98619da143 100644 --- a/extensions/bonjour/package.json +++ b/extensions/bonjour/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/bonjour", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Bonjour/mDNS gateway discovery", "type": "module", "dependencies": { diff --git a/extensions/brave/package.json b/extensions/brave/package.json index 825fedb8457..d2ba88801d4 100644 --- a/extensions/brave/package.json +++ b/extensions/brave/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/brave-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Brave plugin", "repository": { "type": "git", @@ -20,10 +20,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/browser/package.json b/extensions/browser/package.json index 6839852aa24..308862066d3 100644 --- a/extensions/browser/package.json +++ b/extensions/browser/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/browser-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw browser tool plugin", "type": "module", diff --git a/extensions/byteplus/package.json b/extensions/byteplus/package.json index c29311eec60..4ab9e98666f 100644 --- a/extensions/byteplus/package.json +++ b/extensions/byteplus/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/byteplus-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw BytePlus provider plugin", "type": "module", diff --git a/extensions/cerebras/package.json b/extensions/cerebras/package.json index 03dee4fe7e1..d36005b3690 100644 --- a/extensions/cerebras/package.json +++ b/extensions/cerebras/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cerebras-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Cerebras provider plugin", "type": "module", diff --git a/extensions/chutes/package.json b/extensions/chutes/package.json index fe940202f03..0b2302901d3 100644 --- a/extensions/chutes/package.json +++ b/extensions/chutes/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/chutes-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Chutes.ai provider plugin", "type": "module", diff --git a/extensions/cloudflare-ai-gateway/package.json b/extensions/cloudflare-ai-gateway/package.json index 8dff304d0c8..9b99e88aa23 100644 --- a/extensions/cloudflare-ai-gateway/package.json +++ b/extensions/cloudflare-ai-gateway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cloudflare-ai-gateway-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Cloudflare AI Gateway provider plugin", "type": "module", diff --git a/extensions/codex/package.json b/extensions/codex/package.json index daf3722e670..456cdb56fe3 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/codex", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Codex harness and model provider plugin", "repository": { "type": "git", @@ -27,10 +27,10 @@ "minHostVersion": ">=2026.5.1-beta.1" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/comfy/package.json b/extensions/comfy/package.json index d0e762e868a..298711afcde 100644 --- a/extensions/comfy/package.json +++ b/extensions/comfy/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/comfy-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw ComfyUI provider plugin", "type": "module", diff --git a/extensions/copilot-proxy/package.json b/extensions/copilot-proxy/package.json index 3d42cf106aa..253a5596dc8 100644 --- a/extensions/copilot-proxy/package.json +++ b/extensions/copilot-proxy/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/copilot-proxy", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Copilot Proxy provider plugin", "type": "module", diff --git a/extensions/deepgram/package.json b/extensions/deepgram/package.json index aecf4d9662d..949fe89c964 100644 --- a/extensions/deepgram/package.json +++ b/extensions/deepgram/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepgram-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Deepgram media-understanding provider", "type": "module", diff --git a/extensions/deepinfra/package.json b/extensions/deepinfra/package.json index 50dc18fcabf..5f2f2c36e75 100644 --- a/extensions/deepinfra/package.json +++ b/extensions/deepinfra/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepinfra-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw DeepInfra provider plugin", "type": "module", diff --git a/extensions/deepseek/package.json b/extensions/deepseek/package.json index 436680a0550..65cdcdbe542 100644 --- a/extensions/deepseek/package.json +++ b/extensions/deepseek/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepseek-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw DeepSeek provider plugin", "type": "module", diff --git a/extensions/diagnostics-otel/package.json b/extensions/diagnostics-otel/package.json index 5cb4b1e6f93..c3f8f806df7 100644 --- a/extensions/diagnostics-otel/package.json +++ b/extensions/diagnostics-otel/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diagnostics-otel", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw diagnostics OpenTelemetry exporter", "repository": { "type": "git", @@ -34,10 +34,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/diagnostics-prometheus/package.json b/extensions/diagnostics-prometheus/package.json index 195b80cb7f1..6d9ecaa3d0f 100644 --- a/extensions/diagnostics-prometheus/package.json +++ b/extensions/diagnostics-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diagnostics-prometheus", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw diagnostics Prometheus exporter", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/diffs/package.json b/extensions/diffs/package.json index 66971f7fee5..47d4c034d50 100644 --- a/extensions/diffs/package.json +++ b/extensions/diffs/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diffs", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw diff viewer plugin", "repository": { "type": "git", @@ -30,10 +30,10 @@ "minHostVersion": ">=2026.4.30" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/discord/package.json b/extensions/discord/package.json index bbe6a22d9ad..ea8de04a724 100644 --- a/extensions/discord/package.json +++ b/extensions/discord/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/discord", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Discord channel plugin", "repository": { "type": "git", @@ -21,7 +21,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -64,10 +64,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/document-extract/package.json b/extensions/document-extract/package.json index 67505406d18..866d95c0b9f 100644 --- a/extensions/document-extract/package.json +++ b/extensions/document-extract/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/document-extract-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw local document extraction plugin", "type": "module", diff --git a/extensions/duckduckgo/package.json b/extensions/duckduckgo/package.json index ec40c2d4140..953128916f5 100644 --- a/extensions/duckduckgo/package.json +++ b/extensions/duckduckgo/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/duckduckgo-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw DuckDuckGo plugin", "type": "module", diff --git a/extensions/elevenlabs/package.json b/extensions/elevenlabs/package.json index e32da156335..28f2bc58a2a 100644 --- a/extensions/elevenlabs/package.json +++ b/extensions/elevenlabs/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/elevenlabs-speech", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw ElevenLabs speech plugin", "type": "module", diff --git a/extensions/exa/package.json b/extensions/exa/package.json index 4df29b8bd5e..d6283f8517d 100644 --- a/extensions/exa/package.json +++ b/extensions/exa/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/exa-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Exa plugin", "type": "module", diff --git a/extensions/fal/package.json b/extensions/fal/package.json index a4f8120d669..69763f00460 100644 --- a/extensions/fal/package.json +++ b/extensions/fal/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/fal-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw fal provider plugin", "type": "module", diff --git a/extensions/feishu/package.json b/extensions/feishu/package.json index fa914cd9156..9417cb1a735 100644 --- a/extensions/feishu/package.json +++ b/extensions/feishu/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/feishu", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -47,10 +47,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/file-transfer/package.json b/extensions/file-transfer/package.json index f147abc3dd2..242655cc424 100644 --- a/extensions/file-transfer/package.json +++ b/extensions/file-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/file-transfer", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw file transfer plugin (file_fetch, dir_list, dir_fetch, file_write)", "type": "module", "dependencies": { diff --git a/extensions/firecrawl/package.json b/extensions/firecrawl/package.json index 9be0126f66d..f874f436273 100644 --- a/extensions/firecrawl/package.json +++ b/extensions/firecrawl/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/firecrawl-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Firecrawl plugin", "type": "module", diff --git a/extensions/fireworks/package.json b/extensions/fireworks/package.json index d07a9536e8a..5b5b9e10eff 100644 --- a/extensions/fireworks/package.json +++ b/extensions/fireworks/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/fireworks-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Fireworks provider plugin", "type": "module", diff --git a/extensions/github-copilot/package.json b/extensions/github-copilot/package.json index 0fad17922f7..7552e00f9a2 100644 --- a/extensions/github-copilot/package.json +++ b/extensions/github-copilot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/github-copilot-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw GitHub Copilot provider plugin", "type": "module", diff --git a/extensions/google-meet/package.json b/extensions/google-meet/package.json index 37f06fcb2aa..b94876949ab 100644 --- a/extensions/google-meet/package.json +++ b/extensions/google-meet/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/google-meet", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Google Meet participant plugin", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.4.20" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/google/package.json b/extensions/google/package.json index efe423385da..c1ba65bfdd5 100644 --- a/extensions/google/package.json +++ b/extensions/google/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/google-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Google plugin", "type": "module", diff --git a/extensions/googlechat/package.json b/extensions/googlechat/package.json index 0afc14d453b..a0636defc3a 100644 --- a/extensions/googlechat/package.json +++ b/extensions/googlechat/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/googlechat", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Google Chat channel plugin", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -75,10 +75,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/gradium/package.json b/extensions/gradium/package.json index d107a083cb1..75f487b4b61 100644 --- a/extensions/gradium/package.json +++ b/extensions/gradium/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/gradium-speech", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Gradium speech plugin", "type": "module", diff --git a/extensions/groq/package.json b/extensions/groq/package.json index eacf86baa96..85077d2c818 100644 --- a/extensions/groq/package.json +++ b/extensions/groq/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/groq-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Groq media-understanding provider", "type": "module", diff --git a/extensions/huggingface/package.json b/extensions/huggingface/package.json index 17d0d8b33ec..1268dd1648c 100644 --- a/extensions/huggingface/package.json +++ b/extensions/huggingface/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/huggingface-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Hugging Face provider plugin", "type": "module", diff --git a/extensions/image-generation-core/package.json b/extensions/image-generation-core/package.json index b71aa195980..bd93243d747 100644 --- a/extensions/image-generation-core/package.json +++ b/extensions/image-generation-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/image-generation-core", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw image generation runtime package", "type": "module", diff --git a/extensions/imessage/package.json b/extensions/imessage/package.json index 89fada31ccc..8abfe7d449c 100644 --- a/extensions/imessage/package.json +++ b/extensions/imessage/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/imessage", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw iMessage channel plugin", "type": "module", diff --git a/extensions/inworld/package.json b/extensions/inworld/package.json index 5d88cf078fb..599ecb62fd2 100644 --- a/extensions/inworld/package.json +++ b/extensions/inworld/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/inworld-speech", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Inworld speech plugin", "type": "module", diff --git a/extensions/irc/package.json b/extensions/irc/package.json index 3262ad2d434..fa8d8227b37 100644 --- a/extensions/irc/package.json +++ b/extensions/irc/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/irc", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw IRC channel plugin", "type": "module", "devDependencies": { diff --git a/extensions/kilocode/package.json b/extensions/kilocode/package.json index 8046725e649..a2cd97ade71 100644 --- a/extensions/kilocode/package.json +++ b/extensions/kilocode/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/kilocode-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Kilo Gateway provider plugin", "type": "module", diff --git a/extensions/kimi-coding/package.json b/extensions/kimi-coding/package.json index 9970d03c5bd..c805cc41313 100644 --- a/extensions/kimi-coding/package.json +++ b/extensions/kimi-coding/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/kimi-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Kimi provider plugin", "type": "module", diff --git a/extensions/line/package.json b/extensions/line/package.json index 3f3952478bc..a3923e35882 100644 --- a/extensions/line/package.json +++ b/extensions/line/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/line", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw LINE channel plugin", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -45,10 +45,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/litellm/package.json b/extensions/litellm/package.json index ac1fe556aa8..b472daab9ce 100644 --- a/extensions/litellm/package.json +++ b/extensions/litellm/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/litellm-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw LiteLLM provider plugin", "type": "module", diff --git a/extensions/llm-task/package.json b/extensions/llm-task/package.json index 51fd1500af7..78e280cc5dc 100644 --- a/extensions/llm-task/package.json +++ b/extensions/llm-task/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/llm-task", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw JSON-only LLM task plugin", "type": "module", diff --git a/extensions/lmstudio/package.json b/extensions/lmstudio/package.json index 11fdd85c708..16f2222f916 100644 --- a/extensions/lmstudio/package.json +++ b/extensions/lmstudio/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/lmstudio-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw LM Studio provider plugin", "type": "module", diff --git a/extensions/lobster/package.json b/extensions/lobster/package.json index 9ddc992ccf3..7d1129a891d 100644 --- a/extensions/lobster/package.json +++ b/extensions/lobster/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/lobster", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)", "repository": { "type": "git", @@ -25,10 +25,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/matrix/CHANGELOG.md b/extensions/matrix/CHANGELOG.md index d26fa7e27e0..0cd156e6b46 100644 --- a/extensions/matrix/CHANGELOG.md +++ b/extensions/matrix/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 2026.5.2-beta.2 + +### Changes + +- Version alignment with core OpenClaw release numbers. + ## 2026.5.2-beta.1 ### Changes diff --git a/extensions/matrix/package.json b/extensions/matrix/package.json index 13659c61d49..c639f00942b 100644 --- a/extensions/matrix/package.json +++ b/extensions/matrix/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/matrix", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Matrix channel plugin", "repository": { "type": "git", @@ -21,7 +21,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -85,10 +85,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/mattermost/package.json b/extensions/mattermost/package.json index 6a9f4ff9f9a..4b5a0eb4a90 100644 --- a/extensions/mattermost/package.json +++ b/extensions/mattermost/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/mattermost", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Mattermost channel plugin", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -42,10 +42,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/media-understanding-core/package.json b/extensions/media-understanding-core/package.json index a9cd82dfbbe..578f9bf07e9 100644 --- a/extensions/media-understanding-core/package.json +++ b/extensions/media-understanding-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/media-understanding-core", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw media understanding runtime package", "type": "module", diff --git a/extensions/memory-core/package.json b/extensions/memory-core/package.json index b5d9eae391f..e460399af73 100644 --- a/extensions/memory-core/package.json +++ b/extensions/memory-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-core", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw core memory search plugin", "type": "module", @@ -13,7 +13,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/memory-lancedb/package.json b/extensions/memory-lancedb/package.json index cee9e673461..2c6b0746dd2 100644 --- a/extensions/memory-lancedb/package.json +++ b/extensions/memory-lancedb/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-lancedb", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture", "repository": { "type": "git", @@ -25,10 +25,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/memory-wiki/package.json b/extensions/memory-wiki/package.json index 2c6c5bdc71a..ec6fba27690 100644 --- a/extensions/memory-wiki/package.json +++ b/extensions/memory-wiki/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-wiki", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw persistent wiki plugin", "type": "module", @@ -13,7 +13,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/microsoft-foundry/package.json b/extensions/microsoft-foundry/package.json index 41dc61ab5f2..4361d7a3dbe 100644 --- a/extensions/microsoft-foundry/package.json +++ b/extensions/microsoft-foundry/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/microsoft-foundry", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Microsoft Foundry provider plugin", "type": "module", diff --git a/extensions/microsoft/package.json b/extensions/microsoft/package.json index d2d3a5c5d7a..fd19aa84b7e 100644 --- a/extensions/microsoft/package.json +++ b/extensions/microsoft/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/microsoft-speech", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Microsoft speech plugin", "type": "module", diff --git a/extensions/migrate-claude/package.json b/extensions/migrate-claude/package.json index c994762b6f7..709f423c13b 100644 --- a/extensions/migrate-claude/package.json +++ b/extensions/migrate-claude/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/migrate-claude", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "Claude to OpenClaw migration provider", "type": "module", @@ -9,7 +9,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/migrate-hermes/package.json b/extensions/migrate-hermes/package.json index 5ed14e9f63b..a664b98f08d 100644 --- a/extensions/migrate-hermes/package.json +++ b/extensions/migrate-hermes/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/migrate-hermes", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "Hermes to OpenClaw migration provider", "type": "module", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/minimax/package.json b/extensions/minimax/package.json index da40b4f15a9..cec632b43bb 100644 --- a/extensions/minimax/package.json +++ b/extensions/minimax/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/minimax-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw MiniMax provider and OAuth plugin", "type": "module", diff --git a/extensions/mistral/package.json b/extensions/mistral/package.json index 60bc927ca87..e8e774f3764 100644 --- a/extensions/mistral/package.json +++ b/extensions/mistral/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/mistral-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Mistral provider plugin", "type": "module", diff --git a/extensions/moonshot/package.json b/extensions/moonshot/package.json index dd3df3e3c84..155d885ab5c 100644 --- a/extensions/moonshot/package.json +++ b/extensions/moonshot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/moonshot-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Moonshot provider plugin", "type": "module", diff --git a/extensions/msteams/package.json b/extensions/msteams/package.json index f55d534587c..598ba975a1e 100644 --- a/extensions/msteams/package.json +++ b/extensions/msteams/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/msteams", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Microsoft Teams channel plugin", "repository": { "type": "git", @@ -22,7 +22,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -58,10 +58,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/nextcloud-talk/package.json b/extensions/nextcloud-talk/package.json index 8efcd6e4239..92729815044 100644 --- a/extensions/nextcloud-talk/package.json +++ b/extensions/nextcloud-talk/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nextcloud-talk", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Nextcloud Talk channel plugin", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -47,10 +47,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/nostr/package.json b/extensions/nostr/package.json index 7c770d849bb..e6612a47056 100644 --- a/extensions/nostr/package.json +++ b/extensions/nostr/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nostr", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -54,10 +54,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/nvidia/package.json b/extensions/nvidia/package.json index eb2a9539dc3..d1b8b125ad1 100644 --- a/extensions/nvidia/package.json +++ b/extensions/nvidia/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nvidia-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw NVIDIA provider plugin", "type": "module", diff --git a/extensions/ollama/package.json b/extensions/ollama/package.json index f4620315ccc..7b4f3635c2e 100644 --- a/extensions/ollama/package.json +++ b/extensions/ollama/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/ollama-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Ollama provider plugin", "type": "module", diff --git a/extensions/open-prose/package.json b/extensions/open-prose/package.json index 6576a17e978..4cdd238a861 100644 --- a/extensions/open-prose/package.json +++ b/extensions/open-prose/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/open-prose", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenProse VM skill pack plugin (slash command + telemetry).", "type": "module", diff --git a/extensions/openai/package.json b/extensions/openai/package.json index cea8e877c23..5d8e4653275 100644 --- a/extensions/openai/package.json +++ b/extensions/openai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openai-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw OpenAI provider plugins", "type": "module", diff --git a/extensions/opencode-go/package.json b/extensions/opencode-go/package.json index 5d632056de6..581330e6b8b 100644 --- a/extensions/opencode-go/package.json +++ b/extensions/opencode-go/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/opencode-go-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw OpenCode Go provider plugin", "type": "module", diff --git a/extensions/opencode/package.json b/extensions/opencode/package.json index 9db7e22c6c6..31dd8537422 100644 --- a/extensions/opencode/package.json +++ b/extensions/opencode/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/opencode-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw OpenCode Zen provider plugin", "type": "module", diff --git a/extensions/openrouter/package.json b/extensions/openrouter/package.json index 04943e2fe11..97747ad41d4 100644 --- a/extensions/openrouter/package.json +++ b/extensions/openrouter/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openrouter-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw OpenRouter provider plugin", "type": "module", diff --git a/extensions/openshell/package.json b/extensions/openshell/package.json index 86bd9868906..bf04fd493bc 100644 --- a/extensions/openshell/package.json +++ b/extensions/openshell/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openshell-sandbox", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw OpenShell sandbox backend", "type": "module", diff --git a/extensions/perplexity/package.json b/extensions/perplexity/package.json index 913c0766e15..66b9c1f3f16 100644 --- a/extensions/perplexity/package.json +++ b/extensions/perplexity/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/perplexity-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Perplexity plugin", "type": "module", diff --git a/extensions/qa-channel/package.json b/extensions/qa-channel/package.json index 4d03aa640cf..302cd1896c6 100644 --- a/extensions/qa-channel/package.json +++ b/extensions/qa-channel/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qa-channel", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw QA synthetic channel plugin", "type": "module", @@ -18,7 +18,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/qa-lab/package.json b/extensions/qa-lab/package.json index 3ba37523930..ab4080866c3 100644 --- a/extensions/qa-lab/package.json +++ b/extensions/qa-lab/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qa-lab", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw QA lab plugin with private debugger UI and scenario runner", "type": "module", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -28,7 +28,7 @@ "./index.ts" ], "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" } } } diff --git a/extensions/qa-matrix/package.json b/extensions/qa-matrix/package.json index 1dd5c945327..d602befa699 100644 --- a/extensions/qa-matrix/package.json +++ b/extensions/qa-matrix/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qa-matrix", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Matrix QA runner plugin", "type": "module", @@ -13,7 +13,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -25,7 +25,7 @@ "./index.ts" ], "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" } } } diff --git a/extensions/qianfan/package.json b/extensions/qianfan/package.json index a5c203fea14..7db8962b710 100644 --- a/extensions/qianfan/package.json +++ b/extensions/qianfan/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qianfan-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Qianfan provider plugin", "type": "module", diff --git a/extensions/qqbot/package.json b/extensions/qqbot/package.json index 57e14159e0f..401cb36f687 100644 --- a/extensions/qqbot/package.json +++ b/extensions/qqbot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qqbot", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": false, "description": "OpenClaw QQ Bot channel plugin", "repository": { @@ -21,7 +21,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -50,10 +50,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/qwen/package.json b/extensions/qwen/package.json index 32d7cf0695f..6e9aa1ef248 100644 --- a/extensions/qwen/package.json +++ b/extensions/qwen/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qwen-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Qwen Cloud provider plugin", "type": "module", diff --git a/extensions/runway/package.json b/extensions/runway/package.json index 4089da64b97..b907801aa34 100644 --- a/extensions/runway/package.json +++ b/extensions/runway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/runway-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Runway video provider plugin", "type": "module", diff --git a/extensions/searxng/package.json b/extensions/searxng/package.json index 157878cec2d..bfbe164f218 100644 --- a/extensions/searxng/package.json +++ b/extensions/searxng/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/searxng-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw SearXNG plugin", "type": "module", diff --git a/extensions/senseaudio/package.json b/extensions/senseaudio/package.json index b031130a95e..b0567789efa 100644 --- a/extensions/senseaudio/package.json +++ b/extensions/senseaudio/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/senseaudio-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw SenseAudio media-understanding provider", "type": "module", diff --git a/extensions/sglang/package.json b/extensions/sglang/package.json index edd9b2700f4..c62cee666da 100644 --- a/extensions/sglang/package.json +++ b/extensions/sglang/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/sglang-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw SGLang provider plugin", "type": "module", diff --git a/extensions/signal/package.json b/extensions/signal/package.json index acc99f14855..b48f920af8e 100644 --- a/extensions/signal/package.json +++ b/extensions/signal/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/signal", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Signal channel plugin", "type": "module", diff --git a/extensions/skill-workshop/package.json b/extensions/skill-workshop/package.json index 4bf99873791..89a9f50c52c 100644 --- a/extensions/skill-workshop/package.json +++ b/extensions/skill-workshop/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/skill-workshop", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw skill workshop plugin", "type": "module", diff --git a/extensions/slack/package.json b/extensions/slack/package.json index 4bef40ed503..10f97f52d72 100644 --- a/extensions/slack/package.json +++ b/extensions/slack/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/slack", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Slack channel plugin", "type": "module", diff --git a/extensions/speech-core/package.json b/extensions/speech-core/package.json index c2964236269..5f1de4711c2 100644 --- a/extensions/speech-core/package.json +++ b/extensions/speech-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/speech-core", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw speech runtime package", "type": "module", diff --git a/extensions/stepfun/package.json b/extensions/stepfun/package.json index a99d07071b7..d1dc5a5d1b7 100644 --- a/extensions/stepfun/package.json +++ b/extensions/stepfun/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/stepfun-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw StepFun provider plugin", "type": "module", diff --git a/extensions/synology-chat/package.json b/extensions/synology-chat/package.json index 87aa086789f..6c80c0fe968 100644 --- a/extensions/synology-chat/package.json +++ b/extensions/synology-chat/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/synology-chat", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "Synology Chat channel plugin for OpenClaw", "repository": { "type": "git", @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/synthetic/package.json b/extensions/synthetic/package.json index 05b0d411fd8..002c104f774 100644 --- a/extensions/synthetic/package.json +++ b/extensions/synthetic/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/synthetic-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Synthetic provider plugin", "type": "module", diff --git a/extensions/tavily/package.json b/extensions/tavily/package.json index 3d8ca3151c3..8fac74af15b 100644 --- a/extensions/tavily/package.json +++ b/extensions/tavily/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tavily-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Tavily plugin", "type": "module", diff --git a/extensions/telegram/package.json b/extensions/telegram/package.json index 9174f7507e8..4e0eb61cf46 100644 --- a/extensions/telegram/package.json +++ b/extensions/telegram/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/telegram", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Telegram channel plugin", "type": "module", diff --git a/extensions/tencent/package.json b/extensions/tencent/package.json index 0d74fcef382..c185ee843fe 100644 --- a/extensions/tencent/package.json +++ b/extensions/tencent/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tencent-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Tencent Cloud provider plugin (TokenHub + Token Plan)", "type": "module", diff --git a/extensions/tlon/package.json b/extensions/tlon/package.json index 29bd8071029..a8d9c1edc88 100644 --- a/extensions/tlon/package.json +++ b/extensions/tlon/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tlon", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Tlon/Urbit channel plugin", "repository": { "type": "git", @@ -18,7 +18,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -72,10 +72,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/together/package.json b/extensions/together/package.json index a6800b9ee67..400091ee8fd 100644 --- a/extensions/together/package.json +++ b/extensions/together/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/together-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Together provider plugin", "type": "module", diff --git a/extensions/tokenjuice/package.json b/extensions/tokenjuice/package.json index 1322422defe..9b02e8003ae 100644 --- a/extensions/tokenjuice/package.json +++ b/extensions/tokenjuice/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tokenjuice", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "Bundled tokenjuice exec output compaction plugin", "type": "module", "dependencies": { diff --git a/extensions/tts-local-cli/package.json b/extensions/tts-local-cli/package.json index c70554bd23b..4d700023270 100644 --- a/extensions/tts-local-cli/package.json +++ b/extensions/tts-local-cli/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tts-local-cli", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw local CLI TTS plugin", "type": "module", diff --git a/extensions/twitch/package.json b/extensions/twitch/package.json index 28698646e1d..2bbc5d009fc 100644 --- a/extensions/twitch/package.json +++ b/extensions/twitch/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/twitch", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Twitch channel plugin", "repository": { "type": "git", @@ -26,10 +26,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "channel": { "id": "twitch", diff --git a/extensions/venice/package.json b/extensions/venice/package.json index 187463a0cc6..66fdf9c7cf2 100644 --- a/extensions/venice/package.json +++ b/extensions/venice/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/venice-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Venice provider plugin", "type": "module", diff --git a/extensions/vercel-ai-gateway/package.json b/extensions/vercel-ai-gateway/package.json index 155b15d826b..fdc026e475c 100644 --- a/extensions/vercel-ai-gateway/package.json +++ b/extensions/vercel-ai-gateway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vercel-ai-gateway-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Vercel AI Gateway provider plugin", "type": "module", diff --git a/extensions/video-generation-core/package.json b/extensions/video-generation-core/package.json index c46df53a30f..4b384c354c3 100644 --- a/extensions/video-generation-core/package.json +++ b/extensions/video-generation-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/video-generation-core", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw video generation runtime package", "type": "module", diff --git a/extensions/vllm/package.json b/extensions/vllm/package.json index 13f0bac0a46..9aa517c72da 100644 --- a/extensions/vllm/package.json +++ b/extensions/vllm/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vllm-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw vLLM provider plugin", "type": "module", diff --git a/extensions/voice-call/package.json b/extensions/voice-call/package.json index 6074f2c2313..73bd0b03e72 100644 --- a/extensions/voice-call/package.json +++ b/extensions/voice-call/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/voice-call", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw voice-call plugin", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -34,10 +34,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/volcengine/package.json b/extensions/volcengine/package.json index 73701b3f429..bf4a41a30a7 100644 --- a/extensions/volcengine/package.json +++ b/extensions/volcengine/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/volcengine-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Volcengine provider plugin", "type": "module", diff --git a/extensions/voyage/package.json b/extensions/voyage/package.json index 8fd53f7a47a..ee88faa3dcb 100644 --- a/extensions/voyage/package.json +++ b/extensions/voyage/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/voyage-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Voyage embedding provider plugin", "type": "module", diff --git a/extensions/vydra/package.json b/extensions/vydra/package.json index fad8a8f0644..49383ea834e 100644 --- a/extensions/vydra/package.json +++ b/extensions/vydra/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vydra-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Vydra media provider plugin", "type": "module", diff --git a/extensions/web-readability/package.json b/extensions/web-readability/package.json index 125d705bb11..2bd2e843df9 100644 --- a/extensions/web-readability/package.json +++ b/extensions/web-readability/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/web-readability-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw local Readability web extraction plugin", "type": "module", diff --git a/extensions/webhooks/package.json b/extensions/webhooks/package.json index 2aa4381d635..aa11f87ed5b 100644 --- a/extensions/webhooks/package.json +++ b/extensions/webhooks/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/webhooks", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw webhook bridge plugin", "type": "module", diff --git a/extensions/whatsapp/package.json b/extensions/whatsapp/package.json index 2579d495a02..a916355f762 100644 --- a/extensions/whatsapp/package.json +++ b/extensions/whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/whatsapp", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw WhatsApp channel plugin", "repository": { "type": "git", @@ -19,7 +19,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -61,10 +61,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/xai/package.json b/extensions/xai/package.json index 77fee442062..40627d5073b 100644 --- a/extensions/xai/package.json +++ b/extensions/xai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/xai-plugin", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw xAI plugin", "type": "module", diff --git a/extensions/xiaomi/package.json b/extensions/xiaomi/package.json index d07b2223fbb..ccb1449966f 100644 --- a/extensions/xiaomi/package.json +++ b/extensions/xiaomi/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/xiaomi-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Xiaomi provider plugin", "type": "module", diff --git a/extensions/zai/package.json b/extensions/zai/package.json index ea80e2951fa..69335391b6e 100644 --- a/extensions/zai/package.json +++ b/extensions/zai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zai-provider", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "private": true, "description": "OpenClaw Z.AI provider plugin", "type": "module", diff --git a/extensions/zalo/package.json b/extensions/zalo/package.json index 93f97d9f553..21c955f2c09 100644 --- a/extensions/zalo/package.json +++ b/extensions/zalo/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zalo", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Zalo channel plugin", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -46,10 +46,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/zalouser/package.json b/extensions/zalouser/package.json index 3314c913367..81d58f29128 100644 --- a/extensions/zalouser/package.json +++ b/extensions/zalouser/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zalouser", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "OpenClaw Zalo Personal Account plugin via native zca-js integration", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.5.2-beta.1" + "openclaw": ">=2026.5.2-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -53,10 +53,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.5.2-beta.1" + "pluginApi": ">=2026.5.2-beta.2" }, "build": { - "openclawVersion": "2026.5.2-beta.1" + "openclawVersion": "2026.5.2-beta.2" }, "release": { "publishToClawHub": true, diff --git a/package.json b/package.json index dff6021f44c..d427980731a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openclaw", - "version": "2026.5.2-beta.1", + "version": "2026.5.2-beta.2", "description": "Multi-channel AI gateway with extensible messaging integrations", "keywords": [], "homepage": "https://github.com/openclaw/openclaw#readme", diff --git a/scripts/runtime-postbuild.mjs b/scripts/runtime-postbuild.mjs index 8d9b9be9949..c865ed7ca1e 100644 --- a/scripts/runtime-postbuild.mjs +++ b/scripts/runtime-postbuild.mjs @@ -10,6 +10,27 @@ import { writeOfficialChannelCatalog } from "./write-official-channel-catalog.mj const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const ROOT_RUNTIME_ALIAS_PATTERN = /^(?.+\.(?:runtime|contract))-[A-Za-z0-9_-]+\.js$/u; +const ROOT_STABLE_RUNTIME_ALIAS_PATTERN = /^.+\.(?:runtime|contract)\.js$/u; +const ROOT_RUNTIME_IMPORT_SPECIFIER_PATTERN = + /(["'])\.\/([^"']+\.(?:runtime|contract)-[A-Za-z0-9_-]+\.js)\1/gu; +const LEGACY_ROOT_RUNTIME_COMPAT_ALIASES = [ + // v2026.4.29 dispatch lazy chunks. Package updates used to replace the + // dist tree before the live gateway had restarted, so an already-loaded old + // dispatch chunk could still resolve these names after the swap. + ["abort.runtime-DX6vo4yJ.js", "abort.runtime.js"], + ["get-reply-from-config.runtime-uABrvCZ-.js", "get-reply-from-config.runtime.js"], + ["reply-media-paths.runtime-C5UnVaLF.js", "reply-media-paths.runtime.js"], + ["route-reply.runtime-D4PGzijU.js", "route-reply.runtime.js"], + ["runtime-plugins.runtime-fLHuT7Vs.js", "runtime-plugins.runtime.js"], + ["tts.runtime-66taD50M.js", "tts.runtime.js"], + // v2026.5.2-beta.1 dispatch lazy chunks. + ["abort.runtime-CKviLU0L.js", "abort.runtime.js"], + ["get-reply-from-config.runtime-BzFAggVK.js", "get-reply-from-config.runtime.js"], + ["reply-media-paths.runtime-ZpULeITb.js", "reply-media-paths.runtime.js"], + ["route-reply.runtime-uzaOjbd1.js", "route-reply.runtime.js"], + ["runtime-plugins.runtime-CNAfmQRG.js", "runtime-plugins.runtime.js"], + ["tts.runtime-D-THXDsp.js", "tts.runtime.js"], +]; const LEGACY_CLI_EXIT_COMPAT_CHUNKS = [ { dest: "dist/memory-state-CcqRgDZU.js", @@ -99,6 +120,74 @@ export function writeStableRootRuntimeAliases(params = {}) { } } +export function rewriteRootRuntimeImportsToStableAliases(params = {}) { + const rootDir = params.rootDir ?? ROOT; + const distDir = path.join(rootDir, "dist"); + const fsImpl = params.fs ?? fs; + let entries = []; + try { + entries = fsImpl.readdirSync(distDir, { withFileTypes: true }); + } catch { + return; + } + + const runtimeAliasFiles = new Map(); + for (const entry of entries) { + if (!entry.isFile()) { + continue; + } + const match = entry.name.match(ROOT_RUNTIME_ALIAS_PATTERN); + if (match?.groups?.base) { + runtimeAliasFiles.set(entry.name, `${match.groups.base}.js`); + } + } + if (runtimeAliasFiles.size === 0) { + return; + } + + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith(".js")) { + continue; + } + if (ROOT_STABLE_RUNTIME_ALIAS_PATTERN.test(entry.name)) { + continue; + } + const filePath = path.join(distDir, entry.name); + let source; + try { + source = fsImpl.readFileSync(filePath, "utf8"); + } catch { + continue; + } + const rewritten = source.replace( + ROOT_RUNTIME_IMPORT_SPECIFIER_PATTERN, + (specifier, quote, fileName) => { + const aliasFileName = runtimeAliasFiles.get(fileName); + return aliasFileName ? `${quote}./${aliasFileName}${quote}` : specifier; + }, + ); + if (rewritten !== source) { + writeTextFileIfChanged(filePath, rewritten); + } + } +} + +export function writeLegacyRootRuntimeCompatAliases(params = {}) { + const rootDir = params.rootDir ?? ROOT; + const distDir = path.join(rootDir, "dist"); + const fsImpl = params.fs ?? fs; + for (const [legacyFileName, aliasFileName] of LEGACY_ROOT_RUNTIME_COMPAT_ALIASES) { + const legacyPath = path.join(distDir, legacyFileName); + if (fsImpl.existsSync(legacyPath)) { + continue; + } + if (!fsImpl.existsSync(path.join(distDir, aliasFileName))) { + continue; + } + writeTextFileIfChanged(legacyPath, `export * from "./${aliasFileName}";\n`); + } +} + export function writeLegacyCliExitCompatChunks(params = {}) { const rootDir = params.rootDir ?? ROOT; const chunks = params.chunks ?? LEGACY_CLI_EXIT_COMPAT_CHUNKS; @@ -124,7 +213,9 @@ export function runRuntimePostBuild(params = {}) { runPhase("bundled plugin metadata", () => copyBundledPluginMetadata(params)); runPhase("official channel catalog", () => writeOfficialChannelCatalog(params)); runPhase("bundled plugin runtime overlay", () => stageBundledPluginRuntime(params)); + runPhase("stable root runtime imports", () => rewriteRootRuntimeImportsToStableAliases(params)); runPhase("stable root runtime aliases", () => writeStableRootRuntimeAliases(params)); + runPhase("legacy root runtime compat aliases", () => writeLegacyRootRuntimeCompatAliases(params)); runPhase("legacy CLI exit compat chunks", () => writeLegacyCliExitCompatChunks(params)); runPhase("static extension assets", () => copyStaticExtensionAssets(params)); } diff --git a/src/agents/pi-embedded-runner-extraparams.test.ts b/src/agents/pi-embedded-runner-extraparams.test.ts index cd91d9826f5..158bf8e7b22 100644 --- a/src/agents/pi-embedded-runner-extraparams.test.ts +++ b/src/agents/pi-embedded-runner-extraparams.test.ts @@ -1882,7 +1882,7 @@ describe("applyExtraParamsToAgent", () => { expect(calls[0]?.transport).toBe("auto"); }); - it("defaults OpenAI transport to auto without websocket warm-up", () => { + it("defaults OpenAI API-key GPT-5 transport to SSE without websocket warm-up", () => { const { calls, agent } = createOptionsCaptureAgent(); applyExtraParamsToAgent(agent, undefined, "openai", "gpt-5"); @@ -1896,7 +1896,7 @@ describe("applyExtraParamsToAgent", () => { void agent.streamFn?.(model, context, {}); expect(calls).toHaveLength(1); - expect(calls[0]?.transport).toBe("auto"); + expect(calls[0]?.transport).toBe("sse"); expect(calls[0]?.openaiWsWarmup).toBe(false); }); diff --git a/src/agents/pi-embedded-runner/extra-params.provider-runtime.test.ts b/src/agents/pi-embedded-runner/extra-params.provider-runtime.test.ts index 4025bec5928..f5ea56fb875 100644 --- a/src/agents/pi-embedded-runner/extra-params.provider-runtime.test.ts +++ b/src/agents/pi-embedded-runner/extra-params.provider-runtime.test.ts @@ -8,6 +8,11 @@ import { } from "./extra-params.js"; import { runExtraParamsCase } from "./extra-params.test-support.js"; +type OpenAIResponseRuntimeOptions = { + transport?: string; + openaiWsWarmup?: boolean; +}; + vi.mock("@mariozechner/pi-ai", () => createPiAiStreamSimpleMock()); beforeEach(() => { @@ -130,4 +135,58 @@ describe("extra-params: provider runtime handoff", () => { expect(payload.think).toBeUndefined(); }); + + it("defaults OpenAI GPT-5 API-key runs to SSE transport", () => { + const result = runExtraParamsCase({ + applyProvider: "openai", + applyModelId: "gpt-5.4", + model: { + api: "openai-responses", + provider: "openai", + id: "gpt-5.4", + } as unknown as Model<"openai-responses">, + payload: { + model: "gpt-5.4", + input: [], + }, + }); + + const options = result.options as OpenAIResponseRuntimeOptions | undefined; + expect(options?.transport).toBe("sse"); + expect(options?.openaiWsWarmup).toBe(false); + }); + + it("preserves explicit OpenAI GPT-5 transport overrides", () => { + const result = runExtraParamsCase({ + applyProvider: "openai", + applyModelId: "gpt-5.4", + cfg: { + agents: { + defaults: { + models: { + "openai/gpt-5.4": { + params: { + transport: "websocket", + openaiWsWarmup: true, + }, + }, + }, + }, + }, + }, + model: { + api: "openai-responses", + provider: "openai", + id: "gpt-5.4", + } as unknown as Model<"openai-responses">, + payload: { + model: "gpt-5.4", + input: [], + }, + }); + + const options = result.options as OpenAIResponseRuntimeOptions | undefined; + expect(options?.transport).toBe("websocket"); + expect(options?.openaiWsWarmup).toBe(true); + }); }); diff --git a/src/agents/pi-embedded-runner/extra-params.ts b/src/agents/pi-embedded-runner/extra-params.ts index 48091785712..52af7510662 100644 --- a/src/agents/pi-embedded-runner/extra-params.ts +++ b/src/agents/pi-embedded-runner/extra-params.ts @@ -323,6 +323,9 @@ function applyDefaultOpenAIGptRuntimeParams( if (!Object.hasOwn(merged, "text_verbosity") && !Object.hasOwn(merged, "textVerbosity")) { merged.text_verbosity = "low"; } + if (params.provider === "openai" && !Object.hasOwn(merged, "transport")) { + merged.transport = "sse"; + } if (!Object.hasOwn(merged, "openaiWsWarmup")) { merged.openaiWsWarmup = false; } diff --git a/src/channels/plugins/catalog.ts b/src/channels/plugins/catalog.ts index 3dfc228b44e..c8111c46a00 100644 --- a/src/channels/plugins/catalog.ts +++ b/src/channels/plugins/catalog.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { MANIFEST_KEY } from "../../compat/legacy-names.js"; import { resolveOpenClawPackageRootSync } from "../../infra/openclaw-root.js"; import { listChannelCatalogEntries } from "../../plugins/channel-catalog-registry.js"; +import { resolveChannelAwareNpmSpec } from "../../plugins/channel-npm-spec.js"; import { describePluginInstallSource, type PluginInstallSourceInfo, @@ -239,12 +240,16 @@ function toChannelMeta(params: { function resolveInstallInfo(params: { install?: PluginPackageInstall; packageName?: string; + packageVersion?: string; packageDir?: string; workspaceDir?: string; }): ChannelPluginCatalogEntry["install"] | null { const clawhubSpec = normalizeOptionalString(params.install?.clawhubSpec); - const npmSpec = - normalizeOptionalString(params.install?.npmSpec) ?? normalizeOptionalString(params.packageName); + const npmSpec = resolveChannelAwareNpmSpec({ + npmSpec: params.install?.npmSpec, + packageName: params.packageName, + packageVersion: params.packageVersion, + }); if (!clawhubSpec && !npmSpec) { return null; } @@ -295,6 +300,7 @@ function resolveInstallInfo(params: { function buildCatalogEntryFromManifest(params: { pluginId?: string; packageName?: string; + packageVersion?: string; packageDir?: string; origin?: PluginOrigin; workspaceDir?: string; @@ -315,6 +321,7 @@ function buildCatalogEntryFromManifest(params: { const install = resolveInstallInfo({ install: params.install, packageName: params.packageName, + packageVersion: params.packageVersion, packageDir: params.packageDir, workspaceDir: params.workspaceDir, }); @@ -338,6 +345,7 @@ function buildExternalCatalogEntry(entry: ExternalCatalogEntry): ChannelPluginCa const manifest = entry[MANIFEST_KEY]; return buildCatalogEntryFromManifest({ packageName: entry.name, + packageVersion: entry.version, channel: manifest?.channel, install: manifest?.install, }); @@ -387,6 +395,7 @@ export function listChannelPluginCatalogEntries( const entry = buildCatalogEntryFromManifest({ pluginId: candidate.pluginId, packageName: candidate.packageName, + packageVersion: candidate.packageVersion, packageDir: candidate.rootDir, origin: candidate.origin, workspaceDir: candidate.workspaceDir ?? options.workspaceDir, diff --git a/src/channels/plugins/contracts/test-helpers/channel-plugin-catalog-contract-suites.ts b/src/channels/plugins/contracts/test-helpers/channel-plugin-catalog-contract-suites.ts index c60344f6fd3..00c6e5bfc14 100644 --- a/src/channels/plugins/contracts/test-helpers/channel-plugin-catalog-contract-suites.ts +++ b/src/channels/plugins/contracts/test-helpers/channel-plugin-catalog-contract-suites.ts @@ -287,6 +287,39 @@ export function describeChannelPluginCatalogEntriesContract() { }; }, }, + { + name: "pins bare external prerelease package specs to the entry version", + setup: () => { + const dir = fs.mkdtempSync( + path.join(resolvePreferredOpenClawTmpDir(), "openclaw-catalog-prerelease-"), + ); + const catalogPath = path.join(dir, "catalog.json"); + writeCatalogFile(catalogPath, { + ...createCatalogEntry({ + packageName: "@openclaw/twitch", + channelId: "twitch", + label: "Twitch", + blurb: "Twitch chat integration", + }), + version: "2026.5.2-beta.2", + }); + return { + channelId: "twitch", + catalogPaths: [catalogPath], + expected: { + install: { npmSpec: "@openclaw/twitch@2026.5.2-beta.2" }, + installSource: { + npm: { + spec: "@openclaw/twitch@2026.5.2-beta.2", + packageName: "@openclaw/twitch", + selector: "2026.5.2-beta.2", + selectorKind: "exact-version", + }, + }, + }, + }; + }, + }, { name: "accepts external manifest entries with ClawHub-only install metadata", setup: () => { diff --git a/src/cli/plugins-location-bridges.ts b/src/cli/plugins-location-bridges.ts index 51fd5f66f1f..d0df16fbed8 100644 --- a/src/cli/plugins-location-bridges.ts +++ b/src/cli/plugins-location-bridges.ts @@ -43,6 +43,7 @@ function buildBridgeFromPersistedBundledRecord( officialInstall?.defaultChoice === "clawhub" && clawhubSpec ? "clawhub" : "npm", ...(npmSpec ? { npmSpec } : {}), ...(clawhubSpec ? { clawhubSpec } : {}), + ...(record.packageVersion ? { packageVersion: record.packageVersion } : {}), ...(record.enabledByDefault ? { enabledByDefault: true } : {}), ...(channelIds.length ? { channelIds } : {}), }; diff --git a/src/plugins/channel-catalog-registry.ts b/src/plugins/channel-catalog-registry.ts index f1c65050cf1..5f648ae1b12 100644 --- a/src/plugins/channel-catalog-registry.ts +++ b/src/plugins/channel-catalog-registry.ts @@ -10,6 +10,7 @@ export type PluginChannelCatalogEntry = { pluginId: string; origin: PluginOrigin; packageName?: string; + packageVersion?: string; workspaceDir?: string; rootDir: string; channel: PluginPackageChannel; @@ -43,6 +44,7 @@ export function listChannelCatalogEntries( pluginId: manifest.manifest.id, origin: candidate.origin, packageName: candidate.packageName, + packageVersion: candidate.packageVersion, workspaceDir: candidate.workspaceDir, rootDir: candidate.rootDir, channel, diff --git a/src/plugins/channel-npm-spec.test.ts b/src/plugins/channel-npm-spec.test.ts new file mode 100644 index 00000000000..73713bc837f --- /dev/null +++ b/src/plugins/channel-npm-spec.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vitest"; +import { resolveChannelAwareNpmSpec } from "./channel-npm-spec.js"; + +describe("resolveChannelAwareNpmSpec", () => { + it("pins bare npm specs to the package prerelease version", () => { + expect( + resolveChannelAwareNpmSpec({ + npmSpec: "@openclaw/twitch", + packageName: "@openclaw/twitch", + packageVersion: "2026.5.2-beta.2", + }), + ).toBe("@openclaw/twitch@2026.5.2-beta.2"); + }); + + it("targets the beta dist-tag for bare plugin specs on beta channel", () => { + expect( + resolveChannelAwareNpmSpec({ + npmSpec: "@openclaw/twitch", + channel: "beta", + }), + ).toBe("@openclaw/twitch@beta"); + }); + + it("preserves explicit versions and tags", () => { + expect( + resolveChannelAwareNpmSpec({ + npmSpec: "@openclaw/twitch@2026.5.2-beta.2", + channel: "beta", + }), + ).toBe("@openclaw/twitch@2026.5.2-beta.2"); + expect( + resolveChannelAwareNpmSpec({ + npmSpec: "@openclaw/twitch@latest", + packageVersion: "2026.5.2-beta.2", + }), + ).toBe("@openclaw/twitch@latest"); + }); +}); diff --git a/src/plugins/channel-npm-spec.ts b/src/plugins/channel-npm-spec.ts new file mode 100644 index 00000000000..92c183f70a6 --- /dev/null +++ b/src/plugins/channel-npm-spec.ts @@ -0,0 +1,35 @@ +import { isPrereleaseSemverVersion, parseRegistryNpmSpec } from "../infra/npm-registry-spec.js"; +import type { UpdateChannel } from "../infra/update-channels.js"; +import { normalizeOptionalString } from "../shared/string-coerce.js"; + +export function resolveChannelAwareNpmSpec(params: { + npmSpec?: string; + packageName?: string; + packageVersion?: string; + channel?: UpdateChannel; +}): string | undefined { + const npmSpec = + normalizeOptionalString(params.npmSpec) ?? normalizeOptionalString(params.packageName); + if (!npmSpec) { + return undefined; + } + const parsed = parseRegistryNpmSpec(npmSpec); + if (!parsed || parsed.selectorKind !== "none") { + return npmSpec; + } + const packageName = normalizeOptionalString(params.packageName); + const expectedName = packageName + ? (parseRegistryNpmSpec(packageName)?.name ?? packageName) + : undefined; + if (expectedName && parsed.name !== expectedName) { + return npmSpec; + } + const packageVersion = normalizeOptionalString(params.packageVersion); + if (packageVersion && isPrereleaseSemverVersion(packageVersion)) { + return `${parsed.name}@${packageVersion}`; + } + if (params.channel === "beta") { + return `${parsed.name}@beta`; + } + return npmSpec; +} diff --git a/src/plugins/externalized-bundled-plugins.ts b/src/plugins/externalized-bundled-plugins.ts index ab2c70aee17..1e262fee8d2 100644 --- a/src/plugins/externalized-bundled-plugins.ts +++ b/src/plugins/externalized-bundled-plugins.ts @@ -9,6 +9,8 @@ export type ExternalizedBundledPluginBridge = { preferredSource?: ExternalizedBundledPluginPreferredSource; /** npm spec OpenClaw can install when migrating the bundled plugin out. */ npmSpec?: string; + /** Version of the bundled package that authored the install hint. */ + packageVersion?: string; /** ClawHub spec OpenClaw can install when migrating the bundled plugin out. */ clawhubSpec?: string; /** Optional ClawHub base URL for non-default registries. */ diff --git a/src/plugins/update.test.ts b/src/plugins/update.test.ts index 446aa345fe2..f12ab8c4d78 100644 --- a/src/plugins/update.test.ts +++ b/src/plugins/update.test.ts @@ -1947,6 +1947,52 @@ describe("syncPluginsForUpdateChannel", () => { }); }); + it("uses the beta dist-tag when beta restores an externalized bundled npm plugin", async () => { + resolveBundledPluginSourcesMock.mockReturnValue(new Map()); + installPluginFromNpmSpecMock.mockResolvedValue( + createSuccessfulNpmUpdateResult({ + pluginId: "legacy-chat", + targetDir: "/tmp/openclaw-plugins/legacy-chat", + version: "2026.5.2-beta.2", + npmResolution: { + name: "@openclaw/legacy-chat", + version: "2026.5.2-beta.2", + resolvedSpec: "@openclaw/legacy-chat@2026.5.2-beta.2", + }, + }), + ); + + const result = await syncPluginsForUpdateChannel({ + channel: "beta", + externalizedBundledPluginBridges: [ + { + bundledPluginId: "legacy-chat", + npmSpec: "@openclaw/legacy-chat", + channelIds: ["legacy-chat"], + }, + ], + config: { + channels: { + "legacy-chat": { + enabled: true, + }, + }, + }, + }); + + expect(installPluginFromNpmSpecMock).toHaveBeenCalledWith( + expect.objectContaining({ + spec: "@openclaw/legacy-chat@beta", + mode: "update", + expectedPluginId: "legacy-chat", + }), + ); + expect(result.config.plugins?.installs?.["legacy-chat"]?.spec).toBe( + "@openclaw/legacy-chat@beta", + ); + expect(result.summary.switchedToNpm).toEqual(["legacy-chat"]); + }); + it("installs a ClawHub-preferred externalized bundled plugin", async () => { resolveBundledPluginSourcesMock.mockReturnValue(new Map()); installPluginFromClawHubMock.mockResolvedValue( diff --git a/src/plugins/update.ts b/src/plugins/update.ts index c20aca14198..5e1864e84be 100644 --- a/src/plugins/update.ts +++ b/src/plugins/update.ts @@ -13,6 +13,7 @@ import { compareComparableSemver, parseComparableSemver } from "../infra/semver- import type { UpdateChannel } from "../infra/update-channels.js"; import { resolveUserPath } from "../utils.js"; import { resolveBundledPluginSources } from "./bundled-sources.js"; +import { resolveChannelAwareNpmSpec } from "./channel-npm-spec.js"; import { buildClawHubPluginInstallRecordFields } from "./clawhub-install-records.js"; import { CLAWHUB_INSTALL_ERROR_CODE, installPluginFromClawHub } from "./clawhub.js"; import { normalizePluginsConfig, resolveEffectiveEnableState } from "./config-state.js"; @@ -507,8 +508,9 @@ function resolveClawHubUpdateSpecs(params: { function isBridgeAlreadyInstalledFromPreferredSource(params: { bridge: ExternalizedBundledPluginBridge; record: PluginInstallRecord; + channel: UpdateChannel; }): boolean { - const npmSpec = getExternalizedBundledPluginNpmSpec(params.bridge); + const npmSpec = resolveBridgeNpmSpec(params.bridge, params.channel); if (npmSpec && params.record.source === "npm" && params.record.spec === npmSpec) { return true; } @@ -518,6 +520,19 @@ function isBridgeAlreadyInstalledFromPreferredSource(params: { ); } +function resolveBridgeNpmSpec( + bridge: ExternalizedBundledPluginBridge, + channel: UpdateChannel, +): string { + return ( + resolveChannelAwareNpmSpec({ + npmSpec: getExternalizedBundledPluginNpmSpec(bridge), + packageVersion: bridge.packageVersion, + channel, + }) ?? "" + ); +} + function replacePluginIdInList( entries: string[] | undefined, fromId: string, @@ -1335,6 +1350,7 @@ export async function syncPluginsForUpdateChannel(params: { isBridgeAlreadyInstalledFromPreferredSource({ bridge, record: existing.record, + channel: params.channel, }) ) { if (existing.pluginId !== targetPluginId) { @@ -1358,7 +1374,7 @@ export async function syncPluginsForUpdateChannel(params: { } const preferredSource = getExternalizedBundledPluginPreferredSource(bridge); - const npmSpec = getExternalizedBundledPluginNpmSpec(bridge); + const npmSpec = resolveBridgeNpmSpec(bridge, params.channel); const clawhubSpec = getExternalizedBundledPluginClawHubSpec(bridge); let installSource = preferredSource; let installSpec = preferredSource === "clawhub" ? clawhubSpec : npmSpec; diff --git a/test/scripts/runtime-postbuild.test.ts b/test/scripts/runtime-postbuild.test.ts index 8636bfee2b4..9cd58bdf05c 100644 --- a/test/scripts/runtime-postbuild.test.ts +++ b/test/scripts/runtime-postbuild.test.ts @@ -4,7 +4,9 @@ import { describe, expect, it, vi } from "vitest"; import { copyStaticExtensionAssets, listStaticExtensionAssetOutputs, + rewriteRootRuntimeImportsToStableAliases, writeLegacyCliExitCompatChunks, + writeLegacyRootRuntimeCompatAliases, writeStableRootRuntimeAliases, } from "../../scripts/runtime-postbuild.mjs"; import { createScriptTestHarness } from "./test-helpers.js"; @@ -86,6 +88,78 @@ describe("runtime postbuild static assets", () => { await expect(fs.stat(path.join(distDir, "library.js"))).rejects.toThrow(); }); + it("rewrites root runtime imports to stable aliases", async () => { + const rootDir = createTempDir("openclaw-runtime-postbuild-"); + const distDir = path.join(rootDir, "dist"); + await fs.mkdir(distDir, { recursive: true }); + await fs.writeFile( + path.join(distDir, "runtime-plugins.runtime-AbCd1234.js"), + "export const ready = true;\n", + "utf8", + ); + await fs.writeFile( + path.join(distDir, "dispatch-OldHash.js"), + [ + 'const lazy = () => import("./runtime-plugins.runtime-AbCd1234.js");', + 'import "./missing.runtime-Nope.js";', + "", + ].join("\n"), + "utf8", + ); + + rewriteRootRuntimeImportsToStableAliases({ rootDir }); + + expect(await fs.readFile(path.join(distDir, "dispatch-OldHash.js"), "utf8")).toBe( + [ + 'const lazy = () => import("./runtime-plugins.runtime.js");', + 'import "./missing.runtime-Nope.js";', + "", + ].join("\n"), + ); + }); + + it("leaves stable alias files pointing at their hashed runtime chunks", async () => { + const rootDir = createTempDir("openclaw-runtime-postbuild-"); + const distDir = path.join(rootDir, "dist"); + await fs.mkdir(distDir, { recursive: true }); + await fs.writeFile( + path.join(distDir, "runtime-plugins.runtime-AbCd1234.js"), + "export const ready = true;\n", + "utf8", + ); + await fs.writeFile( + path.join(distDir, "runtime-plugins.runtime.js"), + 'export * from "./runtime-plugins.runtime-AbCd1234.js";\n', + "utf8", + ); + + rewriteRootRuntimeImportsToStableAliases({ rootDir }); + + expect(await fs.readFile(path.join(distDir, "runtime-plugins.runtime.js"), "utf8")).toBe( + 'export * from "./runtime-plugins.runtime-AbCd1234.js";\n', + ); + }); + + it("writes compatibility aliases for previous release runtime chunk names", async () => { + const rootDir = createTempDir("openclaw-runtime-postbuild-"); + const distDir = path.join(rootDir, "dist"); + await fs.mkdir(distDir, { recursive: true }); + await fs.writeFile( + path.join(distDir, "runtime-plugins.runtime.js"), + 'export * from "./runtime-plugins.runtime-NewHash.js";\n', + "utf8", + ); + + writeLegacyRootRuntimeCompatAliases({ rootDir }); + + expect( + await fs.readFile(path.join(distDir, "runtime-plugins.runtime-fLHuT7Vs.js"), "utf8"), + ).toBe('export * from "./runtime-plugins.runtime.js";\n'); + expect( + await fs.readFile(path.join(distDir, "runtime-plugins.runtime-CNAfmQRG.js"), "utf8"), + ).toBe('export * from "./runtime-plugins.runtime.js";\n'); + }); + it("writes legacy CLI exit compatibility chunks", async () => { const rootDir = createTempDir("openclaw-runtime-postbuild-");