From 42786afc64ea4c2b6f7336a0d8a1daa00c9a22be Mon Sep 17 00:00:00 2001 From: Shakker Date: Wed, 1 Apr 2026 20:51:24 +0100 Subject: [PATCH] refactor: trim image generation runtime imports --- src/image-generation/runtime.test.ts | 13 ++++------ .../image-generation-core.auth.runtime.ts | 1 + src/plugin-sdk/image-generation-core.ts | 22 ++++++++++++++-- src/plugins/bundled-compat.ts | 2 +- src/plugins/config-policy.ts | 25 ++++++++++++++++++- 5 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 src/plugin-sdk/image-generation-core.auth.runtime.ts diff --git a/src/image-generation/runtime.test.ts b/src/image-generation/runtime.test.ts index f7f37400596..d4c2fc3c590 100644 --- a/src/image-generation/runtime.test.ts +++ b/src/image-generation/runtime.test.ts @@ -1,4 +1,8 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { + generateImage, + listRuntimeImageGenerationProviders, +} from "../../extensions/image-generation-core/runtime-api.js"; import type { OpenClawConfig } from "../config/config.js"; import { createEmptyPluginRegistry } from "../plugins/registry.js"; import { resetPluginRuntimeStateForTest, setActivePluginRegistry } from "../plugins/runtime.js"; @@ -13,9 +17,6 @@ vi.mock("../plugins/loader.js", () => ({ resolveRuntimePluginRegistry: resolveRuntimePluginRegistryMock, })); -let generateImage: typeof import("./runtime.js").generateImage; -let listRuntimeImageGenerationProviders: typeof import("./runtime.js").listRuntimeImageGenerationProviders; - function setCompatibleActiveImageGenerationRegistry( pluginRegistry: ReturnType, _cfg: OpenClawConfig, @@ -24,10 +25,6 @@ function setCompatibleActiveImageGenerationRegistry( } describe("image-generation runtime helpers", () => { - beforeAll(async () => { - ({ generateImage, listRuntimeImageGenerationProviders } = await import("./runtime.js")); - }); - beforeEach(() => { resolveRuntimePluginRegistryMock.mockReset(); resolveRuntimePluginRegistryMock.mockReturnValue(undefined); diff --git a/src/plugin-sdk/image-generation-core.auth.runtime.ts b/src/plugin-sdk/image-generation-core.auth.runtime.ts new file mode 100644 index 00000000000..fe6804373fc --- /dev/null +++ b/src/plugin-sdk/image-generation-core.auth.runtime.ts @@ -0,0 +1 @@ +export { resolveApiKeyForProvider } from "../agents/model-auth.js"; diff --git a/src/plugin-sdk/image-generation-core.ts b/src/plugin-sdk/image-generation-core.ts index 94f2dbf7252..75e3c63cb2f 100644 --- a/src/plugin-sdk/image-generation-core.ts +++ b/src/plugin-sdk/image-generation-core.ts @@ -14,7 +14,6 @@ export type { export type { OpenClawConfig } from "../config/config.js"; export { describeFailoverError, isFailoverError } from "../agents/failover-error.js"; -export { resolveApiKeyForProvider } from "../agents/model-auth.js"; export { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, @@ -27,5 +26,24 @@ export { export { parseImageGenerationModelRef } from "../image-generation/model-ref.js"; export { createSubsystemLogger } from "../logging/subsystem.js"; export { normalizeGoogleModelId } from "./google.js"; -export { OPENAI_DEFAULT_IMAGE_MODEL } from "./openai.js"; export { getProviderEnvVars } from "../secrets/provider-env-vars.js"; +export { OPENAI_DEFAULT_IMAGE_MODEL } from "../plugins/provider-model-defaults.js"; + +type ImageGenerationCoreAuthRuntimeModule = + typeof import("./image-generation-core.auth.runtime.js"); + +let imageGenerationCoreAuthRuntimePromise: + | Promise + | undefined; + +async function loadImageGenerationCoreAuthRuntime(): Promise { + imageGenerationCoreAuthRuntimePromise ??= import("./image-generation-core.auth.runtime.js"); + return imageGenerationCoreAuthRuntimePromise; +} + +export async function resolveApiKeyForProvider( + ...args: Parameters +): Promise>> { + const runtime = await loadImageGenerationCoreAuthRuntime(); + return runtime.resolveApiKeyForProvider(...args); +} diff --git a/src/plugins/bundled-compat.ts b/src/plugins/bundled-compat.ts index f1ab9cb4c32..546bc979150 100644 --- a/src/plugins/bundled-compat.ts +++ b/src/plugins/bundled-compat.ts @@ -1,5 +1,5 @@ import type { PluginEntryConfig } from "../config/types.plugins.js"; -import { hasExplicitPluginConfig } from "./config-state.js"; +import { hasExplicitPluginConfig } from "./config-policy.js"; import type { PluginLoadOptions } from "./loader.js"; export function withBundledPluginAllowlistCompat(params: { diff --git a/src/plugins/config-policy.ts b/src/plugins/config-policy.ts index 87513bcb446..19f7cb1f5db 100644 --- a/src/plugins/config-policy.ts +++ b/src/plugins/config-policy.ts @@ -318,7 +318,30 @@ export function resolvePluginActivationState(params: { source: "default", }; } - +export function hasExplicitPluginConfig(plugins?: OpenClawConfig["plugins"]): boolean { + if (!plugins) { + return false; + } + if (typeof plugins.enabled === "boolean") { + return true; + } + if (Array.isArray(plugins.allow) && plugins.allow.length > 0) { + return true; + } + if (Array.isArray(plugins.deny) && plugins.deny.length > 0) { + return true; + } + if (plugins.load?.paths && Array.isArray(plugins.load.paths) && plugins.load.paths.length > 0) { + return true; + } + if (plugins.slots && Object.keys(plugins.slots).length > 0) { + return true; + } + if (plugins.entries && Object.keys(plugins.entries).length > 0) { + return true; + } + return false; +} export function resolveEnableState( id: string, origin: PluginOrigin,