Compare commits

...

24 Commits

Author SHA1 Message Date
Peter Steinberger
0e2e7c66bd test(qa): remove brittle capability flip setup turn 2026-05-24 14:30:49 +01:00
Peter Steinberger
246abdcfc0 test(qa): extend capability flip setup budget 2026-05-24 14:02:10 +01:00
Peter Steinberger
d1c3958777 test(qa): widen capability flip restart budget 2026-05-24 13:38:12 +01:00
Peter Steinberger
e1c799b732 test(telegram): keep startup limiter coverage focused 2026-05-24 12:36:16 +01:00
Peter Steinberger
2f4e5ee438 test(telegram): isolate startup probe limiter timing 2026-05-24 12:23:07 +01:00
Peter Steinberger
57701503a6 test(release): harden plugin prerelease checks 2026-05-24 12:02:09 +01:00
Peter Steinberger
ea685a7970 test(release): stabilize plugin prerelease checks 2026-05-24 11:40:31 +01:00
Peter Steinberger
e1c973de91 test(telegram): wait for startup probe slots 2026-05-24 11:21:03 +01:00
Peter Steinberger
a6a5e0cf6f test(codex): match sandbox exec-server yolo policy 2026-05-24 11:01:05 +01:00
Peter Steinberger
532d58c1e3 test(codex): avoid full sandbox exec-server turn run 2026-05-24 10:36:34 +01:00
Peter Steinberger
4d856c6dfe fix(docker): parse peer-suffixed lockfile packages 2026-05-24 09:51:29 +01:00
Peter Steinberger
a9ce9ce0f9 fix(docker): seed lockfile packages before prune 2026-05-24 09:29:07 +01:00
Peter Steinberger
f9ebf24db3 fix(docker): seed lockfile snapshot tarballs before prune 2026-05-24 09:17:55 +01:00
Peter Steinberger
ef07aa8cd6 test(codex): type thread start mock params 2026-05-24 08:53:22 +01:00
Vincent Koc
07c2407133 fix(plugins): harden Windows npm package staging 2026-05-24 08:41:18 +01:00
Peter Steinberger
5386e2950d test(codex): avoid full sandbox run in thread-start test 2026-05-24 08:40:45 +01:00
Vincent Koc
0b9f9db1b6 fix(release): harden Windows npm shim verification 2026-05-24 08:19:19 +01:00
Peter Steinberger
8e476dd21d test(codex): complete sandbox turn inline 2026-05-24 08:18:53 +01:00
Peter Steinberger
1b0b599407 test(release): type metadata snapshot mock params 2026-05-24 07:56:28 +01:00
Rubén Cuevas
a10e471462 fix(update): avoid broad tag fetches for dev updates (#84737)
Summary:
- The PR changes dev-channel git updates to fetch branches with `--no-tags`, adds targeted fetching for explicit dev tag refs, updates update-runner tests, and adds a changelog entry.
- Reproducibility: yes. Current main source shows dev updates still run a broad tag fetch, and the PR body sup ... al local bare-remote moved-tag reproducer showing that command fails before the branch update can continue.

Automerge notes:
- PR branch already contained follow-up commit before automerge: fix(update): avoid broad tag fetches for dev updates

Validation:
- ClawSweeper review passed for head 733680b1bc.
- Required merge gates passed before the squash merge.

Prepared head SHA: 733680b1bc
Review: https://github.com/openclaw/openclaw/pull/84737#issuecomment-4503692161

Co-authored-by: Ruben Cuevas <hi@rubencu.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>
2026-05-24 07:43:38 +01:00
homer-byte
cf60d8f280 Fix iMessage slash command acknowledgements (#82642)
Merged via squash.

Prepared head SHA: ecc8791393
Co-authored-by: homer-byte <262247270+homer-byte@users.noreply.github.com>
Co-authored-by: omarshahine <10343873+omarshahine@users.noreply.github.com>
Reviewed-by: @omarshahine
2026-05-24 07:43:38 +01:00
Peter Steinberger
198f69ddc6 test(release): finish plugin metadata prerelease sync 2026-05-24 07:42:43 +01:00
Peter Steinberger
82ab34232d test(release): align prerelease contracts 2026-05-24 07:23:21 +01:00
Peter Steinberger
87cd6b3e92 chore(release): prepare 2026.5.24 beta 1 2026-05-24 06:47:50 +01:00
195 changed files with 1273 additions and 644 deletions

View File

@@ -241,7 +241,7 @@ jobs:
set -euo pipefail
timeout --foreground --kill-after=30s 35m docker build \
--target runtime-assets \
--build-arg OPENCLAW_EXTENSIONS="matrix" \
--build-arg OPENCLAW_EXTENSIONS="diagnostics-otel,codex" \
.
normal_ci:

View File

@@ -2,6 +2,14 @@
Docs: https://docs.openclaw.ai
## Unreleased
### Changes
### Fixes
- iMessage: mark authorized slash-command turns as text-sourced commands so `/status`, `/new`, and `/restart` acknowledgements return to the source conversation. (#82642) thanks @homer-byte.
## 2026.5.24
### Changes
@@ -65,6 +73,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- Gateway/update: avoid fetching unrelated tags during dev-channel git updates so moved release tags do not block branch-based updates. (#84737) Thanks @rubencu.
- MiniMax: store OAuth token expiry as an absolute millisecond timestamp so OAuth profiles no longer appear expired on every request. (#83480) Thanks @NianJiuZst.
- Agents/Anthropic: strip missing or blank thinking signatures for signed-thinking providers even when recovery supplies a narrow replay policy without signature preservation. Fixes #84430. (#84448) Thanks @NianJiuZst.
- Agents/channels: send a visible notice when an aborted main session cannot be resumed after restart, including Telegram group targets. (#85805) Thanks @pfrederiksen.
@@ -106,6 +115,8 @@ Docs: https://docs.openclaw.ai
- Release: align generated config/API baselines and the meeting-notes plugin version so release preflight stays green on native Windows.
- Install/Windows: run Git hook setup through a Node prepare helper so native Windows installs no longer print POSIX shell errors.
- Checks/Windows: chunk and serialize extension oxlint shards on native Windows so changed gates avoid Go-backed linter memory spikes.
- Release/Windows: run installed `openclaw.cmd` verification through explicit `cmd.exe` wrapping so npm prepublish/postpublish checks avoid Node shell-argv warnings.
- Plugins/Windows: run plugin npm package staging through the shared npm runner so native Windows release checks avoid bare `npm` lookup and `.cmd` shell-argv handling.
- Checks/Windows: route full `pnpm check` stage commands through the managed child runner so Windows avoids Node shell-argv deprecation warnings there too.
- Agents/fs: allow workspace-only host write/edit tools to write through in-workspace symlink directory parents while preserving outside-workspace symlink rejection. Fixes #84696. Thanks @garbagenetwork.
- Checks/Windows: run managed child commands through explicit `cmd.exe` wrapping instead of Node shell mode with argv, avoiding Node 24 subprocess deprecation warnings during changed checks.

View File

@@ -1,4 +1,4 @@
e8e71a715bd33405280b5a9f6b6e788abed636fba66ec5f3a4f9b9a768a1637f config-baseline.json
d8c6d36cb079b929ed403503dd09bf61aa7f7ad1ad157ed85d3fc2dd1547baa6 config-baseline.json
003183db53a41905c540f37b1d30b3006ef8906915e13eac844b643cd210fdfe config-baseline.core.json
859b021f65400df22c95ae55b074cf26c83d3a0bfadb3fceeaca522f6ea391ae config-baseline.channel.json
57291e1848bc059994923354d7b0a822909da7a8139a6615a9d5dfa2d189ee5e config-baseline.channel.json
74441e331aabb3026784c148d4ee5ce3f489a15ed87ffd9b7ba0c5e2a7bc93be config-baseline.plugin.json

View File

@@ -1,2 +1,2 @@
8882e41620deeed05be9526981c32a034444abc232903b946c48d416f46f06c3 plugin-sdk-api-baseline.json
40b22ddad62692447717a2b4f0ecdbd9f6209fa86eaf4e66f85d37c48e26d394 plugin-sdk-api-baseline.jsonl
28fcbbe21ee8088d78774a17e8906d408345dfe210f3b3511a18e26efad6904c plugin-sdk-api-baseline.json
8076e25cda96fd463e800064ff6c56a872cf61de73ca0353e0911e0b47f89751 plugin-sdk-api-baseline.jsonl

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/acpx",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/acpx",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@agentclientprotocol/claude-agent-acp": "0.36.1",
"@zed-industries/codex-acp": "0.14.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/acpx",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw ACP runtime backend",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24",
"openclawVersion": "2026.5.24-beta.1",
"staticAssets": [
{
"source": "./src/runtime-internals/mcp-proxy.mjs",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/admin-http-rpc",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw admin HTTP RPC endpoint",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/alibaba-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Alibaba Model Studio video provider plugin",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@anthropic-ai/sdk": "0.97.1",
"@aws/bedrock-token-generator": "1.1.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Amazon Bedrock Mantle (OpenAI-compatible) provider plugin",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24",
"openclawVersion": "2026.5.24-beta.1",
"bundledDist": false
},
"release": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@aws-sdk/client-bedrock": "3.1051.0",
"@aws-sdk/client-bedrock-runtime": "3.1051.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Amazon Bedrock provider plugin",
"repository": {
"type": "git",
@@ -27,10 +27,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24",
"openclawVersion": "2026.5.24-beta.1",
"bundledDist": false
},
"release": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@anthropic-ai/vertex-sdk": "0.16.1",
"@earendil-works/pi-agent-core": "0.75.4",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Anthropic Vertex provider plugin",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24",
"openclawVersion": "2026.5.24-beta.1",
"bundledDist": false
},
"release": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Anthropic provider plugin",
"type": "module",

View File

@@ -119,8 +119,7 @@ describe("anthropic provider policy public artifact", () => {
});
expect(
nextConfig.agents?.defaults?.models?.["anthropic/claude-sonnet-4-20250514"]?.params
?.cacheRetention,
nextConfig.agents?.defaults?.models?.["anthropic/claude-sonnet-4-6"]?.params?.cacheRetention,
).toBe("short");
});

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/arcee-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Arcee provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/azure-speech",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Azure Speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/bonjour",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Bonjour/mDNS gateway discovery",
"type": "module",
"dependencies": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/brave-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/brave-plugin",
"version": "2026.5.24"
"version": "2026.5.24-beta.1"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/brave-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Brave plugin",
"repository": {
"type": "git",
@@ -21,10 +21,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/browser-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw browser tool plugin",
"type": "module",

View File

@@ -65,7 +65,9 @@ vi.mock("../../media/store.js", () => ({
vi.mock("./agent.shared.js", () => ({
getPwAiModule: vi.fn(async () => null),
handleRouteError: vi.fn(),
handleRouteError: vi.fn((_ctx, _res, err) => {
throw err;
}),
readBody: vi.fn((req: { body?: unknown }) => req.body ?? {}),
requirePwAi: vi.fn(async () => null),
resolveProfileContext: vi.fn(() => profileContext),
@@ -78,7 +80,7 @@ const { registerBrowserAgentSnapshotRoutes } = await import("./agent.snapshot.js
function getSnapshotHandler() {
const { app, getHandlers } = createBrowserRouteApp();
registerBrowserAgentSnapshotRoutes(app, {
state: () => ({ resolved: {} }),
state: () => ({ resolved: { extraArgs: [] } }),
} as never);
const handler = getHandlers.get("/snapshot");
expect(handler).toBeTypeOf("function");

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/byteplus-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw BytePlus provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/canvas-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Canvas plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/cerebras-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Cerebras provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/chutes-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Chutes.ai provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/clickclack",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw ClickClack channel plugin",
"type": "module",
@@ -18,7 +18,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/cloudflare-ai-gateway-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Cloudflare AI Gateway provider plugin",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/codex",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/codex",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@earendil-works/pi-coding-agent": "0.75.4",
"@openai/codex": "0.132.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Codex harness and model provider plugin",
"repository": {
"type": "git",
@@ -27,10 +27,10 @@
"minHostVersion": ">=2026.5.1-beta.1"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1170,92 +1170,101 @@ describe("runCodexAppServerAttempt", () => {
);
});
it("starts active OpenClaw sandbox turns with Codex native execution disabled", async () => {
const runtimeId = `codex-test-runtime-${path.basename(tempDir)}`;
const restoreSandboxBackend = registerSandboxBackend("codex-test-sandbox", async () => ({
id: "codex-test-sandbox",
runtimeId,
runtimeLabel: "Codex Test Sandbox",
workdir: "/workspace",
buildExecSpec: async () => ({
argv: ["true"],
env: {},
stdinMode: "pipe-closed" as const,
}),
runShellCommand: async () => ({
stdout: Buffer.alloc(0),
stderr: Buffer.alloc(0),
code: 0,
}),
}));
try {
testing.setOpenClawCodingToolsFactoryForTests(() => [
createRuntimeDynamicTool("exec"),
createRuntimeDynamicTool("process"),
createRuntimeDynamicTool("message"),
]);
const sessionFile = path.join(tempDir, "session.jsonl");
const workspaceDir = path.join(tempDir, "workspace");
const params = createParams(sessionFile, workspaceDir);
params.disableTools = false;
params.runtimePlan = createCodexRuntimePlanFixture();
params.config = {
agents: {
defaults: {
sandbox: {
mode: "all",
backend: "codex-test-sandbox",
scope: "session",
workspaceAccess: "rw",
prune: { idleHours: 0, maxAgeDays: 0 },
},
},
},
} as never;
const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
it("starts active OpenClaw sandbox threads with Codex native execution disabled", async () => {
testing.setOpenClawCodingToolsFactoryForTests(() => [
createRuntimeDynamicTool("exec"),
createRuntimeDynamicTool("process"),
createRuntimeDynamicTool("message"),
]);
const sessionFile = path.join(tempDir, "session.jsonl");
const workspaceDir = path.join(tempDir, "workspace");
const params = createParams(sessionFile, workspaceDir);
params.disableTools = false;
params.runtimePlan = createCodexRuntimePlanFixture();
const sandbox = {
enabled: true,
backendId: "codex-test-sandbox",
workspaceAccess: "rw",
} as never;
const nativeToolSurfaceEnabled = testing.shouldEnableCodexAppServerNativeToolSurface(
params,
sandbox,
);
const dynamicTools = await testing.buildDynamicTools({
params,
resolvedWorkspace: workspaceDir,
effectiveWorkspace: workspaceDir,
sandboxSessionKey: params.sessionKey!,
sandbox,
nativeToolSurfaceEnabled,
runAbortController: new AbortController(),
sessionAgentId: "main",
pluginConfig: {},
onYieldDetected: () => undefined,
});
const request = vi.fn(async (method: string, _requestParams?: unknown) => {
if (method === "thread/start") {
return threadStartResult();
}
throw new Error(`unexpected method: ${method}`);
});
const run = runCodexAppServerAttempt(params, {
pluginConfig: { appServer: { mode: "yolo" } },
});
await waitForMethod("turn/start");
await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
await startOrResumeThread({
client: { request } as never,
params,
cwd: workspaceDir,
dynamicTools: dynamicTools as never,
appServer: createThreadLifecycleAppServerOptions(),
nativeCodeModeEnabled: nativeToolSurfaceEnabled,
nativeCodeModeOnlyEnabled: false,
userMcpServersEnabled: nativeToolSurfaceEnabled,
environmentSelection: [],
});
const startRequest = requests.find((request) => request.method === "thread/start");
const startParams = startRequest?.params as Record<string, unknown> | undefined;
const startConfig = startParams?.config as Record<string, unknown> | undefined;
const dynamicTools = startParams?.dynamicTools as Array<{ name: string }> | undefined;
expect(startConfig?.["features.code_mode"]).toBe(false);
expect(startConfig?.["features.code_mode_only"]).toBe(false);
expect(startParams?.environments).toEqual([]);
expect(dynamicTools?.map((tool) => tool.name)).toEqual([
"message",
"sandbox_exec",
"sandbox_process",
]);
} finally {
restoreSandboxBackend();
}
const startRequest = request.mock.calls.find(([method]) => method === "thread/start");
const startParams = startRequest?.[1] as Record<string, unknown> | undefined;
const startConfig = startParams?.config as Record<string, unknown> | undefined;
const startDynamicTools = startParams?.dynamicTools as Array<{ name: string }> | undefined;
expect(startConfig?.["features.code_mode"]).toBe(false);
expect(startConfig?.["features.code_mode_only"]).toBe(false);
expect(startParams?.environments).toEqual([]);
expect(startDynamicTools?.map((tool) => tool.name)).toEqual([
"message",
"sandbox_exec",
"sandbox_process",
]);
});
it("routes native Codex execution through an OpenClaw sandbox exec-server when opted in", async () => {
const runtimeId = `codex-test-runtime-${path.basename(tempDir)}`;
const restoreSandboxBackend = registerSandboxBackend("codex-test-sandbox", async () => ({
id: "codex-test-sandbox",
runtimeId,
const appServer = {
...createThreadLifecycleAppServerOptions(),
sandbox: "danger-full-access" as const,
};
const sandbox = {
...createSandboxContext({
runShellCommand: async () => ({
stdout: Buffer.alloc(0),
stderr: Buffer.alloc(0),
code: 0,
}),
}),
backendId: "codex-test-sandbox",
runtimeId: `codex-test-runtime-${path.basename(tempDir)}`,
runtimeLabel: "Codex Test Sandbox",
workdir: "/workspace",
buildExecSpec: async () => ({
argv: ["true"],
env: {},
stdinMode: "pipe-closed" as const,
}),
runShellCommand: async () => ({
stdout: Buffer.alloc(0),
stderr: Buffer.alloc(0),
code: 0,
}),
}));
};
const request = vi.fn(async (method: string, _requestParams?: unknown) => {
if (method === "environment/add") {
return {};
}
if (method === "thread/start") {
return threadStartResult();
}
throw new Error(`unexpected method: ${method}`);
});
const client = {
getServerVersion: () => "0.132.0",
request,
};
try {
testing.setOpenClawCodingToolsFactoryForTests(() => [
createRuntimeDynamicTool("exec"),
@@ -1280,26 +1289,64 @@ describe("runCodexAppServerAttempt", () => {
},
},
} as never;
const { requests, waitForMethod, completeTurn } = createStartedThreadHarness();
const run = runCodexAppServerAttempt(params, {
const nativeToolSurfaceEnabled = testing.shouldEnableCodexAppServerNativeToolSurface(
params,
sandbox as never,
{ sandboxExecServerEnabled: true },
);
const dynamicTools = await testing.buildDynamicTools({
params,
resolvedWorkspace: workspaceDir,
effectiveWorkspace: "/workspace",
sandboxSessionKey: params.sessionKey!,
sandbox: sandbox as never,
nativeToolSurfaceEnabled,
runAbortController: new AbortController(),
sessionAgentId: "main",
pluginConfig: {
appServer: {
mode: "yolo",
experimental: { sandboxExecServer: true },
},
},
onYieldDetected: () => undefined,
});
await waitForMethod("turn/start");
await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
const environment = await ensureCodexSandboxExecServerEnvironment({
client: client as never,
sandbox: sandbox as never,
appServerStartOptions: appServer.start,
});
if (!environment) {
throw new Error("expected sandbox exec-server environment");
}
const environmentSelection = [environment];
const environmentAdd = requests.find((request) => request.method === "environment/add");
const environmentAddParams = environmentAdd?.params as
await startOrResumeThread({
client: client as never,
params,
cwd: environment.cwd,
dynamicTools: dynamicTools as never,
appServer,
nativeCodeModeEnabled: nativeToolSurfaceEnabled,
nativeCodeModeOnlyEnabled: false,
userMcpServersEnabled: nativeToolSurfaceEnabled,
environmentSelection,
});
const turnParams = buildTurnStartParams(params, {
threadId: "thread-1",
cwd: environment.cwd,
appServer,
sandboxPolicy: { type: "externalSandbox", networkAccess: "enabled" },
environmentSelection,
});
const environmentAdd = request.mock.calls.find(([method]) => method === "environment/add");
const environmentAddParams = environmentAdd?.[1] as
| { environmentId?: string; execServerUrl?: string }
| undefined;
const startRequest = requests.find((request) => request.method === "thread/start");
const startParams = startRequest?.params as
const startRequest = request.mock.calls.find(([method]) => method === "thread/start");
const startParams = startRequest?.[1] as
| {
cwd?: string;
dynamicTools?: Array<{ name: string }>;
@@ -1311,15 +1358,8 @@ describe("runCodexAppServerAttempt", () => {
};
}
| undefined;
const turnRequest = requests.find((request) => request.method === "turn/start");
const turnParams = turnRequest?.params as
| {
cwd?: string;
environments?: Array<{ environmentId?: string; cwd?: string }>;
sandboxPolicy?: { type?: string; networkAccess?: string };
}
| undefined;
expect(nativeToolSurfaceEnabled).toBe(true);
expect(environmentAddParams?.environmentId).toMatch(/^openclaw-sandbox-/);
expect(environmentAddParams?.execServerUrl).toMatch(/^ws:\/\/127\.0\.0\.1:/);
expect(startParams?.cwd).toBe("/workspace");
@@ -1330,14 +1370,14 @@ describe("runCodexAppServerAttempt", () => {
{ environmentId: environmentAddParams?.environmentId, cwd: "/workspace" },
]);
expect(startParams?.sandbox).toBe("danger-full-access");
expect(turnParams?.sandboxPolicy).toEqual({
expect(turnParams.sandboxPolicy).toEqual({
type: "externalSandbox",
networkAccess: "enabled",
});
expect(turnParams?.cwd).toBe("/workspace");
expect(turnParams?.environments).toEqual(startParams?.environments);
expect(turnParams.cwd).toBe("/workspace");
expect(turnParams.environments).toEqual(startParams?.environments);
} finally {
restoreSandboxBackend();
await releaseCodexSandboxExecServerEnvironment(sandbox as never);
}
});

View File

@@ -100,6 +100,12 @@ async function runStreamingSandboxHttpRequest(
child.once("close", () => {
socket.off("close", abortOnSocketClose);
});
child.stdin.on("error", (error: NodeJS.ErrnoException) => {
if (error.code === "EPIPE" || error.code === "ERR_STREAM_DESTROYED") {
return;
}
embeddedAgentLog.warn("codex sandbox http/request stdin write failed", { error });
});
child.stdin.end(JSON.stringify(params));
return await readStreamingSandboxHttpResponse({
child,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/comfy-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw ComfyUI provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/copilot-proxy",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Copilot Proxy provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepgram-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Deepgram media-understanding provider",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepinfra-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw DeepInfra provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/deepseek-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw DeepSeek provider plugin",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@opentelemetry/api": "1.9.1",
"@opentelemetry/api-logs": "0.218.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw diagnostics OpenTelemetry exporter",
"repository": {
"type": "git",
@@ -34,10 +34,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.5.24"
"version": "2026.5.24-beta.1"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw diagnostics Prometheus exporter",
"repository": {
"type": "git",
@@ -21,10 +21,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diffs",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diffs",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@pierre/diffs": "1.2.1",
"@pierre/theme": "1.0.3",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diffs",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw diff viewer plugin",
"repository": {
"type": "git",
@@ -31,10 +31,10 @@
"minHostVersion": ">=2026.4.30"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24",
"openclawVersion": "2026.5.24-beta.1",
"staticAssets": [
{
"source": "./assets/viewer-runtime.js",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/discord",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/discord",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@discordjs/voice": "0.19.2",
"discord-api-types": "0.38.47",
@@ -17,7 +17,7 @@
"ws": "8.20.1"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/discord",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Discord channel plugin",
"repository": {
"type": "git",
@@ -21,7 +21,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -65,10 +65,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/document-extract-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw local document extraction plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/duckduckgo-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw DuckDuckGo plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/elevenlabs-speech",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw ElevenLabs speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/exa-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Exa plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fal-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw fal provider plugin",
"type": "module",

View File

@@ -1,19 +1,19 @@
{
"name": "@openclaw/feishu",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/feishu",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@larksuiteoapi/node-sdk": "1.65.0",
"typebox": "1.1.38",
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/feishu",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -48,10 +48,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/file-transfer",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw file transfer plugin (file_fetch, dir_list, dir_fetch, file_write)",
"type": "module",
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/firecrawl-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Firecrawl plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fireworks-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Fireworks provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/github-copilot-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw GitHub Copilot provider plugin",
"type": "module",

View File

@@ -1,18 +1,18 @@
{
"name": "@openclaw/google-meet",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/google-meet",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"commander": "14.0.3",
"typebox": "1.1.38"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-meet",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Google Meet participant plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -33,10 +33,10 @@
"minHostVersion": ">=2026.4.20"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-plugin",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Google plugin",
"type": "module",

View File

@@ -1,19 +1,19 @@
{
"name": "@openclaw/googlechat",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/googlechat",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"gaxios": "7.1.4",
"google-auth-library": "10.6.2",
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/googlechat",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Google Chat channel plugin",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -75,10 +75,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/gradium-speech",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Gradium speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/groq-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Groq media-understanding provider",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/huggingface-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Hugging Face provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/image-generation-core",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw image generation runtime package",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/imessage",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac",
"type": "module",
@@ -40,10 +40,10 @@
]
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
}
},
"pluginInspector": {

View File

@@ -213,6 +213,7 @@ describe("buildIMessageInboundContext forwards GroupSystemPrompt", () => {
replyContext: null,
effectiveWasMentioned: false,
commandAuthorized: false,
hasControlCommand: false,
effectiveDmAllowFrom: [],
effectiveGroupAllowFrom: [],
groupSystemPrompt: decision.groupSystemPrompt,

View File

@@ -803,6 +803,7 @@ describe("resolveIMessageInboundDecision command auth", () => {
storeAllowFrom: string[];
dmPolicy?: "open" | "pairing" | "allowlist" | "disabled";
allowFrom?: string[];
text?: string;
}) =>
resolveIMessageInboundDecision({
cfg,
@@ -810,13 +811,13 @@ describe("resolveIMessageInboundDecision command auth", () => {
message: {
id: params.messageId,
sender: "+15555550123",
text: "/status",
text: params.text ?? "/status",
is_from_me: false,
is_group: false,
},
opts: undefined,
messageText: "/status",
bodyText: "/status",
messageText: params.text ?? "/status",
bodyText: params.text ?? "/status",
allowFrom: params.allowFrom ?? [],
groupAllowFrom: [],
groupPolicy: "open",
@@ -849,6 +850,84 @@ describe("resolveIMessageInboundDecision command auth", () => {
return;
}
expect(decision.commandAuthorized).toBe(true);
expect(decision.hasControlCommand).toBe(true);
});
it("marks authorized iMessage control commands as text command turns", async () => {
const decision = await resolveDmCommandDecision({
messageId: 102,
dmPolicy: "pairing",
storeAllowFrom: ["+15555550123"],
text: "/new",
});
expect(decision.kind).toBe("dispatch");
if (decision.kind !== "dispatch") {
return;
}
const { ctxPayload } = buildIMessageInboundContext({
cfg,
decision,
message: {
id: 102,
guid: "p:0/GUID-command",
sender: "+15555550123",
text: "/new",
is_from_me: false,
is_group: false,
},
historyLimit: 0,
groupHistories: new Map(),
});
expect(ctxPayload.CommandAuthorized).toBe(true);
expect(ctxPayload.CommandSource).toBe("text");
expect(ctxPayload.CommandTurn).toMatchObject({
kind: "text-slash",
source: "text",
authorized: true,
commandName: "new",
});
});
it("does not mark authorized non-command iMessage DMs as text command turns", async () => {
const decision = await resolveDmCommandDecision({
messageId: 103,
dmPolicy: "pairing",
storeAllowFrom: ["+15555550123"],
text: "hello there",
});
expect(decision.kind).toBe("dispatch");
if (decision.kind !== "dispatch") {
return;
}
expect(decision.commandAuthorized).toBe(true);
expect(decision.hasControlCommand).toBe(false);
const { ctxPayload } = buildIMessageInboundContext({
cfg,
decision,
message: {
id: 103,
guid: "p:0/GUID-non-command",
sender: "+15555550123",
text: "hello there",
is_from_me: false,
is_group: false,
},
historyLimit: 0,
groupHistories: new Map(),
});
expect(ctxPayload.CommandAuthorized).toBe(true);
expect(ctxPayload.CommandSource).toBeUndefined();
expect(ctxPayload.CommandTurn).toMatchObject({
kind: "normal",
source: "message",
commandName: undefined,
});
});
});
@@ -892,6 +971,7 @@ describe("buildIMessageInboundContext MessageSid handling (rowid-leak regression
replyContext: undefined,
isCommand: false,
commandAuthorized: false,
hasControlCommand: false,
};
return {
cfg: {} as OpenClawConfig,

View File

@@ -395,6 +395,7 @@ type IMessageInboundDispatchDecision = {
replyContext: IMessageReplyContext | null;
effectiveWasMentioned: boolean;
commandAuthorized: boolean;
hasControlCommand: boolean;
// Forwarded as ctxPayload.GroupSystemPrompt for group messages. Resolved
// from `channels.imessage.groups.<chat_id>.systemPrompt` (or the `"*"`
// wildcard) at gate time. Always undefined for DMs.
@@ -884,6 +885,7 @@ export async function resolveIMessageInboundDecision(params: {
replyContext: filteredReplyContext,
effectiveWasMentioned,
commandAuthorized,
hasControlCommand: hasControlCommandInMessage,
groupSystemPrompt,
};
}
@@ -1031,6 +1033,8 @@ export function buildIMessageInboundContext(params: {
MediaRemoteHost: params.remoteHost,
WasMentioned: decision.effectiveWasMentioned,
CommandAuthorized: decision.commandAuthorized,
CommandSource:
decision.commandAuthorized && decision.hasControlCommand ? ("text" as const) : undefined,
OriginatingChannel: "imessage" as const,
OriginatingTo: imessageTo,
});

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/inworld-speech",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Inworld speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/irc",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw IRC channel plugin",
"type": "module",
"devDependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/kilocode-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Kilo Gateway provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/kimi-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Kimi provider plugin",
"type": "module",

View File

@@ -1,18 +1,18 @@
{
"name": "@openclaw/line",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/line",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@line/bot-sdk": "11.0.0",
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/line",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw LINE channel plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -46,10 +46,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/litellm-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw LiteLLM provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/llm-task",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw JSON-only LLM task plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lmstudio-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw LM Studio provider plugin",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/lobster",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/lobster",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@clawdbot/lobster": "2026.4.6",
"ajv": "8.20.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lobster",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
"repository": {
"type": "git",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/matrix",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/matrix",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@matrix-org/matrix-sdk-crypto-nodejs": "0.4.0",
"@matrix-org/matrix-sdk-crypto-wasm": "18.3.0",
@@ -18,7 +18,7 @@
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/matrix",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Matrix channel plugin",
"repository": {
"type": "git",
@@ -22,7 +22,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -87,10 +87,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/mattermost",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Mattermost channel plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/media-understanding-core",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw media understanding runtime package",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/meeting-notes",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw meeting notes plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-core",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw core memory search plugin",
"type": "module",
@@ -14,7 +14,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/memory-lancedb",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/memory-lancedb",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@lancedb/lancedb": "0.29.0",
"apache-arrow": "18.1.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-lancedb",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"bundleRuntimeDependencies": false,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-wiki",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw persistent wiki plugin",
"type": "module",
@@ -14,7 +14,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-foundry",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Microsoft Foundry provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-speech",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Microsoft speech plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/migrate-claude",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "Claude to OpenClaw migration provider",
"type": "module",
@@ -9,7 +9,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/migrate-hermes",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "Hermes to OpenClaw migration provider",
"type": "module",
@@ -12,7 +12,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/minimax-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw MiniMax provider and OAuth plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/mistral-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Mistral provider plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/moonshot-provider",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"private": true,
"description": "OpenClaw Moonshot provider plugin",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/msteams",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/msteams",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"@azure/identity": "4.13.1",
"@microsoft/teams.api": "2.0.11",
@@ -17,7 +17,7 @@
"typebox": "1.1.38"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/msteams",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"description": "OpenClaw Microsoft Teams channel plugin",
"repository": {
"type": "git",
@@ -22,7 +22,7 @@
"openclaw": "workspace:*"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -58,10 +58,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.5.24"
"pluginApi": ">=2026.5.24-beta.1"
},
"build": {
"openclawVersion": "2026.5.24"
"openclawVersion": "2026.5.24-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,17 +1,17 @@
{
"name": "@openclaw/nextcloud-talk",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/nextcloud-talk",
"version": "2026.5.24",
"version": "2026.5.24-beta.1",
"dependencies": {
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.5.24"
"openclaw": ">=2026.5.24-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

Some files were not shown because too many files have changed in this diff Show More