mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 14:01:24 +08:00
Compare commits
13 Commits
codex/8606
...
v2026.5.16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dba00cba6f | ||
|
|
c7b774414a | ||
|
|
9cf58b0c58 | ||
|
|
14d59b7fe9 | ||
|
|
96cfbe20ce | ||
|
|
e8fe9f416d | ||
|
|
60a46eb4e8 | ||
|
|
bf0342583f | ||
|
|
6e4301fc3e | ||
|
|
e1a0a01828 | ||
|
|
2cecc2ebe3 | ||
|
|
8971df8ee2 | ||
|
|
757dd86ba4 |
@@ -2,7 +2,7 @@
|
||||
|
||||
Docs: https://docs.openclaw.ai
|
||||
|
||||
## 2026.5.17
|
||||
## 2026.5.16
|
||||
|
||||
### Changes
|
||||
|
||||
@@ -36,6 +36,7 @@ Docs: https://docs.openclaw.ai
|
||||
- Commitments: strip malformed optional reminder scope metadata from persisted commitments before matching pending follow-ups.
|
||||
- Config persistence: normalize malformed auth profile credential fields/state, skip JSON-valid garbage transcript checkpoint rows, and let `openclaw doctor --fix` remove unrepairable cron job rows.
|
||||
- Cron: skip persisted job rows with malformed schedule or payload shapes in memory, leaving the store for `openclaw doctor --fix` instead of hydrating them into runtime state.
|
||||
- Cron: reject empty scheduled main/isolated payloads before persisting jobs, keeping runtime stores compatible with malformed-row hardening.
|
||||
- Task persistence: drop malformed array/scalar requester-origin JSON from task and task-flow SQLite sidecars instead of restoring it as delivery metadata.
|
||||
- Agents/timeouts: clarify model idle-timeout errors and docs so provider `timeoutSeconds` is shown as bounded by the whole agent/run timeout ceiling.
|
||||
- Release tooling: align the published launcher Node floor, `npm start`, package script checks, sharded lint locking, Vitest root project coverage, and plugin-SDK declaration build cache metadata so release/package validation does not silently skip or ship stale surfaces.
|
||||
|
||||
@@ -66,7 +66,7 @@ android {
|
||||
minSdk = 31
|
||||
targetSdk = 36
|
||||
versionCode = 2026051700
|
||||
versionName = "2026.5.17"
|
||||
versionName = "2026.5.16"
|
||||
ndk {
|
||||
// Support all major ABIs — native libs are tiny (~47 KB per ABI)
|
||||
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# OpenClaw iOS Changelog
|
||||
|
||||
## 2026.5.17 - 2026-05-17
|
||||
## 2026.5.16 - 2026-05-16
|
||||
|
||||
Maintenance update for the current OpenClaw release.
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Source of truth: apps/ios/version.json
|
||||
// Generated by scripts/ios-sync-versioning.ts.
|
||||
|
||||
OPENCLAW_IOS_VERSION = 2026.5.17
|
||||
OPENCLAW_MARKETING_VERSION = 2026.5.17
|
||||
OPENCLAW_IOS_VERSION = 2026.5.16
|
||||
OPENCLAW_MARKETING_VERSION = 2026.5.16
|
||||
OPENCLAW_BUILD_VERSION = 1
|
||||
|
||||
#include? "../build/Version.xcconfig"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"version": "2026.5.17"
|
||||
"version": "2026.5.16"
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2026.5.17</string>
|
||||
<string>2026.5.16</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2026051700</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/acpx",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw ACP runtime backend",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -26,10 +26,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"staticAssets": [
|
||||
{
|
||||
"source": "./src/runtime-internals/mcp-proxy.mjs",
|
||||
|
||||
@@ -11,6 +11,14 @@ function expectedSourceMcpServerArgs(entrypoint: string): string[] {
|
||||
return ["--import", TSX_IMPORT, path.resolve(entrypoint)];
|
||||
}
|
||||
|
||||
function expectedMcpServerArgs(sourceEntrypoint: string, distEntrypoint: string): string[] {
|
||||
const distPath = path.resolve(distEntrypoint);
|
||||
if (fs.existsSync(distPath)) {
|
||||
return [distPath];
|
||||
}
|
||||
return expectedSourceMcpServerArgs(sourceEntrypoint);
|
||||
}
|
||||
|
||||
describe("embedded acpx plugin config", () => {
|
||||
it("resolves workspace stateDir and cwd by default", () => {
|
||||
const workspaceDir = path.resolve("/tmp/openclaw-acpx");
|
||||
@@ -164,7 +172,10 @@ describe("embedded acpx plugin config", () => {
|
||||
const server = resolved.mcpServers["openclaw-plugin-tools"];
|
||||
expect(server).toEqual({
|
||||
command: process.execPath,
|
||||
args: expectedSourceMcpServerArgs("src/mcp/plugin-tools-serve.ts"),
|
||||
args: expectedMcpServerArgs(
|
||||
"src/mcp/plugin-tools-serve.ts",
|
||||
"dist/mcp/plugin-tools-serve.js",
|
||||
),
|
||||
});
|
||||
});
|
||||
|
||||
@@ -179,7 +190,10 @@ describe("embedded acpx plugin config", () => {
|
||||
const server = resolved.mcpServers["openclaw-tools"];
|
||||
expect(server).toEqual({
|
||||
command: process.execPath,
|
||||
args: expectedSourceMcpServerArgs("src/mcp/openclaw-tools-serve.ts"),
|
||||
args: expectedMcpServerArgs(
|
||||
"src/mcp/openclaw-tools-serve.ts",
|
||||
"dist/mcp/openclaw-tools-serve.js",
|
||||
),
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/admin-http-rpc",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw admin HTTP RPC endpoint",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/alibaba-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Alibaba Model Studio video provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-mantle-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Amazon Bedrock Mantle (OpenAI-compatible) provider plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,10 +25,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/amazon-bedrock-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Amazon Bedrock provider plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -27,10 +27,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-vertex-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Anthropic Vertex provider plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,10 +25,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/anthropic-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Anthropic provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/arcee-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Arcee provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/azure-speech",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Azure Speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -44,14 +44,18 @@ describe("buildAzureSpeechProvider", () => {
|
||||
vi.resetModules();
|
||||
});
|
||||
|
||||
it("reports configured only when key plus region or endpoint is available", () => {
|
||||
const provider = buildAzureSpeechProvider();
|
||||
function clearAzureSpeechEnv() {
|
||||
delete process.env.AZURE_SPEECH_KEY;
|
||||
delete process.env.AZURE_SPEECH_API_KEY;
|
||||
delete process.env.SPEECH_KEY;
|
||||
delete process.env.AZURE_SPEECH_REGION;
|
||||
delete process.env.SPEECH_REGION;
|
||||
delete process.env.AZURE_SPEECH_ENDPOINT;
|
||||
}
|
||||
|
||||
it("reports configured only when key plus region or endpoint is available", () => {
|
||||
const provider = buildAzureSpeechProvider();
|
||||
clearAzureSpeechEnv();
|
||||
|
||||
expect(provider.isConfigured({ providerConfig: {}, timeoutMs: 30_000 })).toBe(false);
|
||||
expect(provider.isConfigured({ providerConfig: { apiKey: "key" }, timeoutMs: 30_000 })).toBe(
|
||||
@@ -70,6 +74,7 @@ describe("buildAzureSpeechProvider", () => {
|
||||
});
|
||||
|
||||
it("normalizes provider-owned config under canonical and alias keys", () => {
|
||||
clearAzureSpeechEnv();
|
||||
const provider = buildAzureSpeechProvider();
|
||||
const canonical = provider.resolveConfig?.({
|
||||
cfg: {} as never,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/bonjour",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Bonjour/mDNS gateway discovery",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/brave-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Brave plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,10 +21,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/browser-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw browser tool plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -356,7 +356,8 @@ describe("basic browser routes", () => {
|
||||
expect(isTransportAvailable).toHaveBeenCalledTimes(1);
|
||||
expect(isTransportAvailable).toHaveBeenCalledWith(5_000);
|
||||
const [timeoutMs, reachabilityOptions] = readFirstReachabilityCall(isReachable);
|
||||
expect(timeoutMs).toBe(7_000);
|
||||
expect(timeoutMs).toBeGreaterThanOrEqual(6_900);
|
||||
expect(timeoutMs).toBeLessThanOrEqual(7_000);
|
||||
expect(reachabilityOptions?.ephemeral).toBe(true);
|
||||
expect(reachabilityOptions?.signal).toBeInstanceOf(AbortSignal);
|
||||
expect(isHttpReachable).not.toHaveBeenCalled();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/byteplus-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw BytePlus provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/canvas-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Canvas plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/cerebras-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Cerebras provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/chutes-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Chutes.ai provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/clickclack",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw ClickClack channel plugin",
|
||||
"type": "module",
|
||||
@@ -18,7 +18,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/cloudflare-ai-gateway-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Cloudflare AI Gateway provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/codex",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Codex harness and model provider plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -27,10 +27,10 @@
|
||||
"minHostVersion": ">=2026.5.1-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -8,6 +8,10 @@ export const CODEX_APP_SERVER_OWNED_DYNAMIC_TOOL_EXCLUDES = [
|
||||
"exec",
|
||||
"process",
|
||||
"update_plan",
|
||||
"tool_search_code",
|
||||
"tool_search",
|
||||
"tool_describe",
|
||||
"tool_call",
|
||||
] as const;
|
||||
|
||||
const DYNAMIC_TOOL_NAME_ALIASES: Record<string, string> = {
|
||||
|
||||
@@ -790,32 +790,17 @@ describe("runCodexAppServerAttempt", () => {
|
||||
expect((await readCodexAppServerBinding(sessionFile))?.mcpServersFingerprint).toBeUndefined();
|
||||
});
|
||||
|
||||
it("does not expose OpenClaw Tool Search controls through Codex dynamic tools", async () => {
|
||||
const sessionFile = path.join(tempDir, "session.jsonl");
|
||||
const workspaceDir = path.join(tempDir, "workspace");
|
||||
const params = createParams(sessionFile, workspaceDir);
|
||||
params.disableTools = false;
|
||||
params.config = {
|
||||
tools: {
|
||||
toolSearch: true,
|
||||
},
|
||||
};
|
||||
const sandboxSessionKey = params.sessionKey;
|
||||
if (!sandboxSessionKey) {
|
||||
throw new Error("createParams must provide a sessionKey for Codex dynamic tool tests.");
|
||||
}
|
||||
|
||||
const tools = await __testing.buildDynamicTools({
|
||||
params,
|
||||
resolvedWorkspace: workspaceDir,
|
||||
effectiveWorkspace: workspaceDir,
|
||||
sandboxSessionKey,
|
||||
sandbox: null as never,
|
||||
runAbortController: new AbortController(),
|
||||
sessionAgentId: "main",
|
||||
pluginConfig: {},
|
||||
onYieldDetected: () => undefined,
|
||||
});
|
||||
it("does not expose OpenClaw Tool Search controls through Codex dynamic tools", () => {
|
||||
const tools = __testing.filterCodexDynamicTools(
|
||||
[
|
||||
createRuntimeDynamicTool("message"),
|
||||
createRuntimeDynamicTool("tool_search_code"),
|
||||
createRuntimeDynamicTool("tool_search"),
|
||||
createRuntimeDynamicTool("tool_describe"),
|
||||
createRuntimeDynamicTool("tool_call"),
|
||||
],
|
||||
{},
|
||||
);
|
||||
const bridge = createCodexDynamicToolBridge({
|
||||
tools,
|
||||
signal: new AbortController().signal,
|
||||
@@ -823,12 +808,13 @@ describe("runCodexAppServerAttempt", () => {
|
||||
});
|
||||
const dynamicToolNames = bridge.specs.map((tool) => tool.name);
|
||||
|
||||
expect(dynamicToolNames).toContain("message");
|
||||
for (const toolName of ["tool_search_code", "tool_search", "tool_describe", "tool_call"]) {
|
||||
expect(dynamicToolNames).not.toContain(toolName);
|
||||
}
|
||||
});
|
||||
|
||||
it("passes auth profiles into Codex dynamic tool construction", async () => {
|
||||
it("passes auth profiles into Codex dynamic tool construction", () => {
|
||||
const sessionFile = path.join(tempDir, "session.jsonl");
|
||||
const workspaceDir = path.join(tempDir, "workspace");
|
||||
const params = createParams(sessionFile, workspaceDir);
|
||||
@@ -845,13 +831,7 @@ describe("runCodexAppServerAttempt", () => {
|
||||
params.disableTools = false;
|
||||
params.authProfileStore = authProfileStore;
|
||||
|
||||
const factoryOptions: unknown[] = [];
|
||||
__testing.setOpenClawCodingToolsFactoryForTests((options) => {
|
||||
factoryOptions.push(options);
|
||||
return [];
|
||||
});
|
||||
|
||||
await __testing.buildDynamicTools({
|
||||
const toolOptions = __testing.buildOpenClawCodingToolsOptions({
|
||||
params,
|
||||
resolvedWorkspace: workspaceDir,
|
||||
effectiveWorkspace: workspaceDir,
|
||||
@@ -863,10 +843,7 @@ describe("runCodexAppServerAttempt", () => {
|
||||
onYieldDetected: () => undefined,
|
||||
});
|
||||
|
||||
expect(factoryOptions).toHaveLength(1);
|
||||
expect((factoryOptions[0] as { authProfileStore?: unknown }).authProfileStore).toBe(
|
||||
authProfileStore,
|
||||
);
|
||||
expect(toolOptions.authProfileStore).toBe(authProfileStore);
|
||||
});
|
||||
|
||||
it("normalizes Codex dynamic toolsAllow entries before filtering", () => {
|
||||
|
||||
@@ -2490,18 +2490,15 @@ function resolveOpenClawCodingToolsSessionKeys(
|
||||
};
|
||||
}
|
||||
|
||||
async function buildDynamicTools(input: DynamicToolBuildParams) {
|
||||
function buildOpenClawCodingToolsOptions(
|
||||
input: DynamicToolBuildParams,
|
||||
): OpenClawCodingToolsOptions {
|
||||
const { params } = input;
|
||||
if (params.disableTools || !supportsModelTools(params.model)) {
|
||||
return [];
|
||||
}
|
||||
const modelHasVision = params.model.input?.includes("image") ?? false;
|
||||
const agentDir = params.agentDir ?? resolveAgentDir(params.config ?? {}, input.sessionAgentId);
|
||||
const createOpenClawCodingTools =
|
||||
openClawCodingToolsFactoryForTests ??
|
||||
(await import("openclaw/plugin-sdk/agent-harness")).createOpenClawCodingTools;
|
||||
const sessionKeys = resolveOpenClawCodingToolsSessionKeys(params, input.sandboxSessionKey);
|
||||
const allTools = createOpenClawCodingTools({
|
||||
|
||||
return {
|
||||
agentId: input.sessionAgentId,
|
||||
...buildEmbeddedAttemptToolRunContext(params),
|
||||
exec: {
|
||||
@@ -2568,10 +2565,22 @@ async function buildDynamicTools(input: DynamicToolBuildParams) {
|
||||
});
|
||||
input.runAbortController.abort("sessions_yield");
|
||||
},
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
async function buildDynamicTools(input: DynamicToolBuildParams) {
|
||||
const { params } = input;
|
||||
if (params.disableTools || !supportsModelTools(params.model)) {
|
||||
return [];
|
||||
}
|
||||
const createOpenClawCodingTools =
|
||||
openClawCodingToolsFactoryForTests ??
|
||||
(await import("openclaw/plugin-sdk/agent-harness")).createOpenClawCodingTools;
|
||||
const toolOptions = buildOpenClawCodingToolsOptions(input);
|
||||
const allTools = createOpenClawCodingTools(toolOptions);
|
||||
const codexFilteredTools = filterCodexDynamicTools(allTools, input.pluginConfig);
|
||||
const visionFilteredTools = filterToolsForVisionInputs(codexFilteredTools, {
|
||||
modelHasVision,
|
||||
modelHasVision: toolOptions.modelHasVision ?? false,
|
||||
hasInboundImages: (params.images?.length ?? 0) > 0,
|
||||
});
|
||||
const toolsAllow = includeForcedMessageToolAllow(params.toolsAllow, params);
|
||||
@@ -3586,6 +3595,7 @@ export const __testing = {
|
||||
createCodexSteeringQueue,
|
||||
buildCodexNativeHookRelayId,
|
||||
filterCodexDynamicTools,
|
||||
buildOpenClawCodingToolsOptions,
|
||||
buildDynamicTools,
|
||||
filterCodexDynamicToolsForAllowlist,
|
||||
filterToolsForVisionInputs,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/comfy-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw ComfyUI provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/copilot-proxy",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Copilot Proxy provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepgram-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Deepgram media-understanding provider",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepinfra-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw DeepInfra provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
import { afterAll, afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { buildDeepInfraSpeechProvider } from "./speech-provider.js";
|
||||
|
||||
const { assertOkOrThrowHttpErrorMock, postJsonRequestMock, resolveProviderHttpRequestConfigMock } =
|
||||
vi.hoisted(() => ({
|
||||
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
|
||||
postJsonRequestMock: vi.fn(),
|
||||
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
|
||||
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://api.deepinfra.com/v1/openai",
|
||||
allowPrivateNetwork: false,
|
||||
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
|
||||
dispatcherPolicy: undefined,
|
||||
})),
|
||||
}));
|
||||
const {
|
||||
assertOkOrThrowHttpErrorMock,
|
||||
postJsonRequestMock,
|
||||
readProviderBinaryResponseMock,
|
||||
resolveProviderHttpRequestConfigMock,
|
||||
} = vi.hoisted(() => ({
|
||||
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
|
||||
postJsonRequestMock: vi.fn(),
|
||||
readProviderBinaryResponseMock: vi.fn(async (response: Response) => {
|
||||
return new Uint8Array(await response.arrayBuffer());
|
||||
}),
|
||||
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
|
||||
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://api.deepinfra.com/v1/openai",
|
||||
allowPrivateNetwork: false,
|
||||
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
|
||||
dispatcherPolicy: undefined,
|
||||
})),
|
||||
}));
|
||||
|
||||
vi.mock("openclaw/plugin-sdk/provider-http", () => ({
|
||||
assertOkOrThrowHttpError: assertOkOrThrowHttpErrorMock,
|
||||
postJsonRequest: postJsonRequestMock,
|
||||
readProviderBinaryResponse: readProviderBinaryResponseMock,
|
||||
resolveProviderHttpRequestConfig: resolveProviderHttpRequestConfigMock,
|
||||
}));
|
||||
|
||||
@@ -36,6 +44,7 @@ describe("deepinfra speech provider", () => {
|
||||
afterEach(() => {
|
||||
assertOkOrThrowHttpErrorMock.mockClear();
|
||||
postJsonRequestMock.mockReset();
|
||||
readProviderBinaryResponseMock.mockClear();
|
||||
resolveProviderHttpRequestConfigMock.mockClear();
|
||||
vi.unstubAllEnvs();
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/deepseek-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw DeepSeek provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-otel",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw diagnostics OpenTelemetry exporter",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -34,10 +34,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diagnostics-prometheus",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw diagnostics Prometheus exporter",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,10 +21,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/diffs",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw diff viewer plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -31,10 +31,10 @@
|
||||
"minHostVersion": ">=2026.4.30"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"staticAssets": [
|
||||
{
|
||||
"source": "./assets/viewer-runtime.js",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/discord",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Discord channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,7 +21,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -65,10 +65,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -2,33 +2,39 @@ import { Readable } from "node:stream";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { decodeOpusStream, resolveOpusDecoderPreference } from "./audio.js";
|
||||
|
||||
function withoutOpusPreference<T>(run: () => T): T {
|
||||
const previousPreference = process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
try {
|
||||
return run();
|
||||
} finally {
|
||||
if (previousPreference === undefined) {
|
||||
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
} else {
|
||||
process.env.OPENCLAW_DISCORD_OPUS_DECODER = previousPreference;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
describe("discord voice opus decoder selection", () => {
|
||||
it("defaults to the pure-JS opusscript decoder", async () => {
|
||||
const verbose: string[] = [];
|
||||
const warnings: string[] = [];
|
||||
const previousPreference = process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
|
||||
try {
|
||||
const decoded = await decodeOpusStream(Readable.from([]), {
|
||||
const decoded = await withoutOpusPreference(async () => {
|
||||
return await decodeOpusStream(Readable.from([]), {
|
||||
onVerbose: (message) => verbose.push(message),
|
||||
onWarn: (message) => warnings.push(message),
|
||||
});
|
||||
});
|
||||
|
||||
expect(decoded.length).toBe(0);
|
||||
expect(verbose).toContain("opus decoder: opusscript");
|
||||
expect(warnings).toEqual([]);
|
||||
} finally {
|
||||
if (previousPreference === undefined) {
|
||||
delete process.env.OPENCLAW_DISCORD_OPUS_DECODER;
|
||||
} else {
|
||||
process.env.OPENCLAW_DISCORD_OPUS_DECODER = previousPreference;
|
||||
}
|
||||
}
|
||||
expect(decoded.length).toBe(0);
|
||||
expect(verbose).toContain("opus decoder: opusscript");
|
||||
expect(warnings).toEqual([]);
|
||||
});
|
||||
|
||||
it("requires an explicit preference for native opus", () => {
|
||||
expect(resolveOpusDecoderPreference()).toBe("opusscript");
|
||||
expect(withoutOpusPreference(() => resolveOpusDecoderPreference())).toBe("opusscript");
|
||||
expect(resolveOpusDecoderPreference("opusscript")).toBe("opusscript");
|
||||
expect(resolveOpusDecoderPreference("native")).toBe("native");
|
||||
expect(resolveOpusDecoderPreference("@discordjs/opus")).toBe("native");
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/document-extract-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw local document extraction plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/duckduckgo-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw DuckDuckGo plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/elevenlabs-speech",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw ElevenLabs speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/exa-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Exa plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/fal-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw fal provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/feishu",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -17,7 +17,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -48,10 +48,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/file-transfer",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.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.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Firecrawl plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/fireworks-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Fireworks provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/github-copilot-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw GitHub Copilot provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/google-meet",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Google Meet participant plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -33,10 +33,10 @@
|
||||
"minHostVersion": ">=2026.4.20"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/google-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Google plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/googlechat",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Google Chat channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -17,7 +17,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -75,10 +75,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/gradium-speech",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Gradium speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/groq-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Groq media-understanding provider",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/huggingface-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Hugging Face provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/image-generation-core",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw image generation runtime package",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/imessage",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw iMessage channel plugin using imsg on a signed-in Mac",
|
||||
"type": "module",
|
||||
@@ -40,10 +40,10 @@
|
||||
]
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
}
|
||||
},
|
||||
"pluginInspector": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/inworld-speech",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Inworld speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/irc",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw IRC channel plugin",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/kilocode-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Kilo Gateway provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/kimi-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Kimi provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/line",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw LINE channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -46,10 +46,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/litellm-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw LiteLLM provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/llm-task",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw JSON-only LLM task plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/lmstudio-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw LM Studio provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/lobster",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,10 +25,10 @@
|
||||
"minHostVersion": ">=2026.4.25"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## 2026.5.17
|
||||
## 2026.5.16
|
||||
|
||||
### Changes
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/matrix",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Matrix channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -22,7 +22,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -87,10 +87,10 @@
|
||||
"allowInvalidConfigRecovery": true
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/mattermost",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Mattermost channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/media-understanding-core",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw media understanding runtime package",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/memory-core",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw core memory search plugin",
|
||||
"type": "module",
|
||||
@@ -14,7 +14,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/memory-lancedb",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -26,10 +26,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/memory-wiki",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw persistent wiki plugin",
|
||||
"type": "module",
|
||||
@@ -14,7 +14,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/microsoft-foundry",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Microsoft Foundry provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/microsoft-speech",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Microsoft speech plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/migrate-claude",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "Claude to OpenClaw migration provider",
|
||||
"type": "module",
|
||||
@@ -9,7 +9,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/migrate-hermes",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "Hermes to OpenClaw migration provider",
|
||||
"type": "module",
|
||||
@@ -12,7 +12,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/minimax-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw MiniMax provider and OAuth plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/mistral-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Mistral provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/moonshot-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Moonshot provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/msteams",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Microsoft Teams channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -22,7 +22,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -58,10 +58,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/nextcloud-talk",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Nextcloud Talk channel plugin",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -12,7 +12,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -44,10 +44,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/nostr",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -16,7 +16,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -54,10 +54,10 @@
|
||||
"minHostVersion": ">=2026.4.10"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17"
|
||||
"openclawVersion": "2026.5.16-beta.2"
|
||||
},
|
||||
"release": {
|
||||
"publishToClawHub": true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/nvidia-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw NVIDIA provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/oc-path",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw oc:// workspace path plugin",
|
||||
"type": "module",
|
||||
@@ -14,7 +14,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/ollama-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Ollama provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/open-prose",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenProse VM skill pack plugin (slash command + telemetry).",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/openai-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw OpenAI provider plugins",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/opencode-go-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw OpenCode Go provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/opencode-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw OpenCode Zen provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/openrouter-provider",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw OpenRouter provider plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { buildOpenRouterSpeechProvider } from "./speech-provider.js";
|
||||
|
||||
const { assertOkOrThrowHttpErrorMock, postJsonRequestMock, resolveProviderHttpRequestConfigMock } =
|
||||
vi.hoisted(() => ({
|
||||
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
|
||||
postJsonRequestMock: vi.fn(),
|
||||
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
|
||||
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://openrouter.ai/api/v1",
|
||||
allowPrivateNetwork: false,
|
||||
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
|
||||
dispatcherPolicy: undefined,
|
||||
})),
|
||||
}));
|
||||
const {
|
||||
assertOkOrThrowHttpErrorMock,
|
||||
postJsonRequestMock,
|
||||
readProviderBinaryResponseMock,
|
||||
resolveProviderHttpRequestConfigMock,
|
||||
} = vi.hoisted(() => ({
|
||||
assertOkOrThrowHttpErrorMock: vi.fn(async () => {}),
|
||||
postJsonRequestMock: vi.fn(),
|
||||
readProviderBinaryResponseMock: vi.fn(async (response: Response) => {
|
||||
return new Uint8Array(await response.arrayBuffer());
|
||||
}),
|
||||
resolveProviderHttpRequestConfigMock: vi.fn((params: Record<string, unknown>) => ({
|
||||
baseUrl: params.baseUrl ?? params.defaultBaseUrl ?? "https://openrouter.ai/api/v1",
|
||||
allowPrivateNetwork: false,
|
||||
headers: new Headers(params.defaultHeaders as HeadersInit | undefined),
|
||||
dispatcherPolicy: undefined,
|
||||
})),
|
||||
}));
|
||||
|
||||
vi.mock("openclaw/plugin-sdk/provider-http", () => ({
|
||||
assertOkOrThrowHttpError: assertOkOrThrowHttpErrorMock,
|
||||
postJsonRequest: postJsonRequestMock,
|
||||
readProviderBinaryResponse: readProviderBinaryResponseMock,
|
||||
resolveProviderHttpRequestConfig: resolveProviderHttpRequestConfigMock,
|
||||
}));
|
||||
|
||||
@@ -54,6 +62,7 @@ describe("openrouter speech provider", () => {
|
||||
afterEach(() => {
|
||||
assertOkOrThrowHttpErrorMock.mockClear();
|
||||
postJsonRequestMock.mockReset();
|
||||
readProviderBinaryResponseMock.mockClear();
|
||||
resolveProviderHttpRequestConfigMock.mockClear();
|
||||
vi.unstubAllEnvs();
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/openshell-sandbox",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"description": "OpenClaw OpenShell sandbox backend",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,10 +24,10 @@
|
||||
"minHostVersion": ">=2026.5.12-beta.1"
|
||||
},
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"build": {
|
||||
"openclawVersion": "2026.5.17",
|
||||
"openclawVersion": "2026.5.16-beta.2",
|
||||
"bundledDist": false
|
||||
},
|
||||
"release": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/perplexity-plugin",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Perplexity plugin",
|
||||
"type": "module",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/qa-channel",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw QA synthetic channel plugin",
|
||||
"type": "module",
|
||||
@@ -19,7 +19,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/qa-lab",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw QA lab plugin with private debugger UI and scenario runner",
|
||||
"type": "module",
|
||||
@@ -19,7 +19,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -31,7 +31,7 @@
|
||||
"./index.ts"
|
||||
],
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@openclaw/qa-matrix",
|
||||
"version": "2026.5.17",
|
||||
"version": "2026.5.16-beta.2",
|
||||
"private": true,
|
||||
"description": "OpenClaw Matrix QA runner plugin",
|
||||
"type": "module",
|
||||
@@ -13,7 +13,7 @@
|
||||
"openclaw": "workspace:*"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"openclaw": ">=2026.5.17"
|
||||
"openclaw": ">=2026.5.16-beta.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"openclaw": {
|
||||
@@ -25,7 +25,7 @@
|
||||
"./index.ts"
|
||||
],
|
||||
"compat": {
|
||||
"pluginApi": ">=2026.5.17"
|
||||
"pluginApi": ">=2026.5.16-beta.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user