diff --git a/extensions/qa-lab/src/runtime-api.ts b/extensions/qa-lab/src/runtime-api.ts index de44ddf1bdf..07e7da977de 100644 --- a/extensions/qa-lab/src/runtime-api.ts +++ b/extensions/qa-lab/src/runtime-api.ts @@ -20,7 +20,7 @@ export { searchQaBusMessages, sendQaBusMessage, setQaChannelRuntime, -} from "@openclaw/qa-channel/api.js"; +} from "openclaw/plugin-sdk/qa-channel"; export type { QaBusAttachment, QaBusConversation, diff --git a/scripts/e2e/lib/clawhub-fixture-server.cjs b/scripts/e2e/lib/clawhub-fixture-server.cjs index d00e3ab1f8f..bae4839b2e5 100644 --- a/scripts/e2e/lib/clawhub-fixture-server.cjs +++ b/scripts/e2e/lib/clawhub-fixture-server.cjs @@ -79,6 +79,9 @@ export default definePluginEntry({ name: "OpenClaw Kitchen Sink", channels: ["kitchen-sink-channel"], providers: ["kitchen-sink-provider"], + contracts: { + tools: ["kitchen-sink-tool"], + }, configSchema: { type: "object", properties: {}, diff --git a/scripts/openclaw-cross-os-release-checks.ts b/scripts/openclaw-cross-os-release-checks.ts index bf54fc33241..7bbf153dff2 100644 --- a/scripts/openclaw-cross-os-release-checks.ts +++ b/scripts/openclaw-cross-os-release-checks.ts @@ -1866,6 +1866,20 @@ async function runInstalledModelsSet(params) { }); } if (typeof params.providerConfig.timeoutSeconds === "number") { + await runInstalledCli({ + cliPath: params.cliPath, + args: [ + "config", + "set", + `models.providers.${params.providerConfig.extensionId}.models`, + "[]", + "--strict-json", + ], + cwd: params.cwd, + env: params.env, + logPath: params.logPath, + timeoutMs: 2 * 60 * 1000, + }); if (typeof params.providerConfig.baseUrl === "string") { await runInstalledCli({ cliPath: params.cliPath, @@ -2690,6 +2704,19 @@ async function runModelsSet(params) { }); } if (typeof params.providerConfig.timeoutSeconds === "number") { + await runOpenClaw({ + lane: params.lane, + env: params.env, + args: [ + "config", + "set", + `models.providers.${params.providerConfig.extensionId}.models`, + "[]", + "--strict-json", + ], + logPath: params.logPath, + timeoutMs: 2 * 60 * 1000, + }); if (typeof params.providerConfig.baseUrl === "string") { await runOpenClaw({ lane: params.lane, diff --git a/src/infra/net/proxy/external-proxy.e2e.test.ts b/src/infra/net/proxy/external-proxy.e2e.test.ts index 966fb7f5013..cbd0d4977c7 100644 --- a/src/infra/net/proxy/external-proxy.e2e.test.ts +++ b/src/infra/net/proxy/external-proxy.e2e.test.ts @@ -4,7 +4,8 @@ import * as net from "node:net"; import { afterEach, describe, expect, it } from "vitest"; import { WebSocketServer } from "ws"; -const CHILD_PROCESS_TIMEOUT_MS = process.env.CI ? 30_000 : 10_000; +const CHILD_PROCESS_TIMEOUT_MS = process.env.CI ? 45_000 : 15_000; +const PROBE_TIMEOUT_MS = process.env.CI ? 15_000 : 5_000; async function listenOnLoopback(server: Server): Promise { return new Promise((resolve, reject) => { @@ -216,7 +217,7 @@ describe("SSRF external proxy routing", () => { resolve({ status: response.statusCode, body }); }); }); - req.setTimeout(5000, () => { + req.setTimeout(${PROBE_TIMEOUT_MS}, () => { req.destroy(new Error("node:http request timed out")); }); req.on("error", reject); @@ -238,7 +239,7 @@ describe("SSRF external proxy routing", () => { response.resume(); response.on("end", resolve); }); - req.setTimeout(5000, () => { + req.setTimeout(${PROBE_TIMEOUT_MS}, () => { req.destroy(new Error("node:https request timed out")); }); req.on("error", reject); @@ -247,7 +248,7 @@ describe("SSRF external proxy routing", () => { async function websocketProbe(url) { return new Promise((resolve, reject) => { - const ws = new WebSocket(url, { handshakeTimeout: 5000 }); + const ws = new WebSocket(url, { handshakeTimeout: ${PROBE_TIMEOUT_MS} }); ws.once("open", () => { ws.close(); reject(new Error("proxied websocket unexpectedly opened")); @@ -259,7 +260,7 @@ describe("SSRF external proxy routing", () => { async function gatewayLoopbackBypassProbe(url) { return new Promise((resolve, reject) => { const ws = dangerouslyBypassManagedProxyForGatewayLoopbackControlPlane(url, () => - new WebSocket(url, { handshakeTimeout: 5000 }), + new WebSocket(url, { handshakeTimeout: ${PROBE_TIMEOUT_MS} }), ); ws.once("open", () => { ws.close(); @@ -275,7 +276,7 @@ describe("SSRF external proxy routing", () => { } try { const response = await undiciFetch(process.env.OPENCLAW_TEST_TARGET_URL, { - signal: AbortSignal.timeout(5000), + signal: AbortSignal.timeout(${PROBE_TIMEOUT_MS}), }); const body = await response.text(); const nodeHttp = await nodeHttpGet(process.env.OPENCLAW_TEST_NODE_HTTP_TARGET_URL);