mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-22 06:32:00 +00:00
chore(release): prepare 2026.4.11-beta.1
This commit is contained in:
@@ -2,7 +2,13 @@
|
||||
|
||||
Docs: https://docs.openclaw.ai
|
||||
|
||||
## 2026.4.11
|
||||
## Unreleased
|
||||
|
||||
### Changes
|
||||
|
||||
### Fixes
|
||||
|
||||
## 2026.4.11-beta.1
|
||||
|
||||
### Changes
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ android {
|
||||
minSdk = 31
|
||||
targetSdk = 36
|
||||
versionCode = 2026041101
|
||||
versionName = "2026.4.11"
|
||||
versionName = "2026.4.11-beta.1"
|
||||
ndk {
|
||||
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
|
||||
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2026.4.11</string>
|
||||
<string>2026.4.11-beta.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2026041101</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
228031f16ad06580bfd137f092d70d03f2796515e723b8b6618ed69d285465fa config-baseline.json
|
||||
bad0a5bb247a62b8fb9ed9fc2b2720eacf3e0913077ac351b5d26ae2723335ad config-baseline.core.json
|
||||
e1f94346a8507ce3dec763b598e79f3bb89ff2e33189ce977cc87d3b05e71c1d config-baseline.channel.json
|
||||
02af8ba235c1d45212f7a38c0a1752712f2c49505445127587c974499ffbbc50 config-baseline.json
|
||||
fb6f0ef881fb591d2791d2adca43c7e88d48f8b562457683092ab6e767aece78 config-baseline.core.json
|
||||
73464e0e53d9e76e212b0946db36e69c2528b45bbd8131a4302e9b7f44b8a115 config-baseline.channel.json
|
||||
6c19997f1fb2aff4315f2cb9c7d9e299b403fbc0f9e78e3412cc7fe1c655f222 config-baseline.plugin.json
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
7a5c71593c9efbb936b9632f0b381a6c603e9bce44706b312a0172504fa51ef6 plugin-sdk-api-baseline.json
|
||||
0b044de57266d20561838a5ae0edbaacaa53b323d4c8c068e701a48f92f0a264 plugin-sdk-api-baseline.jsonl
|
||||
4e6dc34841d2bbffe3360aea21a1d6a77d63745bab036043ab412ec0af419f2f plugin-sdk-api-baseline.json
|
||||
185fdfa07af2332f2038273f9a0e1e86214aedc70338a27b965740ce77439d9c plugin-sdk-api-baseline.jsonl
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "openclaw",
|
||||
"version": "2026.4.11",
|
||||
"version": "2026.4.11-beta.1",
|
||||
"description": "Multi-channel AI gateway with extensible messaging integrations",
|
||||
"keywords": [],
|
||||
"homepage": "https://github.com/openclaw/openclaw#readme",
|
||||
@@ -30,7 +30,9 @@
|
||||
"!dist/**/*.map",
|
||||
"!dist/plugin-sdk/.tsbuildinfo",
|
||||
"!dist/extensions/qa-channel/**",
|
||||
"dist/extensions/qa-channel/runtime-api.js",
|
||||
"!dist/extensions/qa-lab/**",
|
||||
"dist/extensions/qa-lab/runtime-api.js",
|
||||
"docs/",
|
||||
"!docs/.generated/**",
|
||||
"!docs/.i18n/zh-CN.tm.jsonl",
|
||||
|
||||
@@ -10,6 +10,11 @@ export const BUILD_ALL_STEPS = [
|
||||
{ label: "canvas:a2ui:bundle", kind: "pnpm", pnpmArgs: ["canvas:a2ui:bundle"] },
|
||||
{ label: "tsdown", kind: "node", args: ["scripts/tsdown-build.mjs"] },
|
||||
{ label: "runtime-postbuild", kind: "node", args: ["scripts/runtime-postbuild.mjs"] },
|
||||
{
|
||||
label: "write-npm-update-compat-sidecars",
|
||||
kind: "node",
|
||||
args: ["scripts/write-npm-update-compat-sidecars.mjs"],
|
||||
},
|
||||
{ label: "build-stamp", kind: "node", args: ["scripts/build-stamp.mjs"] },
|
||||
{
|
||||
label: "build:plugin-sdk:dts",
|
||||
|
||||
@@ -111,13 +111,21 @@ run_update_smoke() {
|
||||
|
||||
echo "==> Run openclaw update from host-served tgz"
|
||||
local update_status
|
||||
local update_stderr_file
|
||||
local update_stderr
|
||||
update_stderr_file="$(mktemp)"
|
||||
set +e
|
||||
UPDATE_JSON="$(
|
||||
npm_config_omit=optional NPM_CONFIG_OMIT=optional openclaw update --tag "$UPDATE_TAG_URL" --yes --json 2>&1
|
||||
npm_config_omit=optional NPM_CONFIG_OMIT=optional openclaw update --tag "$UPDATE_TAG_URL" --yes --json 2>"$update_stderr_file"
|
||||
)"
|
||||
update_status=$?
|
||||
set -e
|
||||
update_stderr="$(cat "$update_stderr_file")"
|
||||
rm -f "$update_stderr_file"
|
||||
printf "%s\n" "$UPDATE_JSON"
|
||||
if [[ -n "$update_stderr" ]]; then
|
||||
printf "%s\n" "$update_stderr" >&2
|
||||
fi
|
||||
if [[ "$update_status" -ne 0 ]]; then
|
||||
echo "ERROR: openclaw update failed with exit code $update_status" >&2
|
||||
return "$update_status"
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
import { shouldBuildBundledCluster } from "./optional-bundled-clusters.mjs";
|
||||
|
||||
const TOP_LEVEL_PUBLIC_SURFACE_EXTENSIONS = new Set([".ts", ".js", ".mts", ".cts", ".mjs", ".cjs"]);
|
||||
const NON_PACKAGED_BUNDLED_PLUGIN_DIRS = new Set(["qa-channel", "qa-lab"]);
|
||||
const toPosixPath = (value) => value.replaceAll("\\", "/");
|
||||
|
||||
function readBundledPluginPackageJson(packageJsonPath) {
|
||||
@@ -145,7 +146,9 @@ export function listBundledPluginBuildEntries(params = {}) {
|
||||
}
|
||||
|
||||
export function listBundledPluginPackArtifacts(params = {}) {
|
||||
const entries = collectBundledPluginBuildEntries(params);
|
||||
const entries = collectBundledPluginBuildEntries(params).filter(
|
||||
({ id }) => !NON_PACKAGED_BUNDLED_PLUGIN_DIRS.has(id),
|
||||
);
|
||||
const artifacts = new Set();
|
||||
|
||||
for (const { id, hasManifest, hasPackageJson, sourceEntries } of entries) {
|
||||
|
||||
16
scripts/lib/npm-update-compat-sidecars.mjs
Normal file
16
scripts/lib/npm-update-compat-sidecars.mjs
Normal file
@@ -0,0 +1,16 @@
|
||||
export const NPM_UPDATE_COMPAT_SIDECARS = [
|
||||
{
|
||||
path: "dist/extensions/qa-channel/runtime-api.js",
|
||||
content:
|
||||
"// Compatibility stub for older OpenClaw updaters. The QA channel implementation is not packaged.\nexport {};\n",
|
||||
},
|
||||
{
|
||||
path: "dist/extensions/qa-lab/runtime-api.js",
|
||||
content:
|
||||
"// Compatibility stub for older OpenClaw updaters. The QA lab implementation is not packaged.\nexport {};\n",
|
||||
},
|
||||
];
|
||||
|
||||
export const NPM_UPDATE_COMPAT_SIDECAR_PATHS = new Set(
|
||||
NPM_UPDATE_COMPAT_SIDECARS.map((entry) => entry.path),
|
||||
);
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
resolveNpmDistTagMirrorAuth as resolveNpmDistTagMirrorAuthBase,
|
||||
parseReleaseVersion as parseReleaseVersionBase,
|
||||
} from "./lib/npm-publish-plan.mjs";
|
||||
import { NPM_UPDATE_COMPAT_SIDECAR_PATHS } from "./lib/npm-update-compat-sidecars.mjs";
|
||||
|
||||
type PackageJson = {
|
||||
name?: string;
|
||||
@@ -463,6 +464,9 @@ function collectPackedTarballErrors(): string[] {
|
||||
export function collectForbiddenPackedPathErrors(paths: Iterable<string>): string[] {
|
||||
const errors: string[] = [];
|
||||
for (const packedPath of paths) {
|
||||
if (NPM_UPDATE_COMPAT_SIDECAR_PATHS.has(packedPath)) {
|
||||
continue;
|
||||
}
|
||||
const matchedRule = FORBIDDEN_PACKED_PATH_RULES.find((rule) =>
|
||||
packedPath.startsWith(rule.prefix),
|
||||
);
|
||||
|
||||
10
scripts/write-npm-update-compat-sidecars.mjs
Normal file
10
scripts/write-npm-update-compat-sidecars.mjs
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import { NPM_UPDATE_COMPAT_SIDECARS } from "./lib/npm-update-compat-sidecars.mjs";
|
||||
|
||||
for (const entry of NPM_UPDATE_COMPAT_SIDECARS) {
|
||||
fs.mkdirSync(path.dirname(entry.path), { recursive: true });
|
||||
fs.writeFileSync(entry.path, entry.content, "utf8");
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
2ebea4cf54d91de1831736ec2b73a7489b6b4290acec25ee77001d168f47a479
|
||||
50bc4860e0ce52be932f23512ccf896e6f9faa3186d25f21fae69018db86cda7
|
||||
|
||||
@@ -8161,6 +8161,21 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [
|
||||
minimum: 0,
|
||||
maximum: 9007199254740991,
|
||||
},
|
||||
delegatedAuth: {
|
||||
type: "object",
|
||||
properties: {
|
||||
enabled: {
|
||||
type: "boolean",
|
||||
},
|
||||
scopes: {
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
sso: {
|
||||
type: "object",
|
||||
properties: {
|
||||
|
||||
@@ -27159,6 +27159,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = {
|
||||
tags: ["advanced", "url-secret"],
|
||||
},
|
||||
},
|
||||
version: "2026.4.11",
|
||||
version: "2026.4.11-beta.1",
|
||||
generatedAt: "2026-03-22T21:17:33.302Z",
|
||||
};
|
||||
|
||||
@@ -40,6 +40,13 @@ describe("plugin-sdk qa-lab", () => {
|
||||
expect(registerQaLabCliImpl).toHaveBeenCalledWith({} as never);
|
||||
});
|
||||
|
||||
it("delegates qa cli availability through the bundled public surface", async () => {
|
||||
const module = await import("./qa-lab.js");
|
||||
|
||||
expect(module.isQaLabCliAvailable()).toBe(true);
|
||||
expect(isQaLabCliAvailableImpl).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("reports qa-lab unavailable when private facade artifacts are not packed", async () => {
|
||||
loadBundledPluginPublicSurfaceModuleSync.mockImplementation(() => {
|
||||
throw new Error("Unable to resolve bundled plugin public surface qa-lab/cli.js");
|
||||
|
||||
@@ -312,7 +312,9 @@ describe("collectForbiddenPackedPathErrors", () => {
|
||||
it("rejects private qa artifacts in npm pack output", () => {
|
||||
expect(
|
||||
collectForbiddenPackedPathErrors([
|
||||
"dist/extensions/qa-channel/runtime-api.js",
|
||||
"dist/extensions/qa-channel/package.json",
|
||||
"dist/extensions/qa-lab/runtime-api.js",
|
||||
"dist/extensions/qa-lab/src/cli.js",
|
||||
]),
|
||||
).toEqual([
|
||||
|
||||
@@ -52,6 +52,17 @@ describe("bundled plugin build entries", () => {
|
||||
expect(artifacts).toContain("dist/extensions/matrix/plugin-entry.handlers.runtime.js");
|
||||
});
|
||||
|
||||
it("keeps private QA bundles out of required npm pack artifacts", () => {
|
||||
const artifacts = listBundledPluginPackArtifacts();
|
||||
|
||||
expect(artifacts.some((artifact) => artifact.startsWith("dist/extensions/qa-channel/"))).toBe(
|
||||
false,
|
||||
);
|
||||
expect(artifacts.some((artifact) => artifact.startsWith("dist/extensions/qa-lab/"))).toBe(
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
it("keeps bundled channel secret contracts on packed top-level sidecars", () => {
|
||||
const artifacts = listBundledPluginPackArtifacts();
|
||||
const offenders: string[] = [];
|
||||
|
||||
Reference in New Issue
Block a user