From 6ebcd853be0196277f74146f10dc0470e363af3e Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 18 Mar 2026 13:20:46 -0700 Subject: [PATCH] fix(plugin-sdk): isolate provider entry surfaces --- extensions/amazon-bedrock/index.ts | 2 +- extensions/google/gemini-cli-provider.ts | 2 +- extensions/google/index.ts | 2 +- extensions/google/provider-models.ts | 2 +- extensions/kilocode/index.ts | 2 +- extensions/moonshot/index.ts | 2 +- extensions/openai/index.ts | 2 +- extensions/openai/openai-codex-provider.ts | 2 +- extensions/openai/openai-provider.ts | 2 +- extensions/openrouter/index.ts | 2 +- extensions/xai/index.ts | 2 +- package.json | 4 + scripts/lib/plugin-sdk-entrypoints.json | 1 + src/plugin-sdk/plugin-entry.ts | 94 ++++++++++++++++++++++ src/plugin-sdk/talk-voice.ts | 2 +- 15 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 src/plugin-sdk/plugin-entry.ts diff --git a/extensions/amazon-bedrock/index.ts b/extensions/amazon-bedrock/index.ts index 01c7f62687b..7c76a5419da 100644 --- a/extensions/amazon-bedrock/index.ts +++ b/extensions/amazon-bedrock/index.ts @@ -1,4 +1,4 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createBedrockNoCacheWrapper, isAnthropicBedrockModel, diff --git a/extensions/google/gemini-cli-provider.ts b/extensions/google/gemini-cli-provider.ts index 45b00c1be28..ae10da9b2ab 100644 --- a/extensions/google/gemini-cli-provider.ts +++ b/extensions/google/gemini-cli-provider.ts @@ -2,7 +2,7 @@ import type { OpenClawPluginApi, ProviderAuthContext, ProviderFetchUsageSnapshotContext, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/plugin-entry"; import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/provider-auth"; import { fetchGeminiUsage } from "openclaw/plugin-sdk/provider-usage"; import { loginGeminiCliOAuth } from "./oauth.js"; diff --git a/extensions/google/index.ts b/extensions/google/index.ts index 7a67f614d1d..17a597344eb 100644 --- a/extensions/google/index.ts +++ b/extensions/google/index.ts @@ -1,5 +1,5 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; import { buildGoogleImageGenerationProvider } from "openclaw/plugin-sdk/image-generation"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; import { GOOGLE_GEMINI_DEFAULT_MODEL, diff --git a/extensions/google/provider-models.ts b/extensions/google/provider-models.ts index 93e6c40619c..e8bc88816a8 100644 --- a/extensions/google/provider-models.ts +++ b/extensions/google/provider-models.ts @@ -1,7 +1,7 @@ import type { ProviderResolveDynamicModelContext, ProviderRuntimeModel, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/plugin-entry"; import { cloneFirstTemplateModel } from "openclaw/plugin-sdk/provider-models"; const GEMINI_3_1_PRO_PREFIX = "gemini-3.1-pro"; diff --git a/extensions/kilocode/index.ts b/extensions/kilocode/index.ts index edbe5db7cfb..1261afe9ace 100644 --- a/extensions/kilocode/index.ts +++ b/extensions/kilocode/index.ts @@ -1,4 +1,4 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { diff --git a/extensions/moonshot/index.ts b/extensions/moonshot/index.ts index 241d53e6014..dd23e9a6309 100644 --- a/extensions/moonshot/index.ts +++ b/extensions/moonshot/index.ts @@ -1,4 +1,4 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { diff --git a/extensions/openai/index.ts b/extensions/openai/index.ts index 5664d19b82c..7ba31100085 100644 --- a/extensions/openai/index.ts +++ b/extensions/openai/index.ts @@ -1,5 +1,5 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; import { buildOpenAIImageGenerationProvider } from "openclaw/plugin-sdk/image-generation"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { buildOpenAISpeechProvider } from "openclaw/plugin-sdk/speech"; import { openaiMediaUnderstandingProvider } from "./media-understanding-provider.js"; import { buildOpenAICodexProviderPlugin } from "./openai-codex-provider.js"; diff --git a/extensions/openai/openai-codex-provider.ts b/extensions/openai/openai-codex-provider.ts index cb8d6d2519c..9263bf8043c 100644 --- a/extensions/openai/openai-codex-provider.ts +++ b/extensions/openai/openai-codex-provider.ts @@ -3,7 +3,7 @@ import type { ProviderAuthContext, ProviderResolveDynamicModelContext, ProviderRuntimeModel, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/plugin-entry"; import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/provider-auth"; import { CODEX_CLI_PROFILE_ID, diff --git a/extensions/openai/openai-provider.ts b/extensions/openai/openai-provider.ts index 25c7dc95da9..dfc38aa706a 100644 --- a/extensions/openai/openai-provider.ts +++ b/extensions/openai/openai-provider.ts @@ -1,7 +1,7 @@ import { type ProviderResolveDynamicModelContext, type ProviderRuntimeModel, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; import { applyOpenAIConfig, diff --git a/extensions/openrouter/index.ts b/extensions/openrouter/index.ts index 6b9ffbd2a1a..c33a4a6eb95 100644 --- a/extensions/openrouter/index.ts +++ b/extensions/openrouter/index.ts @@ -3,7 +3,7 @@ import { definePluginEntry, type ProviderResolveDynamicModelContext, type ProviderRuntimeModel, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key"; import { applyXaiModelCompat, DEFAULT_CONTEXT_TOKENS } from "openclaw/plugin-sdk/provider-models"; import { diff --git a/extensions/xai/index.ts b/extensions/xai/index.ts index 0f0784c315f..6dc646a2cad 100644 --- a/extensions/xai/index.ts +++ b/extensions/xai/index.ts @@ -1,4 +1,4 @@ -import { definePluginEntry } from "openclaw/plugin-sdk/core"; +import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth-api-key"; import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applyXaiModelCompat } from "openclaw/plugin-sdk/provider-models"; diff --git a/package.json b/package.json index d28200d336f..e3978f388a1 100644 --- a/package.json +++ b/package.json @@ -442,6 +442,10 @@ "types": "./dist/plugin-sdk/provider-auth-login.d.ts", "default": "./dist/plugin-sdk/provider-auth-login.js" }, + "./plugin-sdk/plugin-entry": { + "types": "./dist/plugin-sdk/plugin-entry.d.ts", + "default": "./dist/plugin-sdk/plugin-entry.js" + }, "./plugin-sdk/provider-catalog": { "types": "./dist/plugin-sdk/provider-catalog.d.ts", "default": "./dist/plugin-sdk/provider-catalog.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index e0d707523a8..cb0911af1e9 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -100,6 +100,7 @@ "provider-auth", "provider-auth-api-key", "provider-auth-login", + "plugin-entry", "provider-catalog", "provider-models", "provider-onboard", diff --git a/src/plugin-sdk/plugin-entry.ts b/src/plugin-sdk/plugin-entry.ts new file mode 100644 index 00000000000..9d0cb1eceba --- /dev/null +++ b/src/plugin-sdk/plugin-entry.ts @@ -0,0 +1,94 @@ +import { emptyPluginConfigSchema } from "../plugins/config-schema.js"; +import type { + OpenClawPluginApi, + OpenClawPluginCommandDefinition, + OpenClawPluginConfigSchema, + OpenClawPluginDefinition, + PluginInteractiveTelegramHandlerContext, +} from "../plugins/types.js"; + +export type { + AnyAgentTool, + MediaUnderstandingProviderPlugin, + OpenClawPluginApi, + OpenClawPluginConfigSchema, + ProviderDiscoveryContext, + ProviderCatalogContext, + ProviderCatalogResult, + ProviderAugmentModelCatalogContext, + ProviderBuiltInModelSuppressionContext, + ProviderBuiltInModelSuppressionResult, + ProviderBuildMissingAuthMessageContext, + ProviderCacheTtlEligibilityContext, + ProviderDefaultThinkingPolicyContext, + ProviderFetchUsageSnapshotContext, + ProviderModernModelPolicyContext, + ProviderPreparedRuntimeAuth, + ProviderResolvedUsageAuth, + ProviderPrepareExtraParamsContext, + ProviderPrepareDynamicModelContext, + ProviderPrepareRuntimeAuthContext, + ProviderResolveUsageAuthContext, + ProviderResolveDynamicModelContext, + ProviderNormalizeResolvedModelContext, + ProviderRuntimeModel, + SpeechProviderPlugin, + ProviderThinkingPolicyContext, + ProviderWrapStreamFnContext, + OpenClawPluginService, + OpenClawPluginServiceContext, + ProviderAuthContext, + ProviderAuthDoctorHintContext, + ProviderAuthMethodNonInteractiveContext, + ProviderAuthMethod, + ProviderAuthResult, + OpenClawPluginCommandDefinition, + OpenClawPluginDefinition, + PluginLogger, + PluginInteractiveTelegramHandlerContext, +} from "../plugins/types.js"; +export type { OpenClawConfig } from "../config/config.js"; + +export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; + +type DefinePluginEntryOptions = { + id: string; + name: string; + description: string; + kind?: OpenClawPluginDefinition["kind"]; + configSchema?: OpenClawPluginConfigSchema | (() => OpenClawPluginConfigSchema); + register: (api: OpenClawPluginApi) => void; +}; + +type DefinedPluginEntry = { + id: string; + name: string; + description: string; + configSchema: OpenClawPluginConfigSchema; + register: NonNullable; +} & Pick; + +function resolvePluginConfigSchema( + configSchema: DefinePluginEntryOptions["configSchema"] = emptyPluginConfigSchema, +): OpenClawPluginConfigSchema { + return typeof configSchema === "function" ? configSchema() : configSchema; +} + +// Small entry surface for provider and command plugins that do not need channel helpers. +export function definePluginEntry({ + id, + name, + description, + kind, + configSchema = emptyPluginConfigSchema, + register, +}: DefinePluginEntryOptions): DefinedPluginEntry { + return { + id, + name, + description, + ...(kind ? { kind } : {}), + configSchema: resolvePluginConfigSchema(configSchema), + register, + }; +} diff --git a/src/plugin-sdk/talk-voice.ts b/src/plugin-sdk/talk-voice.ts index e89f210af62..10f4096da03 100644 --- a/src/plugin-sdk/talk-voice.ts +++ b/src/plugin-sdk/talk-voice.ts @@ -1,5 +1,5 @@ // Narrow plugin-sdk surface for the bundled talk-voice plugin. // Keep this list additive and scoped to symbols used under extensions/talk-voice. -export { definePluginEntry } from "./core.js"; +export { definePluginEntry } from "./plugin-entry.js"; export type { OpenClawPluginApi } from "../plugins/types.js";