Compare commits

...

6 Commits

Author SHA1 Message Date
Peter Steinberger
f5b52bddb5 test(codex): widen app-server wait timeout type 2026-05-26 10:17:52 +01:00
Peter Steinberger
f0653f28b9 ci(release): include performance run in validation manifest 2026-05-26 10:09:16 +01:00
Vincent Koc
046b2d8ddd fix(codex): preserve sandbox bootstrap path style 2026-05-26 10:09:16 +01:00
Omar Shahine
878d18609b fix(imessage): dedupe accounts sharing the local Messages source (#86705)
Merged via squash.

Prepared head SHA: fcfe97d7c8
Co-authored-by: omarshahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: omarshahine <10343873+omarshahine@users.noreply.github.com>
Reviewed-by: @omarshahine
2026-05-26 10:09:16 +01:00
Omar Shahine
dd173f64fa Fix iMessage image attachment roots (#86569)
* fix imessage image attachment roots

* fix media tool inbound wildcard roots

* docs(changelog): add iMessage image attachment root fix entry for #86569

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
2026-05-26 10:09:16 +01:00
Peter Steinberger
f72e3424ae chore(release): prepare 2026.5.25 beta 1 2026-05-26 08:21:17 +01:00
178 changed files with 960 additions and 309 deletions

View File

@@ -1471,6 +1471,7 @@ jobs:
PLUGIN_PRERELEASE_RUN_ID: ${{ needs.plugin_prerelease.outputs.run_id }}
RELEASE_CHECKS_RUN_ID: ${{ needs.release_checks.outputs.run_id }}
NPM_TELEGRAM_RUN_ID: ${{ needs.npm_telegram.outputs.run_id }}
PERFORMANCE_RUN_ID: ${{ needs.performance.outputs.run_id }}
run: |
set -euo pipefail
manifest_dir="${RUNNER_TEMP}/full-release-validation"

View File

@@ -21,6 +21,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- iMessage: thread current channel/account inbound attachment roots into the image tool so iMessage-saved attachments under `~/Library/Messages/Attachments` (including the wildcard `/Users/*/Library/Messages/Attachments` root) are read through the existing inbound path policy instead of being rejected as `path-not-allowed`. Literal `localRoots` stays workspace-scoped. Fixes #30170. (#86569)
- QQ Bot: respect `OPENCLAW_HOME` for outbound media path resolution so `<qqmedia>` sends no longer silently fail when `HOME` and `OPENCLAW_HOME` differ (Docker / multi-user hosts). Persisted QQ Bot data (sessions, known users, refs) stays anchored on the OS home for upgrade compatibility. Fixes #83562. Thanks @sliverp.
- Update: report the primary malformed `openclaw.extensions` payload error without adding a duplicate missing-main diagnostic. (#86596) Thanks @ferminquant.
- Control UI: keep host-local Markdown file paths inert while preserving app-relative links. (#86620) Thanks @BryanTegomoh.
@@ -134,6 +135,7 @@ Docs: https://docs.openclaw.ai
- Gateway: require Talk secret authority before setup-code handoff can include Talk secrets. (#85690) Thanks @ngutman.
- Agents: keep fallback error reporting scoped to the active model candidate so stale prior-provider quota/auth text is not reported for later fallback attempts. (#86134) thanks @zhangguiping-xydt.
- iMessage: dedupe watcher startup when `channels.imessage.accounts` lists both `default` and a named account that point at the same local Messages source, so the gateway no longer spawns two `imsg rpc` processes or doubles inbound replies; the dedupe is scoped to watcher startup, leaving duplicate accounts addressable for outbound sends, status, and capability listings, and `openclaw doctor` flags the redundant account with a rebinding hint. Fixes #65141. (#86705) Thanks @swang430.
## 2026.5.25

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/admin-http-rpc",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"dependencies": {
"@anthropic-ai/sdk": "0.98.0",
"@aws/bedrock-token-generator": "1.1.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26",
"openclawVersion": "2026.5.25-beta.1",
"bundledDist": false
},
"release": {

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26",
"openclawVersion": "2026.5.25-beta.1",
"bundledDist": false
},
"release": {

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26",
"openclawVersion": "2026.5.25-beta.1",
"bundledDist": false
},
"release": {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/cloudflare-ai-gateway-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/codex",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"dependencies": {
"@earendil-works/pi-coding-agent": "0.75.5",
"@openai/codex": "0.133.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -421,7 +421,7 @@ function createAppServerHarness(
return {
request,
requests,
async waitForMethod(method: string, timeoutMs = appServerHarnessWait.timeout) {
async waitForMethod(method: string, timeoutMs: number = appServerHarnessWait.timeout) {
await vi.waitFor(
() => {
if (!requests.some((entry) => entry.method === method)) {
@@ -6827,8 +6827,7 @@ describe("runCodexAppServerAttempt", () => {
},
} as never;
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await harness.waitForMethod("turn/start", 180_000);
await run;
await vi.waitFor(
() =>
@@ -6871,7 +6870,7 @@ describe("runCodexAppServerAttempt", () => {
} finally {
stopDiagnostics();
}
});
}, 240_000);
it("classifies codex model-call timeout diagnostics", async () => {
const diagnosticEvents: DiagnosticEventPayload[] = [];

View File

@@ -5671,9 +5671,16 @@ function remapCodexContextFilePath(params: {
) {
return params.file;
}
const targetUsesPosixSeparators =
params.targetWorkspaceDir.includes("/") && !params.targetWorkspaceDir.includes("\\");
const normalizedRelativePath = targetUsesPosixSeparators
? relativePath.replaceAll("\\", "/")
: relativePath.replaceAll("/", "\\");
return {
...params.file,
path: path.join(params.targetWorkspaceDir, relativePath),
path: targetUsesPosixSeparators
? path.posix.join(params.targetWorkspaceDir, normalizedRelativePath)
: path.win32.join(params.targetWorkspaceDir, normalizedRelativePath),
};
}

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/copilot-proxy",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw DeepInfra provider plugin",
"type": "module",

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diagnostics-otel",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"description": "OpenClaw diagnostics OpenTelemetry exporter",
"repository": {
"type": "git",
@@ -34,10 +34,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
},
"release": {
"publishToClawHub": true,

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/discord",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/discord",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"dependencies": {
"@discordjs/voice": "0.19.2",
"discord-api-types": "0.38.48",
@@ -18,7 +18,7 @@
"ws": "8.21.0"
},
"peerDependencies": {
"openclaw": ">=2026.5.26"
"openclaw": ">=2026.5.25-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/document-extract-plugin",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw DuckDuckGo plugin",
"type": "module",

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/feishu",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"openclaw": ">=2026.5.25-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -48,10 +48,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.5.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/file-transfer",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw Firecrawl plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fireworks-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/google-meet",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"dependencies": {
"commander": "14.0.3",
"typebox": "1.1.38"
},
"peerDependencies": {
"openclaw": ">=2026.5.26"
"openclaw": ">=2026.5.25-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/groq-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw image generation runtime package",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/imessage",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
}
},
"pluginInspector": {

View File

@@ -1,8 +1,11 @@
import { describe, expect, it } from "vitest";
import {
collectIMessageDuplicateAccountSourceWarnings,
listEnabledIMessageAccounts,
listIMessageAccountIds,
resolveDefaultIMessageAccountId,
resolveIMessageAccount,
resolveIMessageDuplicateSourceOwner,
} from "./accounts.js";
describe("resolveIMessageAccount", () => {
@@ -48,3 +51,113 @@ describe("resolveIMessageAccount", () => {
expect(resolved.configured).toBe(true);
});
});
describe("iMessage duplicate-source watcher ownership", () => {
it("flags default as a non-owner when a named account shares its source", () => {
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": {
cliPath: "imsg",
dmPolicy: "pairing",
groupPolicy: "allowlist",
},
default: {
dmPolicy: "pairing",
groupPolicy: "allowlist",
},
},
},
},
} as never;
// Both accounts stay enabled so outbound, status, and capability surfaces
// keep treating them normally; only the watcher startup path consults
// resolveIMessageDuplicateSourceOwner to skip the redundant `imsg rpc`.
const enabled = listEnabledIMessageAccounts(cfg).map((a) => a.accountId);
expect(enabled).toEqual(["default", "swang430-gmail-com"]);
const dupAccount = resolveIMessageAccount({ cfg, accountId: "default" });
expect(resolveIMessageDuplicateSourceOwner({ cfg, account: dupAccount })).toBe(
"swang430-gmail-com",
);
const ownerAccount = resolveIMessageAccount({ cfg, accountId: "swang430-gmail-com" });
expect(resolveIMessageDuplicateSourceOwner({ cfg, account: ownerAccount })).toBeUndefined();
});
it("reports no duplicate ownership when accounts target different cliPaths", () => {
const cfg = {
channels: {
imessage: {
accounts: {
work: { cliPath: "/usr/local/bin/imsg-work" },
home: { cliPath: "/usr/local/bin/imsg-home" },
},
},
},
} as never;
const enabled = listEnabledIMessageAccounts(cfg).map((a) => a.accountId);
expect(enabled).toEqual(["home", "work"]);
for (const accountId of enabled) {
const account = resolveIMessageAccount({ cfg, accountId });
expect(resolveIMessageDuplicateSourceOwner({ cfg, account })).toBeUndefined();
}
});
it("ignores a disabled duplicate when computing ownership", () => {
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": {},
default: { enabled: false },
},
},
},
} as never;
const enabled = listEnabledIMessageAccounts(cfg).map((a) => a.accountId);
expect(enabled).toEqual(["swang430-gmail-com"]);
const ownerAccount = resolveIMessageAccount({ cfg, accountId: "swang430-gmail-com" });
expect(resolveIMessageDuplicateSourceOwner({ cfg, account: ownerAccount })).toBeUndefined();
});
it("emits one preview warning per collision group", () => {
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": {},
default: {},
},
},
},
} as never;
const warnings = collectIMessageDuplicateAccountSourceWarnings({ cfg });
expect(warnings).toHaveLength(1);
expect(warnings[0]).toMatch(/channels\.imessage:/);
expect(warnings[0]).toMatch(/swang430-gmail-com/);
expect(warnings[0]).toMatch(/"default"/);
expect(warnings[0]).toMatch(/cliPath=imsg/);
});
it("emits no warning when only one account is enabled", () => {
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": {},
default: { enabled: false },
},
},
},
} as never;
expect(collectIMessageDuplicateAccountSourceWarnings({ cfg })).toEqual([]);
});
});

View File

@@ -1,3 +1,4 @@
import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id";
import {
createAccountListHelpers,
normalizeAccountId,
@@ -68,8 +69,114 @@ export function resolveIMessageAccount(params: {
};
}
function normalizeIMessageCliPath(value: string | undefined | null): string {
return value?.trim() || "imsg";
}
function normalizeIMessageDbPath(value: string | undefined | null): string {
return value?.trim() ?? "";
}
// Stable signature for the local Messages backend an iMessage account targets.
// Two enabled accounts that share a signature watch the same source, which
// caused duplicate inbound handling in openclaw/openclaw#65141.
export function resolveIMessageAccountSourceSignature(account: ResolvedIMessageAccount): string {
return JSON.stringify([
normalizeIMessageCliPath(account.config.cliPath),
normalizeIMessageDbPath(account.config.dbPath),
]);
}
function resolveIMessageAccountSourceOwner(params: {
cfg: OpenClawConfig;
signature: string;
}): string | undefined {
// Prefer an explicit named account over the implicit "default" so that
// bindings tied to the named account keep working (openclaw/openclaw#65141).
let defaultOwner: string | undefined;
for (const candidateAccountId of listIMessageAccountIds(params.cfg)) {
const candidate = resolveIMessageAccount({
cfg: params.cfg,
accountId: candidateAccountId,
});
if (!candidate.enabled) {
continue;
}
if (resolveIMessageAccountSourceSignature(candidate) !== params.signature) {
continue;
}
if (candidate.accountId === DEFAULT_ACCOUNT_ID) {
defaultOwner ??= candidate.accountId;
continue;
}
return candidate.accountId;
}
return defaultOwner;
}
/**
* Returns the owner account id when `account` is an enabled duplicate of
* another enabled account that targets the same local Messages source. Used
* by the iMessage gateway lifecycle to skip starting redundant `imsg rpc`
* watchers (openclaw/openclaw#65141) without otherwise marking the duplicate
* disabled — outbound selection, status surfaces, and capability listings
* keep treating both accounts normally.
*/
export function resolveIMessageDuplicateSourceOwner(params: {
cfg: OpenClawConfig;
account: ResolvedIMessageAccount;
}): string | undefined {
if (!params.account.enabled) {
return undefined;
}
const owner = resolveIMessageAccountSourceOwner({
cfg: params.cfg,
signature: resolveIMessageAccountSourceSignature(params.account),
});
return owner && owner !== params.account.accountId ? owner : undefined;
}
export function listEnabledIMessageAccounts(cfg: OpenClawConfig): ResolvedIMessageAccount[] {
return listIMessageAccountIds(cfg)
.map((accountId) => resolveIMessageAccount({ cfg, accountId }))
.filter((account) => account.enabled);
}
export function collectIMessageDuplicateAccountSourceWarnings(params: {
cfg: OpenClawConfig;
}): string[] {
const groups = new Map<string, ResolvedIMessageAccount[]>();
for (const accountId of listIMessageAccountIds(params.cfg)) {
const account = resolveIMessageAccount({ cfg: params.cfg, accountId });
if (!account.enabled) {
continue;
}
const signature = resolveIMessageAccountSourceSignature(account);
const existing = groups.get(signature);
if (existing) {
existing.push(account);
} else {
groups.set(signature, [account]);
}
}
const warnings: string[] = [];
for (const collisions of groups.values()) {
if (collisions.length < 2) {
continue;
}
const ownerId = resolveIMessageAccountSourceOwner({
cfg: params.cfg,
signature: resolveIMessageAccountSourceSignature(collisions[0]),
});
const owner = collisions.find((a) => a.accountId === ownerId) ?? collisions[0];
const duplicates = collisions.filter((a) => a.accountId !== owner.accountId);
const dupIds = duplicates.map((a) => `"${a.accountId}"`).join(", ");
const cliPath = normalizeIMessageCliPath(owner.config.cliPath);
const dbPath = normalizeIMessageDbPath(owner.config.dbPath);
const where = dbPath ? `cliPath=${cliPath}, dbPath=${dbPath}` : `cliPath=${cliPath}`;
warnings.push(
`- channels.imessage: accounts "${owner.accountId}" and ${dupIds} watch the same local Messages source (${where}). OpenClaw runs one watcher (owner: "${owner.accountId}") and idles the duplicate; the other accounts stay enabled for outbound sends and status. Inbound messages arrive tagged with accountId="${owner.accountId}", so bindings pinned to ${dupIds} should be re-pointed at "${owner.accountId}" (or set "enabled": false on "${owner.accountId}" to flip ownership). Set "enabled": false on the unused duplicates to silence this warning.`,
);
}
return warnings;
}

View File

@@ -0,0 +1,108 @@
import { describe, expect, it, vi } from "vitest";
const monitorMock = vi.hoisted(() => vi.fn(async () => undefined));
vi.mock("./monitor.js", async (importOriginal) => ({
...(await importOriginal<typeof import("./monitor.js")>()),
monitorIMessageProvider: monitorMock,
}));
const { startIMessageGatewayAccount } = await import("./channel.runtime.js");
const { resolveIMessageAccount } = await import("./accounts.js");
function makeCtx(params: {
cfg: Parameters<typeof resolveIMessageAccount>[0]["cfg"];
accountId: string;
}) {
const account = resolveIMessageAccount({ cfg: params.cfg, accountId: params.accountId });
const ac = new AbortController();
const statusEvents: unknown[] = [];
const logEvents: { level: string; line: string }[] = [];
return {
ctx: {
cfg: params.cfg,
accountId: params.accountId,
account,
runtime: {} as never,
abortSignal: ac.signal,
log: {
info: (line: string) => logEvents.push({ level: "info", line }),
},
getStatus: () => ({ accountId: params.accountId }),
setStatus: (next: unknown) => statusEvents.push(next),
channelRuntime: undefined as never,
} as never,
abort: () => ac.abort(),
statusEvents,
logEvents,
};
}
describe("startIMessageGatewayAccount duplicate-source handling", () => {
it("parks the watcher slot without spawning monitorIMessageProvider for a non-owner duplicate", async () => {
monitorMock.mockClear();
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": { cliPath: "imsg" },
default: {},
},
},
},
} as never;
const { ctx, abort, logEvents } = makeCtx({ cfg, accountId: "default" });
const settled = vi.fn();
const task = startIMessageGatewayAccount(ctx).then(settled);
await Promise.resolve();
await Promise.resolve();
expect(monitorMock).not.toHaveBeenCalled();
expect(settled).not.toHaveBeenCalled();
expect(logEvents.some((e) => e.line.includes("skipping watcher"))).toBe(true);
expect(logEvents.some((e) => e.line.includes('using account "swang430-gmail-com"'))).toBe(true);
abort();
await task;
expect(settled).toHaveBeenCalled();
expect(monitorMock).not.toHaveBeenCalled();
});
it("starts monitorIMessageProvider for the duplicate-source owner", async () => {
monitorMock.mockClear();
monitorMock.mockResolvedValueOnce(undefined);
const cfg = {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": { cliPath: "imsg" },
default: {},
},
},
},
} as never;
const { ctx } = makeCtx({ cfg, accountId: "swang430-gmail-com" });
await startIMessageGatewayAccount(ctx);
expect(monitorMock).toHaveBeenCalledTimes(1);
});
it("starts monitorIMessageProvider when an account has no duplicate sibling", async () => {
monitorMock.mockClear();
monitorMock.mockResolvedValueOnce(undefined);
const cfg = {
channels: {
imessage: {
accounts: {
solo: { cliPath: "/usr/local/bin/imsg-solo" },
},
},
},
} as never;
const { ctx } = makeCtx({ cfg, accountId: "solo" });
await startIMessageGatewayAccount(ctx);
expect(monitorMock).toHaveBeenCalledTimes(1);
});
});

View File

@@ -1,5 +1,5 @@
import { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-send-deps";
import type { ResolvedIMessageAccount } from "./accounts.js";
import { resolveIMessageDuplicateSourceOwner, type ResolvedIMessageAccount } from "./accounts.js";
import { PAIRING_APPROVED_MESSAGE, resolveChannelMediaMaxBytes } from "./channel-api.js";
import type { ChannelPlugin } from "./channel-api.js";
import { monitorIMessageProvider } from "./monitor.js";
@@ -72,6 +72,23 @@ export async function startIMessageGatewayAccount(
cliPath,
dbPath: dbPath ?? null,
});
const ownerAccountId = resolveIMessageDuplicateSourceOwner({ cfg: ctx.cfg, account });
if (ownerAccountId) {
// openclaw/openclaw#65141: this account shares a local Messages source with
// an already-owning account, so spawning a second `imsg rpc` would deliver
// every inbound twice. Keep the account enabled for outbound sends, status,
// and capability surfaces; just park the watcher slot until shutdown.
ctx.log?.info?.(
`[${account.accountId}] skipping watcher: duplicate iMessage source; using account "${ownerAccountId}"`,
);
if (ctx.abortSignal.aborted) {
return;
}
await new Promise<void>((resolve) => {
ctx.abortSignal.addEventListener("abort", () => resolve(), { once: true });
});
return;
}
ctx.log?.info?.(
`[${account.accountId}] starting provider (${cliPath}${dbPath ? ` db=${dbPath}` : ""})`,
);

View File

@@ -31,6 +31,7 @@ import {
normalizeIMessageAcpConversationId,
resolveIMessageConversationIdFromTarget,
} from "./conversation-id.js";
import { imessageDoctor } from "./doctor.js";
import {
resolveIMessageGroupRequireMention,
resolveIMessageGroupToolPolicy,
@@ -207,9 +208,7 @@ export const imessagePlugin: ChannelPlugin<ResolvedIMessageAccount, IMessageProb
resolveRequireMention: resolveIMessageGroupRequireMention,
resolveToolPolicy: resolveIMessageGroupToolPolicy,
},
doctor: {
groupAllowFromFallbackToAllowFrom: false,
},
doctor: imessageDoctor,
conversationBindings: {
supportsCurrentConversationBinding: true,
createManager: ({ cfg, accountId }) =>

View File

@@ -0,0 +1,68 @@
import { describe, expect, it } from "vitest";
import { imessageDoctor } from "./doctor.js";
describe("imessageDoctor.collectPreviewWarnings", () => {
it("flags accounts that share the local Messages source", async () => {
const warnings = await imessageDoctor.collectPreviewWarnings?.({
cfg: {
channels: {
imessage: {
accounts: {
"swang430-gmail-com": {},
default: {},
},
},
},
} as never,
doctorFixCommand: "openclaw doctor --fix",
});
expect(warnings).toHaveLength(1);
const warning = warnings?.[0] ?? "";
expect(warning).toContain(
'channels.imessage: accounts "swang430-gmail-com" and "default" watch the same local Messages source (cliPath=imsg).',
);
expect(warning).toContain('OpenClaw runs one watcher (owner: "swang430-gmail-com")');
expect(warning).toContain("idles the duplicate");
expect(warning).toContain('accountId="swang430-gmail-com"');
expect(warning).toContain('"default"');
expect(warning).toContain('set "enabled": false');
});
it("includes dbPath in the warning when configured", async () => {
const warnings = await imessageDoctor.collectPreviewWarnings?.({
cfg: {
channels: {
imessage: {
accounts: {
primary: { cliPath: "imsg", dbPath: "/Users/me/chat.db" },
default: { cliPath: "imsg", dbPath: "/Users/me/chat.db" },
},
},
},
} as never,
doctorFixCommand: "openclaw doctor --fix",
});
expect(warnings).toHaveLength(1);
expect(warnings?.[0]).toMatch(/cliPath=imsg, dbPath=\/Users\/me\/chat\.db/);
});
it("stays quiet when each enabled account targets a distinct source", async () => {
const warnings = await imessageDoctor.collectPreviewWarnings?.({
cfg: {
channels: {
imessage: {
accounts: {
work: { cliPath: "/usr/local/bin/imsg-work" },
home: { cliPath: "/usr/local/bin/imsg-home" },
},
},
},
} as never,
doctorFixCommand: "openclaw doctor --fix",
});
expect(warnings).toEqual([]);
});
});

View File

@@ -0,0 +1,7 @@
import type { ChannelDoctorAdapter } from "openclaw/plugin-sdk/channel-contract";
import { collectIMessageDuplicateAccountSourceWarnings } from "./accounts.js";
export const imessageDoctor: ChannelDoctorAdapter = {
groupAllowFromFallbackToAllowFrom: false,
collectPreviewWarnings: ({ cfg }) => collectIMessageDuplicateAccountSourceWarnings({ cfg }),
};

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/kilocode-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw Kimi provider plugin",
"type": "module",

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/llm-task",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw LM Studio provider plugin",
"type": "module",

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lobster",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
# Changelog
## 2026.5.26
## 2026.5.25
### Changes

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/matrix",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/matrix",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"openclaw": ">=2026.5.25-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/media-understanding-core",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw meeting notes plugin",
"type": "module",

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/memory-lancedb",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/memory-lancedb",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-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.26"
"pluginApi": ">=2026.5.25-beta.1"
},
"build": {
"openclawVersion": "2026.5.26"
"openclawVersion": "2026.5.25-beta.1"
},
"release": {
"bundleRuntimeDependencies": false,

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/microsoft-foundry",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw Microsoft speech plugin",
"type": "module",

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/minimax-provider",
"version": "2026.5.26",
"version": "2026.5.25-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.26",
"version": "2026.5.25-beta.1",
"private": true,
"description": "OpenClaw Mistral provider plugin",
"type": "module",

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/msteams",
"version": "2026.5.26",
"version": "2026.5.25-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/msteams",
"version": "2026.5.26",
"version": "2026.5.25-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.26"
"openclaw": ">=2026.5.25-beta.1"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

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