chore(release): prepare 2026.4.14 beta

This commit is contained in:
Peter Steinberger
2026-04-14 03:06:46 +01:00
parent 366ee11a80
commit 224cbd9ff6
14 changed files with 99 additions and 16 deletions

View File

@@ -4,7 +4,11 @@ Docs: https://docs.openclaw.ai
## Unreleased
- UI/chat: replace marked.js with markdown-it so maliciously crafted markdown can no longer freeze the Control UI via ReDoS. (#46707) Thanks @zhangfnf.
### Changes
### Fixes
## 2026.4.14-beta.1
### Changes
@@ -12,6 +16,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- UI/chat: replace marked.js with markdown-it so maliciously crafted markdown can no longer freeze the Control UI via ReDoS. (#46707) Thanks @zhangfnf.
- Auto-reply/send policy: keep `sendPolicy: "deny"` from blocking inbound message processing, so the agent still runs its turn while all outbound delivery is suppressed for observer-style setups. (#65461, #53328) Thanks @omarshahine.
- BlueBubbles: lazy-refresh the Private API server-info cache on send when reply threading or message effects are requested but status is unknown, so sends no longer silently degrade to plain messages when the 10-minute cache expires. (#65447, #43764) Thanks @omarshahine.
- Heartbeat/security: force owner downgrade for untrusted `hook:wake` system events [AI-assisted]. (#66031) Thanks @pgondhi987.

View File

@@ -65,8 +65,8 @@ android {
applicationId = "ai.openclaw.app"
minSdk = 31
targetSdk = 36
versionCode = 2026041290
versionName = "2026.4.12"
versionCode = 2026041401
versionName = "2026.4.14-beta.1"
ndk {
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")

View File

@@ -1,5 +1,9 @@
# OpenClaw iOS Changelog
## 2026.4.14 - 2026-04-14
Maintenance update for the current OpenClaw beta release.
## 2026.4.12 - 2026-04-12
Maintenance update for the current OpenClaw release.

View File

@@ -2,8 +2,8 @@
// Source of truth: apps/ios/version.json
// Generated by scripts/ios-sync-versioning.ts.
OPENCLAW_IOS_VERSION = 2026.4.12
OPENCLAW_MARKETING_VERSION = 2026.4.12
OPENCLAW_IOS_VERSION = 2026.4.14
OPENCLAW_MARKETING_VERSION = 2026.4.14
OPENCLAW_BUILD_VERSION = 1
#include? "../build/Version.xcconfig"

View File

@@ -1 +1 @@
Maintenance update for the current OpenClaw release.
Maintenance update for the current OpenClaw beta release.

View File

@@ -1,3 +1,3 @@
{
"version": "2026.4.12"
"version": "2026.4.14"
}

View File

@@ -15,9 +15,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2026.4.12</string>
<string>2026.4.14-beta.1</string>
<key>CFBundleVersion</key>
<string>2026041290</string>
<string>2026041401</string>
<key>CFBundleIconFile</key>
<string>OpenClaw</string>
<key>CFBundleURLTypes</key>

View File

@@ -1,4 +1,4 @@
724be329389b48a3f1697a534722702de294be4605e1d700c16ec6bbc560100d config-baseline.json
e4f4396307dc84c9f4b5c42280d69b985d8e07869046ca325956fc59a5a9abd0 config-baseline.core.json
3583489dfebd88a53f1c66c984b16dc5eff752c887d4c582a86753990f1d5b18 config-baseline.json
a490b20c47a45c3e26b6917eb3e102356698395128aec20b1f4aabb62ca7cad1 config-baseline.core.json
3bb312dc9c39a374ca92613abf21606c25dc571287a3941dac71ff57b2b5c519 config-baseline.channel.json
0471a5bffb213a3829555efe5961f5b5fd5080c1d38b1ac8dd87afaabdb8bdc1 config-baseline.plugin.json

View File

@@ -1,2 +1,2 @@
42a93d8368fd40f6bbe3045ba89b84a28e1131c700d4e57580febd3e773b23a4 plugin-sdk-api-baseline.json
515333c277b725abaccf4fd5ab8c5e58b2de39b26e1fe4738f31852fcf789c96 plugin-sdk-api-baseline.jsonl
7003e0d0ba1cddb7eb388204825ac892206209a4a9c795e76c4e34b5fc7b50f0 plugin-sdk-api-baseline.json
14e39520459abc7db7993a700a4f07adfa0855d9233d123c4725477b91f1cb13 plugin-sdk-api-baseline.jsonl

View File

@@ -1,6 +1,6 @@
{
"name": "openclaw",
"version": "2026.4.12",
"version": "2026.4.14-beta.1",
"description": "Multi-channel AI gateway with extensible messaging integrations",
"keywords": [],
"homepage": "https://github.com/openclaw/openclaw#readme",

View File

@@ -93,6 +93,15 @@ const defaultStagedRuntimeDepPruneRules = new Map([
["matrix-widget-api", { paths: ["src"], suffixes: [".d.ts"] }],
["oidc-client-ts", { paths: ["README.md"], suffixes: [".d.ts"] }],
["music-metadata", { paths: ["README.md"], suffixes: [".d.ts"] }],
["@cloudflare/workers-types", { paths: ["."] }],
["gifwrap", { paths: ["test"] }],
["playwright-core", { paths: ["types"], suffixes: [".d.ts"] }],
["@jimp/plugin-blit", { paths: ["src/__image_snapshots__"] }],
["@jimp/plugin-blur", { paths: ["src/__image_snapshots__"] }],
["@jimp/plugin-color", { paths: ["src/__image_snapshots__"] }],
["@jimp/plugin-print", { paths: ["src/__image_snapshots__"] }],
["@jimp/plugin-quantize", { paths: ["src/__image_snapshots__"] }],
["@jimp/plugin-threshold", { paths: ["src/__image_snapshots__"] }],
]);
const runtimeDepsStagingVersion = 2;

View File

@@ -1 +1 @@
5848c4cb70b4f330875853e1ddb906adb6bde95c6ae531880e2af87b000b4bd9
fe6c039912decd3f99288b3d1f3dd54723d23b80ba53553ef41d016b81668144

View File

@@ -27277,6 +27277,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = {
tags: ["advanced", "url-secret"],
},
},
version: "2026.4.12",
version: "2026.4.14-beta.1",
generatedAt: "2026-03-22T21:17:33.302Z",
};

View File

@@ -261,6 +261,71 @@ describe("stageBundledPluginRuntimeDeps", () => {
);
});
it("applies default prune rules for known heavy non-runtime package cargo", () => {
const { pluginDir, repoRoot } = createBundledPluginFixture({
packageJson: {
name: "@openclaw/fixture-plugin",
version: "1.0.0",
dependencies: {
"@cloudflare/workers-types": "1.0.0",
"@jimp/plugin-blit": "1.0.0",
gifwrap: "1.0.0",
"playwright-core": "1.0.0",
},
openclaw: { bundle: { stageRuntimeDependencies: true } },
},
});
const rootNodeModules = path.join(repoRoot, "node_modules");
const writePackage = (name: string) => {
const depDir = path.join(rootNodeModules, ...name.split("/"));
fs.mkdirSync(depDir, { recursive: true });
fs.writeFileSync(
path.join(depDir, "package.json"),
`${JSON.stringify({ name, version: "1.0.0" }, null, 2)}\n`,
"utf8",
);
return depDir;
};
const cloudflareDir = writePackage("@cloudflare/workers-types");
fs.writeFileSync(path.join(cloudflareDir, "index.d.ts"), "export {};\n", "utf8");
const gifwrapDir = writePackage("gifwrap");
fs.mkdirSync(path.join(gifwrapDir, "test", "fixtures"), { recursive: true });
fs.writeFileSync(path.join(gifwrapDir, "test", "fixtures", "large.gif"), "fixture\n", "utf8");
const playwrightDir = writePackage("playwright-core");
fs.mkdirSync(path.join(playwrightDir, "types"), { recursive: true });
fs.writeFileSync(path.join(playwrightDir, "types", "types.d.ts"), "export {};\n", "utf8");
fs.writeFileSync(path.join(playwrightDir, "index.js"), "export {};\n", "utf8");
const jimpDir = writePackage("@jimp/plugin-blit");
fs.mkdirSync(path.join(jimpDir, "src", "__image_snapshots__"), { recursive: true });
fs.writeFileSync(
path.join(jimpDir, "src", "__image_snapshots__", "snapshot.png"),
"fixture\n",
"utf8",
);
fs.writeFileSync(path.join(jimpDir, "index.js"), "export {};\n", "utf8");
stageBundledPluginRuntimeDeps({ cwd: repoRoot });
expect(
fs.existsSync(path.join(pluginDir, "node_modules", "@cloudflare", "workers-types")),
).toBe(false);
expect(fs.existsSync(path.join(pluginDir, "node_modules", "gifwrap", "test"))).toBe(false);
expect(fs.existsSync(path.join(pluginDir, "node_modules", "playwright-core", "types"))).toBe(
false,
);
expect(fs.existsSync(path.join(pluginDir, "node_modules", "playwright-core", "index.js"))).toBe(
true,
);
expect(
fs.existsSync(
path.join(pluginDir, "node_modules", "@jimp", "plugin-blit", "src", "__image_snapshots__"),
),
).toBe(false);
expect(
fs.existsSync(path.join(pluginDir, "node_modules", "@jimp", "plugin-blit", "index.js")),
).toBe(true);
});
it("falls back to staging installs when the root dependency version is incompatible", () => {
const { pluginDir, repoRoot } = createBundledPluginFixture({
packageJson: {