mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-14 01:58:47 +08:00
Compare commits
20 Commits
codex/secu
...
v2026.6.9-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61ce213a31 | ||
|
|
6ab9ac76d1 | ||
|
|
acc68f56c7 | ||
|
|
b7364417ce | ||
|
|
189efd8b42 | ||
|
|
e94b9ffd4c | ||
|
|
ff8456e9a8 | ||
|
|
e6e57844be | ||
|
|
2ec07f7520 | ||
|
|
bb8c22ca0a | ||
|
|
7139a8c49a | ||
|
|
a08c74dcf9 | ||
|
|
48c62c637d | ||
|
|
e69e83ea7d | ||
|
|
8b6f0362ef | ||
|
|
32b6b1d2ae | ||
|
|
6af597f7a9 | ||
|
|
3294fed4da | ||
|
|
232c6b2b48 | ||
|
|
3a62102e29 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
4
extensions/acpx/npm-shrinkwrap.json
generated
4
extensions/acpx/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
4
extensions/amazon-bedrock/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-provider",
|
||||
"version": "2026.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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
4
extensions/anthropic-vertex/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-vertex-provider",
|
||||
"version": "2026.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"
|
||||
}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
4
extensions/brave/npm-shrinkwrap.json
generated
4
extensions/brave/npm-shrinkwrap.json
generated
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/codex/npm-shrinkwrap.json
generated
4
extensions/codex/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/copilot/npm-shrinkwrap.json
generated
4
extensions/copilot/npm-shrinkwrap.json
generated
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
4
extensions/diagnostics-otel/npm-shrinkwrap.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-otel",
|
||||
"version": "2026.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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/diffs/npm-shrinkwrap.json
generated
4
extensions/diffs/npm-shrinkwrap.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/discord/npm-shrinkwrap.json
generated
6
extensions/discord/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/feishu/npm-shrinkwrap.json
generated
6
extensions/feishu/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/google-meet/npm-shrinkwrap.json
generated
6
extensions/google-meet/npm-shrinkwrap.json
generated
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "@openclaw/google-meet",
|
||||
"version": "2026.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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/googlechat/npm-shrinkwrap.json
generated
6
extensions/googlechat/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
extensions/line/npm-shrinkwrap.json
generated
6
extensions/line/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/llama-cpp/npm-shrinkwrap.json
generated
4
extensions/llama-cpp/npm-shrinkwrap.json
generated
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
4
extensions/lobster/npm-shrinkwrap.json
generated
4
extensions/lobster/npm-shrinkwrap.json
generated
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## 2026.6.9-alpha.2
|
||||
|
||||
### Changes
|
||||
|
||||
- Version alignment with core OpenClaw release numbers.
|
||||
|
||||
## 2026.6.3
|
||||
|
||||
### Changes
|
||||
|
||||
6
extensions/matrix/npm-shrinkwrap.json
generated
6
extensions/matrix/npm-shrinkwrap.json
generated
@@ -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": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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 },
|
||||
);
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user