mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 14:01:24 +08:00
Compare commits
6 Commits
codex/pr-8
...
v2026.5.25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5b52bddb5 | ||
|
|
f0653f28b9 | ||
|
|
046b2d8ddd | ||
|
|
878d18609b | ||
|
|
dd173f64fa | ||
|
|
f72e3424ae |
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
4
extensions/acpx/npm-shrinkwrap.json
generated
4
extensions/acpx/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/brave/npm-shrinkwrap.json
generated
4
extensions/brave/npm-shrinkwrap.json
generated
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/codex/npm-shrinkwrap.json
generated
4
extensions/codex/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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[] = [];
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
4
extensions/diffs/npm-shrinkwrap.json
generated
4
extensions/diffs/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/discord/npm-shrinkwrap.json
generated
6
extensions/discord/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/feishu/npm-shrinkwrap.json
generated
6
extensions/feishu/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/google-meet/npm-shrinkwrap.json
generated
6
extensions/google-meet/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/googlechat/npm-shrinkwrap.json
generated
6
extensions/googlechat/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
108
extensions/imessage/src/channel.runtime.test.ts
Normal file
108
extensions/imessage/src/channel.runtime.test.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
@@ -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}` : ""})`,
|
||||
);
|
||||
|
||||
@@ -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 }) =>
|
||||
|
||||
68
extensions/imessage/src/doctor.test.ts
Normal file
68
extensions/imessage/src/doctor.test.ts
Normal 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([]);
|
||||
});
|
||||
});
|
||||
7
extensions/imessage/src/doctor.ts
Normal file
7
extensions/imessage/src/doctor.ts
Normal 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 }),
|
||||
};
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/line/npm-shrinkwrap.json
generated
6
extensions/line/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/lobster/npm-shrinkwrap.json
generated
4
extensions/lobster/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## 2026.5.26
|
||||
## 2026.5.25
|
||||
|
||||
### Changes
|
||||
|
||||
|
||||
6
extensions/matrix/npm-shrinkwrap.json
generated
6
extensions/matrix/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/memory-lancedb/npm-shrinkwrap.json
generated
4
extensions/memory-lancedb/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/msteams/npm-shrinkwrap.json
generated
6
extensions/msteams/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user