From f9dbc5b669b47824ecc4c1ea3233e60d79d47dd2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 12 Aug 2026 18:27:10 -0700 Subject: [PATCH] chore(release): rebase 2026.8.1 beta.2 onto main Rebuild 2026.8.1-beta.2 on frozen main commit be600d0a24d56378474dfaef358bd5a1e8f25e4c, including the trusted Telegram isolation repair. Preserve the still-release-specific plugin/package fixture corrections, Matrix/Buzz QA ownership, current generated config and locale artifacts, and restore intentional out-of-band Slack native approvals after an unrelated forwarded-image PR added a conflicting channel guard. Co-authored-by: Vincent Koc Co-authored-by: Vyctor H. Brzezowski <51521767+vyctorbrzezowski@users.noreply.github.com> Co-authored-by: Ayaan Zaidi --- docs/.generated/config-baseline.sha256 | 4 +- extensions/acpx/package.json | 6 +- extensions/admin-http-rpc/package.json | 2 +- extensions/alibaba/package.json | 2 +- extensions/amazon-bedrock-mantle/package.json | 6 +- extensions/amazon-bedrock/package.json | 6 +- extensions/anthropic-vertex/package.json | 6 +- extensions/anthropic/package.json | 2 +- extensions/arcee/package.json | 6 +- extensions/azure-speech/package.json | 2 +- extensions/baseten/package.json | 6 +- extensions/beam/package.json | 2 +- extensions/bonjour/package.json | 2 +- extensions/brave/package.json | 6 +- extensions/browser/package.json | 2 +- extensions/buzz/package.json | 8 +- extensions/byteplus/package.json | 6 +- extensions/canvas/package.json | 2 +- extensions/cerebras/package.json | 6 +- extensions/chutes/package.json | 6 +- extensions/clawrouter/package.json | 2 +- extensions/clickclack/package.json | 8 +- extensions/cloudflare-ai-gateway/package.json | 6 +- extensions/codex/package.json | 6 +- ...vent-projector.native-finalization.test.ts | 2 +- .../event-projector.progress-echo.test.ts | 4 +- .../event-projector.replay-safety.test.ts | 2 +- .../src/app-server/thread-lifecycle.test.ts | 4 +- extensions/cohere/package.json | 6 +- extensions/comfy/package.json | 6 +- extensions/copilot-proxy/package.json | 2 +- extensions/copilot/package.json | 6 +- extensions/crabbox/package.json | 2 +- extensions/cua-computer/package.json | 2 +- extensions/deepgram/package.json | 2 +- extensions/deepinfra/package.json | 6 +- extensions/deepseek/package.json | 6 +- extensions/diagnostics-otel/package.json | 6 +- .../diagnostics-prometheus/package.json | 6 +- extensions/diffs-language-pack/package.json | 6 +- extensions/diffs/package.json | 6 +- extensions/discord/package.json | 8 +- extensions/document-extract/package.json | 2 +- extensions/duckduckgo/package.json | 6 +- extensions/elevenlabs/package.json | 2 +- extensions/exa/package.json | 6 +- extensions/fal/package.json | 2 +- extensions/featherless/package.json | 6 +- extensions/feishu/package.json | 8 +- extensions/file-transfer/package.json | 2 +- extensions/firecrawl/package.json | 6 +- extensions/fireworks/package.json | 6 +- extensions/fish-audio-speech/package.json | 6 +- extensions/github-copilot/package.json | 2 +- extensions/gmi/package.json | 6 +- extensions/google-meet/package.json | 8 +- extensions/google/package.json | 2 +- extensions/googlechat/package.json | 8 +- extensions/gradium/package.json | 6 +- extensions/groq/package.json | 6 +- extensions/huggingface/package.json | 2 +- extensions/image-generation-core/package.json | 2 +- extensions/imessage/package.json | 8 +- extensions/inworld/package.json | 6 +- extensions/irc/package.json | 6 +- extensions/kilocode/package.json | 6 +- extensions/kimi-coding/package.json | 6 +- extensions/line/package.json | 8 +- extensions/linux-canvas/package.json | 2 +- extensions/linux-node/package.json | 2 +- extensions/litellm/package.json | 2 +- extensions/llama-cpp/package.json | 6 +- extensions/llm-task/package.json | 2 +- extensions/lmstudio/package.json | 2 +- extensions/lobster/package.json | 6 +- extensions/logbook/package.json | 4 +- extensions/longcat/package.json | 6 +- extensions/matrix/package.json | 8 +- .../matrix/src/matrix/monitor/handler.test.ts | 5 +- extensions/mattermost/package.json | 8 +- .../monitor.inbound-system-event.test.ts | 5 +- .../media-understanding-core/package.json | 2 +- extensions/memory-core/package.json | 4 +- .../embeddings.lifecycle.test.ts | 37 +- extensions/memory-lancedb/package.json | 6 +- extensions/memory-wiki/package.json | 4 +- extensions/meta/package.json | 6 +- extensions/microsoft-foundry/package.json | 2 +- extensions/microsoft/package.json | 2 +- extensions/migrate-claude/package.json | 4 +- extensions/migrate-hermes/package.json | 4 +- extensions/minimax/package.json | 2 +- extensions/mistral/package.json | 6 +- extensions/moonshot/package.json | 6 +- extensions/msteams/package.json | 8 +- extensions/mxc/package.json | 6 +- extensions/nextcloud-talk/package.json | 8 +- extensions/nostr/package.json | 8 +- extensions/novita/package.json | 6 +- extensions/nvidia/package.json | 2 +- extensions/oc-path/package.json | 4 +- extensions/ollama/package.json | 2 +- extensions/onepassword/package.json | 2 +- extensions/open-prose/package.json | 2 +- extensions/openai/package.json | 2 +- extensions/opencode-go/package.json | 6 +- extensions/opencode/package.json | 6 +- extensions/openrouter/package.json | 2 +- extensions/openshell/package.json | 6 +- extensions/parallel/package.json | 6 +- extensions/perplexity/package.json | 6 +- extensions/pixverse/package.json | 8 +- extensions/policy/package.json | 4 +- extensions/qa-channel/package.json | 4 +- extensions/qa-lab/package.json | 6 +- .../matrix/substrate/config.test.ts | 13 +- .../matrix/substrate/config.ts | 31 +- .../shared/scenario-selection.test.ts | 3 +- .../src/scenario-catalog-channels.test.ts | 27 +- extensions/qianfan/package.json | 6 +- extensions/qwen/package.json | 6 +- extensions/raft/package.json | 8 +- extensions/reef/package.json | 2 +- extensions/runway/package.json | 2 +- extensions/searxng/package.json | 6 +- extensions/senseaudio/package.json | 2 +- extensions/sglang/package.json | 2 +- extensions/signal/package.json | 6 +- extensions/slack/package.json | 8 +- extensions/slack/src/approval-native-gates.ts | 4 - extensions/slack/src/exec-approvals.test.ts | 4 +- .../src/monitor/provider.allowlist.test.ts | 43 +- extensions/sms/package.json | 6 +- extensions/stepfun/package.json | 6 +- extensions/synology-chat/package.json | 6 +- extensions/synthetic/package.json | 6 +- extensions/tavily/package.json | 6 +- extensions/teams-meetings/package.json | 8 +- .../teams-meetings/src/node-host.test.ts | 43 +- .../src/node-invoke-policy.test.ts | 3 + extensions/telegram/package.json | 2 +- ...e-dispatch.draft-failures-progress.test.ts | 7 +- .../telegram/src/polling-session.test.ts | 70 ++-- .../src/progress-draft-preview.test.ts | 17 +- extensions/telegram/src/webhook.test.ts | 105 ++--- extensions/tencent/package.json | 6 +- extensions/tlon/package.json | 8 +- extensions/together/package.json | 2 +- extensions/tokenjuice/package.json | 8 +- extensions/tts-local-cli/package.json | 2 +- extensions/twitch/package.json | 6 +- extensions/vault/package.json | 2 +- extensions/venice/package.json | 6 +- extensions/vercel-ai-gateway/package.json | 6 +- extensions/video-generation-core/package.json | 2 +- extensions/vllm/package.json | 2 +- extensions/voice-call/package.json | 8 +- extensions/volcengine/package.json | 6 +- extensions/voyage/package.json | 6 +- extensions/vydra/package.json | 6 +- extensions/web-readability/package.json | 2 +- extensions/webhooks/package.json | 2 +- extensions/whatsapp/package.json | 8 +- extensions/workboard/package.json | 4 +- extensions/xai/package.json | 2 +- extensions/xiaomi/package.json | 6 +- extensions/zai/package.json | 6 +- extensions/zalo/package.json | 8 +- extensions/zalouser/package.json | 8 +- extensions/zoom-meetings/package.json | 8 +- .../src/node-invoke-policy.test.ts | 3 + package.json | 2 +- packages/ai/package.json | 2 +- packages/gateway-client/package.json | 2 +- packages/gateway-protocol/package.json | 2 +- qa/scenarios/channels/channel-canary.yaml | 1 + ...rix-room-tool-progress-mention-safety.yaml | 5 +- .../official-external-channel-catalog.json | 46 +-- scripts/lib/openclaw-test-state.mts | 6 +- src/cli/update-cli.test.ts | 6 +- src/infra/approval-request-account-binding.ts | 3 + .../exec-approval-session-target.test.ts | 17 + src/meeting-bot/configured-node-host.test.ts | 29 +- .../npm-install-security-scan.release.test.ts | 1 - ui/src/i18n/.i18n/ar.meta.json | 12 +- ui/src/i18n/.i18n/ar.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/catalog-fallbacks.json | 2 +- ui/src/i18n/.i18n/de.meta.json | 12 +- ui/src/i18n/.i18n/de.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/es.meta.json | 12 +- ui/src/i18n/.i18n/es.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/fa.meta.json | 12 +- ui/src/i18n/.i18n/fa.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/fr.meta.json | 12 +- ui/src/i18n/.i18n/fr.tm.jsonl | 375 ++++++++++++++---- ui/src/i18n/.i18n/hi.meta.json | 12 +- ui/src/i18n/.i18n/hi.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/id.meta.json | 12 +- ui/src/i18n/.i18n/id.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/it.meta.json | 12 +- ui/src/i18n/.i18n/it.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/ja-JP.meta.json | 12 +- ui/src/i18n/.i18n/ja-JP.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/ko.meta.json | 12 +- ui/src/i18n/.i18n/ko.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/nl.meta.json | 12 +- ui/src/i18n/.i18n/nl.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/pl.meta.json | 12 +- ui/src/i18n/.i18n/pl.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/pt-BR.meta.json | 12 +- ui/src/i18n/.i18n/pt-BR.tm.jsonl | 375 ++++++++++++++---- ui/src/i18n/.i18n/ru.meta.json | 12 +- ui/src/i18n/.i18n/ru.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/th.meta.json | 12 +- ui/src/i18n/.i18n/th.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/tr.meta.json | 12 +- ui/src/i18n/.i18n/tr.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/uk.meta.json | 12 +- ui/src/i18n/.i18n/uk.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/vi.meta.json | 12 +- ui/src/i18n/.i18n/vi.tm.jsonl | 374 +++++++++++++---- ui/src/i18n/.i18n/zh-CN.meta.json | 12 +- ui/src/i18n/.i18n/zh-CN.tm.jsonl | 373 +++++++++++++---- ui/src/i18n/.i18n/zh-TW.meta.json | 12 +- ui/src/i18n/.i18n/zh-TW.tm.jsonl | 374 +++++++++++++---- 225 files changed, 6943 insertions(+), 2058 deletions(-) diff --git a/docs/.generated/config-baseline.sha256 b/docs/.generated/config-baseline.sha256 index 494cf9711b60..5be95afbacb1 100644 --- a/docs/.generated/config-baseline.sha256 +++ b/docs/.generated/config-baseline.sha256 @@ -1,4 +1,4 @@ -09e85f06289696850e357f2e263ec4a84b81d17852df1d779c044703042611cb config-baseline.json +4fb78af9e8b9911cc56eb0e7b029eabbde08379f86de6467aef491f17777369f config-baseline.json ce74623d1b19b178aee681a4d1e15eee17297f3a5d939ed1f0fba838abfabe6c config-baseline.core.json dd317647cf5ccf8d23774dcc7208d5ca749c08486137c6e5e6c8b7114592356f config-baseline.channel.json -4bcc2364924c80f38139f0508945b6d28b33b70dd2973f0685a8f221d672ac94 config-baseline.plugin.json +250f573a93619d8a2f554028288af84551e572ef8bfdc820a43024572b55175a config-baseline.plugin.json diff --git a/extensions/acpx/package.json b/extensions/acpx/package.json index f27455fc16ef..c45af4713f08 100644 --- a/extensions/acpx/package.json +++ b/extensions/acpx/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/acpx", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw ACP runtime backend with plugin-owned session and transport management.", "repository": { "type": "git", @@ -43,10 +43,10 @@ ] }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "staticAssets": [ { "source": "./src/runtime-internals/mcp-proxy.mjs", diff --git a/extensions/admin-http-rpc/package.json b/extensions/admin-http-rpc/package.json index 6da90c8520d3..6426d3b54fb7 100644 --- a/extensions/admin-http-rpc/package.json +++ b/extensions/admin-http-rpc/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/admin-http-rpc", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw admin HTTP RPC endpoint", "type": "module", diff --git a/extensions/alibaba/package.json b/extensions/alibaba/package.json index a6189f013a86..423591a887df 100644 --- a/extensions/alibaba/package.json +++ b/extensions/alibaba/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/alibaba-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Alibaba Model Studio video provider plugin", "type": "module", diff --git a/extensions/amazon-bedrock-mantle/package.json b/extensions/amazon-bedrock-mantle/package.json index 274c4287aaab..c1152783bb91 100644 --- a/extensions/amazon-bedrock-mantle/package.json +++ b/extensions/amazon-bedrock-mantle/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/amazon-bedrock-mantle-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Amazon Bedrock Mantle provider plugin for OpenAI-compatible model routing.", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.5.12-beta.1" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/amazon-bedrock/package.json b/extensions/amazon-bedrock/package.json index 2dc55a2419ff..77700f1ad7fc 100644 --- a/extensions/amazon-bedrock/package.json +++ b/extensions/amazon-bedrock/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/amazon-bedrock-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Amazon Bedrock provider plugin with model discovery, embeddings, and guardrail support.", "repository": { "type": "git", @@ -28,10 +28,10 @@ "minHostVersion": ">=2026.5.12-beta.1" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/anthropic-vertex/package.json b/extensions/anthropic-vertex/package.json index b26e4b55da0e..297a75dd17bd 100644 --- a/extensions/anthropic-vertex/package.json +++ b/extensions/anthropic-vertex/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/anthropic-vertex-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Anthropic Vertex provider plugin for Claude models on Google Vertex AI.", "repository": { "type": "git", @@ -25,10 +25,10 @@ "minHostVersion": ">=2026.5.12-beta.1" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/anthropic/package.json b/extensions/anthropic/package.json index 52a4e1a6116f..4b66b5884d46 100644 --- a/extensions/anthropic/package.json +++ b/extensions/anthropic/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/anthropic-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Anthropic provider, Claude CLI, and native session catalog plugin", "type": "module", diff --git a/extensions/arcee/package.json b/extensions/arcee/package.json index 499c65436903..614cc3c9579a 100644 --- a/extensions/arcee/package.json +++ b/extensions/arcee/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/arcee-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Arcee provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/azure-speech/package.json b/extensions/azure-speech/package.json index 781bdc148814..b3e4b8b958b1 100644 --- a/extensions/azure-speech/package.json +++ b/extensions/azure-speech/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/azure-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Azure Speech plugin", "type": "module", diff --git a/extensions/baseten/package.json b/extensions/baseten/package.json index ec9333a4fbc8..672acbe9d812 100644 --- a/extensions/baseten/package.json +++ b/extensions/baseten/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/baseten-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Baseten provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/beam/package.json b/extensions/beam/package.json index bffd2564dd37..45a7f9797ed0 100644 --- a/extensions/beam/package.json +++ b/extensions/beam/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/beam", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "Read-only coding-session Beam receiver", "type": "module", diff --git a/extensions/bonjour/package.json b/extensions/bonjour/package.json index 44f61189ce70..76ab52b2ecba 100644 --- a/extensions/bonjour/package.json +++ b/extensions/bonjour/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/bonjour", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Bonjour/mDNS gateway discovery", "type": "module", "dependencies": { diff --git a/extensions/brave/package.json b/extensions/brave/package.json index 0b91eac8e4af..5121acb9597e 100644 --- a/extensions/brave/package.json +++ b/extensions/brave/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/brave-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Brave Search provider plugin for web search.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/browser/package.json b/extensions/browser/package.json index 7783af8b3660..0602c812b850 100644 --- a/extensions/browser/package.json +++ b/extensions/browser/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/browser-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw browser tool plugin", "type": "module", diff --git a/extensions/buzz/package.json b/extensions/buzz/package.json index f4b3aeefb867..a6d902491dc1 100644 --- a/extensions/buzz/package.json +++ b/extensions/buzz/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/buzz", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Connect OpenClaw agents to Buzz rooms", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -83,10 +83,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/byteplus/package.json b/extensions/byteplus/package.json index 8b5df9feedcf..53a1029c1023 100644 --- a/extensions/byteplus/package.json +++ b/extensions/byteplus/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/byteplus-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw BytePlus provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/canvas/package.json b/extensions/canvas/package.json index 2c6bb0d86a83..f339c19b6433 100644 --- a/extensions/canvas/package.json +++ b/extensions/canvas/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/canvas-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Canvas plugin", "type": "module", diff --git a/extensions/cerebras/package.json b/extensions/cerebras/package.json index f2b27f9403d7..4448af43bf11 100644 --- a/extensions/cerebras/package.json +++ b/extensions/cerebras/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cerebras-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Cerebras provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/chutes/package.json b/extensions/chutes/package.json index 10ccb5620d1e..3b198ee3dbec 100644 --- a/extensions/chutes/package.json +++ b/extensions/chutes/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/chutes-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Chutes.ai provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/clawrouter/package.json b/extensions/clawrouter/package.json index 3ba44cd19480..83c652433602 100644 --- a/extensions/clawrouter/package.json +++ b/extensions/clawrouter/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/clawrouter", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw ClawRouter plugin", "type": "module", diff --git a/extensions/clickclack/package.json b/extensions/clickclack/package.json index 84f5021d846b..36338b10f976 100644 --- a/extensions/clickclack/package.json +++ b/extensions/clickclack/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/clickclack", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw ClickClack channel plugin", "type": "module", "exports": { @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -141,10 +141,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/cloudflare-ai-gateway/package.json b/extensions/cloudflare-ai-gateway/package.json index 9eb1fe3d6728..6ba6113c2e76 100644 --- a/extensions/cloudflare-ai-gateway/package.json +++ b/extensions/cloudflare-ai-gateway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cloudflare-ai-gateway-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Cloudflare AI Gateway provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/codex/package.json b/extensions/codex/package.json index a75186c46783..acd717be297b 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/codex", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Codex app-server harness and native session supervision plugin.", "repository": { "type": "git", @@ -35,10 +35,10 @@ ] }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/codex/src/app-server/event-projector.native-finalization.test.ts b/extensions/codex/src/app-server/event-projector.native-finalization.test.ts index 1676a06ec0a4..5d9c7207f716 100644 --- a/extensions/codex/src/app-server/event-projector.native-finalization.test.ts +++ b/extensions/codex/src/app-server/event-projector.native-finalization.test.ts @@ -376,7 +376,7 @@ describe("CodexAppServerEventProjector native tool finalization", () => { expect(toolResult.status).toBe("completed"); expect(toolResult.isError).toBe(false); expect(onToolResult).toHaveBeenCalledWith({ - text: "🛠️ `run tests (workspace)`", + text: "🛠️ Bash", }); expect(trajectoryRecorder.recordEvent).toHaveBeenCalledWith("tool.call", { threadId: THREAD_ID, diff --git a/extensions/codex/src/app-server/event-projector.progress-echo.test.ts b/extensions/codex/src/app-server/event-projector.progress-echo.test.ts index f7c0309ae54f..10c761d9088f 100644 --- a/extensions/codex/src/app-server/event-projector.progress-echo.test.ts +++ b/extensions/codex/src/app-server/event-projector.progress-echo.test.ts @@ -23,7 +23,7 @@ describe("CodexAppServerEventProjector tool progress echo filtering", () => { const onToolResult = vi.fn(); const projector = await createProjector({ ...(await createParams()), - verboseLevel: "on", + verboseLevel: "full", onToolResult, }); @@ -71,7 +71,7 @@ describe("CodexAppServerEventProjector tool progress echo filtering", () => { const onToolResult = vi.fn(); const projector = await createProjector({ ...(await createParams()), - verboseLevel: "on", + verboseLevel: "full", onToolResult, }); const command = "pnpm test"; diff --git a/extensions/codex/src/app-server/event-projector.replay-safety.test.ts b/extensions/codex/src/app-server/event-projector.replay-safety.test.ts index a9c3cf870ec3..8f5ac3da6148 100644 --- a/extensions/codex/src/app-server/event-projector.replay-safety.test.ts +++ b/extensions/codex/src/app-server/event-projector.replay-safety.test.ts @@ -327,7 +327,7 @@ describe("CodexAppServerEventProjector replay safety and progress projection", ( const onToolResult = vi.fn(); const projector = await createProjector({ ...(await createParams()), - verboseLevel: "on", + verboseLevel: "full", onAgentEvent, onToolResult, }); diff --git a/extensions/codex/src/app-server/thread-lifecycle.test.ts b/extensions/codex/src/app-server/thread-lifecycle.test.ts index 635e247c87c7..6e477be4e09c 100644 --- a/extensions/codex/src/app-server/thread-lifecycle.test.ts +++ b/extensions/codex/src/app-server/thread-lifecycle.test.ts @@ -1048,7 +1048,7 @@ describe("Codex app-server native code mode config", () => { expect(instructions).toContain("## Skill Workshop"); expect(instructions).toContain("Durable reusable skill/playbook/workflow work"); expect(instructions).toContain("`skill_workshop`"); - expect(instructions).toContain("Generated = pending proposal"); + expect(instructions).toContain("Other generated work = pending proposal"); expect(instructions).toContain("only explicit user ask"); }); @@ -1083,7 +1083,7 @@ describe("Codex app-server native code mode config", () => { }); expect(instructions).toContain("For progress, set `final=false`."); - expect(instructions).toContain("set `final=true`"); + expect(instructions).toContain("Set `final=true`"); }); it("keeps durable dynamic tool fingerprints scoped to loading mode", () => { diff --git a/extensions/cohere/package.json b/extensions/cohere/package.json index 57735a171957..94b21a78ec3b 100644 --- a/extensions/cohere/package.json +++ b/extensions/cohere/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cohere-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Cohere provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/comfy/package.json b/extensions/comfy/package.json index 195169abbc54..1036b1be7ef8 100644 --- a/extensions/comfy/package.json +++ b/extensions/comfy/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/comfy-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw ComfyUI provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/copilot-proxy/package.json b/extensions/copilot-proxy/package.json index 96ca77877015..6785c13b8042 100644 --- a/extensions/copilot-proxy/package.json +++ b/extensions/copilot-proxy/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/copilot-proxy", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Copilot Proxy provider plugin", "type": "module", diff --git a/extensions/copilot/package.json b/extensions/copilot/package.json index 20ae13cf04c1..ba3da2f16087 100644 --- a/extensions/copilot/package.json +++ b/extensions/copilot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/copilot", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw GitHub Copilot agent runtime plugin (registers a `github-copilot` AgentHarness backed by @github/copilot-sdk over JSON-RPC to the GitHub Copilot CLI)", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.5.28" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/crabbox/package.json b/extensions/crabbox/package.json index 77d00e4e7666..18e3b347939e 100644 --- a/extensions/crabbox/package.json +++ b/extensions/crabbox/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/crabbox-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw cloud worker provider backed by the Crabbox CLI", "type": "module", diff --git a/extensions/cua-computer/package.json b/extensions/cua-computer/package.json index d0f13f81afa6..681d94907a0f 100644 --- a/extensions/cua-computer/package.json +++ b/extensions/cua-computer/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/cua-computer", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Experimental CUA Driver SDK computer control for Windows and Linux node hosts", "type": "module", "dependencies": { diff --git a/extensions/deepgram/package.json b/extensions/deepgram/package.json index 28b40af2b828..5dc4fe4dd9fa 100644 --- a/extensions/deepgram/package.json +++ b/extensions/deepgram/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepgram-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Deepgram media-understanding provider", "type": "module", diff --git a/extensions/deepinfra/package.json b/extensions/deepinfra/package.json index 579a723c20ce..2548f8528d92 100644 --- a/extensions/deepinfra/package.json +++ b/extensions/deepinfra/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepinfra-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw DeepInfra provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/deepseek/package.json b/extensions/deepseek/package.json index c6df5c709ea8..4cf396f20e85 100644 --- a/extensions/deepseek/package.json +++ b/extensions/deepseek/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/deepseek-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw DeepSeek provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/diagnostics-otel/package.json b/extensions/diagnostics-otel/package.json index 4cb24c17082f..8098013fb5ec 100644 --- a/extensions/diagnostics-otel/package.json +++ b/extensions/diagnostics-otel/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diagnostics-otel", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw diagnostics OpenTelemetry exporter for metrics, traces, and logs.", "repository": { "type": "git", @@ -37,10 +37,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/diagnostics-prometheus/package.json b/extensions/diagnostics-prometheus/package.json index d3d260b13ba0..ea5f9388fdcc 100644 --- a/extensions/diagnostics-prometheus/package.json +++ b/extensions/diagnostics-prometheus/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diagnostics-prometheus", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw diagnostics Prometheus exporter for runtime metrics.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/diffs-language-pack/package.json b/extensions/diffs-language-pack/package.json index 13ebed0bce5c..6e29ee988aa8 100644 --- a/extensions/diffs-language-pack/package.json +++ b/extensions/diffs-language-pack/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diffs-language-pack", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw diffs viewer syntax highlighting language pack", "repository": { "type": "git", @@ -22,13 +22,13 @@ "minHostVersion": ">=2026.5.27" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "assetScripts": { "build": "node --import tsx ../../scripts/build-diffs-viewer-runtime.mts full" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "staticAssets": [ { "source": "./assets/viewer-runtime.js", diff --git a/extensions/diffs/package.json b/extensions/diffs/package.json index c7e2e5793fbc..dd80b4e2bfdc 100644 --- a/extensions/diffs/package.json +++ b/extensions/diffs/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/diffs", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw read-only diff viewer plugin and file renderer for agents.", "repository": { "type": "git", @@ -28,13 +28,13 @@ "minHostVersion": ">=2026.4.30" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "assetScripts": { "build": "node --import tsx ../../scripts/build-diffs-viewer-runtime.mts curated" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "staticAssets": [ { "source": "./assets/viewer-runtime.js", diff --git a/extensions/discord/package.json b/extensions/discord/package.json index fe7d807e1c4a..98663cbc369b 100644 --- a/extensions/discord/package.json +++ b/extensions/discord/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/discord", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.", "repository": { "type": "git", @@ -24,7 +24,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -97,10 +97,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "staticAssets": [ { "source": "./assets/embedded-app-sdk.mjs", diff --git a/extensions/document-extract/package.json b/extensions/document-extract/package.json index 0fa76259d41d..420f8f5441c6 100644 --- a/extensions/document-extract/package.json +++ b/extensions/document-extract/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/document-extract-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw local document extraction plugin", "type": "module", diff --git a/extensions/duckduckgo/package.json b/extensions/duckduckgo/package.json index c9acbe316b89..76041761b2ca 100644 --- a/extensions/duckduckgo/package.json +++ b/extensions/duckduckgo/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/duckduckgo-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw DuckDuckGo plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/elevenlabs/package.json b/extensions/elevenlabs/package.json index cc1049fb958a..ff4c60071c46 100644 --- a/extensions/elevenlabs/package.json +++ b/extensions/elevenlabs/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/elevenlabs-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw ElevenLabs speech plugin", "type": "module", diff --git a/extensions/exa/package.json b/extensions/exa/package.json index 0fbcc2b3a09c..a86262504c7c 100644 --- a/extensions/exa/package.json +++ b/extensions/exa/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/exa-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Exa plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/fal/package.json b/extensions/fal/package.json index 76da53804619..e6acea9d512e 100644 --- a/extensions/fal/package.json +++ b/extensions/fal/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/fal-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw fal provider plugin", "type": "module", diff --git a/extensions/featherless/package.json b/extensions/featherless/package.json index eba3b030a8f4..480c4ba8b2e4 100644 --- a/extensions/featherless/package.json +++ b/extensions/featherless/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/featherless-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Featherless AI provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.11" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/feishu/package.json b/extensions/feishu/package.json index 62f0270736af..5350abf7208e 100644 --- a/extensions/feishu/package.json +++ b/extensions/feishu/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/feishu", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Feishu/Lark channel plugin for chats and workplace tools (community maintained by @m1heng).", "repository": { "type": "git", @@ -20,7 +20,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -64,10 +64,10 @@ "minHostVersion": ">=2026.5.29" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/file-transfer/package.json b/extensions/file-transfer/package.json index 75e31fa1cc37..d244cce25b13 100644 --- a/extensions/file-transfer/package.json +++ b/extensions/file-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/file-transfer", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw file transfer plugin (file_fetch, dir_list, dir_fetch, file_write)", "type": "module", "dependencies": { diff --git a/extensions/firecrawl/package.json b/extensions/firecrawl/package.json index dda6aa1c3222..027ec625f4a8 100644 --- a/extensions/firecrawl/package.json +++ b/extensions/firecrawl/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/firecrawl-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Firecrawl plugin.", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/fireworks/package.json b/extensions/fireworks/package.json index 8e601dd60272..c8185601910b 100644 --- a/extensions/fireworks/package.json +++ b/extensions/fireworks/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/fireworks-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Fireworks provider plugin", "type": "module", "devDependencies": { @@ -17,10 +17,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/fish-audio-speech/package.json b/extensions/fish-audio-speech/package.json index 5323b924f0d2..9d500932835a 100644 --- a/extensions/fish-audio-speech/package.json +++ b/extensions/fish-audio-speech/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/fish-audio-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Fish Audio speech plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/github-copilot/package.json b/extensions/github-copilot/package.json index e42b82423b40..bcf6a895db38 100644 --- a/extensions/github-copilot/package.json +++ b/extensions/github-copilot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/github-copilot-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw GitHub Copilot provider plugin", "type": "module", diff --git a/extensions/gmi/package.json b/extensions/gmi/package.json index 7f29039d7e16..e80d024f7060 100644 --- a/extensions/gmi/package.json +++ b/extensions/gmi/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/gmi-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw GMI Cloud provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/google-meet/package.json b/extensions/google-meet/package.json index 27b475762cbe..84adfe3c7325 100644 --- a/extensions/google-meet/package.json +++ b/extensions/google-meet/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/google-meet", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -34,10 +34,10 @@ "minHostVersion": ">=2026.4.20" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/google/package.json b/extensions/google/package.json index fcb9c3a9a331..026f7f8474e0 100644 --- a/extensions/google/package.json +++ b/extensions/google/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/google-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Google plugin", "type": "module", diff --git a/extensions/googlechat/package.json b/extensions/googlechat/package.json index 0eab3dad4826..864a44221d7a 100644 --- a/extensions/googlechat/package.json +++ b/extensions/googlechat/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/googlechat", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Google Chat channel plugin for spaces and direct messages.", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -135,10 +135,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/gradium/package.json b/extensions/gradium/package.json index 036ce14c04ae..4016767f7251 100644 --- a/extensions/gradium/package.json +++ b/extensions/gradium/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/gradium-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Gradium speech plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/groq/package.json b/extensions/groq/package.json index 2fd9e1ef9464..04fbed15d88e 100644 --- a/extensions/groq/package.json +++ b/extensions/groq/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/groq-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Groq media-understanding provider.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/huggingface/package.json b/extensions/huggingface/package.json index 670c3b584bcf..fc0c0039e21a 100644 --- a/extensions/huggingface/package.json +++ b/extensions/huggingface/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/huggingface-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Hugging Face provider plugin", "type": "module", diff --git a/extensions/image-generation-core/package.json b/extensions/image-generation-core/package.json index c13d147add1b..0f6d2b9a25f5 100644 --- a/extensions/image-generation-core/package.json +++ b/extensions/image-generation-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/image-generation-core", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw image generation runtime package", "type": "module", diff --git a/extensions/imessage/package.json b/extensions/imessage/package.json index d41a4287863c..d8faeb70cdd0 100644 --- a/extensions/imessage/package.json +++ b/extensions/imessage/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/imessage", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -96,10 +96,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/inworld/package.json b/extensions/inworld/package.json index a414ba78d391..72e8d160c167 100644 --- a/extensions/inworld/package.json +++ b/extensions/inworld/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/inworld-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Inworld speech plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/irc/package.json b/extensions/irc/package.json index 8876159ab159..e62cb1953128 100644 --- a/extensions/irc/package.json +++ b/extensions/irc/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/irc", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw IRC channel plugin", "type": "module", "devDependencies": { @@ -121,10 +121,10 @@ } }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/kilocode/package.json b/extensions/kilocode/package.json index 507b3f73258a..6c403d1114ec 100644 --- a/extensions/kilocode/package.json +++ b/extensions/kilocode/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/kilocode-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Kilo Gateway provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/kimi-coding/package.json b/extensions/kimi-coding/package.json index 78ca61f444f4..ebae6335d2b7 100644 --- a/extensions/kimi-coding/package.json +++ b/extensions/kimi-coding/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/kimi-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Kimi provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/line/package.json b/extensions/line/package.json index ec9a619ca6ca..dcde5dba4347 100644 --- a/extensions/line/package.json +++ b/extensions/line/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/line", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw LINE channel plugin for LINE Bot API chats.", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -112,10 +112,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/linux-canvas/package.json b/extensions/linux-canvas/package.json index 119b0f9849ed..0a5e2664569b 100644 --- a/extensions/linux-canvas/package.json +++ b/extensions/linux-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/linux-canvas", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Linux desktop canvas bridge", "type": "module", "dependencies": { diff --git a/extensions/linux-node/package.json b/extensions/linux-node/package.json index 392e16f7f7dd..1239d0055f57 100644 --- a/extensions/linux-node/package.json +++ b/extensions/linux-node/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/linux-node", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Linux node device capabilities", "type": "module", "dependencies": { diff --git a/extensions/litellm/package.json b/extensions/litellm/package.json index bab42afb059a..b17ff19087a1 100644 --- a/extensions/litellm/package.json +++ b/extensions/litellm/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/litellm-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw LiteLLM provider plugin", "type": "module", diff --git a/extensions/llama-cpp/package.json b/extensions/llama-cpp/package.json index dae083141625..72c11d102f1b 100644 --- a/extensions/llama-cpp/package.json +++ b/extensions/llama-cpp/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/llama-cpp-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw llama.cpp text inference and embedding provider plugin", "repository": { "type": "git", @@ -23,10 +23,10 @@ "minHostVersion": ">=2026.6.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "bundleRuntimeDependencies": false, diff --git a/extensions/llm-task/package.json b/extensions/llm-task/package.json index 809f377602d9..2d2f4782b01e 100644 --- a/extensions/llm-task/package.json +++ b/extensions/llm-task/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/llm-task", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw JSON-only LLM task plugin", "type": "module", diff --git a/extensions/lmstudio/package.json b/extensions/lmstudio/package.json index 9e93c0c4c69b..b31baeae84d9 100644 --- a/extensions/lmstudio/package.json +++ b/extensions/lmstudio/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/lmstudio-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw LM Studio provider plugin", "type": "module", diff --git a/extensions/lobster/package.json b/extensions/lobster/package.json index 3f1b7d031d01..be3db864c766 100644 --- a/extensions/lobster/package.json +++ b/extensions/lobster/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/lobster", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Lobster workflow tool plugin for typed pipelines and resumable approvals.", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/logbook/package.json b/extensions/logbook/package.json index 3da66c2dbd10..ac33fad0385b 100644 --- a/extensions/logbook/package.json +++ b/extensions/logbook/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/logbook", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw automatic work journal plugin", "type": "module", @@ -9,7 +9,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/longcat/package.json b/extensions/longcat/package.json index db3169bb21af..2694f460c658 100644 --- a/extensions/longcat/package.json +++ b/extensions/longcat/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/longcat-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw LongCat provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/matrix/package.json b/extensions/matrix/package.json index ecda56d78216..2db1d2b4c08a 100644 --- a/extensions/matrix/package.json +++ b/extensions/matrix/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/matrix", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Matrix channel plugin for rooms and direct messages.", "repository": { "type": "git", @@ -22,7 +22,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -171,10 +171,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/matrix/src/matrix/monitor/handler.test.ts b/extensions/matrix/src/matrix/monitor/handler.test.ts index f826fb971b5a..0fa8dc39b8e8 100644 --- a/extensions/matrix/src/matrix/monitor/handler.test.ts +++ b/extensions/matrix/src/matrix/monitor/handler.test.ts @@ -3414,7 +3414,10 @@ describe("matrix monitor handler draft streaming", () => { streaming: "progress", previewToolProgressEnabled: true, accountConfig: { - streaming: { mode: "progress", progress: { label: "Working" } }, + streaming: { + mode: "progress", + progress: { label: "Working", commandText: "raw" }, + }, } as never, }); const { opts, finish } = await dispatch(); diff --git a/extensions/mattermost/package.json b/extensions/mattermost/package.json index c63adb36e855..b76d77ae8baa 100644 --- a/extensions/mattermost/package.json +++ b/extensions/mattermost/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/mattermost", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Mattermost channel plugin", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -92,10 +92,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts b/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts index dcb8e3830613..af8393d5c512 100644 --- a/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts +++ b/extensions/mattermost/src/mattermost/monitor.inbound-system-event.test.ts @@ -1879,7 +1879,10 @@ describe("mattermost inbound user posts", () => { chatmode: "onmessage", dmPolicy: "open", groupPolicy: "open", - streaming: { mode: "block", preview: { toolProgress: true } }, + streaming: { + mode: "block", + preview: { toolProgress: true, commandText: "raw" }, + }, }, }, }; diff --git a/extensions/media-understanding-core/package.json b/extensions/media-understanding-core/package.json index ff1d44515216..2d2314e1aed8 100644 --- a/extensions/media-understanding-core/package.json +++ b/extensions/media-understanding-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/media-understanding-core", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw media understanding runtime package", "type": "module", diff --git a/extensions/memory-core/package.json b/extensions/memory-core/package.json index da03cf763328..c910f35da012 100644 --- a/extensions/memory-core/package.json +++ b/extensions/memory-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-core", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw core memory search plugin", "type": "module", @@ -18,7 +18,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/memory-lancedb/embeddings.lifecycle.test.ts b/extensions/memory-lancedb/embeddings.lifecycle.test.ts index 201369bb531b..6b771ded4d67 100644 --- a/extensions/memory-lancedb/embeddings.lifecycle.test.ts +++ b/extensions/memory-lancedb/embeddings.lifecycle.test.ts @@ -311,11 +311,17 @@ describe("memory-lancedb provider lifecycle", () => { }, ...Object.values(agentDirs).map((agentDir) => ({ agentDir, - store: { version: 1, profiles: {} }, + store: { + version: 1, + profiles: { + [profileId]: { type: "api_key" as const, provider: "openai", key: credential }, + }, + runtimeLocalProfileIds: [], + }, })), ]); }; - const closeProvider = vi.fn(async () => {}); + const closedProviderKeys: string[] = []; const createProvider = vi.fn(async (options: { agentDir?: string }) => { const agentDir = expectDefined(options.agentDir, "inherited agent owner"); const profile = ensureAuthProfileStore(agentDir, { @@ -336,7 +342,9 @@ describe("memory-lancedb provider lifecycle", () => { return [0.1, 0.2, 0.3]; }), embedBatch: vi.fn(async () => [[0.1, 0.2, 0.3]]), - close: closeProvider, + close: vi.fn(async () => { + closedProviderKeys.push(`${agentDir}:${credential}`); + }), }, }; }); @@ -369,7 +377,19 @@ describe("memory-lancedb provider lifecycle", () => { ]); expect(createProvider).toHaveBeenCalledTimes(4); - expect(closeProvider).toHaveBeenCalledTimes(2); + expect(closedProviderKeys).toHaveLength(2); + expect(closedProviderKeys).toEqual( + expect.arrayContaining([ + `${agentDirs.private}:fixture-inherited-old`, + `${agentDirs.secondary}:fixture-inherited-old`, + ]), + ); + expect(closedProviderKeys).not.toEqual( + expect.arrayContaining([ + `${agentDirs.private}:fixture-inherited-new`, + `${agentDirs.secondary}:fixture-inherited-new`, + ]), + ); expect(requests).toEqual( expect.arrayContaining([ { @@ -398,6 +418,15 @@ describe("memory-lancedb provider lifecycle", () => { await embeddings.close?.(); clearRuntimeAuthProfileStoreSnapshots(); } + + expect(closedProviderKeys.toSorted()).toEqual( + [ + `${agentDirs.private}:fixture-inherited-old`, + `${agentDirs.private}:fixture-inherited-new`, + `${agentDirs.secondary}:fixture-inherited-old`, + `${agentDirs.secondary}:fixture-inherited-new`, + ].toSorted(), + ); }); it("retires cached agent providers and fails closed after runtime config replacement", async () => { diff --git a/extensions/memory-lancedb/package.json b/extensions/memory-lancedb/package.json index 92a0dda28a0c..1a1b068d64ad 100644 --- a/extensions/memory-lancedb/package.json +++ b/extensions/memory-lancedb/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-lancedb", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall, auto-capture, and vector search.", "repository": { "type": "git", @@ -26,10 +26,10 @@ "minHostVersion": ">=2026.5.31" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "bundleRuntimeDependencies": false, diff --git a/extensions/memory-wiki/package.json b/extensions/memory-wiki/package.json index 5e4c70263cab..257fd3cc16a2 100644 --- a/extensions/memory-wiki/package.json +++ b/extensions/memory-wiki/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/memory-wiki", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw persistent wiki plugin", "type": "module", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/meta/package.json b/extensions/meta/package.json index dd9e4e4ef40a..18e3aca9ccdd 100644 --- a/extensions/meta/package.json +++ b/extensions/meta/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/meta-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Meta provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.11" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/microsoft-foundry/package.json b/extensions/microsoft-foundry/package.json index 6b4f9116fe31..6589410639f6 100644 --- a/extensions/microsoft-foundry/package.json +++ b/extensions/microsoft-foundry/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/microsoft-foundry", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Microsoft Foundry provider plugin", "type": "module", diff --git a/extensions/microsoft/package.json b/extensions/microsoft/package.json index cd767649837b..53b984f4117e 100644 --- a/extensions/microsoft/package.json +++ b/extensions/microsoft/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/microsoft-speech", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Microsoft speech plugin", "type": "module", diff --git a/extensions/migrate-claude/package.json b/extensions/migrate-claude/package.json index a91fb9c3fbd9..7a2ed56526d7 100644 --- a/extensions/migrate-claude/package.json +++ b/extensions/migrate-claude/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/migrate-claude", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "Claude to OpenClaw migration provider", "type": "module", @@ -9,7 +9,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/migrate-hermes/package.json b/extensions/migrate-hermes/package.json index f50742e17630..8e2a6845b4c8 100644 --- a/extensions/migrate-hermes/package.json +++ b/extensions/migrate-hermes/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/migrate-hermes", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "Hermes to OpenClaw migration provider", "type": "module", @@ -13,7 +13,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/minimax/package.json b/extensions/minimax/package.json index 4b7cd79011ed..9cfae0bc7d12 100644 --- a/extensions/minimax/package.json +++ b/extensions/minimax/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/minimax-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw MiniMax provider and OAuth plugin", "type": "module", diff --git a/extensions/mistral/package.json b/extensions/mistral/package.json index c98a1eb0b639..0f4241bd5aca 100644 --- a/extensions/mistral/package.json +++ b/extensions/mistral/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/mistral-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Mistral provider plugin", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/moonshot/package.json b/extensions/moonshot/package.json index 29b9feb7ad3a..b5411a3dc4a4 100644 --- a/extensions/moonshot/package.json +++ b/extensions/moonshot/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/moonshot-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Moonshot provider plugin", "type": "module", "devDependencies": { @@ -17,10 +17,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/msteams/package.json b/extensions/msteams/package.json index 0551a0ed2bc2..528a81666766 100644 --- a/extensions/msteams/package.json +++ b/extensions/msteams/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/msteams", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Microsoft Teams channel plugin for bot conversations.", "repository": { "type": "git", @@ -22,7 +22,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -70,10 +70,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "runtimeFormat": "cjs" }, "release": { diff --git a/extensions/mxc/package.json b/extensions/mxc/package.json index c0feee4097d8..2dd749938704 100644 --- a/extensions/mxc/package.json +++ b/extensions/mxc/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/mxc-sandbox", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw MXC sandbox execution plugin for MXC-capable hosts", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.6.11" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false, "staticAssets": [ { diff --git a/extensions/nextcloud-talk/package.json b/extensions/nextcloud-talk/package.json index 121cc8e06241..11f0efdae4d7 100644 --- a/extensions/nextcloud-talk/package.json +++ b/extensions/nextcloud-talk/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nextcloud-talk", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Nextcloud Talk channel plugin for conversations.", "repository": { "type": "git", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -129,10 +129,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/nostr/package.json b/extensions/nostr/package.json index 0b0a5778f765..af258ec1a500 100644 --- a/extensions/nostr/package.json +++ b/extensions/nostr/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nostr", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Nostr channel plugin for NIP-04 encrypted direct messages.", "repository": { "type": "git", @@ -16,7 +16,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -81,10 +81,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/novita/package.json b/extensions/novita/package.json index 40f177970c52..e315bdbedb0b 100644 --- a/extensions/novita/package.json +++ b/extensions/novita/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/novita-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw NovitaAI provider plugin", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/nvidia/package.json b/extensions/nvidia/package.json index 1817bddb1824..7440a3d1c9f1 100644 --- a/extensions/nvidia/package.json +++ b/extensions/nvidia/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/nvidia-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw NVIDIA provider plugin", "type": "module", diff --git a/extensions/oc-path/package.json b/extensions/oc-path/package.json index 4e066d76a9e8..14ab83ea331d 100644 --- a/extensions/oc-path/package.json +++ b/extensions/oc-path/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/oc-path", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw oc:// workspace path plugin", "type": "module", @@ -14,7 +14,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/ollama/package.json b/extensions/ollama/package.json index 8c84b99b2b95..5e6adc1e8a9c 100644 --- a/extensions/ollama/package.json +++ b/extensions/ollama/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/ollama-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Ollama provider plugin", "type": "module", diff --git a/extensions/onepassword/package.json b/extensions/onepassword/package.json index 9d87e7b146b2..a90a92feff60 100644 --- a/extensions/onepassword/package.json +++ b/extensions/onepassword/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/onepassword", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "1Password SecretRef resolver and audited agent secrets broker for OpenClaw", "type": "module", diff --git a/extensions/open-prose/package.json b/extensions/open-prose/package.json index 551fb323f16d..f8d924d552e2 100644 --- a/extensions/open-prose/package.json +++ b/extensions/open-prose/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/open-prose", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenProse VM skill pack plugin (slash command + telemetry).", "type": "module", diff --git a/extensions/openai/package.json b/extensions/openai/package.json index 346d1b255372..431c2f97e3e7 100644 --- a/extensions/openai/package.json +++ b/extensions/openai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openai-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw OpenAI provider plugins", "type": "module", diff --git a/extensions/opencode-go/package.json b/extensions/opencode-go/package.json index e3ec044adf56..212df7d1b624 100644 --- a/extensions/opencode-go/package.json +++ b/extensions/opencode-go/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/opencode-go-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw OpenCode Go provider plugin", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": true }, "release": { diff --git a/extensions/opencode/package.json b/extensions/opencode/package.json index 8e3447383b93..5ae750c0c26a 100644 --- a/extensions/opencode/package.json +++ b/extensions/opencode/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/opencode-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw OpenCode Zen provider plugin", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/openrouter/package.json b/extensions/openrouter/package.json index b48931452b01..f51a90a330a7 100644 --- a/extensions/openrouter/package.json +++ b/extensions/openrouter/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openrouter-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw OpenRouter provider plugin", "type": "module", diff --git a/extensions/openshell/package.json b/extensions/openshell/package.json index f8366e35268e..2b49de0be861 100644 --- a/extensions/openshell/package.json +++ b/extensions/openshell/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/openshell-sandbox", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw sandbox backend for the NVIDIA OpenShell CLI with mirrored local workspaces and SSH command execution.", "repository": { "type": "git", @@ -24,10 +24,10 @@ "minHostVersion": ">=2026.5.12-beta.1" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/parallel/package.json b/extensions/parallel/package.json index 3f3434f2c8f7..32cc861b2367 100644 --- a/extensions/parallel/package.json +++ b/extensions/parallel/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/parallel-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Parallel web search plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/perplexity/package.json b/extensions/perplexity/package.json index 9871b8b19a21..fdcb0d4b26f8 100644 --- a/extensions/perplexity/package.json +++ b/extensions/perplexity/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/perplexity-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Perplexity plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/pixverse/package.json b/extensions/pixverse/package.json index 987e836a86ea..d8467ba2120a 100644 --- a/extensions/pixverse/package.json +++ b/extensions/pixverse/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/pixverse-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw PixVerse video generation provider plugin.", "repository": { "type": "git", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -30,10 +30,10 @@ "minHostVersion": ">=2026.5.26" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/policy/package.json b/extensions/policy/package.json index 33ffd9550850..2168cd26e01e 100644 --- a/extensions/policy/package.json +++ b/extensions/policy/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/policy", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw policy doctor checks for workspace conformance", "type": "module", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/qa-channel/package.json b/extensions/qa-channel/package.json index 48f98cd1a0ff..43a08c95c835 100644 --- a/extensions/qa-channel/package.json +++ b/extensions/qa-channel/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qa-channel", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw QA synthetic channel plugin", "type": "module", @@ -19,7 +19,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/qa-lab/package.json b/extensions/qa-lab/package.json index 3b9670de57e4..79833aac3a67 100644 --- a/extensions/qa-lab/package.json +++ b/extensions/qa-lab/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qa-lab", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw QA lab plugin with private debugger UI and scenario runner", "type": "module", @@ -27,7 +27,7 @@ "vite": "8.1.5" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -39,7 +39,7 @@ "./index.ts" ], "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" } } } diff --git a/extensions/qa-lab/src/live-transports/matrix/substrate/config.test.ts b/extensions/qa-lab/src/live-transports/matrix/substrate/config.test.ts index 9399ee2c2869..6c8a73d92d2d 100644 --- a/extensions/qa-lab/src/live-transports/matrix/substrate/config.test.ts +++ b/extensions/qa-lab/src/live-transports/matrix/substrate/config.test.ts @@ -374,6 +374,7 @@ describe("matrix qa config", () => { chunkMode: "newline", mode: "quiet", preview: { toolProgress: false }, + progress: { commandText: "status", maxLines: 2 }, }, threadBindings: { enabled: false, @@ -463,6 +464,7 @@ describe("matrix qa config", () => { chunkMode: "newline", mode: "quiet", preview: { adjacentPreview: "current", toolProgress: false }, + progress: { commandText: "raw", currentOnly: "current", maxLines: 3 }, }, threadBindings: { adjacentBinding: "current", @@ -541,6 +543,7 @@ describe("matrix qa config", () => { chunkMode: "length", mode: "off", preview: { adjacentPreview: "current", toolProgress: true }, + progress: { commandText: "status", currentOnly: "current", maxLines: 3 }, }, threadBindings: { adjacentBinding: "current", @@ -596,7 +599,10 @@ describe("matrix qa config", () => { }, groupMentionPatterns: ["\\S"], groupPolicy: "open", - streaming: true, + streaming: { + mode: "partial", + progress: { commandText: "raw" }, + }, }, sutAccessToken: "sut-token", sutAccountId: "sut", @@ -613,11 +619,12 @@ describe("matrix qa config", () => { chunkMode: "length", mode: "partial", preview: { toolProgress: true }, + progress: { commandText: "raw" }, }); expect(config.messages?.groupChat?.mentionPatterns).toEqual(["\\S"]); }); - it("resets tool progress when a scalar streaming override follows an opt-out", () => { + it("resets QA streaming detail overrides when a scalar override follows", () => { const optedOut = buildMatrixQaConfig({} as OpenClawConfig, { driverUserId: "@driver:matrix-qa.test", homeserver: "http://127.0.0.1:28008/", @@ -626,6 +633,7 @@ describe("matrix qa config", () => { streaming: { mode: "quiet", preview: { toolProgress: false }, + progress: { commandText: "raw" }, }, }, sutAccessToken: "sut-token", @@ -650,6 +658,7 @@ describe("matrix qa config", () => { chunkMode: "length", mode: "quiet", preview: { toolProgress: false }, + progress: { commandText: "raw" }, }); expect(reset.channels?.matrix?.accounts?.sut?.streaming).toEqual({ block: { enabled: false }, diff --git a/extensions/qa-lab/src/live-transports/matrix/substrate/config.ts b/extensions/qa-lab/src/live-transports/matrix/substrate/config.ts index ddea8cf1e190..acf139beeee5 100644 --- a/extensions/qa-lab/src/live-transports/matrix/substrate/config.ts +++ b/extensions/qa-lab/src/live-transports/matrix/substrate/config.ts @@ -20,9 +20,8 @@ type MatrixQaExecApprovalsEnabled = boolean | "auto"; type MatrixQaAllowBotsMode = boolean | "mentions"; type MatrixQaStreamingConfig = { mode?: MatrixQaStreamingMode; - preview?: { - toolProgress?: boolean; - }; + preview?: { toolProgress?: boolean }; + progress?: { commandText?: "raw" | "status" }; }; type MatrixQaAgentDefaultsOverrides = { blockStreamingChunk?: { @@ -132,6 +131,7 @@ type MatrixQaConfigSnapshot = { startupVerification?: "if-unverified" | "off"; streaming: MatrixQaStreamingMode; streamingPreviewToolProgress: boolean; + streamingProgressCommandText?: "raw" | "status"; textChunkLimit?: number; threadBindings: MatrixQaThreadBindingsConfigOverrides; threadReplies: MatrixQaThreadRepliesMode; @@ -293,10 +293,7 @@ function isMatrixQaStreamingConfig( function resolveMatrixQaStreamingPreviewToolProgress( value: MatrixQaConfigOverrides["streaming"], ): boolean { - if (!isMatrixQaStreamingConfig(value)) { - return true; - } - return value.preview?.toolProgress ?? true; + return isMatrixQaStreamingConfig(value) ? (value.preview?.toolProgress ?? true) : true; } function resolveMatrixQaAutoJoinAllowlist(params: { overrides?: MatrixQaConfigOverrides }) { @@ -450,12 +447,22 @@ function buildMatrixQaChannelAccountConfig(params: { const preview = restoreOwnedFields(current?.streaming?.preview, baseline?.streaming?.preview, [ "toolProgress", ]); + const progress = restoreOwnedFields(current?.streaming?.progress, baseline?.streaming?.progress, [ + "commandText", + ]); + if (params.snapshot.streamingProgressCommandText !== undefined) { + progress.commandText = params.snapshot.streamingProgressCommandText; + } Object.assign(streaming, { block: { ...block, enabled: params.snapshot.blockStreaming }, chunkMode: params.snapshot.chunkMode ?? "length", mode: params.snapshot.streaming, preview: { ...preview, toolProgress: params.snapshot.streamingPreviewToolProgress }, }); + delete streaming.progress; + if (Object.keys(progress).length > 0) { + streaming.progress = progress; + } const threadBindings = restoreOwnedFields( current?.threadBindings, baseline?.threadBindings, @@ -513,6 +520,7 @@ function buildMatrixQaConfigSnapshot(params: { sutUserId: string; topology: MatrixQaProvisionedTopology; }): MatrixQaConfigSnapshot { + const streaming = params.overrides?.streaming; return { allowBots: params.overrides?.allowBots, autoJoin: params.overrides?.autoJoin ?? "off", @@ -532,10 +540,11 @@ function buildMatrixQaConfigSnapshot(params: { }), replyToMode: params.overrides?.replyToMode ?? "off", startupVerification: params.overrides?.startupVerification, - streaming: resolveMatrixQaStreamingMode(params.overrides?.streaming), - streamingPreviewToolProgress: resolveMatrixQaStreamingPreviewToolProgress( - params.overrides?.streaming, - ), + streaming: resolveMatrixQaStreamingMode(streaming), + streamingPreviewToolProgress: resolveMatrixQaStreamingPreviewToolProgress(streaming), + streamingProgressCommandText: isMatrixQaStreamingConfig(streaming) + ? streaming.progress?.commandText + : undefined, threadBindings: { ...params.overrides?.threadBindings }, textChunkLimit: params.overrides?.textChunkLimit, threadReplies: params.overrides?.threadReplies ?? "inbound", diff --git a/extensions/qa-lab/src/live-transports/shared/scenario-selection.test.ts b/extensions/qa-lab/src/live-transports/shared/scenario-selection.test.ts index 85ae5e08c5e5..a0029800deb7 100644 --- a/extensions/qa-lab/src/live-transports/shared/scenario-selection.test.ts +++ b/extensions/qa-lab/src/live-transports/shared/scenario-selection.test.ts @@ -138,6 +138,7 @@ describe("live transport QA scenario selection", () => { it.each([ { channelId: "matrix", scenarioId: "thread-follow-up" }, + { channelId: "buzz", scenarioId: "channel-canary" }, { channelId: "telegram", scenarioId: "channel-canary" }, { channelId: "telegram", scenarioId: "channel-message-flows" }, ] as const)( @@ -165,7 +166,7 @@ describe("live transport QA scenario selection", () => { scenarioIds: ["channel-canary"], }), ).toThrow( - "selected QA scenario(s) do not match the current QA lane: channel-canary (channel=qa-channel|telegram)", + "selected QA scenario(s) do not match the current QA lane: channel-canary (channel=qa-channel|telegram|buzz)", ); }); }); diff --git a/extensions/qa-lab/src/scenario-catalog-channels.test.ts b/extensions/qa-lab/src/scenario-catalog-channels.test.ts index b81fc546418e..12d6d2643427 100644 --- a/extensions/qa-lab/src/scenario-catalog-channels.test.ts +++ b/extensions/qa-lab/src/scenario-catalog-channels.test.ts @@ -213,10 +213,33 @@ describe("qa scenario catalog channel contracts", () => { expect(scenario.gatewayConfigPatch).not.toHaveProperty("channels.telegram.groups"); }); - it("keeps the shared channel canary eligible for QA Channel and Telegram", () => { + it("keeps the shared channel canary eligible for QA Channel, Telegram, and Buzz", () => { const scenario = requireFlowScenario(readQaScenarioById("channel-canary")); - expect(scenario.execution.channels).toEqual(["qa-channel", "telegram"]); + expect(scenario.execution.channels).toEqual(["qa-channel", "telegram", "buzz"]); + }); + + it("keeps raw Matrix command text scoped to the mention-safety scenario", () => { + const scenario = requireFlowScenario( + readQaScenarioById("matrix-room-tool-progress-mention-safety"), + ); + const ordinaryProgressScenario = requireFlowScenario( + readQaScenarioById("matrix-room-tool-progress-preview"), + ); + + expect(scenario.execution.channel).toBe("matrix"); + expect(scenario.execution.config).toMatchObject({ + matrixConfigOverrides: { + streaming: { + mode: "partial", + progress: { commandText: "raw" }, + }, + toolProfile: "coding", + }, + }); + expect(ordinaryProgressScenario.execution.config).not.toHaveProperty( + "matrixConfigOverrides.streaming.progress.commandText", + ); }); it("keeps transcript-role delivery on the Crabline driver", () => { diff --git a/extensions/qianfan/package.json b/extensions/qianfan/package.json index acd5f1e0d521..598d631973ce 100644 --- a/extensions/qianfan/package.json +++ b/extensions/qianfan/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qianfan-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Qianfan provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/qwen/package.json b/extensions/qwen/package.json index db15134bd4d0..45ba59cb4bbc 100644 --- a/extensions/qwen/package.json +++ b/extensions/qwen/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/qwen-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Qwen Cloud provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/raft/package.json b/extensions/raft/package.json index ca3fb70104f2..17967fa0549b 100644 --- a/extensions/raft/package.json +++ b/extensions/raft/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/raft", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Raft channel plugin for Raft CLI wake bridges.", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.6.8" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "channel": { "id": "raft", diff --git a/extensions/reef/package.json b/extensions/reef/package.json index c653c770f361..d13ff151687c 100644 --- a/extensions/reef/package.json +++ b/extensions/reef/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/reef", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Reef channel plugin — guarded end-to-end encrypted claw-to-claw messaging", "type": "module", "dependencies": { diff --git a/extensions/runway/package.json b/extensions/runway/package.json index 050f38856180..df55f2d32af4 100644 --- a/extensions/runway/package.json +++ b/extensions/runway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/runway-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Runway video provider plugin", "type": "module", diff --git a/extensions/searxng/package.json b/extensions/searxng/package.json index 939059666bd9..afc4974e98dd 100644 --- a/extensions/searxng/package.json +++ b/extensions/searxng/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/searxng-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw SearXNG plugin", "type": "module", "devDependencies": { @@ -18,10 +18,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/senseaudio/package.json b/extensions/senseaudio/package.json index f9073f0af1f6..f8ad4c542355 100644 --- a/extensions/senseaudio/package.json +++ b/extensions/senseaudio/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/senseaudio-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw SenseAudio media-understanding provider", "type": "module", diff --git a/extensions/sglang/package.json b/extensions/sglang/package.json index 9557650e2589..c3b8352eb1bc 100644 --- a/extensions/sglang/package.json +++ b/extensions/sglang/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/sglang-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw SGLang provider plugin", "type": "module", diff --git a/extensions/signal/package.json b/extensions/signal/package.json index 95b544cdd1b2..b6a4b6badd93 100644 --- a/extensions/signal/package.json +++ b/extensions/signal/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/signal", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Signal channel plugin", "type": "module", "dependencies": { @@ -96,10 +96,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/slack/package.json b/extensions/slack/package.json index e2f0cd43cd8e..8dc97ff15889 100644 --- a/extensions/slack/package.json +++ b/extensions/slack/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/slack", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Slack channel plugin for channels, DMs, commands, and app events.", "repository": { "type": "git", @@ -24,7 +24,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -152,10 +152,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/slack/src/approval-native-gates.ts b/extensions/slack/src/approval-native-gates.ts index bab81dd00c55..80a7a126593a 100644 --- a/extensions/slack/src/approval-native-gates.ts +++ b/extensions/slack/src/approval-native-gates.ts @@ -453,10 +453,6 @@ export function shouldHandleSlackNativeApprovalRequest(params: { shouldHandleSlackPluginViaForwarding(params) ); } - const turnSourceChannel = normalizeMessageChannel(params.request.request.turnSourceChannel); - if (turnSourceChannel && turnSourceChannel !== "slack") { - return false; - } if ( !doesApprovalRequestSelectChannelAccount({ ...params, diff --git a/extensions/slack/src/exec-approvals.test.ts b/extensions/slack/src/exec-approvals.test.ts index e0b1146bdd48..f358ce692a82 100644 --- a/extensions/slack/src/exec-approvals.test.ts +++ b/extensions/slack/src/exec-approvals.test.ts @@ -239,7 +239,7 @@ describe("slack exec approvals", () => { ).toBe(false); }); - it("rejects requests bound to another channel or Slack account", () => { + it("reports a foreign-channel candidate but rejects another Slack account", () => { const cfg = buildConfig({ enabled: true, approvers: ["U123"], @@ -261,7 +261,7 @@ describe("slack exec approvals", () => { expiresAtMs: 1000, }, }), - ).toBe(false); + ).toBe(true); expect( slackApprovalCapability.nativeRuntime?.availability.shouldHandle({ diff --git a/extensions/slack/src/monitor/provider.allowlist.test.ts b/extensions/slack/src/monitor/provider.allowlist.test.ts index 60f086438975..9f55295ee851 100644 --- a/extensions/slack/src/monitor/provider.allowlist.test.ts +++ b/extensions/slack/src/monitor/provider.allowlist.test.ts @@ -13,11 +13,14 @@ import { } from "../monitor.test-helpers.js"; import { formatSlackChannelResolved, formatSlackUserResolved } from "./provider-support.js"; +const webClientMocks = vi.hoisted(() => ({ constructed: vi.fn() })); + const { monitorSlackProvider } = await import("./provider.js"); const slackTestState = getSlackTestState(); beforeEach(() => { resetSlackTestState(); + webClientMocks.constructed.mockClear(); }); function createRuntimeContextCapture(): { @@ -103,6 +106,23 @@ describe("slack allowlist log formatting", () => { describe("slack startup user allowlist resolution", () => { it("registers one native approval client per Enterprise Grid team", async () => { + vi.resetModules(); + vi.doMock("../client.js", async (importOriginal) => { + const actual = await importOriginal(); + const webApi = await vi.importActual("@slack/web-api"); + return { + ...actual, + createSlackStartupAuthClient: () => getSlackClient(), + createSlackWebClient: ( + token: string, + options?: import("@slack/web-api").WebClientOptions, + ) => { + webClientMocks.constructed(token, options); + return new webApi.WebClient(token, options); + }, + }; + }); + const { monitorSlackProvider: cacheAwareMonitor } = await import("./provider.js"); resetSlackTestState({ channels: { slack: { @@ -128,7 +148,7 @@ describe("slack startup user allowlist resolution", () => { }); const { channelRuntime, register } = createRuntimeContextCapture(); - const monitor = startSlackMonitor(monitorSlackProvider, { + const monitor = startSlackMonitor(cacheAwareMonitor, { channelRuntime, appToken: "xapp-1-A123-test", }); @@ -141,16 +161,27 @@ describe("slack startup user allowlist resolution", () => { | undefined; const resolveClient = registration?.context?.resolveClient; expect(resolveClient).toBeTypeOf("function"); - const teamOne = resolveClient?.("T111") as { teamId?: string }; - const teamOneAgain = resolveClient?.("T111") as { teamId?: string }; - const teamTwo = resolveClient?.("T222") as { teamId?: string }; + const teamOne = resolveClient?.("T111"); + const teamOneAgain = resolveClient?.("T111"); + const teamTwo = resolveClient?.("T222"); + expect(webClientMocks.constructed).toHaveBeenCalledTimes(2); expect(teamOneAgain).toBe(teamOne); expect(teamTwo).not.toBe(teamOne); - expect(teamOne.teamId).toBe("T111"); - expect(teamTwo.teamId).toBe("T222"); + expect(webClientMocks.constructed).toHaveBeenNthCalledWith( + 1, + "bot-token", + expect.objectContaining({ teamId: "T111" }), + ); + expect(webClientMocks.constructed).toHaveBeenNthCalledWith( + 2, + "bot-token", + expect.objectContaining({ teamId: "T222" }), + ); } finally { await stopSlackMonitor(monitor); + vi.doUnmock("../client.js"); + vi.resetModules(); } }); diff --git a/extensions/sms/package.json b/extensions/sms/package.json index 82e81609c4df..562094ab89aa 100644 --- a/extensions/sms/package.json +++ b/extensions/sms/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/sms", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw SMS/MMS channel plugin for Twilio messages.", "repository": { "type": "git", @@ -127,10 +127,10 @@ } }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "install": { diff --git a/extensions/stepfun/package.json b/extensions/stepfun/package.json index a1b610e90346..9e67f5c07b65 100644 --- a/extensions/stepfun/package.json +++ b/extensions/stepfun/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/stepfun-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw StepFun provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/synology-chat/package.json b/extensions/synology-chat/package.json index cb8c963323d0..bb6d32140f80 100644 --- a/extensions/synology-chat/package.json +++ b/extensions/synology-chat/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/synology-chat", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Synology Chat channel plugin for OpenClaw channels and direct messages.", "repository": { "type": "git", @@ -80,10 +80,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/synthetic/package.json b/extensions/synthetic/package.json index 1c7672bcf53b..4e89372ca41a 100644 --- a/extensions/synthetic/package.json +++ b/extensions/synthetic/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/synthetic-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Synthetic provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/tavily/package.json b/extensions/tavily/package.json index dd8160c0f405..c40b467dad71 100644 --- a/extensions/tavily/package.json +++ b/extensions/tavily/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tavily-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Tavily plugin", "type": "module", "dependencies": { @@ -21,10 +21,10 @@ "allowInvalidConfigRecovery": true }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/teams-meetings/package.json b/extensions/teams-meetings/package.json index a4b858ad5be2..daddc35769a2 100644 --- a/extensions/teams-meetings/package.json +++ b/extensions/teams-meetings/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/teams-meetings", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Microsoft Teams browser meeting participant plugin.", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/teams-meetings/src/node-host.test.ts b/extensions/teams-meetings/src/node-host.test.ts index 7a2ee7433c13..7705b1d9803c 100644 --- a/extensions/teams-meetings/src/node-host.test.ts +++ b/extensions/teams-meetings/src/node-host.test.ts @@ -2,13 +2,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const spawnSyncMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { - const actual = await importOriginal(); - return { ...actual, spawnSync: spawnSyncMock }; -}); - -import { teamsMeetingsConfig } from "./config.js"; -import { handleTeamsMeetingsNodeHostCommand } from "./node-host.js"; +let handleTeamsMeetingsNodeHostCommand: typeof import("./node-host.js").handleTeamsMeetingsNodeHostCommand; const successfulProbe = { pid: 123, @@ -29,13 +23,20 @@ function setupParams() { } describe("Teams meeting node-host prerequisite deadline", () => { - beforeEach(() => { + beforeEach(async () => { + vi.resetModules(); + vi.doMock("node:child_process", async (importOriginal) => { + const actual = await importOriginal(); + return { ...actual, spawnSync: spawnSyncMock }; + }); + ({ handleTeamsMeetingsNodeHostCommand } = await import("./node-host.js")); vi.spyOn(process, "platform", "get").mockReturnValue("darwin"); spawnSyncMock.mockReset(); spawnSyncMock.mockReturnValue(successfulProbe); }); afterEach(() => { + vi.doUnmock("node:child_process"); vi.restoreAllMocks(); }); @@ -58,32 +59,6 @@ describe("Teams meeting node-host prerequisite deadline", () => { ).toEqual([10_000, 7_000, 3_000]); }); - it("probes the default sox executable only once", async () => { - await expect( - handleTeamsMeetingsNodeHostCommand( - JSON.stringify({ - action: "setup", - audioInputCommand: teamsMeetingsConfig.defaultAudioInputCommand, - audioOutputCommand: teamsMeetingsConfig.defaultAudioOutputCommand, - }), - ), - ).resolves.toBe( - JSON.stringify({ - ok: true, - audioBackend: "blackhole-2ch", - audioDeviceLabel: "BlackHole 2ch", - }), - ); - - expect(spawnSyncMock).toHaveBeenCalledTimes(2); - expect(spawnSyncMock.mock.calls[1]?.[1]).toEqual([ - "-lc", - 'command -v "$1" >/dev/null 2>&1', - "sh", - "sox", - ]); - }); - it("does not start another probe after the shared deadline expires", async () => { const now = vi.spyOn(Date, "now"); for (const value of [1_000, 1_000, 11_000]) { diff --git a/extensions/teams-meetings/src/node-invoke-policy.test.ts b/extensions/teams-meetings/src/node-invoke-policy.test.ts index bec2224867c4..bdf5e64f96ae 100644 --- a/extensions/teams-meetings/src/node-invoke-policy.test.ts +++ b/extensions/teams-meetings/src/node-invoke-policy.test.ts @@ -32,6 +32,9 @@ describe("Microsoft Teams meetings node invoke policy", () => { expect(invokeNode).toHaveBeenCalledWith({ params: { action: "setup", + audioBackend: "auto", + audioBufferBytes: 4_096, + audioFormat: "pcm16-24khz", audioInputCommand: ["trusted-input", "--read"], audioOutputCommand: ["trusted-output", "--write"], bargeInInputCommand: ["trusted-barge-in"], diff --git a/extensions/telegram/package.json b/extensions/telegram/package.json index 387c09b1c63b..a97c0a6b4f57 100644 --- a/extensions/telegram/package.json +++ b/extensions/telegram/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/telegram", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Telegram channel plugin", "type": "module", diff --git a/extensions/telegram/src/bot-message-dispatch.draft-failures-progress.test.ts b/extensions/telegram/src/bot-message-dispatch.draft-failures-progress.test.ts index 278dbebb5195..8a97b60e2444 100644 --- a/extensions/telegram/src/bot-message-dispatch.draft-failures-progress.test.ts +++ b/extensions/telegram/src/bot-message-dispatch.draft-failures-progress.test.ts @@ -576,7 +576,12 @@ describeTelegramDispatch("dispatchTelegramMessage draft-failures-progress", () = await dispatchWithContext({ context: createContext(), streamMode: "progress", - telegramCfg: { streaming: { mode: "progress", progress: { label: "Cracking" } } }, + telegramCfg: { + streaming: { + mode: "progress", + progress: { label: "Cracking", commandText: "raw" }, + }, + }, }); // #121600: default command progress is status-only — raw command text stays diff --git a/extensions/telegram/src/polling-session.test.ts b/extensions/telegram/src/polling-session.test.ts index b2d967655351..2ce28b7bf5d8 100644 --- a/extensions/telegram/src/polling-session.test.ts +++ b/extensions/telegram/src/polling-session.test.ts @@ -585,6 +585,8 @@ async function waitForApiMiddleware( type TestTelegramUpdate = { update_id: number; message: { + message_id: number; + date: number; text: string; chat: { id: number; type: "private" | "supergroup"; is_forum?: boolean }; message_thread_id?: number; @@ -596,6 +598,8 @@ function topicUpdate(updateId: number, threadId: number, text: string): TestTele return { update_id: updateId, message: { + message_id: updateId, + date: 1_700_000_000 + updateId, text, message_thread_id: threadId, is_topic_message: true, @@ -608,6 +612,8 @@ function directUpdate(updateId: number, chatId: number, text: string): TestTeleg return { update_id: updateId, message: { + message_id: updateId, + date: 1_700_000_000 + updateId, text, chat: { id: chatId, type: chatId < 0 ? "supergroup" : "private" }, }, @@ -1291,9 +1297,10 @@ describe("TelegramPollingSession", () => { const abort = new AbortController(); const handleUpdate = vi.fn(async () => undefined); const init = vi.fn(async () => undefined); + const update = directUpdate(42, 123, "hello"); await writeTelegramSpooledUpdate({ spoolDir: tempDir, - update: { update_id: 42, message: { text: "hello" } }, + update, }); const { createWorker, runPromise } = startIsolatedIngressSession({ @@ -1331,7 +1338,7 @@ describe("TelegramPollingSession", () => { persistenceFloorUpdateId: null, }); expect(init).toHaveBeenCalledBefore(handleUpdate); - expect(handleUpdate).toHaveBeenCalledWith({ update_id: 42, message: { text: "hello" } }); + expect(handleUpdate).toHaveBeenCalledWith(update); }); }); @@ -1346,12 +1353,13 @@ describe("TelegramPollingSession", () => { handleUpdate, createWorker: worker.createWorker, }); + const update = directUpdate(42, 123, "hello"); try { await waitForTelegramTestState(() => expect(worker.hasListener()).toBe(true)); worker.emit({ type: "update", requestId: "write-1", - update: { update_id: 42, message: { text: "hello" } }, + update, queued: 1, }); await waitForTelegramTestState(() => @@ -1360,9 +1368,7 @@ describe("TelegramPollingSession", () => { updateId: 42, }), ); - await waitForTelegramTestState(() => - expect(handleUpdate).toHaveBeenCalledWith({ update_id: 42, message: { text: "hello" } }), - ); + await waitForTelegramTestState(() => expect(handleUpdate).toHaveBeenCalledWith(update)); await waitForTelegramTestState(async () => expect(await pendingUpdateIds(tempDir, "all")).toEqual([]), ); @@ -1424,19 +1430,14 @@ describe("TelegramPollingSession", () => { }, }); const runPromise = session.runUntilAbort(); + const update = directUpdate(143, 1234, "installed bot capability snapshot"); + update.message.message_thread_id = 42; try { await waitForTelegramTestState(() => expect(worker.hasListener()).toBe(true)); worker.emit({ type: "update", requestId: "topic-capability-1", - update: { - update_id: 143, - message: { - chat: { id: 1234, type: "private" }, - message_thread_id: 42, - text: "installed bot capability snapshot", - }, - }, + update, queued: 1, }); await waitForTelegramTestState(() => @@ -1488,7 +1489,7 @@ describe("TelegramPollingSession", () => { worker.emit({ type: "update", requestId: "offset-gap", - update: { update_id: 42, message: { text: "hello" } }, + update: directUpdate(42, 123, "hello"), queued: 1, }); await waitForTelegramTestState(() => @@ -1529,7 +1530,7 @@ describe("TelegramPollingSession", () => { worker.emit({ type: "update", requestId: "offset-failure", - update: { update_id: 43, message: { text: "hello" } }, + update: directUpdate(43, 123, "hello"), queued: 1, }); await waitForTelegramTestState(() => @@ -1567,7 +1568,7 @@ describe("TelegramPollingSession", () => { worker.emit({ type: "update", requestId: "offset-catching-up", - update: { update_id: 44, message: { text: "hello" } }, + update: directUpdate(44, 123, "hello"), queued: 1, }); await waitForTelegramTestState(() => @@ -1615,7 +1616,7 @@ describe("TelegramPollingSession", () => { firstWorker.emit({ type: "update", requestId: "first-delivery", - update: { update_id: 42, message: { text: "hello" } }, + update: directUpdate(42, 123, "hello"), queued: 1, }); await waitForTelegramTestState(() => @@ -1662,7 +1663,7 @@ describe("TelegramPollingSession", () => { restartWorker.emit({ type: "update", requestId: "restart-replay", - update: { update_id: 42, message: { text: "hello" } }, + update: directUpdate(42, 123, "hello"), queued: 1, }); await waitForTelegramTestState(() => @@ -1727,12 +1728,13 @@ describe("TelegramPollingSession", () => { createWorker: worker.createWorker, drainIntervalMs: 60_000, }); + const update = directUpdate(42, 123, "hello"); try { await waitForTelegramTestState(() => expect(worker.hasListener()).toBe(true)); worker.emit({ type: "update", requestId: "write-1", - update: { update_id: 42, message: { text: "hello" } }, + update, queued: 1, }); await waitForTelegramTestState(() => @@ -1742,9 +1744,7 @@ describe("TelegramPollingSession", () => { }), ); worker.emit({ type: "spooled", updateId: 42, queued: 1 }); - await waitForTelegramTestState(() => - expect(handleUpdate).toHaveBeenCalledWith({ update_id: 42, message: { text: "hello" } }), - ); + await waitForTelegramTestState(() => expect(handleUpdate).toHaveBeenCalledWith(update)); await waitForTelegramTestState(async () => expect(await pendingUpdateIds(tempDir, "all")).toEqual([]), ); @@ -1789,9 +1789,11 @@ describe("TelegramPollingSession", () => { }, } as TelegramRuntime); + const preSeededUpdate = directUpdate(1, 123, "pre-seeded"); + const duringDrainUpdate = directUpdate(2, 123, "during-drain"); await writeTelegramSpooledUpdate({ spoolDir: tempDir, - update: { update_id: 1, message: { text: "pre-seeded" } }, + update: preSeededUpdate, }); const handleUpdate = vi.fn(async () => undefined); const worker = createListeningIngressWorker(); @@ -1810,7 +1812,7 @@ describe("TelegramPollingSession", () => { worker.emit({ type: "update", requestId: "write-2", - update: { update_id: 2, message: { text: "during-drain" } }, + update: duringDrainUpdate, queued: 1, }); expect(worker.ackSpooledUpdate).not.toHaveBeenCalledWith("write-2", expect.anything()); @@ -1825,16 +1827,10 @@ describe("TelegramPollingSession", () => { worker.emit({ type: "spooled", updateId: 2, queued: 1 }); await waitForTelegramTestState(() => - expect(handleUpdate).toHaveBeenCalledWith({ - update_id: 1, - message: { text: "pre-seeded" }, - }), + expect(handleUpdate).toHaveBeenCalledWith(preSeededUpdate), ); await waitForTelegramTestState(() => - expect(handleUpdate).toHaveBeenCalledWith({ - update_id: 2, - message: { text: "during-drain" }, - }), + expect(handleUpdate).toHaveBeenCalledWith(duringDrainUpdate), ); await waitForTelegramTestState(async () => expect(await pendingUpdateIds(tempDir, "all")).toEqual([]), @@ -1851,9 +1847,10 @@ describe("TelegramPollingSession", () => { await withTempSpool(async (tempDir) => { const abort = new AbortController(); const handleUpdate = vi.fn(async () => undefined); + const update = directUpdate(42, 123, "pre-upgrade pending"); await writeTelegramSpooledUpdate({ spoolDir: tempDir, - update: { update_id: 42, message: { text: "pre-upgrade pending" } }, + update, }); const { createWorker, runPromise } = startIsolatedIngressSession({ @@ -1884,10 +1881,7 @@ describe("TelegramPollingSession", () => { lastUpdateId: null, persistenceFloorUpdateId: 42, }); - expect(handleUpdate).toHaveBeenCalledWith({ - update_id: 42, - message: { text: "pre-upgrade pending" }, - }); + expect(handleUpdate).toHaveBeenCalledWith(update); }); }); diff --git a/extensions/telegram/src/progress-draft-preview.test.ts b/extensions/telegram/src/progress-draft-preview.test.ts index e8b7c458a378..6457c8879408 100644 --- a/extensions/telegram/src/progress-draft-preview.test.ts +++ b/extensions/telegram/src/progress-draft-preview.test.ts @@ -5,13 +5,16 @@ import { describe, expect, it } from "vitest"; import { renderTelegramProgressDraftPreview } from "./progress-draft-preview.js"; function renderToolLine(name: string) { - const line = buildChannelProgressDraftLine({ - event: "tool", - toolCallId: "call-1", - name, - phase: "start", - args: { command: "echo alpha", description: "print text" }, - }); + const line = buildChannelProgressDraftLine( + { + event: "tool", + toolCallId: "call-1", + name, + phase: "start", + args: { command: "echo alpha", description: "print text" }, + }, + { commandText: "raw" }, + ); if (!line) { throw new Error(`expected a progress line for ${name}`); } diff --git a/extensions/telegram/src/webhook.test.ts b/extensions/telegram/src/webhook.test.ts index 165389baa936..20188bae6949 100644 --- a/extensions/telegram/src/webhook.test.ts +++ b/extensions/telegram/src/webhook.test.ts @@ -191,6 +191,26 @@ function requireWebhookSpoolDir(): string { return webhookSpoolDir; } +function telegramTextUpdate( + updateId: number, + text: string, + options: { chatId?: number; messageThreadId?: number } = {}, +) { + const chatId = options.chatId ?? 1234; + return { + update_id: updateId, + message: { + message_id: updateId, + date: 1_700_000_000 + updateId, + chat: { id: chatId, type: chatId < 0 ? ("supergroup" as const) : ("private" as const) }, + ...(options.messageThreadId === undefined + ? {} + : { message_thread_id: options.messageThreadId }), + text, + }, + }; +} + function createTelegramPrivateTopicCallback(updateId: number) { return { id: `callback-${updateId}`, @@ -486,16 +506,13 @@ async function postWebhookPayloadWithChunkPlan(params: { function createNearLimitTelegramPayload(): { payload: string; sizeBytes: number } { const maxBytes = 1_024 * 1_024; const targetBytes = maxBytes - 4_096; - const shell = { update_id: 77_777, message: { text: "" } }; + const shell = telegramTextUpdate(77_777, ""); const shellSize = Buffer.byteLength(JSON.stringify(shell), "utf-8"); const textLength = Math.max(1, targetBytes - shellSize); const pattern = "the quick brown fox jumps over the lazy dog "; const repeats = Math.ceil(textLength / pattern.length); const text = pattern.repeat(repeats).slice(0, textLength); - const payload = JSON.stringify({ - update_id: 77_777, - message: { text }, - }); + const payload = JSON.stringify(telegramTextUpdate(77_777, text)); return { payload, sizeBytes: Buffer.byteLength(payload, "utf-8") }; } @@ -1044,7 +1061,7 @@ describe("startTelegramWebhook", () => { ); expect(botParams.accountId).toBe("opie"); expect(requireRecord(botParams.config, "telegram config").bindings).toEqual([]); - const payload = JSON.stringify({ update_id: 1, message: { text: "hello" } }); + const payload = JSON.stringify(telegramTextUpdate(1, "hello")); const response = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), payload, @@ -1061,8 +1078,9 @@ describe("startTelegramWebhook", () => { let finishWork: (() => void) | undefined; let workStarted = false; let workFinished = false; - handleUpdateSpy.mockImplementationOnce(async (update: unknown) => { - expect(update).toEqual({ update_id: 2, message: { text: "slow" } }); + const update = telegramTextUpdate(2, "slow"); + handleUpdateSpy.mockImplementationOnce(async (receivedUpdate: unknown) => { + expect(receivedUpdate).toEqual(update); workStarted = true; await new Promise((resolve) => { finishWork = resolve; @@ -1078,7 +1096,7 @@ describe("startTelegramWebhook", () => { async ({ port }) => { const response = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 2, message: { text: "slow" } }), + payload: JSON.stringify(update), secret: TELEGRAM_SECRET, timeoutMs: 1_000, }); @@ -1115,7 +1133,7 @@ describe("startTelegramWebhook", () => { try { const response = await postWebhookJson({ url: webhookUrl(getServerPort(started.server), TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 3, message: { text: "stuck" } }), + payload: JSON.stringify(telegramTextUpdate(3, "stuck")), secret: TELEGRAM_SECRET, }); expect(response.status).toBe(200); @@ -1195,7 +1213,7 @@ describe("startTelegramWebhook", () => { let responseSettled = false; const responseTask = postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 4, message: { text: "commit gate" } }), + payload: JSON.stringify(telegramTextUpdate(4, "commit gate")), secret: TELEGRAM_SECRET, }).then((response) => { responseSettled = true; @@ -1229,7 +1247,7 @@ describe("startTelegramWebhook", () => { throw new Error("agent turn failed"); } }); - const payload = JSON.stringify({ update_id: 3, message: { text: "boom" } }); + const payload = JSON.stringify(telegramTextUpdate(3, "boom")); try { await withStartedWebhook( @@ -1295,7 +1313,7 @@ describe("startTelegramWebhook", () => { } = {}; await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), - update: { update_id: 39, message: { chat: { id: 123 }, text: "stalled" } }, + update: telegramTextUpdate(39, "stalled", { chatId: 123 }), }); handleUpdateSpy.mockImplementationOnce(async () => { active.dispatchStartedAt = Date.now(); @@ -1337,8 +1355,8 @@ describe("startTelegramWebhook", () => { try { let finishFirstUpdate: (() => void) | undefined; const seenUpdateIds: number[] = []; - const firstUpdate = { update_id: 40, message: { chat: { id: 123 }, text: "slow" } }; - const secondUpdate = { update_id: 41, message: { chat: { id: 123 }, text: "blocked" } }; + const firstUpdate = telegramTextUpdate(40, "slow", { chatId: 123 }); + const secondUpdate = telegramTextUpdate(41, "blocked", { chatId: 123 }); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update: firstUpdate, @@ -1384,7 +1402,7 @@ describe("startTelegramWebhook", () => { it("holds buffered timeout settlement behind durable webhook adoption", async () => { vi.useFakeTimers({ toFake: ["Date", "setTimeout", "clearTimeout"] }); try { - const update = { update_id: 42, message: { chat: { id: 123 }, text: "held adoption" } }; + const update = telegramTextUpdate(42, "held adoption", { chatId: 123 }); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update, @@ -1435,7 +1453,7 @@ describe("startTelegramWebhook", () => { }); it("drains spooled webhook updates left by a previous process on startup", async () => { - const update = { update_id: 30, message: { text: "leftover" } }; + const update = telegramTextUpdate(30, "leftover"); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update, @@ -2185,8 +2203,8 @@ describe("startTelegramWebhook", () => { }, }, } as TelegramRuntime); - const firstUpdate = { update_id: 50, message: { chat: { id: 123 }, text: "first" } }; - const secondUpdate = { update_id: 51, message: { chat: { id: 123 }, text: "second" } }; + const firstUpdate = telegramTextUpdate(50, "first", { chatId: 123 }); + const secondUpdate = telegramTextUpdate(51, "second", { chatId: 123 }); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update: firstUpdate, @@ -2264,7 +2282,7 @@ describe("startTelegramWebhook", () => { } as unknown as TelegramRuntime); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), - update: { update_id: 52, message: { chat: { id: 123 }, text: "stop retry" } }, + update: telegramTextUpdate(52, "stop retry", { chatId: 123 }), }); const runtimeLog = vi.fn(); const started = await startTelegramWebhook({ @@ -2294,7 +2312,7 @@ describe("startTelegramWebhook", () => { try { vi.setSystemTime(10_000_000); const runtimeLog = vi.fn(); - const update = { update_id: 31, message: { text: "young poison" } }; + const update = telegramTextUpdate(31, "young poison"); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update, @@ -2334,7 +2352,7 @@ describe("startTelegramWebhook", () => { try { vi.setSystemTime(10_000_000); const runtimeLog = vi.fn(); - const update = { update_id: 32, message: { text: "old poison" } }; + const update = telegramTextUpdate(32, "old poison"); await writeTelegramSpooledUpdate({ spoolDir: requireWebhookSpoolDir(), update, @@ -2426,7 +2444,7 @@ describe("startTelegramWebhook", () => { for (let i = 0; i < TELEGRAM_WEBHOOK_RATE_LIMIT_BURST; i += 1) { const response = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: i, message: { text: `guess ${i}` } }), + payload: JSON.stringify(telegramTextUpdate(i, `guess ${i}`)), secret: `wrong-secret-${String(i).padStart(3, "0")}`, }); @@ -2446,7 +2464,7 @@ describe("startTelegramWebhook", () => { const validResponse = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 999, message: { text: "hello" } }), + payload: JSON.stringify(telegramTextUpdate(999, "hello")), secret: TELEGRAM_SECRET, }); expect(validResponse.status).toBe(200); @@ -2468,7 +2486,7 @@ describe("startTelegramWebhook", () => { for (let i = 0; i < TELEGRAM_WEBHOOK_RATE_LIMIT_BURST; i += 1) { const response = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 10_000 + i, message: { text: `valid ${i}` } }), + payload: JSON.stringify(telegramTextUpdate(10_000 + i, `valid ${i}`)), secret: TELEGRAM_SECRET, }); expect(response.status).toBe(200); @@ -2501,7 +2519,7 @@ describe("startTelegramWebhook", () => { "x-forwarded-for": "198.51.100.10", "x-telegram-bot-api-secret-token": `wrong-secret-${String(i).padStart(3, "0")}`, }, - body: JSON.stringify({ update_id: i, message: { text: `guess ${i}` } }), + body: JSON.stringify(telegramTextUpdate(i, `guess ${i}`)), }, 5_000, ); @@ -2520,7 +2538,7 @@ describe("startTelegramWebhook", () => { "x-forwarded-for": "203.0.113.20", "x-telegram-bot-api-secret-token": TELEGRAM_SECRET, }, - body: JSON.stringify({ update_id: 201, message: { text: "hello" } }), + body: JSON.stringify(telegramTextUpdate(201, "hello")), }, 5_000, ); @@ -2559,7 +2577,7 @@ describe("startTelegramWebhook", () => { for (let i = 0; i < TELEGRAM_WEBHOOK_RATE_LIMIT_BURST; i += 1) { const response = await postWebhookJson({ url: webhookUrl(firstPort, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: i, message: { text: `guess ${i}` } }), + payload: JSON.stringify(telegramTextUpdate(i, `guess ${i}`)), secret: `wrong-secret-${String(i).padStart(3, "0")}`, }); if (response.status === 429) { @@ -2569,7 +2587,7 @@ describe("startTelegramWebhook", () => { const secondResponse = await postWebhookJson({ url: webhookUrl(secondPort, TELEGRAM_WEBHOOK_PATH), - payload: JSON.stringify({ update_id: 301, message: { text: "hello" } }), + payload: JSON.stringify(telegramTextUpdate(301, "hello")), secret: TELEGRAM_SECRET, }); @@ -2628,7 +2646,7 @@ describe("startTelegramWebhook", () => { path: TELEGRAM_WEBHOOK_PATH, }, async ({ port }) => { - const payload = JSON.stringify({ update_id: 1, message: { text: "hello" } }); + const payload = JSON.stringify(telegramTextUpdate(1, "hello")); const res = await postWebhookJson({ url: webhookUrl(port, TELEGRAM_WEBHOOK_PATH), payload, @@ -2668,23 +2686,8 @@ describe("startTelegramWebhook", () => { }, async ({ port }) => { const url = webhookUrl(port, TELEGRAM_WEBHOOK_PATH); - const firstUpdate = { - update_id: 100, - message: { - chat: { id: 1234, type: "private" }, - message_id: 1, - text: "first", - }, - }; - const secondUpdate = { - update_id: 101, - message: { - chat: { id: 1234, type: "private" }, - message_id: 2, - message_thread_id: 42, - text: "second", - }, - }; + const firstUpdate = telegramTextUpdate(100, "first"); + const secondUpdate = telegramTextUpdate(101, "second", { messageThreadId: 42 }); try { const firstResponse = await postWebhookJson({ @@ -2733,8 +2736,8 @@ describe("startTelegramWebhook", () => { }, async ({ port }) => { const payloads = [ - JSON.stringify({ update_id: 1, message: { text: "first" } }), - JSON.stringify({ update_id: 2, message: { text: "second" } }), + JSON.stringify(telegramTextUpdate(1, "first")), + JSON.stringify(telegramTextUpdate(2, "second")), ]; for (const payload of payloads) { @@ -2768,8 +2771,8 @@ describe("startTelegramWebhook", () => { path: TELEGRAM_WEBHOOK_PATH, }, async ({ port }) => { - const firstPayload = JSON.stringify({ update_id: 100, message: { text: "first" } }); - const secondPayload = JSON.stringify({ update_id: 101, message: { text: "second" } }); + const firstPayload = JSON.stringify(telegramTextUpdate(100, "first")); + const secondPayload = JSON.stringify(telegramTextUpdate(101, "second")); const firstResponse = await postWebhookPayloadWithChunkPlan({ port, path: TELEGRAM_WEBHOOK_PATH, diff --git a/extensions/tencent/package.json b/extensions/tencent/package.json index 483449c850f1..823e5ad8dd72 100644 --- a/extensions/tencent/package.json +++ b/extensions/tencent/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tencent-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Tencent Cloud provider plugin (TokenHub + Token Plan)", "type": "module", "devDependencies": { @@ -18,10 +18,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/tlon/package.json b/extensions/tlon/package.json index ba8cce76127e..e269f3bf3dbe 100644 --- a/extensions/tlon/package.json +++ b/extensions/tlon/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tlon", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Tlon/Urbit channel plugin for chat workflows.", "repository": { "type": "git", @@ -19,7 +19,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -120,10 +120,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "bundleRuntimeDependencies": false, diff --git a/extensions/together/package.json b/extensions/together/package.json index 86428149c5b9..2409b3eaf0f6 100644 --- a/extensions/together/package.json +++ b/extensions/together/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/together-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw Together provider plugin", "type": "module", diff --git a/extensions/tokenjuice/package.json b/extensions/tokenjuice/package.json index 13c5671a2024..92160226e2bd 100644 --- a/extensions/tokenjuice/package.json +++ b/extensions/tokenjuice/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tokenjuice", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw tokenjuice exec output compaction plugin", "repository": { "type": "git", @@ -11,7 +11,7 @@ "tokenjuice": "0.8.1" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.5.28" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/tts-local-cli/package.json b/extensions/tts-local-cli/package.json index 0d7cb815af4f..8b4818d238a3 100644 --- a/extensions/tts-local-cli/package.json +++ b/extensions/tts-local-cli/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/tts-local-cli", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw local CLI TTS plugin", "type": "module", diff --git a/extensions/twitch/package.json b/extensions/twitch/package.json index 92f4293bbfd7..f6bc7f29993d 100644 --- a/extensions/twitch/package.json +++ b/extensions/twitch/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/twitch", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Twitch channel plugin for chat and moderation workflows.", "repository": { "type": "git", @@ -30,10 +30,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "channel": { "id": "twitch", diff --git a/extensions/vault/package.json b/extensions/vault/package.json index d17b3883e625..b18d1d7da058 100644 --- a/extensions/vault/package.json +++ b/extensions/vault/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vault", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "HashiCorp Vault SecretRef provider integration for OpenClaw", "type": "module", diff --git a/extensions/venice/package.json b/extensions/venice/package.json index 2d7b17d5f709..2b8f62c835db 100644 --- a/extensions/venice/package.json +++ b/extensions/venice/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/venice-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Venice provider plugin", "type": "module", "devDependencies": { @@ -17,10 +17,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/vercel-ai-gateway/package.json b/extensions/vercel-ai-gateway/package.json index 5e83420fd399..d640bbd94f6e 100644 --- a/extensions/vercel-ai-gateway/package.json +++ b/extensions/vercel-ai-gateway/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vercel-ai-gateway-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Vercel AI Gateway provider plugin", "type": "module", "devDependencies": { @@ -17,10 +17,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/video-generation-core/package.json b/extensions/video-generation-core/package.json index e9138540cc1e..48dcf4152b9e 100644 --- a/extensions/video-generation-core/package.json +++ b/extensions/video-generation-core/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/video-generation-core", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw video generation runtime package", "type": "module", diff --git a/extensions/vllm/package.json b/extensions/vllm/package.json index f731bfe0fd6d..8da4b7adebe0 100644 --- a/extensions/vllm/package.json +++ b/extensions/vllm/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vllm-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw vLLM provider plugin", "type": "module", diff --git a/extensions/voice-call/package.json b/extensions/voice-call/package.json index c694e03a115d..eacecb438d6d 100644 --- a/extensions/voice-call/package.json +++ b/extensions/voice-call/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/voice-call", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw voice-call plugin for Twilio, Telnyx, and Plivo phone calls.", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -34,10 +34,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/volcengine/package.json b/extensions/volcengine/package.json index c0f5ff588beb..fab5911b981b 100644 --- a/extensions/volcengine/package.json +++ b/extensions/volcengine/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/volcengine-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Volcengine provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/voyage/package.json b/extensions/voyage/package.json index 9fe15dd21d49..1a225153ab63 100644 --- a/extensions/voyage/package.json +++ b/extensions/voyage/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/voyage-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Voyage embedding provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/vydra/package.json b/extensions/vydra/package.json index 877c980dba62..a2fe18318528 100644 --- a/extensions/vydra/package.json +++ b/extensions/vydra/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/vydra-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Vydra media provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/web-readability/package.json b/extensions/web-readability/package.json index b8a06c14ce80..d96a128879fd 100644 --- a/extensions/web-readability/package.json +++ b/extensions/web-readability/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/web-readability-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw local Readability web extraction plugin", "type": "module", diff --git a/extensions/webhooks/package.json b/extensions/webhooks/package.json index 1843cef75373..080ff00c31d9 100644 --- a/extensions/webhooks/package.json +++ b/extensions/webhooks/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/webhooks", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw webhook bridge plugin", "type": "module", diff --git a/extensions/whatsapp/package.json b/extensions/whatsapp/package.json index 3a443ed765cf..5fda74965702 100644 --- a/extensions/whatsapp/package.json +++ b/extensions/whatsapp/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/whatsapp", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw WhatsApp channel plugin for WhatsApp Web chats.", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -69,10 +69,10 @@ "minHostVersion": ">=2026.4.25" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/workboard/package.json b/extensions/workboard/package.json index a704ad50ccb7..e1e7c8644630 100644 --- a/extensions/workboard/package.json +++ b/extensions/workboard/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/workboard", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw dashboard workboard plugin", "type": "module", @@ -13,7 +13,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { diff --git a/extensions/xai/package.json b/extensions/xai/package.json index 03b9aa68efa2..e3d9caa0cfac 100644 --- a/extensions/xai/package.json +++ b/extensions/xai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/xai-plugin", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "private": true, "description": "OpenClaw xAI plugin", "type": "module", diff --git a/extensions/xiaomi/package.json b/extensions/xiaomi/package.json index 8d622a4bfe7b..0e56fce8f94a 100644 --- a/extensions/xiaomi/package.json +++ b/extensions/xiaomi/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/xiaomi-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Xiaomi provider plugin.", "repository": { "type": "git", @@ -21,10 +21,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/zai/package.json b/extensions/zai/package.json index 9bdf28cd50a6..8b1c67313618 100644 --- a/extensions/zai/package.json +++ b/extensions/zai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zai-provider", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Z.AI provider plugin", "type": "module", "devDependencies": { @@ -17,10 +17,10 @@ "minHostVersion": ">=2026.6.9" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/zalo/package.json b/extensions/zalo/package.json index 46b69662a9e2..c6c10656dca8 100644 --- a/extensions/zalo/package.json +++ b/extensions/zalo/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zalo", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Zalo channel plugin for bot and webhook chats.", "repository": { "type": "git", @@ -12,7 +12,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -85,10 +85,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/zalouser/package.json b/extensions/zalouser/package.json index 78aecfeb31ff..b4ecbd715c52 100644 --- a/extensions/zalouser/package.json +++ b/extensions/zalouser/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zalouser", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Zalo Personal Account plugin via native zca-js integration.", "repository": { "type": "git", @@ -17,7 +17,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -65,10 +65,10 @@ "minHostVersion": ">=2026.4.10" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1" + "openclawVersion": "2026.8.1-beta.2" }, "release": { "publishToClawHub": true, diff --git a/extensions/zoom-meetings/package.json b/extensions/zoom-meetings/package.json index 48b2e4a40049..3d1e4fdbda08 100644 --- a/extensions/zoom-meetings/package.json +++ b/extensions/zoom-meetings/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/zoom-meetings", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Zoom browser meeting participant plugin.", "repository": { "type": "git", @@ -15,7 +15,7 @@ "openclaw": "workspace:*" }, "peerDependencies": { - "openclaw": ">=2026.8.1" + "openclaw": ">=2026.8.1-beta.2" }, "peerDependenciesMeta": { "openclaw": { @@ -33,10 +33,10 @@ "minHostVersion": ">=2026.7.2" }, "compat": { - "pluginApi": ">=2026.8.1" + "pluginApi": ">=2026.8.1-beta.2" }, "build": { - "openclawVersion": "2026.8.1", + "openclawVersion": "2026.8.1-beta.2", "bundledDist": false }, "release": { diff --git a/extensions/zoom-meetings/src/node-invoke-policy.test.ts b/extensions/zoom-meetings/src/node-invoke-policy.test.ts index ff9b06df9b22..79d754540741 100644 --- a/extensions/zoom-meetings/src/node-invoke-policy.test.ts +++ b/extensions/zoom-meetings/src/node-invoke-policy.test.ts @@ -32,6 +32,9 @@ describe("Zoom meetings node invoke policy", () => { expect(invokeNode).toHaveBeenCalledWith({ params: { action: "setup", + audioBackend: "auto", + audioBufferBytes: 4_096, + audioFormat: "pcm16-24khz", audioInputCommand: ["trusted-input", "--read"], audioOutputCommand: ["trusted-output", "--write"], bargeInInputCommand: ["trusted-barge-in"], diff --git a/package.json b/package.json index f9e71cf2aadb..289749ed975a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openclaw", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "openclaw": { "schemaVersions": { "state": 7, diff --git a/packages/ai/package.json b/packages/ai/package.json index 1af4b08ceaa3..568b403fbf62 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/ai", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Reusable model provider adapters and streaming runtime from OpenClaw", "keywords": [ "ai", diff --git a/packages/gateway-client/package.json b/packages/gateway-client/package.json index 83c951be3db4..1680641f4b8a 100644 --- a/packages/gateway-client/package.json +++ b/packages/gateway-client/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/gateway-client", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Reference WebSocket client for the OpenClaw Gateway protocol", "keywords": [ "client", diff --git a/packages/gateway-protocol/package.json b/packages/gateway-protocol/package.json index 679ac1709446..08a9660d9eff 100644 --- a/packages/gateway-protocol/package.json +++ b/packages/gateway-protocol/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/gateway-protocol", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Typed schemas and runtime validators for the OpenClaw Gateway WebSocket protocol", "keywords": [ "gateway", diff --git a/qa/scenarios/channels/channel-canary.yaml b/qa/scenarios/channels/channel-canary.yaml index 56bb62870d65..417e3f3dac23 100644 --- a/qa/scenarios/channels/channel-canary.yaml +++ b/qa/scenarios/channels/channel-canary.yaml @@ -24,6 +24,7 @@ scenario: channels: - qa-channel - telegram + - buzz summary: Run the shared channel canary through QA Channel, Crabline, or a live adapter. transportPolicy: requireGroupMention: true diff --git a/qa/scenarios/channels/matrix-room-tool-progress-mention-safety.yaml b/qa/scenarios/channels/matrix-room-tool-progress-mention-safety.yaml index 219fe5db1d6b..9d6dccfc7baf 100644 --- a/qa/scenarios/channels/matrix-room-tool-progress-mention-safety.yaml +++ b/qa/scenarios/channels/matrix-room-tool-progress-mention-safety.yaml @@ -12,7 +12,10 @@ scenario: retryCount: 0 config: matrixConfigOverrides: - streaming: partial + streaming: + mode: partial + progress: + commandText: raw toolProfile: coding flow: diff --git a/scripts/lib/official-external-channel-catalog.json b/scripts/lib/official-external-channel-catalog.json index ce17a3eec81e..c9f66907777e 100644 --- a/scripts/lib/official-external-channel-catalog.json +++ b/scripts/lib/official-external-channel-catalog.json @@ -2,7 +2,7 @@ "entries": [ { "name": "@openclaw/buzz", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Connect OpenClaw agents to Buzz rooms", "source": "official", "kind": "channel", @@ -316,7 +316,7 @@ }, { "name": "@openclaw/clickclack", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw ClickClack channel plugin", "source": "official", "kind": "channel", @@ -646,7 +646,7 @@ }, { "name": "@openclaw/discord", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.", "source": "official", "kind": "channel", @@ -726,7 +726,7 @@ }, { "name": "@openclaw/feishu", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Feishu/Lark channel plugin for chats and workplace tools (community maintained by @m1heng).", "source": "official", "kind": "channel", @@ -784,7 +784,7 @@ }, { "name": "@openclaw/googlechat", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Google Chat channel plugin for spaces and direct messages.", "source": "official", "kind": "channel", @@ -902,7 +902,7 @@ }, { "name": "@openclaw/imessage", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac", "source": "official", "kind": "channel", @@ -975,7 +975,7 @@ }, { "name": "@openclaw/irc", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw IRC channel plugin", "source": "official", "kind": "channel", @@ -1093,7 +1093,7 @@ }, { "name": "@openclaw/line", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw LINE channel plugin for LINE Bot API chats.", "source": "official", "kind": "channel", @@ -1188,7 +1188,7 @@ }, { "name": "@openclaw/matrix", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Matrix channel plugin for rooms and direct messages.", "source": "official", "kind": "channel", @@ -1330,7 +1330,7 @@ }, { "name": "@openclaw/mattermost", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Mattermost channel plugin", "source": "official", "kind": "channel", @@ -1405,7 +1405,7 @@ }, { "name": "@openclaw/msteams", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Microsoft Teams channel plugin for bot conversations.", "source": "official", "kind": "channel", @@ -1449,7 +1449,7 @@ }, { "name": "@openclaw/nextcloud-talk", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Nextcloud Talk channel plugin for conversations.", "source": "official", "kind": "channel", @@ -1561,7 +1561,7 @@ }, { "name": "@openclaw/nostr", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Nostr channel plugin for NIP-04 encrypted direct messages.", "source": "official", "kind": "channel", @@ -1864,7 +1864,7 @@ }, { "name": "@openclaw/raft", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Raft channel plugin for Raft CLI wake bridges.", "source": "official", "kind": "channel", @@ -1950,7 +1950,7 @@ }, { "name": "@openclaw/signal", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Signal channel plugin", "source": "official", "kind": "channel", @@ -2036,7 +2036,7 @@ }, { "name": "@openclaw/slack", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Slack channel plugin for channels, DMs, commands, and app events.", "source": "official", "kind": "channel", @@ -2169,7 +2169,7 @@ }, { "name": "@openclaw/sms", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw SMS/MMS channel plugin for Twilio messages.", "source": "official", "kind": "channel", @@ -2294,7 +2294,7 @@ }, { "name": "@openclaw/synology-chat", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "Synology Chat channel plugin for OpenClaw channels and direct messages.", "source": "official", "kind": "channel", @@ -2369,7 +2369,7 @@ }, { "name": "@openclaw/tlon", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Tlon/Urbit channel plugin for chat workflows.", "source": "official", "kind": "channel", @@ -2463,7 +2463,7 @@ }, { "name": "@openclaw/twitch", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Twitch channel plugin for chat and moderation workflows.", "source": "official", "kind": "channel", @@ -2544,7 +2544,7 @@ }, { "name": "@openclaw/whatsapp", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw WhatsApp channel plugin for WhatsApp Web chats.", "source": "official", "kind": "channel", @@ -2643,7 +2643,7 @@ }, { "name": "@openclaw/zalo", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Zalo channel plugin for bot and webhook chats.", "source": "official", "kind": "channel", @@ -2711,7 +2711,7 @@ }, { "name": "@openclaw/zalouser", - "version": "2026.8.1", + "version": "2026.8.1-beta.2", "description": "OpenClaw Zalo Personal Account plugin via native zca-js integration.", "source": "official", "kind": "channel", diff --git a/scripts/lib/openclaw-test-state.mts b/scripts/lib/openclaw-test-state.mts index a474407633f7..601538f9974a 100644 --- a/scripts/lib/openclaw-test-state.mts +++ b/scripts/lib/openclaw-test-state.mts @@ -31,9 +31,9 @@ type TestStateOptions = { function usage() { return `Usage: - node --import tsx scripts/lib/openclaw-test-state.mts -- create [--label ] [--scenario ] [--env-file ] [--json] - node --import tsx scripts/lib/openclaw-test-state.mts shell [--label ] [--scenario ] - node --import tsx scripts/lib/openclaw-test-state.mts shell-function + node scripts/lib/openclaw-test-state.mts -- create [--label ] [--scenario ] [--env-file ] [--json] + node scripts/lib/openclaw-test-state.mts shell [--label ] [--scenario ] + node scripts/lib/openclaw-test-state.mts shell-function Scenarios: ${[...SCENARIOS].join(", ")} `; diff --git a/src/cli/update-cli.test.ts b/src/cli/update-cli.test.ts index 1a73ecd69c85..52e7065051f2 100644 --- a/src/cli/update-cli.test.ts +++ b/src/cli/update-cli.test.ts @@ -930,7 +930,7 @@ describe("update-cli", () => { readPackageVersion.mockResolvedValue("2.0.0"); mockPackageInstallStatus(tempDir); - primeNpmChannelTag("latest", "0.0.1"); + primeNpmChannelTag(isBetaTag(VERSION) ? "beta" : "latest", "0.0.1"); vi.mocked(runGatewayUpdate).mockResolvedValue({ status: "ok", mode: "npm", @@ -5418,7 +5418,9 @@ describe("update-cli", () => { expect(postCoreSpawn?.[1]).toEqual([entryPath, "update", "--no-restart", "--yes"]); expect(postCoreSpawn?.[2].stdio).toBe("inherit"); expect(postCoreSpawn?.[2].env?.OPENCLAW_UPDATE_POST_CORE).toBe("1"); - expect(postCoreSpawn?.[2].env?.OPENCLAW_UPDATE_POST_CORE_CHANNEL).toBe("stable"); + expect(postCoreSpawn?.[2].env?.OPENCLAW_UPDATE_POST_CORE_CHANNEL).toBe( + isBetaTag(VERSION) ? "beta" : "stable", + ); expect(updateNpmInstalledPlugins).not.toHaveBeenCalled(); expect(getLogOutput()).not.toContain("already-current"); }); diff --git a/src/infra/approval-request-account-binding.ts b/src/infra/approval-request-account-binding.ts index d905a8692696..56df9019508f 100644 --- a/src/infra/approval-request-account-binding.ts +++ b/src/infra/approval-request-account-binding.ts @@ -261,6 +261,9 @@ export function doesApprovalRequestSelectChannelAccount(params: { if (boundAccountId || forwardAccountIds.length > 0) { return false; } + // Native approval clients are intentional out-of-band surfaces: a sole eligible account may + // own an unbound request from another source channel. Configured approvers plus Gateway account + // custody are the authorization boundary. const eligibleAccountIds = params.eligibleAccountIds .map(normalizeOptionalAccountId) .filter((candidate): candidate is string => Boolean(candidate)); diff --git a/src/infra/exec-approval-session-target.test.ts b/src/infra/exec-approval-session-target.test.ts index 39cd4308e13b..4f61fc789718 100644 --- a/src/infra/exec-approval-session-target.test.ts +++ b/src/infra/exec-approval-session-target.test.ts @@ -67,6 +67,23 @@ const baseRequest: ExecApprovalRequest = { }; describe("native approval account selection", () => { + it("allows the sole eligible out-of-band approval account across channels", () => { + const discordRequest = buildRequest({ + turnSourceChannel: "discord", + turnSourceAccountId: "default", + }); + expect( + doesApprovalRequestSelectChannelAccount({ + cfg: {}, + request: discordRequest, + channel: "slack", + accountId: "default", + defaultAccountId: "default", + eligibleAccountIds: ["default"], + }), + ).toBe(true); + }); + it("selects only the sole eligible account when no owner is recorded", () => { expect( doesApprovalRequestSelectChannelAccount({ diff --git a/src/meeting-bot/configured-node-host.test.ts b/src/meeting-bot/configured-node-host.test.ts index 7cc758ac912b..0fe5d4769b5b 100644 --- a/src/meeting-bot/configured-node-host.test.ts +++ b/src/meeting-bot/configured-node-host.test.ts @@ -11,7 +11,12 @@ vi.mock("node:child_process", async (importOriginal) => ({ import { createMeetingConfiguredNodeHost } from "./configured-node-host.js"; -function createHost() { +function createHost( + commands: { + input?: string[]; + output?: string[]; + } = {}, +) { return createMeetingConfiguredNodeHost({ agentMode: "agent", bridgeIdPrefix: "test-node-", @@ -28,8 +33,8 @@ function createHost() { bufferBytes: 4_096, format: "pcm16-24khz", }, - defaultAudioInputCommand: ["legacy-capture"], - defaultAudioOutputCommand: ["legacy-playback"], + defaultAudioInputCommand: commands.input ?? ["legacy-capture"], + defaultAudioOutputCommand: commands.output ?? ["legacy-playback"], displayName: "Test meeting", meetingLabel: "Test meeting", normalizeMeetingKey: (url) => url, @@ -147,4 +152,22 @@ describe("configured meeting node host", () => { ); } }); + + it("probes one executable once when every configured audio command shares it", async () => { + vi.spyOn(process, "platform", "get").mockReturnValue("darwin"); + childProcessMocks.spawnSync.mockImplementation((command: string) => ({ + status: 0, + stdout: command.endsWith("system_profiler") ? "BlackHole 2ch" : "", + stderr: "", + })); + + await createHost({ input: ["sox", "capture"], output: ["sox", "play"] })( + JSON.stringify({ action: "setup", bargeInInputCommand: ["sox", "barge"] }), + ); + + const soxProbes = childProcessMocks.spawnSync.mock.calls.filter( + (call) => Array.isArray(call[1]) && call[1].at(-1) === "sox", + ); + expect(soxProbes).toHaveLength(1); + }); }); diff --git a/src/plugins/npm-install-security-scan.release.test.ts b/src/plugins/npm-install-security-scan.release.test.ts index 0b8f80fcf73f..d8b9419f9e85 100644 --- a/src/plugins/npm-install-security-scan.release.test.ts +++ b/src/plugins/npm-install-security-scan.release.test.ts @@ -32,7 +32,6 @@ const REQUIRED_REVIEWED_PUBLISHABLE_CRITICAL_FINDING_COUNTS = new Map