Compare commits

...

13 Commits

Author SHA1 Message Date
Peter Steinberger
10ad3aa160 chore(release): prepare 2026.5.26 stable 2026-05-27 12:26:12 +01:00
Peter Steinberger
c45cc7978e test(e2e): preserve macos smoke entrypoint path 2026-05-27 10:07:11 +01:00
Peter Steinberger
7d89681bb0 test(e2e): harden shell helper env assertions 2026-05-27 07:56:10 +01:00
Peter Steinberger
f0e25b7fbe test(e2e): isolate shell helper env 2026-05-27 07:35:31 +01:00
Peter Steinberger
13436ca463 ci(ui): refresh raw copy baseline 2026-05-27 07:10:48 +01:00
Peter Steinberger
cd1e8fb733 fix(agents): preserve sessions_send fallback cause 2026-05-27 06:56:09 +01:00
Peter Steinberger
292d60546d docs(plugin-sdk): refresh beta API baseline 2026-05-27 06:43:16 +01:00
Peter Steinberger
e8c27faf6d docs(plugin-sdk): refresh beta API baseline 2026-05-27 06:43:16 +01:00
Peter Steinberger
8584ea0f94 docs(changelog): refresh 2026.5.26 notes 2026-05-27 06:43:16 +01:00
Peter Steinberger
daedbb4a5e chore(release): prepare 2026.5.26 beta 2 2026-05-27 06:43:16 +01:00
Peter Steinberger
4e09f80e50 chore(release): refresh plugin shrinkwraps 2026-05-27 06:43:16 +01:00
Peter Steinberger
67c265679d chore(release): sync plugin beta versions 2026-05-27 06:43:16 +01:00
Peter Steinberger
95e453ce32 chore(release): prepare 2026.5.26 beta 1 2026-05-27 06:43:16 +01:00
5 changed files with 81 additions and 45 deletions

View File

@@ -1,2 +1,2 @@
65cb96d0aa2888ddb7b014f810d7cd415f1f0ccdce7792fbf12b4aad11f146f8 plugin-sdk-api-baseline.json
662b37da529f199ee9b56482f2f6897bdd010dfb72be778d208b289adaca1298 plugin-sdk-api-baseline.jsonl
97cbb3fe0840de83298c7f22f9a5e4193a866e78d749217fe6ef2583c3ca37f3 plugin-sdk-api-baseline.json
cc8e70243a7dedc0edc0924c6cee06cac9022080c22616ba982e69ec134e129b plugin-sdk-api-baseline.jsonl

View File

@@ -98,8 +98,6 @@ const guestPath =
const guestOpenClaw = "openclaw";
const guestOpenClawEntry = '"$(npm root -g)/openclaw/openclaw.mjs"';
const guestOpenClawEntryRunner = `node ${guestOpenClawEntry}`;
const guestOpenClawEntryExecScript =
'entry="$(npm root -g)/openclaw/openclaw.mjs"; exec node "$entry" "$@"';
const guestNode = "node";
const guestNpm = "npm";
@@ -583,9 +581,12 @@ class MacosSmoke {
args: string[],
options: { check?: boolean; env?: Record<string, string> } = {},
): string {
return this.guestExec(
["/bin/sh", "-c", guestOpenClawEntryExecScript, "openclaw-entry", ...args],
options,
const argv = args.map((arg) => shellQuote(arg)).join(" ");
return this.guestSh(
`set -e
entry="$(npm root -g)/openclaw/openclaw.mjs"
exec node "$entry" ${argv}`,
options.env,
);
}

View File

@@ -231,7 +231,9 @@ async function startAgentRun(params: {
} catch (err) {
const queueSummary =
formatEmbeddedPiQueueFailureSummary(queueOutcome) ?? "active run queue rejected";
throw new Error(`${queueSummary}; fallback_failed error=${formatErrorMessage(err)}`);
throw new Error(`${queueSummary}; fallback_failed error=${formatErrorMessage(err)}`, {
cause: err,
});
}
}
const response = await params.callGateway<{ runId: string }>({

View File

@@ -5,6 +5,7 @@ import path from "node:path";
import { describe, expect, it } from "vitest";
const helperPath = path.resolve("scripts/lib/openclaw-e2e-instance.sh");
const hostPath = process.env.PATH?.trim() || "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin";
function shellQuote(value: string): string {
return `'${value.replace(/'/gu, `'\\''`)}'`;
@@ -30,6 +31,25 @@ function base64(script: string): string {
return execFileSync("base64", { input: script, encoding: "utf8" }).replace(/\s+/gu, "");
}
function shellTestEnv(overrides: Record<string, string | undefined>): NodeJS.ProcessEnv {
const env: NodeJS.ProcessEnv = {
HOME: process.env.HOME ?? os.tmpdir(),
PATH: hostPath,
SHELL: "/bin/bash",
TMPDIR: process.env.TMPDIR ?? os.tmpdir(),
};
for (const [key, value] of Object.entries(overrides)) {
if (value !== undefined) {
env[key] = value;
}
}
return env;
}
function expectShellSuccess(result: ReturnType<typeof spawnSync>) {
expect(result.status, result.stderr || result.stdout || result.error?.message).toBe(0);
}
describe("scripts/lib/openclaw-e2e-instance.sh", () => {
it("sources decoded test-state scripts", () => {
const result = runHelper(base64('export OPENCLAW_E2E_INSTANCE_TEST="ok"\n'));
@@ -65,8 +85,8 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
fs.writeFileSync(
path.join(tempDir, "timeout"),
[
"#!/usr/bin/env bash",
"set -euo pipefail",
"#!/bin/sh",
"set -eu",
'printf "%s\\n" "$*" >"$OPENCLAW_TEST_TIMEOUT_ARGS"',
'while [ "$#" -gt 0 ] && [ "$1" != "npm" ]; do shift; done',
'exec "$@"',
@@ -92,18 +112,17 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
PATH: `${tempDir}:${process.env.PATH ?? ""}`,
env: shellTestEnv({
PATH: `${tempDir}${path.delimiter}${hostPath}`,
OPENCLAW_CURRENT_PACKAGE_TGZ: packagePath,
OPENCLAW_E2E_NPM_INSTALL_TIMEOUT: "42s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_NPM_ARGS: npmArgsPath,
},
}),
},
);
expect(result.status).toBe(0);
expectShellSuccess(result);
expect(result.stdout).toContain("Installing fixture package...");
expect(fs.readFileSync(timeoutArgsPath, "utf8").trim()).toBe(
`--kill-after=30s 42s npm install -g ${packagePath} --no-fund --no-audit`,
@@ -127,8 +146,8 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
fs.writeFileSync(
path.join(tempDir, "timeout"),
[
"#!/usr/bin/env bash",
"set -euo pipefail",
"#!/bin/sh",
"set -eu",
'if [ "${1:-}" = "--kill-after=1s" ]; then',
" exit 1",
"fi",
@@ -157,18 +176,17 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
PATH: `${tempDir}:${process.env.PATH ?? ""}`,
env: shellTestEnv({
PATH: `${tempDir}${path.delimiter}${hostPath}`,
OPENCLAW_CURRENT_PACKAGE_TGZ: packagePath,
OPENCLAW_E2E_NPM_INSTALL_TIMEOUT: "42s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_NPM_ARGS: npmArgsPath,
},
}),
},
);
expect(result.status).toBe(0);
expectShellSuccess(result);
expect(fs.readFileSync(timeoutArgsPath, "utf8").trim()).toBe(
`42s npm install -g ${packagePath} --no-fund --no-audit`,
);
@@ -218,18 +236,17 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: tempDir,
OPENCLAW_CURRENT_PACKAGE_TGZ: packagePath,
OPENCLAW_E2E_NPM_INSTALL_TIMEOUT: "42s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_NPM_ARGS: npmArgsPath,
},
}),
},
);
expect(result.status).toBe(0);
expectShellSuccess(result);
expect(fs.readFileSync(timeoutArgsPath, "utf8").trim()).toBe(
`--kill-after=30s 42s npm install -g ${packagePath} --no-fund --no-audit`,
);
@@ -267,17 +284,16 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: `${tempDir}:${nodeBinDir}`,
OPENCLAW_CURRENT_PACKAGE_TGZ: packagePath,
OPENCLAW_E2E_NPM_INSTALL_TIMEOUT: "42s",
OPENCLAW_TEST_NPM_ARGS: npmArgsPath,
},
}),
},
);
expect(result.status).toBe(0);
expectShellSuccess(result);
expect(fs.readFileSync(logPath, "utf8")).toContain("using Node watchdog");
expect(fs.readFileSync(npmArgsPath, "utf8").trim()).toBe(
`install -g ${packagePath} --no-fund --no-audit`,
@@ -304,10 +320,9 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: `${tempDir}:${nodeBinDir}`,
},
}),
timeout: 5_000,
},
);
@@ -411,13 +426,12 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: `${tempDir}:${process.env.PATH ?? ""}`,
OPENCLAW_E2E_COMMAND_TIMEOUT: "17s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_COMMAND_ARGS: commandArgsPath,
},
}),
},
);
@@ -475,13 +489,12 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: `${tempDir}:${process.env.PATH ?? ""}`,
OPENCLAW_E2E_COMMAND_TIMEOUT: "23s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_COMMAND_ARGS: commandArgsPath,
},
}),
},
);
@@ -537,13 +550,12 @@ describe("scripts/lib/openclaw-e2e-instance.sh", () => {
],
{
encoding: "utf8",
env: {
...process.env,
env: shellTestEnv({
PATH: `${tempDir}:${process.env.PATH ?? ""}`,
OPENCLAW_E2E_COMMAND_TIMEOUT: "31s",
OPENCLAW_TEST_TIMEOUT_ARGS: timeoutArgsPath,
OPENCLAW_TEST_SCRIPT_ARGS: scriptArgsPath,
},
}),
},
);

View File

@@ -169,6 +169,13 @@
"path": "ui/src/ui/chat/grouped-render.ts",
"text": "Open in canvas"
},
{
"count": 1,
"kind": "html-attribute",
"name": "aria-label",
"path": "ui/src/ui/chat/grouped-render.ts",
"text": "Tool returned an error"
},
{
"count": 1,
"kind": "html-attribute",
@@ -197,6 +204,13 @@
"path": "ui/src/ui/chat/grouped-render.ts",
"text": "Context"
},
{
"count": 1,
"kind": "html-text",
"name": "text",
"path": "ui/src/ui/chat/grouped-render.ts",
"text": "Error"
},
{
"count": 2,
"kind": "html-text",
@@ -302,6 +316,13 @@
"path": "ui/src/ui/chat/tool-cards.ts",
"text": "Open tool details in side panel"
},
{
"count": 1,
"kind": "html-attribute",
"name": "aria-label",
"path": "ui/src/ui/chat/tool-cards.ts",
"text": "Tool returned an error"
},
{
"count": 1,
"kind": "html-attribute",
@@ -310,11 +331,11 @@
"text": "Open in the side panel"
},
{
"count": 1,
"count": 2,
"kind": "html-text",
"name": "text",
"path": "ui/src/ui/chat/tool-cards.ts",
"text": "Completed"
"text": "Error"
},
{
"count": 1,
@@ -331,7 +352,7 @@
"text": "Tool input"
},
{
"count": 2,
"count": 1,
"kind": "object-property",
"name": "label",
"path": "ui/src/ui/chat/tool-cards.ts",