From 9a66b9cd5400a5c39db22abcba984a4729b8238d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 7 Apr 2026 14:03:14 +0800 Subject: [PATCH] Tests: fix package boundary and runtime drift --- extensions/openai/default-models.ts | 2 +- .../media-understanding-provider.test.ts | 4 +- .../tsconfig.package-boundary.paths.json | 12 ++---- extensions/xai/tsconfig.json | 12 ++---- packages/plugin-sdk/package.json | 38 +++++++++++-------- packages/plugin-sdk/tsconfig.json | 2 + .../openai-compatible-audio.test.ts | 4 +- .../runner.auto-audio.test.ts | 4 +- src/plugin-sdk/text-runtime.ts | 6 +++ ...tension-package-project-boundaries.test.ts | 26 +++++++------ src/plugins/provider-model-defaults.ts | 2 +- test/setup.shared.ts | 1 + 12 files changed, 60 insertions(+), 53 deletions(-) diff --git a/extensions/openai/default-models.ts b/extensions/openai/default-models.ts index 64045361c17..d5e88e83e59 100644 --- a/extensions/openai/default-models.ts +++ b/extensions/openai/default-models.ts @@ -9,7 +9,7 @@ export const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.4"; export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-1"; export const OPENAI_DEFAULT_TTS_MODEL = "gpt-4o-mini-tts"; export const OPENAI_DEFAULT_TTS_VOICE = "alloy"; -export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-mini-transcribe"; +export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-transcribe"; export const OPENAI_DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small"; export function applyOpenAIProviderConfig(cfg: OpenClawConfig): OpenClawConfig { diff --git a/extensions/openai/media-understanding-provider.test.ts b/extensions/openai/media-understanding-provider.test.ts index e80932f177a..3e6461ce7b9 100644 --- a/extensions/openai/media-understanding-provider.test.ts +++ b/extensions/openai/media-understanding-provider.test.ts @@ -43,7 +43,7 @@ describe("transcribeOpenAiAudio", () => { }); const { url: seenUrl, init: seenInit } = getRequest(); - expect(result.model).toBe("gpt-4o-mini-transcribe"); + expect(result.model).toBe("gpt-4o-transcribe"); expect(result.text).toBe("hello"); expect(seenUrl).toBe("https://api.example.com/v1/audio/transcriptions"); expect(seenInit?.method).toBe("POST"); @@ -55,7 +55,7 @@ describe("transcribeOpenAiAudio", () => { const form = seenInit?.body as FormData; expect(form).toBeInstanceOf(FormData); - expect(form.get("model")).toBe("gpt-4o-mini-transcribe"); + expect(form.get("model")).toBe("gpt-4o-transcribe"); expect(form.get("language")).toBe("en"); expect(form.get("prompt")).toBe("hello"); const file = form.get("file") as Blob | { type?: string; name?: string } | null; diff --git a/extensions/tsconfig.package-boundary.paths.json b/extensions/tsconfig.package-boundary.paths.json index 8c29de08caf..f76218230c6 100644 --- a/extensions/tsconfig.package-boundary.paths.json +++ b/extensions/tsconfig.package-boundary.paths.json @@ -3,17 +3,11 @@ "compilerOptions": { "paths": { "openclaw/extension-api": ["../src/extensionAPI.ts"], - "openclaw/plugin-sdk": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts" - ], - "openclaw/plugin-sdk/*": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" - ], + "openclaw/plugin-sdk": ["../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], + "openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], "openclaw/plugin-sdk/account-id": ["../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], - "@openclaw/plugin-sdk/*": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" - ] + "@openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"] } } } diff --git a/extensions/xai/tsconfig.json b/extensions/xai/tsconfig.json index 2e159bc4e59..f023a9f18ca 100644 --- a/extensions/xai/tsconfig.json +++ b/extensions/xai/tsconfig.json @@ -4,17 +4,11 @@ "rootDir": ".", "paths": { "openclaw/extension-api": ["../../src/extensionAPI.ts"], - "openclaw/plugin-sdk": [ - "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts" - ], - "openclaw/plugin-sdk/*": [ - "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" - ], + "openclaw/plugin-sdk": ["../../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], + "openclaw/plugin-sdk/*": ["../../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], "openclaw/plugin-sdk/account-id": ["../../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../*"], - "@openclaw/plugin-sdk/*": [ - "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" - ], + "@openclaw/plugin-sdk/*": ["../../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], "@openclaw/anthropic-vertex/api.js": ["./.boundary-stubs/anthropic-vertex-api.d.ts"], "@openclaw/ollama/api.js": ["./.boundary-stubs/ollama-api.d.ts"], "@openclaw/ollama/runtime-api.js": ["./.boundary-stubs/ollama-runtime-api.d.ts"], diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index 1608fee5ffe..7e6a390381a 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -5,63 +5,71 @@ "type": "module", "exports": { "./config-runtime": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/config-runtime.d.ts", + "types": "./dist/src/plugin-sdk/config-runtime.d.ts", "default": "./src/config-runtime.ts" }, "./plugin-entry": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/plugin-entry.d.ts", + "types": "./dist/src/plugin-sdk/plugin-entry.d.ts", "default": "./src/plugin-entry.ts" }, "./provider-auth": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-auth.d.ts", + "types": "./dist/src/plugin-sdk/provider-auth.d.ts", "default": "./src/provider-auth.ts" }, "./provider-auth-runtime": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-auth-runtime.d.ts", + "types": "./dist/src/plugin-sdk/provider-auth-runtime.d.ts", "default": "./src/provider-auth-runtime.ts" }, "./provider-entry": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-entry.d.ts", + "types": "./dist/src/plugin-sdk/provider-entry.d.ts", "default": "./src/provider-entry.ts" }, "./provider-http": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-http.d.ts", + "types": "./dist/src/plugin-sdk/provider-http.d.ts", "default": "./src/provider-http.ts" }, "./provider-model-shared": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-model-shared.d.ts", + "types": "./dist/src/plugin-sdk/provider-model-shared.d.ts", "default": "./src/provider-model-shared.ts" }, "./provider-onboard": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-onboard.d.ts", + "types": "./dist/src/plugin-sdk/provider-onboard.d.ts", "default": "./src/provider-onboard.ts" }, "./provider-stream-shared": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-stream-shared.d.ts", + "types": "./dist/src/plugin-sdk/provider-stream-shared.d.ts", "default": "./src/provider-stream-shared.ts" }, "./provider-tools": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-tools.d.ts", + "types": "./dist/src/plugin-sdk/provider-tools.d.ts", "default": "./src/provider-tools.ts" }, "./provider-web-search": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-web-search.d.ts", + "types": "./dist/src/plugin-sdk/provider-web-search.d.ts", "default": "./src/provider-web-search.ts" }, + "./runtime-doctor": { + "types": "./dist/src/plugin-sdk/runtime-doctor.d.ts", + "default": "./src/runtime-doctor.ts" + }, "./runtime-env": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/runtime-env.d.ts", + "types": "./dist/src/plugin-sdk/runtime-env.d.ts", "default": "./src/runtime-env.ts" }, "./secret-input": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/secret-input.d.ts", + "types": "./dist/src/plugin-sdk/secret-input.d.ts", "default": "./src/secret-input.ts" }, "./testing": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/testing.d.ts", + "types": "./dist/src/plugin-sdk/testing.d.ts", "default": "./src/testing.ts" }, + "./text-runtime": { + "types": "./dist/src/plugin-sdk/text-runtime.d.ts", + "default": "./src/text-runtime.ts" + }, "./video-generation": { - "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/video-generation.d.ts", + "types": "./dist/src/plugin-sdk/video-generation.d.ts", "default": "./src/video-generation.ts" } } diff --git a/packages/plugin-sdk/tsconfig.json b/packages/plugin-sdk/tsconfig.json index 7f291529b22..e86d6edee09 100644 --- a/packages/plugin-sdk/tsconfig.json +++ b/packages/plugin-sdk/tsconfig.json @@ -27,11 +27,13 @@ "../../src/plugin-sdk/provider-stream-shared.ts", "../../src/plugin-sdk/provider-tools.ts", "../../src/plugin-sdk/provider-web-search.ts", + "../../src/plugin-sdk/runtime-doctor.ts", "../../src/plugin-sdk/runtime-env.ts", "../../src/plugin-sdk/secret-input-schema.ts", "../../src/plugin-sdk/secret-input.ts", "../../src/plugin-sdk/telegram-command-config.ts", "../../src/plugin-sdk/testing.ts", + "../../src/plugin-sdk/text-runtime.ts", "../../src/plugin-sdk/video-generation.ts", "../../src/video-generation/dashscope-compatible.ts", "../../src/video-generation/types.ts", diff --git a/src/media-understanding/openai-compatible-audio.test.ts b/src/media-understanding/openai-compatible-audio.test.ts index 0ca36ff8589..a4c29c3c601 100644 --- a/src/media-understanding/openai-compatible-audio.test.ts +++ b/src/media-understanding/openai-compatible-audio.test.ts @@ -19,7 +19,7 @@ describe("transcribeOpenAiCompatibleAudio", () => { fetchFn, provider: "openai", defaultBaseUrl: "https://api.openai.com/v1", - defaultModel: "gpt-4o-mini-transcribe", + defaultModel: "gpt-4o-transcribe", }); const headers = new Headers(getRequest().init?.headers); @@ -40,7 +40,7 @@ describe("transcribeOpenAiCompatibleAudio", () => { provider: "openai", baseUrl: "https://proxy.example.com/v1", defaultBaseUrl: "https://api.openai.com/v1", - defaultModel: "gpt-4o-mini-transcribe", + defaultModel: "gpt-4o-transcribe", }); const headers = new Headers(getRequest().init?.headers); diff --git a/src/media-understanding/runner.auto-audio.test.ts b/src/media-understanding/runner.auto-audio.test.ts index 3b9b190b3f0..6c8ceeba584 100644 --- a/src/media-understanding/runner.auto-audio.test.ts +++ b/src/media-understanding/runner.auto-audio.test.ts @@ -75,7 +75,7 @@ describe("runCapability auto audio entries", () => { }, }); expect(result.outputs[0]?.text).toBe("ok"); - expect(seenModel).toBe("gpt-4o-mini-transcribe"); + expect(seenModel).toBe("gpt-4o-transcribe"); expect(result.decision.outcome).toBe("success"); }); @@ -144,7 +144,7 @@ describe("runCapability auto audio entries", () => { capabilities: ["audio"], transcribeAudio: async () => ({ text: "openai", - model: "gpt-4o-mini-transcribe", + model: "gpt-4o-transcribe", }), }, mistral: { diff --git a/src/plugin-sdk/text-runtime.ts b/src/plugin-sdk/text-runtime.ts index 225314dfc34..35257da9e1f 100644 --- a/src/plugin-sdk/text-runtime.ts +++ b/src/plugin-sdk/text-runtime.ts @@ -27,6 +27,12 @@ export * from "../utils/chunk-items.js"; export * from "../utils/fetch-timeout.js"; export * from "../utils/reaction-level.js"; export * from "../utils/with-timeout.js"; +export { + hasNonEmptyString, + normalizeNullableString, + normalizeOptionalString, + readStringValue, +} from "../shared/string-coerce.js"; export { CONFIG_DIR, clamp, diff --git a/src/plugins/contracts/extension-package-project-boundaries.test.ts b/src/plugins/contracts/extension-package-project-boundaries.test.ts index 4e8521ef9f0..4b29a60aef0 100644 --- a/src/plugins/contracts/extension-package-project-boundaries.test.ts +++ b/src/plugins/contracts/extension-package-project-boundaries.test.ts @@ -37,17 +37,11 @@ describe("opt-in extension package boundaries", () => { expect(pathsConfig.extends).toBe("../tsconfig.json"); expect(pathsConfig.compilerOptions?.paths).toEqual({ "openclaw/extension-api": ["../src/extensionAPI.ts"], - "openclaw/plugin-sdk": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts", - ], - "openclaw/plugin-sdk/*": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts", - ], + "openclaw/plugin-sdk": ["../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], + "openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], "openclaw/plugin-sdk/account-id": ["../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], - "@openclaw/plugin-sdk/*": [ - "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts", - ], + "@openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], }); const baseConfig = readJsonFile(EXTENSION_PACKAGE_BOUNDARY_BASE_CONFIG); @@ -109,11 +103,13 @@ describe("opt-in extension package boundaries", () => { "../../src/plugin-sdk/provider-stream-shared.ts", "../../src/plugin-sdk/provider-tools.ts", "../../src/plugin-sdk/provider-web-search.ts", + "../../src/plugin-sdk/runtime-doctor.ts", "../../src/plugin-sdk/runtime-env.ts", "../../src/plugin-sdk/secret-input-schema.ts", "../../src/plugin-sdk/secret-input.ts", "../../src/plugin-sdk/telegram-command-config.ts", "../../src/plugin-sdk/testing.ts", + "../../src/plugin-sdk/text-runtime.ts", "../../src/plugin-sdk/video-generation.ts", "../../src/video-generation/dashscope-compatible.ts", "../../src/video-generation/types.ts", @@ -124,13 +120,19 @@ describe("opt-in extension package boundaries", () => { expect(packageJson.name).toBe("@openclaw/plugin-sdk"); expect(packageJson.exports?.["./core"]).toBeUndefined(); expect(packageJson.exports?.["./plugin-entry"]?.types).toBe( - "./dist/packages/plugin-sdk/src/src/plugin-sdk/plugin-entry.d.ts", + "./dist/src/plugin-sdk/plugin-entry.d.ts", ); expect(packageJson.exports?.["./provider-http"]?.types).toBe( - "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-http.d.ts", + "./dist/src/plugin-sdk/provider-http.d.ts", + ); + expect(packageJson.exports?.["./runtime-doctor"]?.types).toBe( + "./dist/src/plugin-sdk/runtime-doctor.d.ts", + ); + expect(packageJson.exports?.["./text-runtime"]?.types).toBe( + "./dist/src/plugin-sdk/text-runtime.d.ts", ); expect(packageJson.exports?.["./video-generation"]?.types).toBe( - "./dist/packages/plugin-sdk/src/src/plugin-sdk/video-generation.d.ts", + "./dist/src/plugin-sdk/video-generation.d.ts", ); expect(existsSync(resolve(REPO_ROOT, "packages/plugin-sdk/types/plugin-entry.d.ts"))).toBe( false, diff --git a/src/plugins/provider-model-defaults.ts b/src/plugins/provider-model-defaults.ts index 90e8f473437..80603f51ae2 100644 --- a/src/plugins/provider-model-defaults.ts +++ b/src/plugins/provider-model-defaults.ts @@ -11,7 +11,7 @@ export const OPENAI_CODEX_DEFAULT_MODEL = "openai-codex/gpt-5.4"; export const OPENAI_DEFAULT_IMAGE_MODEL = "gpt-image-1"; export const OPENAI_DEFAULT_TTS_MODEL = "gpt-4o-mini-tts"; export const OPENAI_DEFAULT_TTS_VOICE = "alloy"; -export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-mini-transcribe"; +export const OPENAI_DEFAULT_AUDIO_TRANSCRIPTION_MODEL = "gpt-4o-transcribe"; export const OPENAI_DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small"; export const GOOGLE_GEMINI_DEFAULT_MODEL = "google/gemini-3.1-pro-preview"; export const OLLAMA_DEFAULT_BASE_URL = "http://127.0.0.1:11434"; diff --git a/test/setup.shared.ts b/test/setup.shared.ts index 6608fd41607..f0bdbea7698 100644 --- a/test/setup.shared.ts +++ b/test/setup.shared.ts @@ -84,6 +84,7 @@ export function installSharedTestSetup(options?: SharedTestSetupOptions): { } cleaned = true; testEnv.cleanup(); + delete globalState[SHARED_TEST_SETUP]; }, }; globalState[SHARED_TEST_SETUP] = handle;