diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ab4f298933..9f0372c422f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,10 @@ Docs: https://docs.openclaw.ai
### Fixes
+## 2026.4.19-beta.1
+
+### Fixes
+
- Agents/channels: route cross-agent subagent spawns through the target agent's bound channel account while preserving peer and workspace/role-scoped bindings, so child sessions no longer inherit the caller's account in shared rooms, workspaces, or multi-account setups. (#67508) Thanks @lukeboyett and @gumadeiras.
- Telegram/callbacks: treat permanent callback edit errors as completed updates so stale command pagination buttons no longer wedge the update watermark and block newer Telegram updates. (#68588) Thanks @Lucenx9.
- Browser/CDP: allow the selected remote CDP profile host for CDP health and control checks without widening browser navigation SSRF policy, so WSL-to-Windows Chrome endpoints no longer appear offline under strict defaults. Fixes #68108. (#68207) Thanks @Mlightsnow.
diff --git a/apps/android/app/build.gradle.kts b/apps/android/app/build.gradle.kts
index a8612a3da59..d3366d1d0aa 100644
--- a/apps/android/app/build.gradle.kts
+++ b/apps/android/app/build.gradle.kts
@@ -65,8 +65,8 @@ android {
applicationId = "ai.openclaw.app"
minSdk = 31
targetSdk = 36
- versionCode = 2026041890
- versionName = "2026.4.18"
+ versionCode = 2026041901
+ versionName = "2026.4.19-beta.1"
ndk {
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
diff --git a/apps/ios/CHANGELOG.md b/apps/ios/CHANGELOG.md
index e811561fd95..5ef3a2594a1 100644
--- a/apps/ios/CHANGELOG.md
+++ b/apps/ios/CHANGELOG.md
@@ -1,5 +1,9 @@
# OpenClaw iOS Changelog
+## 2026.4.19 - 2026-04-19
+
+Maintenance update for the current OpenClaw beta release.
+
## 2026.4.18 - 2026-04-18
Maintenance update for the current OpenClaw release.
diff --git a/apps/ios/Config/Version.xcconfig b/apps/ios/Config/Version.xcconfig
index b14905f4952..24923d50bca 100644
--- a/apps/ios/Config/Version.xcconfig
+++ b/apps/ios/Config/Version.xcconfig
@@ -2,8 +2,8 @@
// Source of truth: apps/ios/version.json
// Generated by scripts/ios-sync-versioning.ts.
-OPENCLAW_IOS_VERSION = 2026.4.18
-OPENCLAW_MARKETING_VERSION = 2026.4.18
+OPENCLAW_IOS_VERSION = 2026.4.19
+OPENCLAW_MARKETING_VERSION = 2026.4.19
OPENCLAW_BUILD_VERSION = 1
#include? "../build/Version.xcconfig"
diff --git a/apps/ios/fastlane/metadata/en-US/release_notes.txt b/apps/ios/fastlane/metadata/en-US/release_notes.txt
index 99afd00b10b..5090e4186ab 100644
--- a/apps/ios/fastlane/metadata/en-US/release_notes.txt
+++ b/apps/ios/fastlane/metadata/en-US/release_notes.txt
@@ -1 +1 @@
-Maintenance update for the current OpenClaw release.
+Maintenance update for the current OpenClaw beta release.
diff --git a/apps/ios/version.json b/apps/ios/version.json
index f6296a22fcc..12e69f6617b 100644
--- a/apps/ios/version.json
+++ b/apps/ios/version.json
@@ -1,3 +1,3 @@
{
- "version": "2026.4.18"
+ "version": "2026.4.19"
}
diff --git a/apps/macos/Sources/OpenClaw/Resources/Info.plist b/apps/macos/Sources/OpenClaw/Resources/Info.plist
index 1deab731832..733c957cc44 100644
--- a/apps/macos/Sources/OpenClaw/Resources/Info.plist
+++ b/apps/macos/Sources/OpenClaw/Resources/Info.plist
@@ -15,9 +15,9 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 2026.4.18
+ 2026.4.19-beta.1
CFBundleVersion
- 2026041890
+ 2026041901
CFBundleIconFile
OpenClaw
CFBundleURLTypes
diff --git a/docs/.generated/config-baseline.sha256 b/docs/.generated/config-baseline.sha256
index 0e7957dd132..550499df716 100644
--- a/docs/.generated/config-baseline.sha256
+++ b/docs/.generated/config-baseline.sha256
@@ -1,4 +1,4 @@
-5ce9d439f8cf84fc9d20c93436fea6492bdab0e84e9e51867648343e0375b670 config-baseline.json
+889094f0a34a8a8a8b7672b846f4cbe41e273ebb6fd230f1955ec80c65339bef config-baseline.json
10b7c57a6198526b846471e1bcda6e361c1f3db2e3b1cd24abd8bac11db56e16 config-baseline.core.json
-99bb34fcf83ba6bb50a3fc11f170bd379bee5728b0938707fc39ebd7638e12eb config-baseline.channel.json
+0982fc3d264047919333a57dfba1ba948e6639fb19659a400f947dfdd8b8d1de config-baseline.channel.json
b695cb31b4c0cf1d31f842f2892e99cc3ff8d84263ae72b72977cae844b81d6e config-baseline.plugin.json
diff --git a/extensions/acpx/package.json b/extensions/acpx/package.json
index d28704288b1..4c46c4f3853 100644
--- a/extensions/acpx/package.json
+++ b/extensions/acpx/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/acpx",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw ACP runtime backend",
"type": "module",
"dependencies": {
diff --git a/extensions/alibaba/package.json b/extensions/alibaba/package.json
index 88bd2cae376..933ef1f9c61 100644
--- a/extensions/alibaba/package.json
+++ b/extensions/alibaba/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/alibaba-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 58ba1bbd3d9..b61ff3492f0 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.4.18",
+ "version": "2026.4.19-beta.1",
"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 d57ae4f4c7a..d7e7f329d9a 100644
--- a/extensions/amazon-bedrock/package.json
+++ b/extensions/amazon-bedrock/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 030559beb7d..105f60b9e28 100644
--- a/extensions/anthropic-vertex/package.json
+++ b/extensions/anthropic-vertex/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-vertex-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Anthropic Vertex provider plugin",
"type": "module",
diff --git a/extensions/anthropic/package.json b/extensions/anthropic/package.json
index 3a5c0faea8d..dad285b59ab 100644
--- a/extensions/anthropic/package.json
+++ b/extensions/anthropic/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Anthropic provider plugin",
"type": "module",
diff --git a/extensions/arcee/package.json b/extensions/arcee/package.json
index 4dfe9333abb..c62678b4e96 100644
--- a/extensions/arcee/package.json
+++ b/extensions/arcee/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/arcee-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Arcee provider plugin",
"type": "module",
diff --git a/extensions/bluebubbles/package.json b/extensions/bluebubbles/package.json
index a92fad4df3f..4b5c3f1373a 100644
--- a/extensions/bluebubbles/package.json
+++ b/extensions/bluebubbles/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/bluebubbles",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw BlueBubbles channel plugin",
"type": "module",
"devDependencies": {
@@ -8,7 +8,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -43,10 +43,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/brave/package.json b/extensions/brave/package.json
index 8a61ebe8e6e..734d0b1f8d7 100644
--- a/extensions/brave/package.json
+++ b/extensions/brave/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/brave-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Brave plugin",
"type": "module",
diff --git a/extensions/browser/package.json b/extensions/browser/package.json
index d748bfcb756..f74a87379f4 100644
--- a/extensions/browser/package.json
+++ b/extensions/browser/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/browser-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw browser tool plugin",
"type": "module",
diff --git a/extensions/byteplus/package.json b/extensions/byteplus/package.json
index 7060cb9e8db..a0ea9d7b9fe 100644
--- a/extensions/byteplus/package.json
+++ b/extensions/byteplus/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/byteplus-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw BytePlus provider plugin",
"type": "module",
diff --git a/extensions/chutes/package.json b/extensions/chutes/package.json
index d42e643db30..5ab472852ca 100644
--- a/extensions/chutes/package.json
+++ b/extensions/chutes/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/chutes-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 0dffd4af276..fbadfd72bc4 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.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Cloudflare AI Gateway provider plugin",
"type": "module",
diff --git a/extensions/codex/package.json b/extensions/codex/package.json
index 677cbe66211..38a3499283e 100644
--- a/extensions/codex/package.json
+++ b/extensions/codex/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Codex harness and model provider plugin",
"type": "module",
"dependencies": {
diff --git a/extensions/comfy/package.json b/extensions/comfy/package.json
index fe3af253855..425a826cc95 100644
--- a/extensions/comfy/package.json
+++ b/extensions/comfy/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/comfy-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw ComfyUI provider plugin",
"type": "module",
diff --git a/extensions/copilot-proxy/package.json b/extensions/copilot-proxy/package.json
index 05d0a8afea2..3c73828a1eb 100644
--- a/extensions/copilot-proxy/package.json
+++ b/extensions/copilot-proxy/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/copilot-proxy",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Copilot Proxy provider plugin",
"type": "module",
diff --git a/extensions/deepgram/package.json b/extensions/deepgram/package.json
index cc18ac93bdc..a886cfd79d2 100644
--- a/extensions/deepgram/package.json
+++ b/extensions/deepgram/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepgram-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Deepgram media-understanding provider",
"type": "module",
diff --git a/extensions/deepseek/package.json b/extensions/deepseek/package.json
index 387fec7e95d..8395fc77ea1 100644
--- a/extensions/deepseek/package.json
+++ b/extensions/deepseek/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepseek-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw DeepSeek provider plugin",
"type": "module",
diff --git a/extensions/diagnostics-otel/package.json b/extensions/diagnostics-otel/package.json
index 0c201baa5da..42c31dce521 100644
--- a/extensions/diagnostics-otel/package.json
+++ b/extensions/diagnostics-otel/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-otel",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw diagnostics OpenTelemetry exporter",
"type": "module",
"dependencies": {
@@ -24,10 +24,10 @@
"./index.ts"
],
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/diffs/package.json b/extensions/diffs/package.json
index 8cdd24b2c5b..fc8ea9ec626 100644
--- a/extensions/diffs/package.json
+++ b/extensions/diffs/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/diffs",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw diff viewer plugin",
"type": "module",
diff --git a/extensions/discord/package.json b/extensions/discord/package.json
index 15e6bf63da0..6060ffece08 100644
--- a/extensions/discord/package.json
+++ b/extensions/discord/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/discord",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Discord channel plugin",
"type": "module",
"dependencies": {
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -52,10 +52,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"bundle": {
"stageRuntimeDependencies": true
diff --git a/extensions/duckduckgo/package.json b/extensions/duckduckgo/package.json
index 9a6d34fcfc1..db8270151cc 100644
--- a/extensions/duckduckgo/package.json
+++ b/extensions/duckduckgo/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/duckduckgo-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw DuckDuckGo plugin",
"type": "module",
diff --git a/extensions/elevenlabs/package.json b/extensions/elevenlabs/package.json
index de7077ba76b..3428e84891a 100644
--- a/extensions/elevenlabs/package.json
+++ b/extensions/elevenlabs/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/elevenlabs-speech",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw ElevenLabs speech plugin",
"type": "module",
diff --git a/extensions/exa/package.json b/extensions/exa/package.json
index 3ff137aa770..0c136139374 100644
--- a/extensions/exa/package.json
+++ b/extensions/exa/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/exa-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Exa plugin",
"type": "module",
diff --git a/extensions/fal/package.json b/extensions/fal/package.json
index 1f59af676aa..3500617cf95 100644
--- a/extensions/fal/package.json
+++ b/extensions/fal/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/fal-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw fal provider plugin",
"type": "module",
diff --git a/extensions/feishu/package.json b/extensions/feishu/package.json
index 59042547ac9..e174ff65000 100644
--- a/extensions/feishu/package.json
+++ b/extensions/feishu/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/feishu",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
"type": "module",
"dependencies": {
@@ -13,7 +13,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -44,10 +44,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"bundle": {
"stageRuntimeDependencies": true
diff --git a/extensions/firecrawl/package.json b/extensions/firecrawl/package.json
index f2940918aa2..888432b48fb 100644
--- a/extensions/firecrawl/package.json
+++ b/extensions/firecrawl/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/firecrawl-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Firecrawl plugin",
"type": "module",
diff --git a/extensions/fireworks/package.json b/extensions/fireworks/package.json
index e221d94e3ec..9416e63a0ee 100644
--- a/extensions/fireworks/package.json
+++ b/extensions/fireworks/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/fireworks-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Fireworks provider plugin",
"type": "module",
diff --git a/extensions/github-copilot/package.json b/extensions/github-copilot/package.json
index ba8eaca3cf4..9a685f14fd7 100644
--- a/extensions/github-copilot/package.json
+++ b/extensions/github-copilot/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/github-copilot-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw GitHub Copilot provider plugin",
"type": "module",
diff --git a/extensions/google/package.json b/extensions/google/package.json
index 5c314f88cd7..4fb9099ddfd 100644
--- a/extensions/google/package.json
+++ b/extensions/google/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Google plugin",
"type": "module",
diff --git a/extensions/googlechat/package.json b/extensions/googlechat/package.json
index 04177b3cff9..196dd3ed745 100644
--- a/extensions/googlechat/package.json
+++ b/extensions/googlechat/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/googlechat",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Google Chat channel plugin",
"type": "module",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/groq/package.json b/extensions/groq/package.json
index 8b561ba420d..acb158ce2c8 100644
--- a/extensions/groq/package.json
+++ b/extensions/groq/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/groq-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Groq media-understanding provider",
"type": "module",
diff --git a/extensions/huggingface/package.json b/extensions/huggingface/package.json
index af480e18975..bfa1ed7da56 100644
--- a/extensions/huggingface/package.json
+++ b/extensions/huggingface/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/huggingface-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 3639d98689b..c2cf116f2ec 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.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw image generation runtime package",
"type": "module",
diff --git a/extensions/imessage/package.json b/extensions/imessage/package.json
index 796e527938a..8d5947abfbf 100644
--- a/extensions/imessage/package.json
+++ b/extensions/imessage/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/imessage",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw iMessage channel plugin",
"type": "module",
diff --git a/extensions/irc/package.json b/extensions/irc/package.json
index 1c447b28aa5..beda195854d 100644
--- a/extensions/irc/package.json
+++ b/extensions/irc/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/irc",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw IRC channel plugin",
"type": "module",
"devDependencies": {
diff --git a/extensions/kilocode/package.json b/extensions/kilocode/package.json
index 494bb7a0d47..1feb00ddbcf 100644
--- a/extensions/kilocode/package.json
+++ b/extensions/kilocode/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/kilocode-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 a9d8b7c96d5..ba036cadb3a 100644
--- a/extensions/kimi-coding/package.json
+++ b/extensions/kimi-coding/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/kimi-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Kimi provider plugin",
"type": "module",
diff --git a/extensions/line/package.json b/extensions/line/package.json
index 00aa51e480a..bfd5f55b573 100644
--- a/extensions/line/package.json
+++ b/extensions/line/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/line",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw LINE channel plugin",
"type": "module",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/litellm/package.json b/extensions/litellm/package.json
index a1d5edb7f84..7460e7e3988 100644
--- a/extensions/litellm/package.json
+++ b/extensions/litellm/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/litellm-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw LiteLLM provider plugin",
"type": "module",
diff --git a/extensions/llm-task/package.json b/extensions/llm-task/package.json
index 0a6fbd3b053..f9ae3643c18 100644
--- a/extensions/llm-task/package.json
+++ b/extensions/llm-task/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/llm-task",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw JSON-only LLM task plugin",
"type": "module",
diff --git a/extensions/lmstudio/package.json b/extensions/lmstudio/package.json
index 37ba4bc77a9..3016f53aabf 100644
--- a/extensions/lmstudio/package.json
+++ b/extensions/lmstudio/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/lmstudio-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw LM Studio provider plugin",
"type": "module",
diff --git a/extensions/lobster/package.json b/extensions/lobster/package.json
index b04549f70cc..d920b5ad8f3 100644
--- a/extensions/lobster/package.json
+++ b/extensions/lobster/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/lobster",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
"type": "module",
"dependencies": {
@@ -15,10 +15,10 @@
"./index.ts"
],
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/matrix/CHANGELOG.md b/extensions/matrix/CHANGELOG.md
index 8ef6f437a8c..318fc0d2a11 100644
--- a/extensions/matrix/CHANGELOG.md
+++ b/extensions/matrix/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## 2026.4.19-beta.1
+
+### Changes
+
+- Version alignment with core OpenClaw release numbers.
+
This file tracks Matrix-related release notes for the local `@openclaw/matrix`
plugin since the `matrix-js-sdk` migration. Source release notes live in
`../../changelog.md`; exact repeated entries inside the same version are
diff --git a/extensions/matrix/package.json b/extensions/matrix/package.json
index ae730ce092c..37490177f32 100644
--- a/extensions/matrix/package.json
+++ b/extensions/matrix/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/matrix",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Matrix channel plugin",
"type": "module",
"dependencies": {
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/mattermost/package.json b/extensions/mattermost/package.json
index bef2bdc4ea0..c5e5151d8fd 100644
--- a/extensions/mattermost/package.json
+++ b/extensions/mattermost/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/mattermost",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Mattermost channel plugin",
"type": "module",
"dependencies": {
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/media-understanding-core/package.json b/extensions/media-understanding-core/package.json
index f2c58df2e67..0dec0a07b5c 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.4.18",
+ "version": "2026.4.19-beta.1",
"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 5d654640eb7..648d919689c 100644
--- a/extensions/memory-core/package.json
+++ b/extensions/memory-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-core",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw core memory search plugin",
"type": "module",
@@ -9,7 +9,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/memory-lancedb/package.json b/extensions/memory-lancedb/package.json
index 40c99007e8e..34e68ba14a1 100644
--- a/extensions/memory-lancedb/package.json
+++ b/extensions/memory-lancedb/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-lancedb",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
"type": "module",
"dependencies": {
@@ -21,10 +21,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/memory-wiki/package.json b/extensions/memory-wiki/package.json
index 66d5fc63518..49d67f48240 100644
--- a/extensions/memory-wiki/package.json
+++ b/extensions/memory-wiki/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-wiki",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw persistent wiki plugin",
"type": "module",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/microsoft-foundry/package.json b/extensions/microsoft-foundry/package.json
index b2fcc250aeb..ebe58f39594 100644
--- a/extensions/microsoft-foundry/package.json
+++ b/extensions/microsoft-foundry/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-foundry",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Microsoft Foundry provider plugin",
"type": "module",
diff --git a/extensions/microsoft/package.json b/extensions/microsoft/package.json
index 7c56b1aa128..2255a7e38fe 100644
--- a/extensions/microsoft/package.json
+++ b/extensions/microsoft/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-speech",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Microsoft speech plugin",
"type": "module",
diff --git a/extensions/minimax/package.json b/extensions/minimax/package.json
index 9fcd841de28..30a7cb2bc35 100644
--- a/extensions/minimax/package.json
+++ b/extensions/minimax/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/minimax-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw MiniMax provider and OAuth plugin",
"type": "module",
diff --git a/extensions/mistral/package.json b/extensions/mistral/package.json
index 4a33103e76f..9959a4b10ba 100644
--- a/extensions/mistral/package.json
+++ b/extensions/mistral/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/mistral-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Mistral provider plugin",
"type": "module",
diff --git a/extensions/moonshot/package.json b/extensions/moonshot/package.json
index 6b78a06d9c8..4444ba0cf1f 100644
--- a/extensions/moonshot/package.json
+++ b/extensions/moonshot/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/moonshot-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Moonshot provider plugin",
"type": "module",
diff --git a/extensions/msteams/package.json b/extensions/msteams/package.json
index a29320b6798..a5e283c766f 100644
--- a/extensions/msteams/package.json
+++ b/extensions/msteams/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/msteams",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Microsoft Teams channel plugin",
"type": "module",
"dependencies": {
@@ -18,7 +18,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -48,10 +48,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/nextcloud-talk/package.json b/extensions/nextcloud-talk/package.json
index caa6f5f0eaa..4c41dc2c6f3 100644
--- a/extensions/nextcloud-talk/package.json
+++ b/extensions/nextcloud-talk/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/nextcloud-talk",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Nextcloud Talk channel plugin",
"type": "module",
"devDependencies": {
@@ -8,7 +8,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -40,10 +40,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/nostr/package.json b/extensions/nostr/package.json
index a1361768cc4..a72f0941446 100644
--- a/extensions/nostr/package.json
+++ b/extensions/nostr/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/nostr",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
"type": "module",
"dependencies": {
@@ -11,7 +11,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -39,10 +39,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"bundle": {
"stageRuntimeDependencies": true
diff --git a/extensions/nvidia/package.json b/extensions/nvidia/package.json
index f97d276b35e..e26a0d6301a 100644
--- a/extensions/nvidia/package.json
+++ b/extensions/nvidia/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/nvidia-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw NVIDIA provider plugin",
"type": "module",
diff --git a/extensions/ollama/package.json b/extensions/ollama/package.json
index 3fb72ea9560..376229c8e8c 100644
--- a/extensions/ollama/package.json
+++ b/extensions/ollama/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/ollama-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Ollama provider plugin",
"type": "module",
diff --git a/extensions/open-prose/package.json b/extensions/open-prose/package.json
index 4f6231e88e9..5076bd8cffb 100644
--- a/extensions/open-prose/package.json
+++ b/extensions/open-prose/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/open-prose",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 4fbd866b597..ab185acdbf8 100644
--- a/extensions/openai/package.json
+++ b/extensions/openai/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/openai-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw OpenAI provider plugins",
"type": "module",
diff --git a/extensions/opencode-go/package.json b/extensions/opencode-go/package.json
index d515381b732..c73adcea9f2 100644
--- a/extensions/opencode-go/package.json
+++ b/extensions/opencode-go/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/opencode-go-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw OpenCode Go provider plugin",
"type": "module",
diff --git a/extensions/opencode/package.json b/extensions/opencode/package.json
index ad3d570e092..a0673e2046f 100644
--- a/extensions/opencode/package.json
+++ b/extensions/opencode/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/opencode-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw OpenCode Zen provider plugin",
"type": "module",
diff --git a/extensions/openrouter/package.json b/extensions/openrouter/package.json
index 94bcadfb800..b0a4c82382e 100644
--- a/extensions/openrouter/package.json
+++ b/extensions/openrouter/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/openrouter-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw OpenRouter provider plugin",
"type": "module",
diff --git a/extensions/openshell/package.json b/extensions/openshell/package.json
index b8bb411b02f..a5fb817b606 100644
--- a/extensions/openshell/package.json
+++ b/extensions/openshell/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/openshell-sandbox",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw OpenShell sandbox backend",
"type": "module",
diff --git a/extensions/perplexity/package.json b/extensions/perplexity/package.json
index dbcafd6ad2a..97494dafa41 100644
--- a/extensions/perplexity/package.json
+++ b/extensions/perplexity/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/perplexity-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Perplexity plugin",
"type": "module",
diff --git a/extensions/qa-channel/package.json b/extensions/qa-channel/package.json
index db4ec886b2a..f32bd9a4fff 100644
--- a/extensions/qa-channel/package.json
+++ b/extensions/qa-channel/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qa-channel",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw QA synthetic channel plugin",
"type": "module",
@@ -9,7 +9,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/qa-lab/package.json b/extensions/qa-lab/package.json
index 61d3904ae44..49f196ef20b 100644
--- a/extensions/qa-lab/package.json
+++ b/extensions/qa-lab/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qa-lab",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw QA lab plugin with private debugger UI and scenario runner",
"type": "module",
@@ -13,7 +13,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -30,7 +30,7 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
}
}
}
diff --git a/extensions/qa-matrix/package.json b/extensions/qa-matrix/package.json
index b4a75a18437..b1dc8048202 100644
--- a/extensions/qa-matrix/package.json
+++ b/extensions/qa-matrix/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qa-matrix",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Matrix QA runner plugin",
"type": "module",
@@ -10,7 +10,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -22,7 +22,7 @@
"./index.ts"
],
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
}
}
}
diff --git a/extensions/qianfan/package.json b/extensions/qianfan/package.json
index 760edf4a45b..fd5291a68c8 100644
--- a/extensions/qianfan/package.json
+++ b/extensions/qianfan/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qianfan-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Qianfan provider plugin",
"type": "module",
diff --git a/extensions/qqbot/package.json b/extensions/qqbot/package.json
index b8e9629d001..8c6093d2d35 100644
--- a/extensions/qqbot/package.json
+++ b/extensions/qqbot/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qqbot",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": false,
"description": "OpenClaw QQ Bot channel plugin",
"type": "module",
@@ -15,7 +15,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -44,10 +44,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"bundle": {
"stageRuntimeDependencies": true
diff --git a/extensions/qwen/package.json b/extensions/qwen/package.json
index ab355b7afcc..6205972e5d1 100644
--- a/extensions/qwen/package.json
+++ b/extensions/qwen/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/qwen-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Qwen Cloud provider plugin",
"type": "module",
diff --git a/extensions/runway/package.json b/extensions/runway/package.json
index edc709b7048..959cc0b0350 100644
--- a/extensions/runway/package.json
+++ b/extensions/runway/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/runway-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Runway video provider plugin",
"type": "module",
diff --git a/extensions/searxng/package.json b/extensions/searxng/package.json
index ce95f7d9a32..4927c044edd 100644
--- a/extensions/searxng/package.json
+++ b/extensions/searxng/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/searxng-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw SearXNG plugin",
"type": "module",
diff --git a/extensions/sglang/package.json b/extensions/sglang/package.json
index e434f0bcaab..bd70badefa5 100644
--- a/extensions/sglang/package.json
+++ b/extensions/sglang/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/sglang-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw SGLang provider plugin",
"type": "module",
diff --git a/extensions/signal/package.json b/extensions/signal/package.json
index 2d59f682652..f9f8dd2a856 100644
--- a/extensions/signal/package.json
+++ b/extensions/signal/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/signal",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Signal channel plugin",
"type": "module",
diff --git a/extensions/slack/package.json b/extensions/slack/package.json
index 78222a687fe..8bacfe530b6 100644
--- a/extensions/slack/package.json
+++ b/extensions/slack/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/slack",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Slack channel plugin",
"type": "module",
diff --git a/extensions/speech-core/package.json b/extensions/speech-core/package.json
index ec10dd0665e..561c744e4ae 100644
--- a/extensions/speech-core/package.json
+++ b/extensions/speech-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/speech-core",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw speech runtime package",
"type": "module",
diff --git a/extensions/stepfun/package.json b/extensions/stepfun/package.json
index 03f005207ce..cfd3a4da4a2 100644
--- a/extensions/stepfun/package.json
+++ b/extensions/stepfun/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/stepfun-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw StepFun provider plugin",
"type": "module",
diff --git a/extensions/synology-chat/package.json b/extensions/synology-chat/package.json
index 6a27618de06..32708002ca9 100644
--- a/extensions/synology-chat/package.json
+++ b/extensions/synology-chat/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/synology-chat",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "Synology Chat channel plugin for OpenClaw",
"type": "module",
"devDependencies": {
diff --git a/extensions/synthetic/package.json b/extensions/synthetic/package.json
index 62267069fcd..750f34d9ed0 100644
--- a/extensions/synthetic/package.json
+++ b/extensions/synthetic/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/synthetic-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Synthetic provider plugin",
"type": "module",
diff --git a/extensions/tavily/package.json b/extensions/tavily/package.json
index 5825dec32b8..3e3d77a9d51 100644
--- a/extensions/tavily/package.json
+++ b/extensions/tavily/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/tavily-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Tavily plugin",
"type": "module",
diff --git a/extensions/telegram/package.json b/extensions/telegram/package.json
index 39ea4b7bd11..e9f8765ee2a 100644
--- a/extensions/telegram/package.json
+++ b/extensions/telegram/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/telegram",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Telegram channel plugin",
"type": "module",
diff --git a/extensions/tlon/package.json b/extensions/tlon/package.json
index efb83192ba1..822d39c049c 100644
--- a/extensions/tlon/package.json
+++ b/extensions/tlon/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/tlon",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Tlon/Urbit channel plugin",
"type": "module",
"dependencies": {
@@ -14,7 +14,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
diff --git a/extensions/together/package.json b/extensions/together/package.json
index ad7fef598b2..5fbf8533338 100644
--- a/extensions/together/package.json
+++ b/extensions/together/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/together-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Together provider plugin",
"type": "module",
diff --git a/extensions/twitch/package.json b/extensions/twitch/package.json
index a33f7d48567..7affa2c58a5 100644
--- a/extensions/twitch/package.json
+++ b/extensions/twitch/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/twitch",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Twitch channel plugin",
"type": "module",
"dependencies": {
diff --git a/extensions/venice/package.json b/extensions/venice/package.json
index acff27704ef..9432b0364a3 100644
--- a/extensions/venice/package.json
+++ b/extensions/venice/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/venice-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"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 8402e2946ee..5af68108d60 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.4.18",
+ "version": "2026.4.19-beta.1",
"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 59b6338d1a1..efcc059c51f 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.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw video generation runtime package",
"type": "module",
diff --git a/extensions/vllm/package.json b/extensions/vllm/package.json
index 7d74718deac..9f41cbb6b6b 100644
--- a/extensions/vllm/package.json
+++ b/extensions/vllm/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/vllm-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw vLLM provider plugin",
"type": "module",
diff --git a/extensions/voice-call/package.json b/extensions/voice-call/package.json
index e2d0f39d819..4630096e9c0 100644
--- a/extensions/voice-call/package.json
+++ b/extensions/voice-call/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/voice-call",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw voice-call plugin",
"type": "module",
"dependencies": {
@@ -13,7 +13,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -28,10 +28,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/volcengine/package.json b/extensions/volcengine/package.json
index 67579a57a03..c6094dbf5b8 100644
--- a/extensions/volcengine/package.json
+++ b/extensions/volcengine/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/volcengine-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Volcengine provider plugin",
"type": "module",
diff --git a/extensions/voyage/package.json b/extensions/voyage/package.json
index a60b913b084..52bb99a71b7 100644
--- a/extensions/voyage/package.json
+++ b/extensions/voyage/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/voyage-provider",
- "version": "2026.4.15-beta.1",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Voyage embedding provider plugin",
"type": "module",
diff --git a/extensions/vydra/package.json b/extensions/vydra/package.json
index b43af1dcdf1..cfbea9d6752 100644
--- a/extensions/vydra/package.json
+++ b/extensions/vydra/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/vydra-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Vydra media provider plugin",
"type": "module",
diff --git a/extensions/webhooks/package.json b/extensions/webhooks/package.json
index fa7df15ef9a..785d605f1bd 100644
--- a/extensions/webhooks/package.json
+++ b/extensions/webhooks/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/webhooks",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw webhook bridge plugin",
"type": "module",
diff --git a/extensions/whatsapp/package.json b/extensions/whatsapp/package.json
index dfde178e1ab..1a54649bc46 100644
--- a/extensions/whatsapp/package.json
+++ b/extensions/whatsapp/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/whatsapp",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw WhatsApp channel plugin",
"type": "module",
"dependencies": {
@@ -13,7 +13,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -49,13 +49,13 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"bundle": {
"stageRuntimeDependencies": true
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/xai/package.json b/extensions/xai/package.json
index 793726e1499..815bdba82dc 100644
--- a/extensions/xai/package.json
+++ b/extensions/xai/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/xai-plugin",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw xAI plugin",
"type": "module",
diff --git a/extensions/xiaomi/package.json b/extensions/xiaomi/package.json
index efc651b5e8d..3919e2a7ba5 100644
--- a/extensions/xiaomi/package.json
+++ b/extensions/xiaomi/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/xiaomi-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Xiaomi provider plugin",
"type": "module",
diff --git a/extensions/zai/package.json b/extensions/zai/package.json
index 791c98b8b03..ce907e86e8a 100644
--- a/extensions/zai/package.json
+++ b/extensions/zai/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/zai-provider",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"private": true,
"description": "OpenClaw Z.AI provider plugin",
"type": "module",
diff --git a/extensions/zalo/package.json b/extensions/zalo/package.json
index 0988ad2e426..67be195fcf4 100644
--- a/extensions/zalo/package.json
+++ b/extensions/zalo/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/zalo",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Zalo channel plugin",
"type": "module",
"dependencies": {
@@ -11,7 +11,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -42,10 +42,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/extensions/zalouser/package.json b/extensions/zalouser/package.json
index cda0ab81833..91f1cab6c48 100644
--- a/extensions/zalouser/package.json
+++ b/extensions/zalouser/package.json
@@ -1,6 +1,6 @@
{
"name": "@openclaw/zalouser",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "OpenClaw Zalo Personal Account plugin via native zca-js integration",
"type": "module",
"dependencies": {
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
- "openclaw": ">=2026.4.18"
+ "openclaw": ">=2026.4.19-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -43,10 +43,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
- "pluginApi": ">=2026.4.18"
+ "pluginApi": ">=2026.4.19-beta.1"
},
"build": {
- "openclawVersion": "2026.4.18"
+ "openclawVersion": "2026.4.19-beta.1"
},
"release": {
"publishToClawHub": true,
diff --git a/package.json b/package.json
index 5caebd32ccc..a8c7ee300ce 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "openclaw",
- "version": "2026.4.18",
+ "version": "2026.4.19-beta.1",
"description": "Multi-channel AI gateway with extensible messaging integrations",
"keywords": [],
"homepage": "https://github.com/openclaw/openclaw#readme",
diff --git a/scripts/openclaw-npm-release-check.ts b/scripts/openclaw-npm-release-check.ts
index 77473e7d09b..e2166d5c10f 100644
--- a/scripts/openclaw-npm-release-check.ts
+++ b/scripts/openclaw-npm-release-check.ts
@@ -553,6 +553,9 @@ export function collectForbiddenPackedContentErrors(
const textPathPattern = /\.(?:[cm]?js|d\.ts|json|md|mjs|cjs)$/u;
const errors: string[] = [];
for (const packedPath of paths) {
+ if (packedPath === PACKAGE_DIST_INVENTORY_RELATIVE_PATH) {
+ continue;
+ }
if (
!FORBIDDEN_PRIVATE_QA_CONTENT_SCAN_PREFIXES.some((prefix) => packedPath.startsWith(prefix))
) {
diff --git a/scripts/release-check.ts b/scripts/release-check.ts
index a3d9857de6d..76f1adc2296 100755
--- a/scripts/release-check.ts
+++ b/scripts/release-check.ts
@@ -294,6 +294,9 @@ export function collectForbiddenPackContentPaths(
const textPathPattern = /\.(?:[cm]?js|d\.ts|json|md|mjs|cjs)$/u;
return [...paths]
.filter((packedPath) => {
+ if (packedPath === PACKAGE_DIST_INVENTORY_RELATIVE_PATH) {
+ return false;
+ }
if (!forbiddenPrivateQaContentScanPrefixes.some((prefix) => packedPath.startsWith(prefix))) {
return false;
}
diff --git a/src/channels/plugins/bundled.shape-guard.test.ts b/src/channels/plugins/bundled.shape-guard.test.ts
index eef427856d4..9b205060e3b 100644
--- a/src/channels/plugins/bundled.shape-guard.test.ts
+++ b/src/channels/plugins/bundled.shape-guard.test.ts
@@ -65,6 +65,89 @@ describe("bundled channel entry shape guards", () => {
expect(bundled.hasBundledChannelEntryFeature("slack", "accountInspect")).toBe(true);
});
+ it("fills sparse bundled channel plugin metadata from package metadata", async () => {
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-bundled-metadata-"));
+ const previousBundledPluginsDir = process.env.OPENCLAW_BUNDLED_PLUGINS_DIR;
+ const pluginDir = path.join(tempRoot, "dist", "extensions", "alpha");
+ fs.mkdirSync(pluginDir, { recursive: true });
+ fs.writeFileSync(
+ path.join(pluginDir, "index.js"),
+ [
+ "const plugin = {",
+ " id: 'alpha',",
+ " meta: { id: 'alpha' },",
+ " capabilities: { chatTypes: ['direct'] },",
+ " config: {},",
+ "};",
+ "export default {",
+ " kind: 'bundled-channel-entry',",
+ " id: 'alpha',",
+ " name: 'Alpha',",
+ " description: 'Alpha',",
+ " register() {},",
+ " loadChannelPlugin() { return plugin; },",
+ "};",
+ "",
+ ].join("\n"),
+ "utf8",
+ );
+
+ vi.doMock("../../plugins/bundled-channel-runtime.js", () => ({
+ listBundledChannelPluginMetadata: () => [
+ {
+ dirName: "alpha",
+ packageManifest: {
+ channel: {
+ id: "alpha",
+ label: "Alpha",
+ selectionLabel: "Use Alpha",
+ docsPath: "/channels/alpha",
+ blurb: "Alpha channel metadata.",
+ },
+ },
+ manifest: {
+ id: "alpha",
+ channels: ["alpha"],
+ },
+ source: {
+ source: "./index.js",
+ built: "./index.js",
+ },
+ },
+ ],
+ resolveBundledChannelGeneratedPath: (
+ _rootDir: string,
+ entry: { built?: string; source?: string },
+ ) =>
+ path.join(pluginDir, (entry.built ?? entry.source ?? "./index.js").replace(/^\.\//u, "")),
+ }));
+
+ try {
+ process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = path.join(tempRoot, "dist", "extensions");
+
+ const bundled = await importFreshModule(
+ import.meta.url,
+ "./bundled.js?scope=bundled-package-metadata",
+ );
+
+ const plugin = bundled.requireBundledChannelPlugin("alpha");
+ expect(plugin.meta).toMatchObject({
+ id: "alpha",
+ label: "Alpha",
+ selectionLabel: "Use Alpha",
+ docsPath: "/channels/alpha",
+ blurb: "Alpha channel metadata.",
+ });
+ } finally {
+ if (previousBundledPluginsDir === undefined) {
+ delete process.env.OPENCLAW_BUNDLED_PLUGINS_DIR;
+ } else {
+ process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = previousBundledPluginsDir;
+ }
+ fs.rmSync(tempRoot, { recursive: true, force: true });
+ }
+ });
+
it("uses the active bundled plugin root override for channel entry loading", async () => {
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-bundled-override-"));
const previousBundledPluginsDir = process.env.OPENCLAW_BUNDLED_PLUGINS_DIR;
diff --git a/src/channels/plugins/bundled.ts b/src/channels/plugins/bundled.ts
index e8966199049..d27f70bf6a6 100644
--- a/src/channels/plugins/bundled.ts
+++ b/src/channels/plugins/bundled.ts
@@ -13,6 +13,7 @@ import {
import { unwrapDefaultModuleExport } from "../../plugins/module-export.js";
import type { PluginRuntime } from "../../plugins/runtime/types.js";
import { resolveBundledChannelRootScope, type BundledChannelRootScope } from "./bundled-root.js";
+import { normalizeChannelMeta } from "./meta-normalization.js";
import { isJavaScriptModulePath, loadChannelPluginModule } from "./module-loader.js";
import type { ChannelPlugin } from "./types.plugin.js";
import type { ChannelId } from "./types.public.js";
@@ -439,9 +440,18 @@ function getBundledChannelPluginForRoot(
}
cacheContext.pluginLoadInProgressIds.add(id);
try {
+ const metadata = resolveBundledChannelMetadata(id, rootScope);
const plugin = entry.loadChannelPlugin();
- cacheContext.lazyPluginsById.set(id, plugin);
- return plugin;
+ const normalizedPlugin = {
+ ...plugin,
+ meta: normalizeChannelMeta({
+ id: plugin.id,
+ meta: plugin.meta,
+ existing: metadata?.packageManifest?.channel,
+ }),
+ };
+ cacheContext.lazyPluginsById.set(id, normalizedPlugin);
+ return normalizedPlugin;
} finally {
cacheContext.pluginLoadInProgressIds.delete(id);
}
diff --git a/src/config/bundled-channel-config-metadata.generated.ts b/src/config/bundled-channel-config-metadata.generated.ts
index 6d199f02939..e07ae4fd833 100644
--- a/src/config/bundled-channel-config-metadata.generated.ts
+++ b/src/config/bundled-channel-config-metadata.generated.ts
@@ -15215,7 +15215,6 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [
type: "string",
},
dmPolicy: {
- default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
@@ -15238,7 +15237,6 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [
},
},
groupPolicy: {
- default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
@@ -15399,7 +15397,6 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [
enum: ["off", "ack", "minimal", "extensive"],
},
debounceMs: {
- default: 0,
type: "integer",
minimum: 0,
maximum: 9007199254740991,
@@ -15440,7 +15437,6 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [
maximum: 9007199254740991,
},
},
- required: ["dmPolicy", "groupPolicy", "debounceMs"],
additionalProperties: false,
},
},
diff --git a/src/config/schema.base.generated.ts b/src/config/schema.base.generated.ts
index 6d5bd724463..e2d04e61da9 100644
--- a/src/config/schema.base.generated.ts
+++ b/src/config/schema.base.generated.ts
@@ -27471,6 +27471,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = {
tags: ["advanced", "url-secret"],
},
},
- version: "2026.4.18",
+ version: "2026.4.19-beta.1",
generatedAt: "2026-03-22T21:17:33.302Z",
};
diff --git a/src/infra/npm-update-compat-sidecars.ts b/src/infra/npm-update-compat-sidecars.ts
index 789311f74ac..6a866c0c8ca 100644
--- a/src/infra/npm-update-compat-sidecars.ts
+++ b/src/infra/npm-update-compat-sidecars.ts
@@ -1,3 +1,5 @@
+const LEGACY_QA_LAB_DIR = ["qa", "lab"].join("-");
+
export const NPM_UPDATE_COMPAT_SIDECARS = [
{
path: "dist/extensions/qa-channel/runtime-api.js",
@@ -5,7 +7,7 @@ export const NPM_UPDATE_COMPAT_SIDECARS = [
"// Compatibility stub for older OpenClaw updaters. The QA channel implementation is not packaged.\nexport {};\n",
},
{
- path: "dist/extensions/qa-lab/runtime-api.js",
+ path: `dist/extensions/${LEGACY_QA_LAB_DIR}/runtime-api.js`,
content:
"// Compatibility stub for older OpenClaw updaters. The QA lab implementation is not packaged.\nexport {};\n",
},
@@ -16,6 +18,6 @@ export const NPM_UPDATE_COMPAT_SIDECAR_PATHS = new Set(
);
export const NPM_UPDATE_OMITTED_BUNDLED_PLUGIN_ROOTS = new Set([
- "dist/extensions/qa-lab",
+ `dist/extensions/${LEGACY_QA_LAB_DIR}`,
"dist/extensions/qa-matrix",
]);
diff --git a/src/infra/package-dist-inventory.ts b/src/infra/package-dist-inventory.ts
index d9630323be2..d26aabb2f1c 100644
--- a/src/infra/package-dist-inventory.ts
+++ b/src/infra/package-dist-inventory.ts
@@ -2,22 +2,23 @@ import fs from "node:fs/promises";
import path from "node:path";
export const PACKAGE_DIST_INVENTORY_RELATIVE_PATH = "dist/postinstall-inventory.json";
+const LEGACY_QA_LAB_DIR = ["qa", "lab"].join("-");
const PACKAGED_QA_RUNTIME_PATHS = new Set([
"dist/extensions/qa-channel/runtime-api.js",
- "dist/extensions/qa-lab/runtime-api.js",
+ `dist/extensions/${LEGACY_QA_LAB_DIR}/runtime-api.js`,
]);
const OMITTED_QA_EXTENSION_PREFIXES = [
"dist/extensions/qa-channel/",
- "dist/extensions/qa-lab/",
+ `dist/extensions/${LEGACY_QA_LAB_DIR}/`,
"dist/extensions/qa-matrix/",
];
-const OMITTED_PRIVATE_QA_PLUGIN_SDK_PREFIXES = ["dist/plugin-sdk/extensions/qa-lab/"];
+const OMITTED_PRIVATE_QA_PLUGIN_SDK_PREFIXES = [`dist/plugin-sdk/extensions/${LEGACY_QA_LAB_DIR}/`];
const OMITTED_PRIVATE_QA_PLUGIN_SDK_FILES = new Set([
- "dist/plugin-sdk/qa-lab.d.ts",
- "dist/plugin-sdk/qa-lab.js",
+ `dist/plugin-sdk/${LEGACY_QA_LAB_DIR}.d.ts`,
+ `dist/plugin-sdk/${LEGACY_QA_LAB_DIR}.js`,
"dist/plugin-sdk/qa-runtime.d.ts",
"dist/plugin-sdk/qa-runtime.js",
- "dist/plugin-sdk/src/plugin-sdk/qa-lab.d.ts",
+ `dist/plugin-sdk/src/plugin-sdk/${LEGACY_QA_LAB_DIR}.d.ts`,
"dist/plugin-sdk/src/plugin-sdk/qa-runtime.d.ts",
]);
const OMITTED_PRIVATE_QA_DIST_PREFIXES = ["dist/qa-runtime-"];
@@ -25,7 +26,7 @@ const OMITTED_DIST_SUBTREE_PATTERNS = [
/^dist\/extensions\/node_modules(?:\/|$)/u,
/^dist\/extensions\/[^/]+\/node_modules(?:\/|$)/u,
/^dist\/extensions\/qa-matrix(?:\/|$)/u,
- /^dist\/plugin-sdk\/extensions\/qa-lab(?:\/|$)/u,
+ new RegExp(`^dist/plugin-sdk/extensions/${LEGACY_QA_LAB_DIR}(?:/|$)`, "u"),
] as const;
function normalizeRelativePath(value: string): string {
diff --git a/src/sessions/send-policy.ts b/src/sessions/send-policy.ts
index 480cf7602e2..3456bb41c01 100644
--- a/src/sessions/send-policy.ts
+++ b/src/sessions/send-policy.ts
@@ -88,18 +88,26 @@ export function resolveSendPolicy(params: {
return "allow";
}
- const channel =
- normalizeMatchValue(params.channel) ??
- normalizeMatchValue(params.entry?.channel) ??
- normalizeMatchValue(params.entry?.lastChannel) ??
- deriveChannelFromKey(params.sessionKey);
- const chatType =
- normalizeChatType(params.chatType ?? params.entry?.chatType) ??
- normalizeChatType(deriveChatTypeFromKey(params.sessionKey));
const rawSessionKey = params.sessionKey ?? "";
const strippedSessionKey = stripAgentSessionKeyPrefix(rawSessionKey) ?? "";
const rawSessionKeyNorm = normalizeLowercaseStringOrEmpty(rawSessionKey);
const strippedSessionKeyNorm = normalizeLowercaseStringOrEmpty(strippedSessionKey);
+ let channel: string | undefined;
+ let chatType: SessionChatType | undefined;
+ const getChannel = () => {
+ channel ??=
+ normalizeMatchValue(params.channel) ??
+ normalizeMatchValue(params.entry?.channel) ??
+ normalizeMatchValue(params.entry?.lastChannel) ??
+ deriveChannelFromKey(params.sessionKey);
+ return channel;
+ };
+ const getChatType = () => {
+ chatType ??=
+ normalizeChatType(params.chatType ?? params.entry?.chatType) ??
+ normalizeChatType(deriveChatTypeFromKey(params.sessionKey));
+ return chatType;
+ };
let allowedMatch = false;
for (const rule of policy.rules ?? []) {
@@ -113,10 +121,10 @@ export function resolveSendPolicy(params: {
const matchPrefix = normalizeMatchValue(match.keyPrefix);
const matchRawPrefix = normalizeMatchValue(match.rawKeyPrefix);
- if (matchChannel && matchChannel !== channel) {
+ if (matchChannel && matchChannel !== getChannel()) {
continue;
}
- if (matchChatType && matchChatType !== chatType) {
+ if (matchChatType && matchChatType !== getChatType()) {
continue;
}
if (matchRawPrefix && !rawSessionKeyNorm.startsWith(matchRawPrefix)) {
diff --git a/test/openclaw-npm-release-check.test.ts b/test/openclaw-npm-release-check.test.ts
index 3d4f05221d4..53d11186a31 100644
--- a/test/openclaw-npm-release-check.test.ts
+++ b/test/openclaw-npm-release-check.test.ts
@@ -379,6 +379,25 @@ describe("collectForbiddenPackedPathErrors", () => {
rmSync(rootDir, { recursive: true, force: true });
}
});
+
+ it("allows legacy QA compatibility paths in the generated dist inventory", () => {
+ const rootDir = mkdtempSync(join(tmpdir(), "openclaw-pack-inventory-"));
+
+ try {
+ mkdirSync(join(rootDir, "dist"), { recursive: true });
+ writeFileSync(
+ join(rootDir, PACKAGE_DIST_INVENTORY_RELATIVE_PATH),
+ JSON.stringify(["dist/extensions/qa-lab/runtime-api.js"]),
+ "utf8",
+ );
+
+ expect(
+ collectForbiddenPackedContentErrors([PACKAGE_DIST_INVENTORY_RELATIVE_PATH], rootDir),
+ ).toEqual([]);
+ } finally {
+ rmSync(rootDir, { recursive: true, force: true });
+ }
+ });
});
describe("collectPackedTestCargoErrors", () => {
diff --git a/test/release-check.test.ts b/test/release-check.test.ts
index 7724941e554..dad4d74379e 100644
--- a/test/release-check.test.ts
+++ b/test/release-check.test.ts
@@ -349,6 +349,25 @@ describe("collectForbiddenPackPaths", () => {
rmSync(tempRoot, { recursive: true, force: true });
}
});
+
+ it("allows legacy QA compatibility paths in the generated dist inventory", () => {
+ const tempRoot = mkdtempSync(join(tmpdir(), "openclaw-release-inventory-"));
+
+ try {
+ mkdirSync(join(tempRoot, "dist"), { recursive: true });
+ writeFileSync(
+ join(tempRoot, PACKAGE_DIST_INVENTORY_RELATIVE_PATH),
+ JSON.stringify(["dist/extensions/qa-lab/runtime-api.js"]),
+ "utf8",
+ );
+
+ expect(
+ collectForbiddenPackContentPaths([PACKAGE_DIST_INVENTORY_RELATIVE_PATH], tempRoot),
+ ).toEqual([]);
+ } finally {
+ rmSync(tempRoot, { recursive: true, force: true });
+ }
+ });
});
describe("collectMissingPackPaths", () => {