Compare commits

...

20 Commits

Author SHA1 Message Date
Tideclaw
61ce213a31 fix: stabilize alpha release preflight 2026-06-09 15:55:29 +00:00
Tideclaw
6ab9ac76d1 test: stabilize imessage monitor release shard 2026-06-09 15:34:27 +00:00
Tideclaw
acc68f56c7 chore: prepare alpha 2026.6.9-alpha.2 2026-06-09 15:16:47 +00:00
Tideclaw
b7364417ce test: stabilize release tooling tests on root hosts 2026-06-09 14:45:19 +00:00
Tideclaw
189efd8b42 fix: refresh alpha release generated metadata 2026-06-09 14:20:27 +00:00
Tideclaw
e94b9ffd4c test: keep task maintenance stale clocks deterministic 2026-06-09 14:16:19 +00:00
Tideclaw
ff8456e9a8 fix: stabilize alpha QA image run waits 2026-06-09 14:16:19 +00:00
Tideclaw
e6e57844be test: retry codex context-engine temp cleanup 2026-06-09 14:16:19 +00:00
Tideclaw
2ec07f7520 test: register matrix fixture for cross-agent acp spawn 2026-06-09 14:16:19 +00:00
Tideclaw
bb8c22ca0a fix: ignore docker post-exit zero stats 2026-06-09 14:16:19 +00:00
Tideclaw
7139a8c49a test: stabilize acp spawn channel fixtures 2026-06-09 14:16:19 +00:00
Tideclaw
a08c74dcf9 fix: tolerate legacy kitchen sink ui descriptor probes 2026-06-09 14:16:19 +00:00
Tideclaw
48c62c637d test: use sqlite session stores in release fixtures 2026-06-09 14:16:18 +00:00
Tideclaw
e69e83ea7d test: seed telegram approval stores through sdk 2026-06-09 14:16:18 +00:00
Tideclaw
8b6f0362ef test: seed remaining plugin stores through sdk 2026-06-09 14:16:18 +00:00
Tideclaw
32b6b1d2ae test: use valid slack session entries 2026-06-09 14:16:18 +00:00
Tideclaw
6af597f7a9 test: satisfy channel fixture lint 2026-06-09 14:16:18 +00:00
Tideclaw
3294fed4da fix(ui): localize cron command labels 2026-06-09 14:16:18 +00:00
Tideclaw
232c6b2b48 test: seed channel session stores through sdk 2026-06-09 14:16:18 +00:00
Tideclaw
3a62102e29 fix: allow current release package scan size 2026-06-09 14:16:18 +00:00
256 changed files with 1905 additions and 1701 deletions

View File

@@ -2,6 +2,12 @@
Docs: https://docs.openclaw.ai
## 2026.6.9-alpha.2
### Fixes
- Alpha/nightly release validation carries release-branch stabilization for package metadata, channel and plugin fixture isolation, Docker and QA waits, iMessage monitor retry tests, memory startup catch-up test coverage, and release prepack changelog packaging.
## 2026.6.5
### Highlights

View File

@@ -1,4 +1,4 @@
37b56008790612b8293930b6a29d74490e98daa90f954fca9d133fcc28645c4c config-baseline.json
904566ff00fbc14631ed3837e6fad9fee5b6357812d020d67d371b352906e82a config-baseline.json
75b64c2ea081369ba4306493313a8a4cd48b784145f92fed995e6b77a5df350d config-baseline.core.json
17d64c9799dfa239a49493413f1100bdd9237e9b67aaeae331a4604dbc227023 config-baseline.channel.json
f9d1f50bfa8403891e76cd99dc1357cdece4a71e8ae18a39b190c2a14e6f97b0 config-baseline.plugin.json
1d1cd6d624d7f4b8137b8a945c7734530aa31170983c3b216de27e6e10126034 config-baseline.channel.json
b0dec5acfe60557e728e5ad03cc36d19d2432d51f755656c97846afa7fbe374a config-baseline.plugin.json

View File

@@ -137,7 +137,7 @@ Each entry lists the package, distribution route, and description.
- **[mattermost](/plugins/reference/mattermost)** (`@openclaw/mattermost`) - included in OpenClaw. Adds the Mattermost channel surface for sending and receiving OpenClaw messages.
- **[memory-core](/plugins/reference/memory-core)** (`@openclaw/memory-core`) - included in OpenClaw. Adds file-backed memory search tools.
- **[memory-core](/plugins/reference/memory-core)** (`@openclaw/memory-core`) - included in OpenClaw. Adds agent-callable tools.
- **[memory-wiki](/plugins/reference/memory-wiki)** (`@openclaw/memory-wiki`) - included in OpenClaw. Persistent wiki compiler and Obsidian-friendly knowledge vault for OpenClaw.
@@ -267,10 +267,10 @@ Each entry lists the package, distribution route, and description.
- **[googlechat](/plugins/reference/googlechat)** (`@openclaw/googlechat`) - npm; ClawHub. OpenClaw Google Chat channel plugin for spaces and direct messages.
- **[llama-cpp](/plugins/reference/llama-cpp)** (`@openclaw/llama-cpp-provider`) - npm; ClawHub. OpenClaw llama.cpp embedding provider plugin.
- **[line](/plugins/reference/line)** (`@openclaw/line`) - npm; ClawHub. OpenClaw LINE channel plugin for LINE Bot API chats.
- **[llama-cpp](/plugins/reference/llama-cpp)** (`@openclaw/llama-cpp-provider`) - npm; ClawHub. Local GGUF embeddings through node-llama-cpp.
- **[lobster](/plugins/reference/lobster)** (`@openclaw/lobster`) - npm; ClawHub. Lobster workflow tool plugin for typed pipelines and resumable approvals.
- **[matrix](/plugins/reference/matrix)** (`@openclaw/matrix`) - ClawHub: `clawhub:@openclaw/matrix`; npm. OpenClaw Matrix channel plugin for rooms and direct messages.

View File

@@ -1,13 +1,13 @@
---
summary: "OpenClaw llama.cpp embedding provider plugin."
summary: "Local GGUF embeddings through node-llama-cpp."
read_when:
- You are installing, configuring, or auditing the llama-cpp plugin
title: "llama-cpp plugin"
title: "Llama Cpp plugin"
---
# llama-cpp plugin
# Llama Cpp plugin
OpenClaw llama.cpp embedding provider plugin.
Local GGUF embeddings through node-llama-cpp.
## Distribution
@@ -20,4 +20,4 @@ contracts: embeddingProviders
## Related docs
- [llama.cpp Provider](/plugins/llama-cpp)
- [llama-cpp](/plugins/llama-cpp)

View File

@@ -1,5 +1,5 @@
---
summary: "Adds file-backed memory search tools."
summary: "Adds agent-callable tools."
read_when:
- You are installing, configuring, or auditing the memory-core plugin
title: "Memory Core plugin"
@@ -7,7 +7,7 @@ title: "Memory Core plugin"
# Memory Core plugin
Adds file-backed memory search tools.
Adds agent-callable tools.
## Distribution

View File

@@ -1,5 +1,5 @@
---
summary: "Use Microsoft Foundry chat and MAI image deployments from OpenClaw."
summary: "Adds Microsoft Foundry model provider support to OpenClaw."
read_when:
- You are installing, configuring, or auditing the microsoft-foundry plugin
title: "Microsoft Foundry plugin"
@@ -7,9 +7,7 @@ title: "Microsoft Foundry plugin"
# Microsoft Foundry plugin
Use Microsoft Foundry deployments from OpenClaw with API-key auth or Microsoft
Entra ID through the Azure CLI. The plugin owns Microsoft Foundry model
discovery, runtime token refresh, and MAI image generation.
Adds Microsoft Foundry model provider support to OpenClaw.
## Distribution
@@ -18,7 +16,10 @@ discovery, runtime token refresh, and MAI image generation.
## Surface
- Model provider: `microsoft-foundry`
providers: microsoft-foundry; contracts: imageGenerationProviders
<!-- openclaw-plugin-reference:manual-start -->
- Image-generation provider: `microsoft-foundry`
## Requirements
@@ -105,3 +106,5 @@ MAI image constraints:
Foundry deployment through onboarding or add `models.providers.microsoft-foundry.baseUrl`.
- `supports MAI image deployments only`: the selected image model points at a
non-MAI deployment. Use a deployed MAI image model for `image_generate`.
<!-- openclaw-plugin-reference:manual-end -->

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/acpx",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/acpx",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@agentclientprotocol/claude-agent-acp": "0.39.0",
"@zed-industries/codex-acp": "0.15.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/acpx",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw ACP runtime backend with plugin-owned session and transport management.",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"staticAssets": [
{
"source": "./src/runtime-internals/mcp-proxy.mjs",

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@anthropic-ai/sdk": "0.100.1",
"@aws/bedrock-token-generator": "1.1.0"

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-mantle-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.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.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"bundledDist": false
},
"release": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@aws-sdk/client-bedrock": "3.1056.0",
"@aws-sdk/client-bedrock-runtime": "3.1056.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/amazon-bedrock-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.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.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"bundledDist": false
},
"release": {

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@anthropic-ai/vertex-sdk": "0.16.1"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/anthropic-vertex-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Anthropic Vertex provider plugin for Claude models on Google Vertex AI.",
"repository": {
"type": "git",
@@ -23,10 +23,10 @@
"minHostVersion": ">=2026.5.12-beta.1"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"bundledDist": false
},
"release": {

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/brave-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/brave-plugin",
"version": "2026.6.2"
"version": "2026.6.9-alpha.2"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/brave-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Brave Search provider plugin for web search.",
"repository": {
"type": "git",
@@ -21,10 +21,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/browser-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw browser tool plugin",
"type": "module",

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/canvas-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw Canvas plugin",
"type": "module",

View File

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

View File

@@ -15,6 +15,17 @@ function restoreEnvVar(name: string, value: string | undefined): void {
}
}
function readAuthorizationHeader(init?: { headers?: HeadersInit }): string {
const headers = init?.headers;
if (headers instanceof Headers) {
return headers.get("Authorization") ?? "";
}
if (Array.isArray(headers)) {
return headers.find(([key]) => key.toLowerCase() === "authorization")?.[1] ?? "";
}
return headers?.Authorization ?? headers?.authorization ?? "";
}
async function runChutesCatalog(params: { apiKey?: string; discoveryApiKey?: string }) {
const provider = await registerSingleProviderPlugin(plugin);
const result = await provider.catalog?.run({
@@ -101,8 +112,8 @@ describe("chutes implicit provider auth mode", () => {
const chutesCalls = fetchMock.mock.calls.filter(([url]) => String(url).includes("chutes.ai"));
expect(chutesCalls.length).toBeGreaterThan(0);
const request = chutesCalls[0]?.[1] as { headers?: Record<string, string> } | undefined;
expect(request?.headers?.Authorization).toBe("Bearer my-chutes-access-token");
const request = chutesCalls[0]?.[1] as { headers?: HeadersInit } | undefined;
expect(readAuthorizationHeader(request)).toBe("Bearer my-chutes-access-token");
});
});
});

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/clickclack",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw ClickClack channel plugin",
"type": "module",
@@ -18,7 +18,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex-supervisor",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw Codex app-server fleet supervision plugin.",
"type": "module",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/codex",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/codex",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@openai/codex": "0.137.0",
"typebox": "1.1.39",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/codex",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Codex app-server harness and model provider plugin with a Codex-managed GPT catalog.",
"repository": {
"type": "git",
@@ -26,10 +26,10 @@
"minHostVersion": ">=2026.5.1-beta.1"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -2,6 +2,7 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { setTimeout as delay } from "node:timers/promises";
import type { AgentMessage } from "openclaw/plugin-sdk/agent-core";
import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness";
import {
@@ -32,6 +33,30 @@ function resetCodexAppServerClientFactoryForTest(): void {
codexAppServerClientFactoryForTest = undefined;
}
function isTransientRemoveError(error: unknown): boolean {
const code =
error && typeof error === "object" && "code" in error
? String((error as { code?: unknown }).code)
: undefined;
return code === "ENOTEMPTY" || code === "EBUSY" || code === "EPERM";
}
async function removeTempDirForTest(dir: string): Promise<void> {
for (let attempt = 0; attempt < 5; attempt += 1) {
try {
await fs.rm(dir, { recursive: true, force: true });
return;
} catch (error) {
if (!isTransientRemoveError(error)) {
throw error;
}
await delay(20 * (attempt + 1));
}
}
await fs.rm(dir, { recursive: true, force: true });
}
function runCodexAppServerAttempt(
params: EmbeddedRunAttemptParams,
options: RunCodexAppServerAttemptOptions = {},
@@ -312,7 +337,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
afterEach(async () => {
resetCodexAppServerClientFactoryForTest();
vi.restoreAllMocks();
await fs.rm(tempDir, { recursive: true, force: true });
await removeTempDirForTest(tempDir);
});
it("bootstraps and assembles non-legacy context before the Codex turn starts", async () => {

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/copilot",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/copilot",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@github/copilot-sdk": "1.0.0-beta.9"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/copilot",
"version": "2026.6.2",
"version": "2026.6.9-alpha.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",
@@ -25,10 +25,10 @@
"minHostVersion": ">=2026.5.28"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"bundledDist": false
},
"release": {

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diagnostics-otel",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw diagnostics OpenTelemetry exporter for metrics and traces.",
"repository": {
"type": "git",
@@ -34,10 +34,10 @@
"minHostVersion": ">=2026.4.25"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diagnostics-prometheus",
"version": "2026.6.2"
"version": "2026.6.9-alpha.2"
}
}
}

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diffs-language-pack",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diffs-language-pack",
"version": "2026.6.2"
"version": "2026.6.9-alpha.2"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diffs-language-pack",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw diffs viewer syntax highlighting language pack",
"repository": {
"type": "git",
@@ -22,13 +22,13 @@
"minHostVersion": ">=2026.5.27"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"assetScripts": {
"build": "node ../../scripts/build-diffs-viewer-runtime.mjs full"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"staticAssets": [
{
"source": "./assets/viewer-runtime.js",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/diffs",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/diffs",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@pierre/diffs": "1.2.4",
"@pierre/theme": "1.0.3",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/diffs",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw read-only diff viewer plugin and file renderer for agents.",
"repository": {
"type": "git",
@@ -29,13 +29,13 @@
"minHostVersion": ">=2026.4.30"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"assetScripts": {
"build": "node ../../scripts/build-diffs-viewer-runtime.mjs curated"
},
"build": {
"openclawVersion": "2026.6.2",
"openclawVersion": "2026.6.9-alpha.2",
"staticAssets": [
{
"source": "./assets/viewer-runtime.js",

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/discord",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/discord",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@discordjs/voice": "0.19.2",
"discord-api-types": "0.38.48",
@@ -16,7 +16,7 @@
"ws": "8.21.0"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/discord",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
"repository": {
"type": "git",
@@ -20,7 +20,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -67,10 +67,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/duckduckgo-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw DuckDuckGo plugin",
"type": "module",

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/exa-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw Exa plugin",
"type": "module",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/fal-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw fal provider plugin",
"type": "module",

View File

@@ -1,19 +1,19 @@
{
"name": "@openclaw/feishu",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/feishu",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@larksuiteoapi/node-sdk": "1.66.0",
"typebox": "1.1.39",
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/feishu",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Feishu/Lark channel plugin for chats and workplace tools (community maintained by @m1heng).",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -51,10 +51,10 @@
"minHostVersion": ">=2026.5.29"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/firecrawl-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw Firecrawl plugin",
"type": "module",

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/gmi-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw GMI Cloud provider plugin",
"type": "module",

View File

@@ -1,18 +1,18 @@
{
"name": "@openclaw/google-meet",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/google-meet",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"commander": "14.0.3",
"typebox": "1.1.39"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-meet",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -33,10 +33,10 @@
"minHostVersion": ">=2026.4.20"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/google-plugin",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw Google plugin",
"type": "module",

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/googlechat",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Google Chat channel plugin for spaces and direct messages.",
"repository": {
"type": "git",
@@ -17,7 +17,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -75,10 +75,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -97,7 +97,7 @@ describe("monitorIMessageProvider watch.subscribe startup retry", () => {
runtime: runtime as never,
});
await vi.runAllTimersAsync();
await vi.advanceTimersByTimeAsync(1_000);
await monitorPromise;
expect(createIMessageRpcClientMock).toHaveBeenCalledTimes(2);
@@ -135,7 +135,7 @@ describe("monitorIMessageProvider watch.subscribe startup retry", () => {
runtime: runtime as never,
}).catch((error: unknown) => error);
await vi.runAllTimersAsync();
await vi.advanceTimersByTimeAsync(2_000);
const monitorError = await monitorErrorPromise;
expect(monitorError).toBeInstanceOf(Error);

View File

@@ -277,15 +277,15 @@ function hasIMessageEchoMatch(params: {
if (!params.text && !fallbackMessageId) {
continue;
}
const echoOptions =
params.skipIdShortCircuit || params.includePendingText
? {
skipIdShortCircuit: params.skipIdShortCircuit,
includePendingText: params.includePendingText,
}
: undefined;
if (
params.echoCache.has(
scope,
{ text: params.text, messageId: fallbackMessageId },
{
skipIdShortCircuit: params.skipIdShortCircuit,
includePendingText: params.includePendingText,
},
)
params.echoCache.has(scope, { text: params.text, messageId: fallbackMessageId }, echoOptions)
) {
return true;
}

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/irc",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw IRC channel plugin",
"type": "module",
"devDependencies": {

View File

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

View File

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

View File

@@ -1,18 +1,18 @@
{
"name": "@openclaw/line",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/line",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@line/bot-sdk": "11.0.1",
"zod": "4.4.3"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/line",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw LINE channel plugin for LINE Bot API chats.",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -46,10 +46,10 @@
"minHostVersion": ">=2026.4.10"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/llama-cpp-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/llama-cpp-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"node-llama-cpp": "3.18.1"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/llama-cpp-provider",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw llama.cpp embedding provider plugin",
"repository": {
"type": "git",
@@ -23,10 +23,10 @@
"minHostVersion": ">=2026.6.2"
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"bundleRuntimeDependencies": false,

View File

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

View File

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

View File

@@ -1,12 +1,12 @@
{
"name": "@openclaw/lobster",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openclaw/lobster",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"dependencies": {
"@clawdbot/lobster": "2026.5.22",
"typebox": "1.1.39"

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/lobster",
"version": "2026.6.2",
"version": "2026.6.9-alpha.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.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -1,5 +1,11 @@
# Changelog
## 2026.6.9-alpha.2
### Changes
- Version alignment with core OpenClaw release numbers.
## 2026.6.3
### Changes

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/matrix",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Matrix channel plugin for rooms and direct messages.",
"repository": {
"type": "git",
@@ -22,7 +22,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {
@@ -88,10 +88,10 @@
"allowInvalidConfigRecovery": true
},
"compat": {
"pluginApi": ">=2026.6.2"
"pluginApi": ">=2026.6.9-alpha.2"
},
"build": {
"openclawVersion": "2026.6.2"
"openclawVersion": "2026.6.9-alpha.2"
},
"release": {
"publishToClawHub": true,

View File

@@ -3,6 +3,7 @@ import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
import { saveSessionStore, type SessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
import { afterEach, describe, expect, it } from "vitest";
import {
getMatrixExecApprovalApprovers,
@@ -342,12 +343,12 @@ describe("matrix exec approvals", () => {
).toBe(false);
});
it("scopes non-matrix turn sources to the stored matrix account", () => {
it("scopes non-matrix turn sources to the stored matrix account", async () => {
const tmpDir = createTempDir();
const storePath = path.join(tmpDir, "sessions.json");
fs.writeFileSync(
await saveSessionStore(
storePath,
JSON.stringify({
{
"agent:ops-agent:matrix:channel:!room:example.org": {
sessionId: "main",
updatedAt: 1,
@@ -359,8 +360,8 @@ describe("matrix exec approvals", () => {
lastTo: "channel:C999",
lastAccountId: "work",
},
}),
"utf-8",
} as Record<string, SessionEntry>,
{ skipMaintenance: true },
);
const cfg = buildMultiAccountMatrixConfig({ sessionStorePath: storePath });
const request = makeForeignChannelApprovalRequest({

View File

@@ -7,6 +7,11 @@ import {
testing as sessionBindingTesting,
registerSessionBindingAdapter,
} from "openclaw/plugin-sdk/session-binding-runtime";
import {
loadSessionStore,
saveSessionStore,
type SessionEntry,
} from "openclaw/plugin-sdk/session-store-runtime";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { installMatrixMonitorTestRuntime } from "../../test-runtime.js";
import { MATRIX_OPENCLAW_FINALIZED_PREVIEW_KEY } from "../send/types.js";
@@ -65,7 +70,7 @@ vi.mock("./replies.js", () => ({
deliverMatrixReplies: deliverMatrixRepliesMock,
}));
function writeMatrixSessionMeta(
async function writeMatrixSessionMeta(
storePath: string,
sessionKey: string,
origin: {
@@ -75,10 +80,8 @@ function writeMatrixSessionMeta(
nativeChannelId?: string;
nativeDirectUserId?: string;
},
): void {
const store = fs.existsSync(storePath)
? (JSON.parse(fs.readFileSync(storePath, "utf8")) as Record<string, Record<string, unknown>>)
: {};
): Promise<void> {
const store = loadSessionStore(storePath, { clone: false });
const existing = store[sessionKey] ?? {
sessionId: `sess-${Object.keys(store).length + 1}`,
updatedAt: Date.now(),
@@ -97,8 +100,7 @@ function writeMatrixSessionMeta(
...origin,
},
};
fs.mkdirSync(path.dirname(storePath), { recursive: true });
fs.writeFileSync(storePath, JSON.stringify(store, null, 2), "utf8");
await saveSessionStore(storePath, store, { skipMaintenance: true });
}
beforeEach(() => {
@@ -1153,7 +1155,7 @@ describe("matrix monitor handler pairing account scope", () => {
const sendNotice = vi.fn(async () => "$notice");
try {
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "direct",
from: "matrix:@user:example.org",
to: "room:!other:example.org",
@@ -1207,7 +1209,7 @@ describe("matrix monitor handler pairing account scope", () => {
}));
try {
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "direct",
from: "matrix:@user:example.org",
to: "room:!other:example.org",
@@ -1251,7 +1253,7 @@ describe("matrix monitor handler pairing account scope", () => {
const sendNotice = vi.fn(async () => "$notice");
try {
writeMatrixSessionMeta(storePath, "agent:ops:matrix:direct:@user:example.org", {
await writeMatrixSessionMeta(storePath, "agent:ops:matrix:direct:@user:example.org", {
chatType: "direct",
from: "matrix:@user:example.org",
to: "room:!other:example.org",
@@ -1295,7 +1297,7 @@ describe("matrix monitor handler pairing account scope", () => {
const sendNotice = vi.fn(async () => "$notice");
try {
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "direct",
from: "matrix:@user:example.org",
to: "room:!other:example.org",
@@ -1347,13 +1349,13 @@ describe("matrix monitor handler pairing account scope", () => {
const sendNotice = vi.fn(async () => "$notice");
try {
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "direct",
from: "matrix:@user:example.org",
to: "room:!other:example.org",
nativeChannelId: "!other:example.org",
});
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "direct",
from: "matrix:@other:example.org",
to: "room:@other:example.org",
@@ -1389,7 +1391,7 @@ describe("matrix monitor handler pairing account scope", () => {
const sendNotice = vi.fn(async () => "$notice");
try {
writeMatrixSessionMeta(storePath, "agent:ops:main", {
await writeMatrixSessionMeta(storePath, "agent:ops:main", {
chatType: "group",
from: "matrix:channel:!group:example.org",
to: "room:!group:example.org",
@@ -1421,9 +1423,9 @@ describe("matrix monitor handler pairing account scope", () => {
it("skips the shared-session notice when Matrix DMs are isolated per room", async () => {
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-dm-room-scope-"));
const storePath = path.join(tempDir, "sessions.json");
fs.writeFileSync(
await saveSessionStore(
storePath,
JSON.stringify({
{
"agent:ops:main": {
sessionId: "sess-main",
updatedAt: Date.now(),
@@ -1433,8 +1435,8 @@ describe("matrix monitor handler pairing account scope", () => {
accountId: "ops",
},
},
}),
"utf8",
} as Record<string, SessionEntry>,
{ skipMaintenance: true },
);
const sendNotice = vi.fn(async () => "$notice");
@@ -1468,9 +1470,9 @@ describe("matrix monitor handler pairing account scope", () => {
it("skips the shared-session notice when a Matrix DM is explicitly bound", async () => {
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-dm-bound-notice-"));
const storePath = path.join(tempDir, "sessions.json");
fs.writeFileSync(
await saveSessionStore(
storePath,
JSON.stringify({
{
"agent:bound:session-1": {
sessionId: "sess-bound",
updatedAt: Date.now(),
@@ -1480,8 +1482,8 @@ describe("matrix monitor handler pairing account scope", () => {
accountId: "ops",
},
},
}),
"utf8",
} as Record<string, SessionEntry>,
{ skipMaintenance: true },
);
const sendNotice = vi.fn(async () => "$notice");
const touch = vi.fn();

View File

@@ -2,6 +2,7 @@
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { saveSessionStore, type SessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
import { afterEach, describe, expect, it } from "vitest";
import type { OpenClawConfig } from "./runtime-api.js";
import { resolveMatrixOutboundSessionRoute } from "./session-route.js";
@@ -27,21 +28,23 @@ const defaultAccountPerRoomDmMatrixConfig = {
},
} satisfies MatrixChannelConfig;
function createTempStore(entries: Record<string, unknown>): string {
async function createTempStore(entries: Record<string, unknown>): Promise<string> {
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-session-route-"));
tempDirs.add(tempDir);
const storePath = path.join(tempDir, "sessions.json");
fs.writeFileSync(storePath, JSON.stringify(entries), "utf8");
await saveSessionStore(storePath, entries as Record<string, SessionEntry>, {
skipMaintenance: true,
});
return storePath;
}
function createMatrixRouteConfig(
async function createMatrixRouteConfig(
entries: Record<string, unknown>,
matrix: MatrixChannelConfig = perRoomDmMatrixConfig,
): OpenClawConfig {
): Promise<OpenClawConfig> {
return {
session: {
store: createTempStore(entries),
store: await createTempStore(entries),
},
channels: {
matrix,
@@ -127,14 +130,14 @@ function resolveUserRoute(params: { cfg: OpenClawConfig; accountId?: string; tar
});
}
function resolveUserRouteForCurrentSession(params: {
async function resolveUserRouteForCurrentSession(params: {
storedSession: Record<string, unknown>;
accountId?: string;
target?: string;
matrix?: MatrixChannelConfig;
}) {
return resolveUserRoute({
cfg: createMatrixRouteConfig(
cfg: await createMatrixRouteConfig(
{
[currentDmSessionKey]: params.storedSession,
},
@@ -188,8 +191,8 @@ afterEach(() => {
});
describe("resolveMatrixOutboundSessionRoute", () => {
it("reuses the current DM room session for same-user sends when Matrix DMs are per-room", () => {
const route = resolveUserRouteForCurrentSession({
it("reuses the current DM room session for same-user sends when Matrix DMs are per-room", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession(),
accountId: "ops",
});
@@ -197,8 +200,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectCurrentDmRoomRoute(route);
});
it("falls back to user-scoped routing when the current session is for another DM peer", () => {
const route = resolveUserRouteForCurrentSession({
it("falls back to user-scoped routing when the current session is for another DM peer", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession({ from: "matrix:@bob:example.org" }),
accountId: "ops",
});
@@ -206,8 +209,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectFallbackUserRoute(route);
});
it("falls back to user-scoped routing when the current session belongs to another Matrix account", () => {
const route = resolveUserRouteForCurrentSession({
it("falls back to user-scoped routing when the current session belongs to another Matrix account", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession(),
accountId: "support",
});
@@ -215,8 +218,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectFallbackUserRoute(route);
});
it("reuses the canonical DM room after user-target outbound metadata overwrites latest to fields", () => {
const route = resolveUserRouteForCurrentSession({
it("reuses the canonical DM room after user-target outbound metadata overwrites latest to fields", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession({
from: "matrix:@bob:example.org",
to: "room:@bob:example.org",
@@ -231,8 +234,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectCurrentDmRoomRoute(route);
});
it("does not reuse the canonical DM room for a different Matrix user after latest metadata drift", () => {
const route = resolveUserRouteForCurrentSession({
it("does not reuse the canonical DM room for a different Matrix user after latest metadata drift", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession({
from: "matrix:@bob:example.org",
to: "room:@bob:example.org",
@@ -248,8 +251,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectFallbackUserRoute(route, { userId: "@bob:example.org" });
});
it("does not reuse a room after the session metadata was overwritten by a non-DM Matrix send", () => {
const route = resolveUserRouteForCurrentSession({
it("does not reuse a room after the session metadata was overwritten by a non-DM Matrix send", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredChannelSession(),
accountId: "ops",
});
@@ -257,8 +260,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectFallbackUserRoute(route);
});
it("uses the effective default Matrix account when accountId is omitted", () => {
const route = resolveUserRouteForCurrentSession({
it("uses the effective default Matrix account when accountId is omitted", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession(),
matrix: defaultAccountPerRoomDmMatrixConfig,
});
@@ -266,8 +269,8 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expectCurrentDmRoomRoute(route);
});
it("reuses the current DM room when stored account metadata is missing", () => {
const route = resolveUserRouteForCurrentSession({
it("reuses the current DM room when stored account metadata is missing", async () => {
const route = await resolveUserRouteForCurrentSession({
storedSession: createStoredDirectDmSession({ accountId: null }),
matrix: defaultAccountPerRoomDmMatrixConfig,
});
@@ -291,17 +294,17 @@ describe("resolveMatrixOutboundSessionRoute", () => {
expect(channelRoute.threadId).toBe("$RootEvent:Example.Org");
});
it("resolves per-room DM metadata from the base key when currentSessionKey has a thread suffix", () => {
it("resolves per-room DM metadata from the base key when currentSessionKey has a thread suffix", async () => {
const storedSession = createStoredDirectDmSession();
const route = resolveUserRoute({
cfg: createMatrixRouteConfig({
cfg: await createMatrixRouteConfig({
[currentDmSessionKey]: storedSession,
}),
accountId: "ops",
target: "@alice:example.org",
});
const threadedRoute = resolveMatrixOutboundSessionRoute({
cfg: createMatrixRouteConfig({
cfg: await createMatrixRouteConfig({
[route?.baseSessionKey ?? currentDmSessionKey]: storedSession,
}),
agentId: "main",

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/mattermost",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"description": "OpenClaw Mattermost channel plugin",
"repository": {
"type": "git",
@@ -16,7 +16,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@openclaw/memory-core",
"version": "2026.6.2",
"version": "2026.6.9-alpha.2",
"private": true,
"description": "OpenClaw core memory search plugin",
"type": "module",
@@ -14,7 +14,7 @@
"openclaw": "2026.5.28"
},
"peerDependencies": {
"openclaw": ">=2026.6.2"
"openclaw": ">=2026.6.9-alpha.2"
},
"peerDependenciesMeta": {
"openclaw": {

View File

@@ -1035,7 +1035,7 @@ describe("generateAndAppendDreamNarrative", () => {
sessionId: "still-missing-non-dreaming",
updatedAt: Date.now(),
},
},
} as never,
{ skipMaintenance: true },
);
await fs.writeFile(orphanPath, '{"runId":"dreaming-narrative-light-123"}\n', "utf-8");
@@ -1105,7 +1105,7 @@ describe("generateAndAppendDreamNarrative", () => {
sessionId: "still-live",
updatedAt: Date.now(),
},
},
} as never,
{ skipMaintenance: true },
);
await fs.writeFile(orphanTranscript, '{"runId":"dreaming-narrative-deep-orphan"}\n', "utf-8");

View File

@@ -10,7 +10,7 @@ import {
resolveMemoryLightDreamingConfig,
resolveMemoryRemDreamingConfig,
} from "openclaw/plugin-sdk/memory-core-host-status";
import { saveSessionStore } from "openclaw/plugin-sdk/session-store-runtime";
import { saveSessionStore, type SessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
import { describe, expect, it, vi } from "vitest";
import {
testing,
@@ -1220,7 +1220,7 @@ describe("memory-core dreaming phases", () => {
sessionFile: transcriptPath,
updatedAt: Date.parse("2026-04-05T18:05:00.000Z"),
},
},
} as Record<string, SessionEntry>,
{ skipMaintenance: true },
);
const mtime = new Date("2026-04-05T18:05:00.000Z");
@@ -1315,7 +1315,7 @@ describe("memory-core dreaming phases", () => {
sessionFile: transcriptPath,
updatedAt: Date.now(),
},
},
} as Record<string, SessionEntry>,
{ skipMaintenance: true },
);

View File

@@ -193,9 +193,7 @@ describe("session startup catch-up", () => {
});
try {
await expect((harness as any).syncSessionFiles({ needsFullReindex: true })).resolves.toBe(
undefined,
);
await (harness as any).syncSessionFiles({ needsFullReindex: true });
expect(attempts).toBe(2);
} finally {
openSpy.mockRestore();

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