From 0cfc80b81c121fb8ee10bcd7d72a86017e475176 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Mar 2026 21:33:50 -0700 Subject: [PATCH] refactor: finish public plugin sdk boundary seams --- .../anthropic/media-understanding-provider.ts | 6 ++++-- extensions/bluebubbles/src/setup-core.ts | 12 +++++------ .../google/media-understanding-provider.ts | 19 +++++++---------- extensions/googlechat/src/setup-core.ts | 3 +-- extensions/kilocode/index.ts | 2 +- extensions/matrix/src/setup-core.ts | 10 +++++---- .../minimax/media-understanding-provider.ts | 6 ++++-- extensions/minimax/model-definitions.ts | 2 +- .../mistral/media-understanding-provider.ts | 6 ++++-- extensions/mistral/model-definitions.ts | 2 +- extensions/modelstudio/model-definitions.ts | 2 +- .../moonshot/media-understanding-provider.ts | 12 +++++------ extensions/nvidia/index.ts | 2 +- .../openai/media-understanding-provider.ts | 13 ++++++------ extensions/qianfan/index.ts | 2 +- extensions/slack/src/shared.ts | 20 ++++++++++-------- extensions/synthetic/index.ts | 2 +- extensions/tlon/src/setup-core.ts | 11 +++++----- extensions/together/index.ts | 2 +- extensions/venice/index.ts | 2 +- extensions/vercel-ai-gateway/index.ts | 2 +- extensions/whatsapp/src/channel.runtime.ts | 2 +- extensions/xai/model-definitions.ts | 2 +- extensions/xiaomi/index.ts | 2 +- .../zai/media-understanding-provider.ts | 6 ++++-- extensions/zai/model-definitions.ts | 2 +- extensions/zalo/src/setup-core.ts | 3 +-- extensions/zalouser/src/setup-core.ts | 2 +- package.json | 12 +++++++++++ scripts/lib/plugin-sdk-entrypoints.json | 3 +++ src/agents/tools/slack-actions.ts | 2 +- src/channels/plugins/actions/signal.ts | 2 +- src/commands/doctor-config-flow.ts | 2 +- src/plugin-sdk/account-resolution.ts | 16 ++++++++++++++ src/plugin-sdk/discord.ts | 1 - src/plugin-sdk/google.ts | 4 ++++ src/plugin-sdk/media-understanding.ts | 21 +++++++++++++++++++ src/plugin-sdk/provider-catalog.ts | 9 ++++++++ src/plugin-sdk/setup.ts | 2 ++ src/plugin-sdk/signal.ts | 1 - src/plugin-sdk/slack.ts | 1 - src/plugin-sdk/telegram.ts | 1 - 42 files changed, 152 insertions(+), 82 deletions(-) create mode 100644 src/plugin-sdk/google.ts create mode 100644 src/plugin-sdk/media-understanding.ts create mode 100644 src/plugin-sdk/provider-catalog.ts diff --git a/extensions/anthropic/media-understanding-provider.ts b/extensions/anthropic/media-understanding-provider.ts index fbd12374e50..5b1f0711705 100644 --- a/extensions/anthropic/media-understanding-provider.ts +++ b/extensions/anthropic/media-understanding-provider.ts @@ -1,5 +1,7 @@ -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; -import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js"; +import { + describeImageWithModel, + type MediaUnderstandingProvider, +} from "openclaw/plugin-sdk/media-understanding"; export const anthropicMediaUnderstandingProvider: MediaUnderstandingProvider = { id: "anthropic", diff --git a/extensions/bluebubbles/src/setup-core.ts b/extensions/bluebubbles/src/setup-core.ts index 408cd255cf3..a8d3261b7ff 100644 --- a/extensions/bluebubbles/src/setup-core.ts +++ b/extensions/bluebubbles/src/setup-core.ts @@ -1,12 +1,12 @@ import { + normalizeAccountId, patchScopedAccountConfig, prepareScopedSetupConfig, -} from "../../../src/channels/plugins/setup-helpers.js"; -import { setTopLevelChannelDmPolicyWithAllowFrom } from "../../../src/channels/plugins/setup-wizard-helpers.js"; -import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { DmPolicy } from "../../../src/config/types.js"; -import { normalizeAccountId } from "../../../src/routing/session-key.js"; + setTopLevelChannelDmPolicyWithAllowFrom, + type ChannelSetupAdapter, + type DmPolicy, + type OpenClawConfig, +} from "openclaw/plugin-sdk/setup"; import { applyBlueBubblesConnectionConfig } from "./config-apply.js"; const channel = "bluebubbles" as const; diff --git a/extensions/google/media-understanding-provider.ts b/extensions/google/media-understanding-provider.ts index 559bd4c63b8..a64f26ca6c8 100644 --- a/extensions/google/media-understanding-provider.ts +++ b/extensions/google/media-understanding-provider.ts @@ -1,18 +1,15 @@ -import { normalizeGoogleModelId } from "../../src/agents/model-id-normalization.js"; -import { parseGeminiAuth } from "../../src/infra/gemini-auth.js"; -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; +import { normalizeGoogleModelId, parseGeminiAuth } from "openclaw/plugin-sdk/google"; import { assertOkOrThrowHttpError, + describeImageWithModel, normalizeBaseUrl, postJsonRequest, -} from "../../src/media-understanding/providers/shared.js"; -import type { - AudioTranscriptionRequest, - AudioTranscriptionResult, - MediaUnderstandingProvider, - VideoDescriptionRequest, - VideoDescriptionResult, -} from "../../src/media-understanding/types.js"; + type AudioTranscriptionRequest, + type AudioTranscriptionResult, + type MediaUnderstandingProvider, + type VideoDescriptionRequest, + type VideoDescriptionResult, +} from "openclaw/plugin-sdk/media-understanding"; export const DEFAULT_GOOGLE_AUDIO_BASE_URL = "https://generativelanguage.googleapis.com/v1beta"; export const DEFAULT_GOOGLE_VIDEO_BASE_URL = "https://generativelanguage.googleapis.com/v1beta"; diff --git a/extensions/googlechat/src/setup-core.ts b/extensions/googlechat/src/setup-core.ts index 09980bad5cd..5643ec4c291 100644 --- a/extensions/googlechat/src/setup-core.ts +++ b/extensions/googlechat/src/setup-core.ts @@ -1,5 +1,4 @@ -import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; +import { createPatchedAccountSetupAdapter, DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; const channel = "googlechat" as const; diff --git a/extensions/kilocode/index.ts b/extensions/kilocode/index.ts index c423606e552..d875bfdb3c2 100644 --- a/extensions/kilocode/index.ts +++ b/extensions/kilocode/index.ts @@ -1,10 +1,10 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { createKilocodeWrapper, isProxyReasoningUnsupported, } from "openclaw/plugin-sdk/provider-stream"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; import { applyKilocodeConfig, KILOCODE_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildKilocodeProviderWithDiscovery } from "./provider-catalog.js"; diff --git a/extensions/matrix/src/setup-core.ts b/extensions/matrix/src/setup-core.ts index 2e6bc895e0c..5e5973bd05e 100644 --- a/extensions/matrix/src/setup-core.ts +++ b/extensions/matrix/src/setup-core.ts @@ -1,7 +1,9 @@ -import { prepareScopedSetupConfig } from "../../../src/channels/plugins/setup-helpers.js"; -import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js"; -import { normalizeSecretInputString } from "../../../src/config/types.secrets.js"; -import { normalizeAccountId } from "../../../src/routing/session-key.js"; +import { + normalizeAccountId, + normalizeSecretInputString, + prepareScopedSetupConfig, + type ChannelSetupAdapter, +} from "openclaw/plugin-sdk/setup"; import type { CoreConfig } from "./types.js"; const channel = "matrix" as const; diff --git a/extensions/minimax/media-understanding-provider.ts b/extensions/minimax/media-understanding-provider.ts index 2798bbf9593..2bda4f4d193 100644 --- a/extensions/minimax/media-understanding-provider.ts +++ b/extensions/minimax/media-understanding-provider.ts @@ -1,5 +1,7 @@ -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; -import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js"; +import { + describeImageWithModel, + type MediaUnderstandingProvider, +} from "openclaw/plugin-sdk/media-understanding"; export const minimaxMediaUnderstandingProvider: MediaUnderstandingProvider = { id: "minimax", diff --git a/extensions/minimax/model-definitions.ts b/extensions/minimax/model-definitions.ts index a913a933cf7..48396f21240 100644 --- a/extensions/minimax/model-definitions.ts +++ b/extensions/minimax/model-definitions.ts @@ -1,4 +1,4 @@ -import type { ModelDefinitionConfig } from "../../src/config/types.models.js"; +import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models"; export const DEFAULT_MINIMAX_BASE_URL = "https://api.minimax.io/v1"; export const MINIMAX_API_BASE_URL = "https://api.minimax.io/anthropic"; diff --git a/extensions/mistral/media-understanding-provider.ts b/extensions/mistral/media-understanding-provider.ts index 6ffe1f0f898..f6ee0f167de 100644 --- a/extensions/mistral/media-understanding-provider.ts +++ b/extensions/mistral/media-understanding-provider.ts @@ -1,5 +1,7 @@ -import { transcribeOpenAiCompatibleAudio } from "../../src/media-understanding/providers/openai-compatible-audio.js"; -import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js"; +import { + transcribeOpenAiCompatibleAudio, + type MediaUnderstandingProvider, +} from "openclaw/plugin-sdk/media-understanding"; const DEFAULT_MISTRAL_AUDIO_BASE_URL = "https://api.mistral.ai/v1"; const DEFAULT_MISTRAL_AUDIO_MODEL = "voxtral-mini-latest"; diff --git a/extensions/mistral/model-definitions.ts b/extensions/mistral/model-definitions.ts index 90d3c84c73d..2e915da172a 100644 --- a/extensions/mistral/model-definitions.ts +++ b/extensions/mistral/model-definitions.ts @@ -1,4 +1,4 @@ -import type { ModelDefinitionConfig } from "../../src/config/types.models.js"; +import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models"; export const MISTRAL_BASE_URL = "https://api.mistral.ai/v1"; export const MISTRAL_DEFAULT_MODEL_ID = "mistral-large-latest"; diff --git a/extensions/modelstudio/model-definitions.ts b/extensions/modelstudio/model-definitions.ts index 765e3962329..16fcdc6ec8c 100644 --- a/extensions/modelstudio/model-definitions.ts +++ b/extensions/modelstudio/model-definitions.ts @@ -1,4 +1,4 @@ -import type { ModelDefinitionConfig } from "../../src/config/types.models.js"; +import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models"; export const MODELSTUDIO_CN_BASE_URL = "https://coding.dashscope.aliyuncs.com/v1"; export const MODELSTUDIO_GLOBAL_BASE_URL = "https://coding-intl.dashscope.aliyuncs.com/v1"; diff --git a/extensions/moonshot/media-understanding-provider.ts b/extensions/moonshot/media-understanding-provider.ts index 52bc9701c26..5814ee96e22 100644 --- a/extensions/moonshot/media-understanding-provider.ts +++ b/extensions/moonshot/media-understanding-provider.ts @@ -1,14 +1,12 @@ -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; import { assertOkOrThrowHttpError, + describeImageWithModel, normalizeBaseUrl, postJsonRequest, -} from "../../src/media-understanding/providers/shared.js"; -import type { - MediaUnderstandingProvider, - VideoDescriptionRequest, - VideoDescriptionResult, -} from "../../src/media-understanding/types.js"; + type MediaUnderstandingProvider, + type VideoDescriptionRequest, + type VideoDescriptionResult, +} from "openclaw/plugin-sdk/media-understanding"; export const DEFAULT_MOONSHOT_VIDEO_BASE_URL = "https://api.moonshot.ai/v1"; const DEFAULT_MOONSHOT_VIDEO_MODEL = "kimi-k2.5"; diff --git a/extensions/nvidia/index.ts b/extensions/nvidia/index.ts index 82b59e40a93..583932bc600 100644 --- a/extensions/nvidia/index.ts +++ b/extensions/nvidia/index.ts @@ -1,5 +1,5 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { buildNvidiaProvider } from "./provider-catalog.js"; const PROVIDER_ID = "nvidia"; diff --git a/extensions/openai/media-understanding-provider.ts b/extensions/openai/media-understanding-provider.ts index c97f317bf4d..dcb0a731a91 100644 --- a/extensions/openai/media-understanding-provider.ts +++ b/extensions/openai/media-understanding-provider.ts @@ -1,13 +1,14 @@ -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; -import { transcribeOpenAiCompatibleAudio } from "../../src/media-understanding/providers/openai-compatible-audio.js"; -import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js"; +import { + describeImageWithModel, + transcribeOpenAiCompatibleAudio, + type AudioTranscriptionRequest, + type MediaUnderstandingProvider, +} from "openclaw/plugin-sdk/media-understanding"; export const DEFAULT_OPENAI_AUDIO_BASE_URL = "https://api.openai.com/v1"; const DEFAULT_OPENAI_AUDIO_MODEL = "gpt-4o-mini-transcribe"; -export async function transcribeOpenAiAudio( - params: import("../../src/media-understanding/types.js").AudioTranscriptionRequest, -) { +export async function transcribeOpenAiAudio(params: AudioTranscriptionRequest) { return await transcribeOpenAiCompatibleAudio({ ...params, defaultBaseUrl: DEFAULT_OPENAI_AUDIO_BASE_URL, diff --git a/extensions/qianfan/index.ts b/extensions/qianfan/index.ts index 42b5b8a0cb7..04094e1c2ca 100644 --- a/extensions/qianfan/index.ts +++ b/extensions/qianfan/index.ts @@ -1,6 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applyQianfanConfig, QIANFAN_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildQianfanProvider } from "./provider-catalog.js"; diff --git a/extensions/slack/src/shared.ts b/extensions/slack/src/shared.ts index e7276da9ae1..d818eaab196 100644 --- a/extensions/slack/src/shared.ts +++ b/extensions/slack/src/shared.ts @@ -1,18 +1,20 @@ +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; +import { + createScopedAccountConfigAccessors, + createScopedChannelConfigBase, +} from "openclaw/plugin-sdk/channel-config-helpers"; +import { + formatDocsLink, + hasConfiguredSecretInput, + patchChannelConfigForAccount, + type OpenClawConfig, +} from "openclaw/plugin-sdk/setup"; import { buildChannelConfigSchema, getChatChannelMeta, SlackConfigSchema, type ChannelPlugin, } from "openclaw/plugin-sdk/slack"; -import { patchChannelConfigForAccount } from "../../../src/channels/plugins/setup-wizard-helpers.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { hasConfiguredSecretInput } from "../../../src/config/types.secrets.js"; -import { formatAllowFromLowercase } from "../../../src/plugin-sdk/allow-from.js"; -import { - createScopedAccountConfigAccessors, - createScopedChannelConfigBase, -} from "../../../src/plugin-sdk/channel-config-helpers.js"; -import { formatDocsLink } from "../../../src/terminal/links.js"; import { inspectSlackAccount } from "./account-inspect.js"; import { listSlackAccountIds, diff --git a/extensions/synthetic/index.ts b/extensions/synthetic/index.ts index f538dd1fbcb..9bdeea0b8a5 100644 --- a/extensions/synthetic/index.ts +++ b/extensions/synthetic/index.ts @@ -1,6 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applySyntheticConfig, SYNTHETIC_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildSyntheticProvider } from "./provider-catalog.js"; diff --git a/extensions/tlon/src/setup-core.ts b/extensions/tlon/src/setup-core.ts index 08d72f2ab28..846af4f08a3 100644 --- a/extensions/tlon/src/setup-core.ts +++ b/extensions/tlon/src/setup-core.ts @@ -1,11 +1,12 @@ import { + DEFAULT_ACCOUNT_ID, + normalizeAccountId, patchScopedAccountConfig, prepareScopedSetupConfig, -} from "../../../src/channels/plugins/setup-helpers.js"; -import type { ChannelSetupAdapter } from "../../../src/channels/plugins/types.adapters.js"; -import type { ChannelSetupInput } from "../../../src/channels/plugins/types.core.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../../src/routing/session-key.js"; + type ChannelSetupAdapter, + type ChannelSetupInput, + type OpenClawConfig, +} from "openclaw/plugin-sdk/setup"; import { buildTlonAccountFields } from "./account-fields.js"; import { resolveTlonAccount } from "./types.js"; diff --git a/extensions/together/index.ts b/extensions/together/index.ts index 2ae0072ca88..01bf59338f1 100644 --- a/extensions/together/index.ts +++ b/extensions/together/index.ts @@ -1,6 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applyTogetherConfig, TOGETHER_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildTogetherProvider } from "./provider-catalog.js"; diff --git a/extensions/venice/index.ts b/extensions/venice/index.ts index b67831fe7a9..37d4e767db3 100644 --- a/extensions/venice/index.ts +++ b/extensions/venice/index.ts @@ -1,6 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applyVeniceConfig, VENICE_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildVeniceProvider } from "./provider-catalog.js"; diff --git a/extensions/vercel-ai-gateway/index.ts b/extensions/vercel-ai-gateway/index.ts index 433f6cee09a..fc4dbae156a 100644 --- a/extensions/vercel-ai-gateway/index.ts +++ b/extensions/vercel-ai-gateway/index.ts @@ -1,6 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { applyVercelAiGatewayConfig, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildVercelAiGatewayProvider } from "./provider-catalog.js"; diff --git a/extensions/whatsapp/src/channel.runtime.ts b/extensions/whatsapp/src/channel.runtime.ts index 46dd5f987d2..1273da7bbd0 100644 --- a/extensions/whatsapp/src/channel.runtime.ts +++ b/extensions/whatsapp/src/channel.runtime.ts @@ -9,4 +9,4 @@ export { export { loginWeb } from "./login.js"; export { startWebLoginWithQr, waitForWebLogin } from "./login-qr.js"; export { whatsappSetupWizard } from "./setup-surface.js"; -export { monitorWebChannel } from "../../../src/channels/web/index.js"; +export { monitorWebChannel } from "openclaw/plugin-sdk/whatsapp"; diff --git a/extensions/xai/model-definitions.ts b/extensions/xai/model-definitions.ts index 5d3383eff8e..ff3a892500e 100644 --- a/extensions/xai/model-definitions.ts +++ b/extensions/xai/model-definitions.ts @@ -1,4 +1,4 @@ -import type { ModelDefinitionConfig } from "../../src/config/types.models.js"; +import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models"; export const XAI_BASE_URL = "https://api.x.ai/v1"; export const XAI_DEFAULT_MODEL_ID = "grok-4"; diff --git a/extensions/xiaomi/index.ts b/extensions/xiaomi/index.ts index 2edc1b33b25..dd18127edfa 100644 --- a/extensions/xiaomi/index.ts +++ b/extensions/xiaomi/index.ts @@ -1,7 +1,7 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth"; +import { buildSingleProviderApiKeyCatalog } from "openclaw/plugin-sdk/provider-catalog"; import { PROVIDER_LABELS } from "openclaw/plugin-sdk/provider-usage"; -import { buildSingleProviderApiKeyCatalog } from "../../src/plugins/provider-catalog.js"; import { applyXiaomiConfig, XIAOMI_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildXiaomiProvider } from "./provider-catalog.js"; diff --git a/extensions/zai/media-understanding-provider.ts b/extensions/zai/media-understanding-provider.ts index bbd8bcc59fc..08f8c186d4d 100644 --- a/extensions/zai/media-understanding-provider.ts +++ b/extensions/zai/media-understanding-provider.ts @@ -1,5 +1,7 @@ -import { describeImageWithModel } from "../../src/media-understanding/providers/image.js"; -import type { MediaUnderstandingProvider } from "../../src/media-understanding/types.js"; +import { + describeImageWithModel, + type MediaUnderstandingProvider, +} from "openclaw/plugin-sdk/media-understanding"; export const zaiMediaUnderstandingProvider: MediaUnderstandingProvider = { id: "zai", diff --git a/extensions/zai/model-definitions.ts b/extensions/zai/model-definitions.ts index 2527ee53031..778d7602f73 100644 --- a/extensions/zai/model-definitions.ts +++ b/extensions/zai/model-definitions.ts @@ -1,4 +1,4 @@ -import type { ModelDefinitionConfig } from "../../src/config/types.models.js"; +import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-models"; export const ZAI_CODING_GLOBAL_BASE_URL = "https://api.z.ai/api/coding/paas/v4"; export const ZAI_CODING_CN_BASE_URL = "https://open.bigmodel.cn/api/coding/paas/v4"; diff --git a/extensions/zalo/src/setup-core.ts b/extensions/zalo/src/setup-core.ts index 3e54c5a86dc..218ff32cf19 100644 --- a/extensions/zalo/src/setup-core.ts +++ b/extensions/zalo/src/setup-core.ts @@ -1,5 +1,4 @@ -import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; +import { createPatchedAccountSetupAdapter, DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; const channel = "zalo" as const; diff --git a/extensions/zalouser/src/setup-core.ts b/extensions/zalouser/src/setup-core.ts index f3215a16469..e1f9e9fd27c 100644 --- a/extensions/zalouser/src/setup-core.ts +++ b/extensions/zalouser/src/setup-core.ts @@ -1,4 +1,4 @@ -import { createPatchedAccountSetupAdapter } from "../../../src/channels/plugins/setup-helpers.js"; +import { createPatchedAccountSetupAdapter } from "openclaw/plugin-sdk/setup"; const channel = "zalouser" as const; diff --git a/package.json b/package.json index 456603ea22c..afbcb632ed0 100644 --- a/package.json +++ b/package.json @@ -338,6 +338,10 @@ "types": "./dist/plugin-sdk/provider-auth.d.ts", "default": "./dist/plugin-sdk/provider-auth.js" }, + "./plugin-sdk/provider-catalog": { + "types": "./dist/plugin-sdk/provider-catalog.d.ts", + "default": "./dist/plugin-sdk/provider-catalog.js" + }, "./plugin-sdk/provider-models": { "types": "./dist/plugin-sdk/provider-models.d.ts", "default": "./dist/plugin-sdk/provider-models.js" @@ -358,6 +362,14 @@ "types": "./dist/plugin-sdk/provider-web-search.d.ts", "default": "./dist/plugin-sdk/provider-web-search.js" }, + "./plugin-sdk/media-understanding": { + "types": "./dist/plugin-sdk/media-understanding.d.ts", + "default": "./dist/plugin-sdk/media-understanding.js" + }, + "./plugin-sdk/google": { + "types": "./dist/plugin-sdk/google.d.ts", + "default": "./dist/plugin-sdk/google.js" + }, "./plugin-sdk/request-url": { "types": "./dist/plugin-sdk/request-url.d.ts", "default": "./dist/plugin-sdk/request-url.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index e2de1d74f1f..50813e8dd66 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -74,11 +74,14 @@ "json-store", "keyed-async-queue", "provider-auth", + "provider-catalog", "provider-models", "provider-onboard", "provider-stream", "provider-usage", "provider-web-search", + "media-understanding", + "google", "request-url", "runtime-store", "speech", diff --git a/src/agents/tools/slack-actions.ts b/src/agents/tools/slack-actions.ts index e9089cbfdcc..11283394ec8 100644 --- a/src/agents/tools/slack-actions.ts +++ b/src/agents/tools/slack-actions.ts @@ -1,5 +1,6 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; import type { OpenClawConfig } from "../../config/config.js"; +import { resolveSlackAccount } from "../../plugin-sdk/account-resolution.js"; import { deleteSlackMessage, downloadSlackFile, @@ -20,7 +21,6 @@ import { parseSlackBlocksInput, parseSlackTarget, recordSlackThreadParticipation, - resolveSlackAccount, resolveSlackChannelId, } from "../../plugin-sdk/slack.js"; import { withNormalizedTimestamp } from "../date-time.js"; diff --git a/src/channels/plugins/actions/signal.ts b/src/channels/plugins/actions/signal.ts index 60a70bac4c0..2eacd78857c 100644 --- a/src/channels/plugins/actions/signal.ts +++ b/src/channels/plugins/actions/signal.ts @@ -1,8 +1,8 @@ import { createActionGate, jsonResult, readStringParam } from "../../../agents/tools/common.js"; +import { resolveSignalAccount } from "../../../plugin-sdk/account-resolution.js"; import { listEnabledSignalAccounts, removeReactionSignal, - resolveSignalAccount, resolveSignalReactionLevel, sendReactionSignal, } from "../../../plugin-sdk/signal.js"; diff --git a/src/commands/doctor-config-flow.ts b/src/commands/doctor-config-flow.ts index a1cbf5fa6d9..912869f390b 100644 --- a/src/commands/doctor-config-flow.ts +++ b/src/commands/doctor-config-flow.ts @@ -22,13 +22,13 @@ import { normalizeTrustedSafeBinDirs, } from "../infra/exec-safe-bin-trust.js"; import { readChannelAllowFromStore } from "../pairing/pairing-store.js"; +import { resolveTelegramAccount } from "../plugin-sdk/account-resolution.js"; import { fetchTelegramChatId, inspectTelegramAccount, isNumericTelegramUserId, listTelegramAccountIds, normalizeTelegramAllowFromEntry, - resolveTelegramAccount, } from "../plugin-sdk/telegram.js"; import { formatChannelAccountsDefaultPath, diff --git a/src/plugin-sdk/account-resolution.ts b/src/plugin-sdk/account-resolution.ts index cb819f57354..533d88187d0 100644 --- a/src/plugin-sdk/account-resolution.ts +++ b/src/plugin-sdk/account-resolution.ts @@ -10,6 +10,22 @@ export { normalizeOptionalAccountId, } from "../routing/session-key.js"; export { normalizeE164, pathExists, resolveUserPath } from "../utils.js"; +export { + resolveDiscordAccount, + type ResolvedDiscordAccount, +} from "../../extensions/discord/src/accounts.js"; +export { + resolveSlackAccount, + type ResolvedSlackAccount, +} from "../../extensions/slack/src/accounts.js"; +export { + resolveTelegramAccount, + type ResolvedTelegramAccount, +} from "../../extensions/telegram/src/accounts.js"; +export { + resolveSignalAccount, + type ResolvedSignalAccount, +} from "../../extensions/signal/src/accounts.js"; /** Resolve an account by id, then fall back to the default account when the primary lacks credentials. */ export function resolveAccountWithDefaultFallback(params: { diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index b31c796e2d6..273df91e908 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -61,7 +61,6 @@ export { createDiscordActionGate, listDiscordAccountIds, resolveDefaultDiscordAccountId, - resolveDiscordAccount, } from "../../extensions/discord/src/accounts.js"; export { inspectDiscordAccount } from "../../extensions/discord/src/account-inspect.js"; export { diff --git a/src/plugin-sdk/google.ts b/src/plugin-sdk/google.ts new file mode 100644 index 00000000000..b39d4aa4ced --- /dev/null +++ b/src/plugin-sdk/google.ts @@ -0,0 +1,4 @@ +// Public Google-specific helpers used by bundled Google plugins. + +export { normalizeGoogleModelId } from "../agents/model-id-normalization.js"; +export { parseGeminiAuth } from "../infra/gemini-auth.js"; diff --git a/src/plugin-sdk/media-understanding.ts b/src/plugin-sdk/media-understanding.ts new file mode 100644 index 00000000000..052736afc3d --- /dev/null +++ b/src/plugin-sdk/media-understanding.ts @@ -0,0 +1,21 @@ +// Public media-understanding helpers and types for provider plugins. + +export type { + AudioTranscriptionRequest, + AudioTranscriptionResult, + ImageDescriptionRequest, + ImageDescriptionResult, + MediaUnderstandingProvider, + VideoDescriptionRequest, + VideoDescriptionResult, +} from "../media-understanding/types.js"; + +export { describeImageWithModel } from "../media-understanding/providers/image.js"; +export { transcribeOpenAiCompatibleAudio } from "../media-understanding/providers/openai-compatible-audio.js"; +export { + assertOkOrThrowHttpError, + normalizeBaseUrl, + postJsonRequest, + postTranscriptionRequest, + requireTranscriptionText, +} from "../media-understanding/providers/shared.js"; diff --git a/src/plugin-sdk/provider-catalog.ts b/src/plugin-sdk/provider-catalog.ts new file mode 100644 index 00000000000..7295658a3cb --- /dev/null +++ b/src/plugin-sdk/provider-catalog.ts @@ -0,0 +1,9 @@ +// Public provider catalog helpers for provider plugins. + +export type { ProviderCatalogContext, ProviderCatalogResult } from "../plugins/types.js"; + +export { + buildPairedProviderApiKeyCatalog, + buildSingleProviderApiKeyCatalog, + findCatalogTemplate, +} from "../plugins/provider-catalog.js"; diff --git a/src/plugin-sdk/setup.ts b/src/plugin-sdk/setup.ts index a2a7cf5c302..b890045a5f8 100644 --- a/src/plugin-sdk/setup.ts +++ b/src/plugin-sdk/setup.ts @@ -21,8 +21,10 @@ export { normalizeE164, pathExists } from "../utils.js"; export { applyAccountNameToChannelSection, applySetupAccountConfigPatch, + createPatchedAccountSetupAdapter, migrateBaseNameToDefaultAccount, patchScopedAccountConfig, + prepareScopedSetupConfig, } from "../channels/plugins/setup-helpers.js"; export { addWildcardAllowFrom, diff --git a/src/plugin-sdk/signal.ts b/src/plugin-sdk/signal.ts index f7d3ec2d84d..da3d839e356 100644 --- a/src/plugin-sdk/signal.ts +++ b/src/plugin-sdk/signal.ts @@ -47,7 +47,6 @@ export { listEnabledSignalAccounts, listSignalAccountIds, resolveDefaultSignalAccountId, - resolveSignalAccount, } from "../../extensions/signal/src/accounts.js"; export { resolveSignalReactionLevel } from "../../extensions/signal/src/reaction-level.js"; export { diff --git a/src/plugin-sdk/slack.ts b/src/plugin-sdk/slack.ts index b883aebac95..8e6793543af 100644 --- a/src/plugin-sdk/slack.ts +++ b/src/plugin-sdk/slack.ts @@ -50,7 +50,6 @@ export { listEnabledSlackAccounts, listSlackAccountIds, resolveDefaultSlackAccountId, - resolveSlackAccount, resolveSlackReplyToMode, } from "../../extensions/slack/src/accounts.js"; export { isSlackInteractiveRepliesEnabled } from "../../extensions/slack/src/interactive-replies.js"; diff --git a/src/plugin-sdk/telegram.ts b/src/plugin-sdk/telegram.ts index cb26a82cb13..db53fa92a35 100644 --- a/src/plugin-sdk/telegram.ts +++ b/src/plugin-sdk/telegram.ts @@ -65,7 +65,6 @@ export { listTelegramAccountIds, resolveDefaultTelegramAccountId, resolveTelegramPollActionGateState, - resolveTelegramAccount, } from "../../extensions/telegram/src/accounts.js"; export { inspectTelegramAccount } from "../../extensions/telegram/src/account-inspect.js"; export {