refactor: move bundled plugin policy into manifests

This commit is contained in:
Peter Steinberger
2026-03-27 16:38:41 +00:00
parent ed055f44ae
commit ef1784d264
80 changed files with 874 additions and 459 deletions

View File

@@ -90,3 +90,28 @@ export const BUNDLED_WEB_SEARCH_PROVIDER_PLUGIN_IDS = Object.fromEntries(
entry.webSearchProviderIds.map((providerId) => [providerId, entry.pluginId] as const),
).toSorted(([left], [right]) => left.localeCompare(right)),
) as Readonly<Record<string, string>>;
export const BUNDLED_PROVIDER_PLUGIN_ID_ALIASES = Object.fromEntries(
BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.flatMap((entry) =>
entry.providerIds
.filter((providerId) => providerId !== entry.pluginId)
.map((providerId) => [providerId, entry.pluginId] as const),
).toSorted(([left], [right]) => left.localeCompare(right)),
) as Readonly<Record<string, string>>;
export const BUNDLED_LEGACY_PLUGIN_ID_ALIASES = Object.fromEntries(
BUNDLED_PLUGIN_METADATA.flatMap(({ manifest }) =>
(manifest.legacyPluginIds ?? []).map(
(legacyPluginId) => [legacyPluginId, manifest.id] as const,
),
).toSorted(([left], [right]) => left.localeCompare(right)),
) as Readonly<Record<string, string>>;
export const BUNDLED_AUTO_ENABLE_PROVIDER_PLUGIN_IDS = Object.fromEntries(
BUNDLED_PLUGIN_METADATA.flatMap(({ manifest }) =>
(manifest.autoEnableWhenConfiguredProviders ?? []).map((providerId) => [
providerId,
manifest.id,
]),
).toSorted(([left], [right]) => left.localeCompare(right)),
) as Readonly<Record<string, string>>;

View File

@@ -8,6 +8,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/acpx",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw ACP runtime backend via acpx",
@@ -149,6 +151,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["amazon-bedrock"],
},
},
@@ -159,6 +162,12 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"cli-backend.js",
"cli-migration.js",
"cli-shared.js",
"media-understanding-provider.js",
],
packageName: "@openclaw/anthropic-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Anthropic provider plugin",
@@ -172,6 +181,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["anthropic"],
cliBackends: ["claude-cli"],
providerAuthEnvVars: {
@@ -228,6 +238,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/bluebubbles",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw BlueBubbles channel plugin",
@@ -777,6 +789,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/brave-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Brave plugin",
@@ -831,6 +844,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["browser-runtime-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/browser-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw browser tool plugin",
@@ -854,6 +869,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["provider-catalog.js"],
packageName: "@openclaw/byteplus-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw BytePlus provider plugin",
@@ -867,6 +883,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["byteplus", "byteplus-plan"],
providerAuthEnvVars: {
byteplus: ["BYTEPLUS_API_KEY"],
@@ -895,6 +912,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/chutes-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Chutes.ai provider plugin",
@@ -948,6 +966,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js"],
packageName: "@openclaw/cloudflare-ai-gateway-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Cloudflare AI Gateway provider plugin",
@@ -961,6 +980,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["cloudflare-ai-gateway"],
providerAuthEnvVars: {
"cloudflare-ai-gateway": ["CLOUDFLARE_AI_GATEWAY_API_KEY"],
@@ -990,6 +1010,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/copilot-proxy",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Copilot Proxy provider plugin",
@@ -1003,6 +1025,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
autoEnableWhenConfiguredProviders: ["copilot-proxy"],
providers: ["copilot-proxy"],
providerAuthChoices: [
{
@@ -1025,6 +1049,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["audio.js", "media-understanding-provider.js"],
packageName: "@openclaw/deepgram-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Deepgram media-understanding provider",
@@ -1050,6 +1075,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/deepseek-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw DeepSeek provider plugin",
@@ -1063,6 +1089,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["deepseek"],
providerAuthEnvVars: {
deepseek: ["DEEPSEEK_API_KEY"],
@@ -1091,6 +1118,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js"],
packageName: "@openclaw/diagnostics-otel",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw diagnostics OpenTelemetry exporter",
@@ -1113,6 +1141,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js"],
packageName: "@openclaw/diffs",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw diff viewer plugin",
@@ -1313,6 +1342,15 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: [
"action-runtime-api.js",
"api.js",
"channel-config-api.js",
"runtime-api.js",
"session-key-api.js",
"timeouts.js",
],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/discord",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Discord channel plugin",
@@ -3977,6 +4015,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/duckduckgo-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw DuckDuckGo plugin",
@@ -4026,6 +4065,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["speech-provider.js", "tts.js"],
packageName: "@openclaw/elevenlabs-speech",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw ElevenLabs speech plugin",
@@ -4051,6 +4091,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/exa-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Exa plugin",
@@ -4097,6 +4138,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["image-generation-provider.js", "onboard.js"],
packageName: "@openclaw/fal-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw fal provider plugin",
@@ -4110,6 +4152,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["fal"],
providerAuthEnvVars: {
fal: ["FAL_KEY"],
@@ -4146,6 +4189,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/feishu",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
@@ -5301,6 +5346,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/firecrawl-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Firecrawl plugin",
@@ -5355,6 +5401,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["login.js", "models-defaults.js", "models.js", "token.js", "usage.js"],
packageName: "@openclaw/github-copilot-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw GitHub Copilot provider plugin",
@@ -5368,6 +5415,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["github-copilot"],
providerAuthEnvVars: {
"github-copilot": ["COPILOT_GITHUB_TOKEN", "GH_TOKEN", "GITHUB_TOKEN"],
@@ -5393,6 +5441,24 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"cli-backend.js",
"gemini-cli-provider.js",
"image-generation-provider.js",
"media-understanding-provider.js",
"oauth.credentials.js",
"oauth.flow.js",
"oauth.http.js",
"oauth.js",
"oauth.project.js",
"oauth.runtime.js",
"oauth.shared.js",
"oauth.token.js",
"provider-models.js",
"runtime-api.js",
"web-search-provider.js",
],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/google-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Google plugin",
@@ -5419,6 +5485,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
},
},
},
enabledByDefault: true,
autoEnableWhenConfiguredProviders: ["google-gemini-cli"],
providers: ["google", "google-gemini-cli"],
cliBackends: ["google-gemini-cli"],
providerAuthEnvVars: {
@@ -5479,6 +5547,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/googlechat",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Google Chat channel plugin",
@@ -6298,6 +6368,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["media-understanding-provider.js"],
packageName: "@openclaw/groq-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Groq media-understanding provider",
@@ -6323,6 +6394,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/huggingface-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Hugging Face provider plugin",
@@ -6336,6 +6408,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["huggingface"],
providerAuthEnvVars: {
huggingface: ["HUGGINGFACE_HUB_TOKEN", "HF_TOKEN"],
@@ -6369,6 +6442,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/imessage",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw iMessage channel plugin",
@@ -6992,6 +7067,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js"],
packageName: "@openclaw/irc",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw IRC channel plugin",
@@ -7653,6 +7729,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js", "shared.js"],
packageName: "@openclaw/kilocode-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Kilo Gateway provider plugin",
@@ -7666,6 +7743,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["kilocode"],
providerAuthEnvVars: {
kilocode: ["KILOCODE_API_KEY"],
@@ -7695,6 +7773,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/kimi-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Kimi provider plugin",
@@ -7708,6 +7787,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["kimi", "kimi-coding"],
providerAuthEnvVars: {
kimi: ["KIMI_API_KEY", "KIMICODE_API_KEY"],
@@ -7741,6 +7821,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/line",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LINE channel plugin",
@@ -8017,6 +8099,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/litellm-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LiteLLM provider plugin",
@@ -8030,6 +8113,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["litellm"],
providerAuthEnvVars: {
litellm: ["LITELLM_API_KEY"],
@@ -8059,6 +8143,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js"],
packageName: "@openclaw/llm-task",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw JSON-only LLM task plugin",
@@ -8106,6 +8191,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/lobster",
packageVersion: "2026.3.26",
packageDescription: "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
@@ -8134,6 +8221,14 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: [
"api.js",
"helper-api.js",
"legacy-crypto-inspector.js",
"runtime-api.js",
"thread-bindings-runtime.js",
],
runtimeSidecarArtifacts: ["helper-api.js", "runtime-api.js", "thread-bindings-runtime.js"],
packageName: "@openclaw/matrix",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Matrix channel plugin",
@@ -8631,6 +8726,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/mattermost",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Mattermost channel plugin",
@@ -9246,6 +9343,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/memory-core",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw core memory search plugin",
@@ -9269,6 +9368,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js", "config.js", "lancedb-runtime.js"],
packageName: "@openclaw/memory-lancedb",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
@@ -9377,6 +9477,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["speech-provider.js", "tts.js"],
packageName: "@openclaw/microsoft-speech",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft speech plugin",
@@ -9402,6 +9503,15 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"auth.js",
"cli.js",
"onboard.js",
"provider.js",
"runtime.js",
"shared-runtime.js",
"shared.js",
],
packageName: "@openclaw/microsoft-foundry",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft Foundry provider plugin",
@@ -9451,6 +9561,15 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"image-generation-provider.js",
"media-understanding-provider.js",
"model-definitions.js",
"oauth.js",
"oauth.runtime.js",
"onboard.js",
"provider-catalog.js",
],
packageName: "@openclaw/minimax-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw MiniMax provider and OAuth plugin",
@@ -9464,6 +9583,9 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
legacyPluginIds: ["minimax-portal-auth"],
autoEnableWhenConfiguredProviders: ["minimax-portal"],
providers: ["minimax", "minimax-portal"],
providerAuthEnvVars: {
minimax: ["MINIMAX_API_KEY"],
@@ -9484,6 +9606,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
provider: "minimax",
method: "api-global",
choiceId: "minimax-global-api",
deprecatedChoiceIds: ["minimax", "minimax-api", "minimax-cloud", "minimax-api-lightning"],
choiceLabel: "MiniMax API key (Global)",
choiceHint: "Global endpoint - api.minimax.io",
groupId: "minimax",
@@ -9508,6 +9631,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
provider: "minimax",
method: "api-cn",
choiceId: "minimax-cn-api",
deprecatedChoiceIds: ["minimax-api-key-cn"],
choiceLabel: "MiniMax API key (CN)",
choiceHint: "CN endpoint - api.minimaxi.com",
groupId: "minimax",
@@ -9532,6 +9656,12 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"media-understanding-provider.js",
"model-definitions.js",
"onboard.js",
"provider-catalog.js",
],
packageName: "@openclaw/mistral-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Mistral provider plugin",
@@ -9545,6 +9675,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["mistral"],
providerAuthEnvVars: {
mistral: ["MISTRAL_API_KEY"],
@@ -9576,6 +9707,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["model-definitions.js", "onboard.js", "provider-catalog.js"],
packageName: "@openclaw/modelstudio-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Model Studio provider plugin",
@@ -9589,6 +9721,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["modelstudio"],
providerAuthEnvVars: {
modelstudio: ["MODELSTUDIO_API_KEY"],
@@ -9660,6 +9793,12 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"media-understanding-provider.js",
"onboard.js",
"provider-catalog.js",
"web-search-provider.js",
],
packageName: "@openclaw/moonshot-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Moonshot provider plugin",
@@ -9689,6 +9828,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
},
},
},
enabledByDefault: true,
providers: ["moonshot"],
providerAuthEnvVars: {
moonshot: ["MOONSHOT_API_KEY"],
@@ -9753,6 +9893,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/msteams",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft Teams channel plugin",
@@ -10236,6 +10378,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/nextcloud-talk",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Nextcloud Talk channel plugin",
@@ -10957,6 +11101,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/nostr",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
@@ -11091,6 +11237,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["provider-catalog.js"],
packageName: "@openclaw/nvidia-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw NVIDIA provider plugin",
@@ -11104,6 +11251,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["nvidia"],
providerAuthEnvVars: {
nvidia: ["NVIDIA_API_KEY"],
@@ -11117,6 +11265,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/ollama-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Ollama provider plugin",
@@ -11130,6 +11280,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["ollama"],
providerAuthEnvVars: {
ollama: ["OLLAMA_API_KEY"],
@@ -11155,6 +11306,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/open-prose",
packageVersion: "2026.3.26",
packageDescription: "OpenProse VM skill pack plugin (slash command + telemetry).",
@@ -11180,6 +11333,19 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"cli-backend.js",
"image-generation-provider.js",
"media-understanding-provider.js",
"openai-codex-auth-identity.js",
"openai-codex-catalog.js",
"openai-codex-provider.js",
"openai-codex-provider.runtime.js",
"openai-provider.js",
"shared.js",
"speech-provider.js",
"tts.js",
],
packageName: "@openclaw/openai-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenAI provider plugins",
@@ -11193,6 +11359,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["openai", "openai-codex"],
cliBackends: ["codex-cli"],
providerAuthEnvVars: {
@@ -11237,6 +11404,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js"],
packageName: "@openclaw/opencode-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenCode Zen provider plugin",
@@ -11250,6 +11418,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["opencode"],
providerAuthEnvVars: {
opencode: ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
@@ -11278,6 +11447,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js"],
packageName: "@openclaw/opencode-go-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenCode Go provider plugin",
@@ -11291,6 +11461,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["opencode-go"],
providerAuthEnvVars: {
"opencode-go": ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
@@ -11319,6 +11490,11 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"media-understanding-provider.js",
"onboard.js",
"provider-catalog.js",
],
packageName: "@openclaw/openrouter-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenRouter provider plugin",
@@ -11332,6 +11508,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["openrouter"],
providerAuthEnvVars: {
openrouter: ["OPENROUTER_API_KEY"],
@@ -11493,6 +11670,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/perplexity-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Perplexity plugin",
@@ -11553,6 +11731,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/qianfan-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Qianfan provider plugin",
@@ -11566,6 +11745,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["qianfan"],
providerAuthEnvVars: {
qianfan: ["QIANFAN_API_KEY"],
@@ -11607,6 +11787,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["sglang"],
providerAuthEnvVars: {
sglang: ["SGLANG_API_KEY"],
@@ -11636,6 +11817,13 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: [
"api.js",
"channel-config-api.js",
"reaction-runtime-api.js",
"runtime-api.js",
],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/signal",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Signal channel plugin",
@@ -12330,6 +12518,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/slack",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Slack channel plugin",
@@ -14075,6 +14265,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["setup-api.js"],
packageName: "@openclaw/synology-chat",
packageVersion: "2026.3.26",
packageDescription: "Synology Chat channel plugin for OpenClaw",
@@ -14133,6 +14324,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/synthetic-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Synthetic provider plugin",
@@ -14146,6 +14338,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["synthetic"],
providerAuthEnvVars: {
synthetic: ["SYNTHETIC_API_KEY"],
@@ -14174,6 +14367,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["web-search-provider.js"],
packageName: "@openclaw/tavily-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Tavily plugin",
@@ -14233,6 +14427,14 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: [
"allow-from.js",
"api.js",
"channel-config-api.js",
"runtime-api.js",
"update-offset-runtime-api.js",
],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/telegram",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Telegram channel plugin",
@@ -16314,6 +16516,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/tlon",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Tlon/Urbit channel plugin",
@@ -16520,6 +16724,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/together-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Together provider plugin",
@@ -16533,6 +16738,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["together"],
providerAuthEnvVars: {
together: ["TOGETHER_API_KEY"],
@@ -16561,6 +16767,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/twitch",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Twitch channel plugin",
@@ -16793,6 +17001,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/venice-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Venice provider plugin",
@@ -16806,6 +17015,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["venice"],
providerAuthEnvVars: {
venice: ["VENICE_API_KEY"],
@@ -16834,6 +17044,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/vercel-ai-gateway-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Vercel AI Gateway provider plugin",
@@ -16847,6 +17058,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["vercel-ai-gateway"],
providerAuthEnvVars: {
"vercel-ai-gateway": ["AI_GATEWAY_API_KEY"],
@@ -16888,6 +17100,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["vllm"],
providerAuthEnvVars: {
vllm: ["VLLM_API_KEY"],
@@ -16913,6 +17126,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js", "runtime-entry.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/voice-call",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw voice-call plugin",
@@ -17540,6 +17755,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["provider-catalog.js"],
packageName: "@openclaw/volcengine-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Volcengine provider plugin",
@@ -17553,6 +17769,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["volcengine", "volcengine-plan"],
providerAuthEnvVars: {
volcengine: ["VOLCANO_ENGINE_API_KEY"],
@@ -17585,6 +17802,17 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: [
"action-runtime-api.js",
"action-runtime.runtime.js",
"api.js",
"auth-presence.js",
"channel-config-api.js",
"light-runtime-api.js",
"login-qr-api.js",
"runtime-api.js",
],
runtimeSidecarArtifacts: ["light-runtime-api.js", "runtime-api.js"],
packageName: "@openclaw/whatsapp",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw WhatsApp channel plugin",
@@ -18183,6 +18411,14 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"model-definitions.js",
"onboard.js",
"provider-catalog.js",
"provider-models.js",
"stream.js",
"web-search.js",
],
packageName: "@openclaw/xai-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw xAI plugin",
@@ -18212,6 +18448,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
},
},
},
enabledByDefault: true,
providers: ["xai"],
providerAuthEnvVars: {
xai: ["XAI_API_KEY"],
@@ -18258,6 +18495,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: ["onboard.js", "provider-catalog.js"],
packageName: "@openclaw/xiaomi-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Xiaomi provider plugin",
@@ -18271,6 +18509,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["xiaomi"],
providerAuthEnvVars: {
xiaomi: ["XIAOMI_API_KEY"],
@@ -18299,6 +18538,14 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./index.ts",
built: "index.js",
},
publicSurfaceArtifacts: [
"detect.js",
"media-understanding-provider.js",
"model-definitions.js",
"onboard.js",
"runtime-api.js",
],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/zai-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Z.AI provider plugin",
@@ -18312,6 +18559,7 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["zai"],
providerAuthEnvVars: {
zai: ["ZAI_API_KEY", "Z_AI_API_KEY"],
@@ -18403,6 +18651,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/zalo",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Zalo channel plugin",
@@ -18874,6 +19124,8 @@ export const GENERATED_BUNDLED_PLUGIN_METADATA = [
source: "./setup-entry.ts",
built: "setup-entry.js",
},
publicSurfaceArtifacts: ["api.js", "runtime-api.js"],
runtimeSidecarArtifacts: ["runtime-api.js"],
packageName: "@openclaw/zalouser",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Zalo Personal Account plugin via native zca-js integration",

View File

@@ -35,6 +35,11 @@ describe("bundled plugin metadata", () => {
const discord = BUNDLED_PLUGIN_METADATA.find((entry) => entry.dirName === "discord");
expect(discord?.source).toEqual({ source: "./index.ts", built: "index.js" });
expect(discord?.setupSource).toEqual({ source: "./setup-entry.ts", built: "setup-entry.js" });
expect(discord?.publicSurfaceArtifacts).toContain("api.js");
expect(discord?.publicSurfaceArtifacts).toContain("runtime-api.js");
expect(discord?.publicSurfaceArtifacts).toContain("session-key-api.js");
expect(discord?.publicSurfaceArtifacts).not.toContain("test-api.js");
expect(discord?.runtimeSidecarArtifacts).toContain("runtime-api.js");
expect(discord?.manifest.id).toBe("discord");
expect(discord?.manifest.channelConfigs?.discord).toEqual(
expect.objectContaining({
@@ -43,6 +48,16 @@ describe("bundled plugin metadata", () => {
);
});
it("excludes test-only public surface artifacts", () => {
for (const entry of BUNDLED_PLUGIN_METADATA) {
for (const artifact of entry.publicSurfaceArtifacts ?? []) {
expect(artifact).not.toMatch(/^test-/);
expect(artifact).not.toContain(".test-");
expect(artifact).not.toMatch(/\.test\.js$/);
}
}
});
it("prefers built generated paths when present and falls back to source paths", () => {
const tempRoot = createGeneratedPluginTempRoot("openclaw-bundled-plugin-metadata-");
@@ -183,4 +198,47 @@ describe("bundled plugin metadata", () => {
},
});
});
it("captures top-level public surface artifacts without duplicating the primary entrypoints", async () => {
const tempRoot = createGeneratedPluginTempRoot("openclaw-bundled-plugin-public-artifacts-");
writeJson(path.join(tempRoot, "extensions", "alpha", "package.json"), {
name: "@openclaw/alpha",
version: "0.0.1",
openclaw: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
},
});
writeJson(path.join(tempRoot, "extensions", "alpha", "openclaw.plugin.json"), {
id: "alpha",
configSchema: { type: "object" },
});
fs.writeFileSync(
path.join(tempRoot, "extensions", "alpha", "index.ts"),
"export {};\n",
"utf8",
);
fs.writeFileSync(
path.join(tempRoot, "extensions", "alpha", "setup-entry.ts"),
"export {};\n",
"utf8",
);
fs.writeFileSync(path.join(tempRoot, "extensions", "alpha", "api.ts"), "export {};\n", "utf8");
fs.writeFileSync(
path.join(tempRoot, "extensions", "alpha", "runtime-api.ts"),
"export {};\n",
"utf8",
);
const entries = await collectBundledPluginMetadata({ repoRoot: tempRoot });
const firstEntry = entries[0] as
| {
publicSurfaceArtifacts?: string[];
runtimeSidecarArtifacts?: string[];
}
| undefined;
expect(firstEntry?.publicSurfaceArtifacts).toEqual(["api.js", "runtime-api.js"]);
expect(firstEntry?.runtimeSidecarArtifacts).toEqual(["runtime-api.js"]);
});
});

View File

@@ -13,6 +13,8 @@ export type GeneratedBundledPluginMetadata = {
idHint: string;
source: GeneratedBundledPluginPathPair;
setupSource?: GeneratedBundledPluginPathPair;
publicSurfaceArtifacts?: readonly string[];
runtimeSidecarArtifacts?: readonly string[];
packageName?: string;
packageVersion?: string;
packageDescription?: string;

View File

@@ -132,21 +132,25 @@ describe("normalizePluginsConfig", () => {
it("normalizes legacy plugin ids to their merged bundled plugin id", () => {
const result = normalizePluginsConfig({
allow: ["openai-codex", "minimax-portal-auth"],
deny: ["openai-codex", "minimax-portal-auth"],
allow: ["openai-codex", "google-gemini-cli", "minimax-portal-auth"],
deny: ["openai-codex", "google-gemini-cli", "minimax-portal-auth"],
entries: {
"openai-codex": {
enabled: true,
},
"google-gemini-cli": {
enabled: true,
},
"minimax-portal-auth": {
enabled: false,
},
},
});
expect(result.allow).toEqual(["openai", "minimax"]);
expect(result.deny).toEqual(["openai", "minimax"]);
expect(result.allow).toEqual(["openai", "google", "minimax"]);
expect(result.deny).toEqual(["openai", "google", "minimax"]);
expect(result.entries.openai?.enabled).toBe(true);
expect(result.entries.google?.enabled).toBe(true);
expect(result.entries.minimax?.enabled).toBe(false);
});
});
@@ -189,6 +193,16 @@ describe("resolveEffectiveEnableState", () => {
});
describe("resolveEnableState", () => {
it("enables bundled plugins only when manifest metadata marks them enabled by default", () => {
expect(resolveEnableState("openai", "bundled", normalizePluginsConfig({}))).toEqual({
enabled: false,
reason: "bundled (disabled by default)",
});
expect(resolveEnableState("openai", "bundled", normalizePluginsConfig({}), true)).toEqual({
enabled: true,
});
});
it("keeps the selected memory slot plugin enabled even when omitted from plugins.allow", () => {
const state = resolveEnableState(
"memory-core",
@@ -266,8 +280,8 @@ describe("resolveEnableState", () => {
});
});
it("keeps bundled provider plugins enabled when they are bundled-default providers", () => {
const state = resolveEnableState("google", "bundled", normalizePluginsConfig({}));
it("keeps bundled plugins enabled when manifest metadata marks them enabled by default", () => {
const state = resolveEnableState("google", "bundled", normalizePluginsConfig({}), true);
expect(state).toEqual({ enabled: true });
});

View File

@@ -1,5 +1,9 @@
import { normalizeChatChannelId } from "../channels/registry.js";
import type { OpenClawConfig } from "../config/config.js";
import {
BUNDLED_LEGACY_PLUGIN_ID_ALIASES,
BUNDLED_PROVIDER_PLUGIN_ID_ALIASES,
} from "./bundled-capability-metadata.js";
import type { PluginRecord } from "./registry.js";
import { defaultSlotIdForKey } from "./slots.js";
@@ -28,52 +32,13 @@ export type NormalizedPluginsConfig = {
>;
};
export const BUNDLED_ENABLED_BY_DEFAULT = new Set<string>([
"amazon-bedrock",
"anthropic",
"byteplus",
"cloudflare-ai-gateway",
"deepseek",
"device-pair",
"github-copilot",
"google",
"huggingface",
"kilocode",
"kimi",
"minimax",
"mistral",
"modelstudio",
"moonshot",
"nvidia",
"ollama",
"openai",
"opencode",
"opencode-go",
"openrouter",
"phone-control",
"qianfan",
"sglang",
"synthetic",
"talk-voice",
"together",
"venice",
"vercel-ai-gateway",
"vllm",
"volcengine",
"xai",
"xiaomi",
"zai",
]);
const PLUGIN_ID_ALIASES: Readonly<Record<string, string>> = {
"openai-codex": "openai",
"kimi-coding": "kimi",
"minimax-portal-auth": "minimax",
};
export function normalizePluginId(id: string): string {
const trimmed = id.trim();
return PLUGIN_ID_ALIASES[trimmed] ?? trimmed;
return (
BUNDLED_LEGACY_PLUGIN_ID_ALIASES[trimmed] ??
BUNDLED_PROVIDER_PLUGIN_ID_ALIASES[trimmed] ??
trimmed
);
}
const normalizeList = (value: unknown): string[] => {
@@ -299,7 +264,7 @@ export function resolveEnableState(
if (entry?.enabled === true) {
return { enabled: true };
}
if (origin === "bundled" && (enabledByDefault ?? BUNDLED_ENABLED_BY_DEFAULT.has(id))) {
if (origin === "bundled" && enabledByDefault === true) {
return { enabled: true };
}
if (origin === "bundled") {

View File

@@ -45,6 +45,7 @@ export type PluginManifestRecord = {
description?: string;
version?: string;
enabledByDefault?: boolean;
autoEnableWhenConfiguredProviders?: string[];
format?: PluginFormat;
bundleFormat?: PluginBundleFormat;
bundleCapabilities?: string[];
@@ -220,6 +221,7 @@ function buildRecord(params: {
normalizeManifestLabel(params.manifest.description) ?? params.candidate.packageDescription,
version: normalizeManifestLabel(params.manifest.version) ?? params.candidate.packageVersion,
enabledByDefault: params.manifest.enabledByDefault === true ? true : undefined,
autoEnableWhenConfiguredProviders: params.manifest.autoEnableWhenConfiguredProviders,
format: params.candidate.format ?? "openclaw",
bundleFormat: params.candidate.bundleFormat,
kind: params.manifest.kind,

View File

@@ -20,6 +20,10 @@ export type PluginManifest = {
id: string;
configSchema: Record<string, unknown>;
enabledByDefault?: boolean;
/** Legacy plugin ids that should normalize to this plugin id. */
legacyPluginIds?: string[];
/** Provider ids that should auto-enable this plugin when referenced in auth/config/models. */
autoEnableWhenConfiguredProviders?: string[];
kind?: PluginKind;
channels?: string[];
providers?: string[];
@@ -63,6 +67,8 @@ export type PluginManifestProviderAuthChoice = {
/** Optional user-facing choice label/hint for grouped onboarding UI. */
choiceLabel?: string;
choiceHint?: string;
/** Legacy choice ids that should point users at this replacement choice. */
deprecatedChoiceIds?: string[];
/** Optional grouping metadata for auth-choice pickers. */
groupId?: string;
groupLabel?: string;
@@ -151,6 +157,7 @@ function normalizeProviderAuthChoices(
}
const choiceLabel = typeof entry.choiceLabel === "string" ? entry.choiceLabel.trim() : "";
const choiceHint = typeof entry.choiceHint === "string" ? entry.choiceHint.trim() : "";
const deprecatedChoiceIds = normalizeStringList(entry.deprecatedChoiceIds);
const groupId = typeof entry.groupId === "string" ? entry.groupId.trim() : "";
const groupLabel = typeof entry.groupLabel === "string" ? entry.groupLabel.trim() : "";
const groupHint = typeof entry.groupHint === "string" ? entry.groupHint.trim() : "";
@@ -169,6 +176,7 @@ function normalizeProviderAuthChoices(
choiceId,
...(choiceLabel ? { choiceLabel } : {}),
...(choiceHint ? { choiceHint } : {}),
...(deprecatedChoiceIds.length > 0 ? { deprecatedChoiceIds } : {}),
...(groupId ? { groupId } : {}),
...(groupLabel ? { groupLabel } : {}),
...(groupHint ? { groupHint } : {}),
@@ -276,6 +284,10 @@ export function loadPluginManifest(
const kind = typeof raw.kind === "string" ? (raw.kind as PluginKind) : undefined;
const enabledByDefault = raw.enabledByDefault === true;
const legacyPluginIds = normalizeStringList(raw.legacyPluginIds);
const autoEnableWhenConfiguredProviders = normalizeStringList(
raw.autoEnableWhenConfiguredProviders,
);
const name = typeof raw.name === "string" ? raw.name.trim() : undefined;
const description = typeof raw.description === "string" ? raw.description.trim() : undefined;
const version = typeof raw.version === "string" ? raw.version.trim() : undefined;
@@ -299,6 +311,10 @@ export function loadPluginManifest(
id,
configSchema,
...(enabledByDefault ? { enabledByDefault } : {}),
...(legacyPluginIds.length > 0 ? { legacyPluginIds } : {}),
...(autoEnableWhenConfiguredProviders.length > 0
? { autoEnableWhenConfiguredProviders }
: {}),
kind,
channels,
providers,

View File

@@ -7,6 +7,7 @@ vi.mock("./manifest-registry.js", () => ({
}));
import {
resolveManifestDeprecatedProviderAuthChoice,
resolveManifestProviderAuthChoice,
resolveManifestProviderAuthChoices,
resolveManifestProviderOnboardAuthFlags,
@@ -91,4 +92,30 @@ describe("provider auth choice manifest helpers", () => {
},
]);
});
it("resolves deprecated auth-choice aliases through manifest metadata", () => {
loadPluginManifestRegistry.mockReturnValue({
plugins: [
{
id: "minimax",
providerAuthChoices: [
{
provider: "minimax",
method: "api-global",
choiceId: "minimax-global-api",
deprecatedChoiceIds: ["minimax", "minimax-api"],
},
],
},
],
});
expect(resolveManifestDeprecatedProviderAuthChoice("minimax")?.choiceId).toBe(
"minimax-global-api",
);
expect(resolveManifestDeprecatedProviderAuthChoice("minimax-api")?.choiceId).toBe(
"minimax-global-api",
);
expect(resolveManifestDeprecatedProviderAuthChoice("openai")).toBeUndefined();
});
});

View File

@@ -9,6 +9,7 @@ export type ProviderAuthChoiceMetadata = {
choiceId: string;
choiceLabel: string;
choiceHint?: string;
deprecatedChoiceIds?: string[];
groupId?: string;
groupLabel?: string;
groupHint?: string;
@@ -46,6 +47,7 @@ export function resolveManifestProviderAuthChoices(params?: {
choiceId: choice.choiceId,
choiceLabel: choice.choiceLabel ?? choice.choiceId,
...(choice.choiceHint ? { choiceHint: choice.choiceHint } : {}),
...(choice.deprecatedChoiceIds ? { deprecatedChoiceIds: choice.deprecatedChoiceIds } : {}),
...(choice.groupId ? { groupId: choice.groupId } : {}),
...(choice.groupLabel ? { groupLabel: choice.groupLabel } : {}),
...(choice.groupHint ? { groupHint: choice.groupHint } : {}),
@@ -94,6 +96,23 @@ export function resolveManifestProviderApiKeyChoice(params: {
});
}
export function resolveManifestDeprecatedProviderAuthChoice(
choiceId: string,
params?: {
config?: OpenClawConfig;
workspaceDir?: string;
env?: NodeJS.ProcessEnv;
},
): ProviderAuthChoiceMetadata | undefined {
const normalized = choiceId.trim();
if (!normalized) {
return undefined;
}
return resolveManifestProviderAuthChoices(params).find((choice) =>
choice.deprecatedChoiceIds?.includes(normalized),
);
}
export function resolveManifestProviderOnboardAuthFlags(params?: {
config?: OpenClawConfig;
workspaceDir?: string;

View File

@@ -1052,6 +1052,15 @@ export type WebSearchProviderPlugin = {
id: WebSearchProviderId;
label: string;
hint: string;
/**
* Interactive onboarding surfaces where this search provider should appear
* when OpenClaw has no config-aware runtime context yet.
*
* Unlike provider auth, search setup historically exposed only a curated
* quickstart subset. Keep this plugin-owned so core does not hardcode the
* default bundled provider list.
*/
onboardingScopes?: Array<"text-inference">;
requiresCredential?: boolean;
credentialLabel?: string;
envVars: string[];