From f2bd76cd1a4b463799a452e24f470a0db87a44b2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Mar 2026 22:32:25 -0700 Subject: [PATCH] refactor: finalize plugin sdk legacy boundary cleanup --- docs/tools/plugin.md | 16 +- extensions/bluebubbles/src/channel.ts | 8 +- extensions/bluebubbles/src/config-schema.ts | 2 +- extensions/bluebubbles/src/runtime.ts | 2 +- extensions/discord/src/channel.ts | 10 +- .../src/monitor/preflight-audio.runtime.ts | 1 + .../discord/src/monitor/preflight-audio.ts | 2 +- extensions/discord/src/shared.ts | 16 +- extensions/feishu/src/channel.ts | 8 +- extensions/feishu/src/directory.static.ts | 2 +- extensions/feishu/src/runtime.ts | 2 +- extensions/google/gemini-cli-provider.ts | 2 +- extensions/googlechat/src/channel.ts | 12 +- extensions/googlechat/src/runtime.ts | 2 +- extensions/imessage/src/channel.ts | 4 +- extensions/imessage/src/shared.ts | 2 +- extensions/irc/src/accounts.ts | 2 +- extensions/irc/src/channel.ts | 6 +- extensions/irc/src/runtime.ts | 2 +- extensions/line/src/channel.ts | 4 +- extensions/line/src/runtime.ts | 2 +- extensions/matrix/src/channel.ts | 8 +- extensions/matrix/src/config-schema.ts | 2 +- extensions/matrix/src/resolve-targets.ts | 2 +- extensions/matrix/src/runtime.ts | 2 +- extensions/mattermost/src/channel.ts | 6 +- extensions/mattermost/src/group-mentions.ts | 2 +- extensions/mattermost/src/runtime.ts | 2 +- extensions/msteams/src/channel.ts | 6 +- extensions/msteams/src/resolve-allowlist.ts | 2 +- extensions/msteams/src/runtime.ts | 2 +- extensions/nextcloud-talk/src/accounts.ts | 2 +- extensions/nextcloud-talk/src/channel.ts | 8 +- extensions/nextcloud-talk/src/runtime.ts | 2 +- extensions/nostr/src/config-schema.ts | 2 +- extensions/nostr/src/runtime.ts | 2 +- extensions/openai/openai-codex-provider.ts | 2 +- extensions/shared/passive-monitor.ts | 2 +- extensions/shared/runtime.ts | 2 +- extensions/signal/src/channel.ts | 2 +- extensions/signal/src/shared.ts | 4 +- extensions/slack/src/channel.ts | 2 +- extensions/synology-chat/src/runtime.ts | 2 +- .../telegram/src/bot-message-context.body.ts | 2 +- extensions/telegram/src/channel.ts | 6 +- .../src/media-understanding.runtime.ts | 1 + extensions/telegram/src/shared.ts | 20 +- extensions/telegram/src/sticker-cache.ts | 4 +- extensions/tlon/src/runtime.ts | 2 +- extensions/twitch/src/runtime.ts | 2 +- extensions/whatsapp/src/channel.ts | 29 +- extensions/whatsapp/src/shared.ts | 24 +- extensions/zalo/src/channel.runtime.ts | 2 +- extensions/zalo/src/channel.ts | 4 +- extensions/zalo/src/config-schema.ts | 2 +- extensions/zalo/src/runtime.ts | 2 +- extensions/zalo/src/token.ts | 2 +- extensions/zalouser/src/channel.ts | 8 +- extensions/zalouser/src/config-schema.ts | 2 +- extensions/zalouser/src/monitor.ts | 8 +- extensions/zalouser/src/runtime.ts | 2 +- package.json | 20 + ...-no-monolithic-plugin-sdk-entry-imports.ts | 24 +- scripts/lib/plugin-sdk-entrypoints.json | 5 + .../models-config.providers.moonshot.test.ts | 2 +- .../reply/elevated-allowlist-matcher.ts | 4 +- src/channels/registry.ts | 21 +- src/cli/deps.test.ts | 12 +- src/cli/deps.ts | 12 +- src/cli/send-runtime/discord.ts | 1 + src/cli/send-runtime/imessage.ts | 1 + src/cli/send-runtime/signal.ts | 1 + src/cli/send-runtime/slack.ts | 1 + src/cli/send-runtime/telegram.ts | 1 + src/cli/send-runtime/whatsapp.ts | 1 + src/commands/auth-choice.test.ts | 2 +- .../onboard-auth.config-core.kilocode.test.ts | 2 +- src/commands/onboard-auth.test.ts | 10 +- ...oard-non-interactive.provider-auth.test.ts | 2 +- src/plugin-sdk-internal/accounts.ts | 12 - src/plugin-sdk-internal/channel-config.ts | 17 - src/plugin-sdk-internal/core.ts | 14 - src/plugin-sdk-internal/discord.ts | 115 --- src/plugin-sdk-internal/imessage.ts | 46 - src/plugin-sdk-internal/setup.ts | 38 - src/plugin-sdk-internal/signal.ts | 39 - src/plugin-sdk-internal/slack.ts | 67 -- src/plugin-sdk-internal/telegram.ts | 120 --- src/plugin-sdk-internal/whatsapp.ts | 108 --- src/plugin-sdk/channel-config-schema.ts | 7 + src/plugin-sdk/channel-policy.ts | 19 + src/plugin-sdk/channel-runtime.ts | 1 + src/plugin-sdk/compat.ts | 29 +- src/plugin-sdk/core.ts | 37 +- src/plugin-sdk/directory-runtime.ts | 9 + src/plugin-sdk/index.test.ts | 61 +- src/plugin-sdk/index.ts | 798 +----------------- src/plugin-sdk/provider-auth.ts | 1 + src/plugin-sdk/provider-models.ts | 72 +- src/plugin-sdk/reply-history.ts | 14 + src/plugin-sdk/root-alias.cjs | 4 +- src/plugin-sdk/subpaths.test.ts | 20 +- 102 files changed, 418 insertions(+), 1647 deletions(-) create mode 100644 extensions/discord/src/monitor/preflight-audio.runtime.ts create mode 100644 extensions/telegram/src/media-understanding.runtime.ts create mode 100644 src/cli/send-runtime/discord.ts create mode 100644 src/cli/send-runtime/imessage.ts create mode 100644 src/cli/send-runtime/signal.ts create mode 100644 src/cli/send-runtime/slack.ts create mode 100644 src/cli/send-runtime/telegram.ts create mode 100644 src/cli/send-runtime/whatsapp.ts delete mode 100644 src/plugin-sdk-internal/accounts.ts delete mode 100644 src/plugin-sdk-internal/channel-config.ts delete mode 100644 src/plugin-sdk-internal/core.ts delete mode 100644 src/plugin-sdk-internal/discord.ts delete mode 100644 src/plugin-sdk-internal/imessage.ts delete mode 100644 src/plugin-sdk-internal/setup.ts delete mode 100644 src/plugin-sdk-internal/signal.ts delete mode 100644 src/plugin-sdk-internal/slack.ts delete mode 100644 src/plugin-sdk-internal/telegram.ts delete mode 100644 src/plugin-sdk-internal/whatsapp.ts create mode 100644 src/plugin-sdk/channel-config-schema.ts create mode 100644 src/plugin-sdk/channel-policy.ts create mode 100644 src/plugin-sdk/directory-runtime.ts create mode 100644 src/plugin-sdk/reply-history.ts diff --git a/docs/tools/plugin.md b/docs/tools/plugin.md index da07776d8ce..db074c011d9 100644 --- a/docs/tools/plugin.md +++ b/docs/tools/plugin.md @@ -920,8 +920,16 @@ Notes: Use SDK subpaths instead of the monolithic `openclaw/plugin-sdk` import when authoring plugins: -- `openclaw/plugin-sdk/core` for generic plugin APIs, provider auth types, and shared helpers such as routing/session utilities and logger-backed runtimes. -- `openclaw/plugin-sdk/compat` for bundled/internal plugin code that needs broader shared runtime helpers than `core`. +- `openclaw/plugin-sdk/core` for the smallest generic plugin-facing contract. +- Domain subpaths such as `openclaw/plugin-sdk/channel-config-helpers`, + `openclaw/plugin-sdk/channel-config-schema`, + `openclaw/plugin-sdk/channel-policy`, + `openclaw/plugin-sdk/reply-history`, + `openclaw/plugin-sdk/routing`, + `openclaw/plugin-sdk/runtime-store`, and + `openclaw/plugin-sdk/directory-runtime` for shared runtime/config helpers. +- `openclaw/plugin-sdk/compat` remains as a legacy migration surface for older + external plugins. Bundled plugins should not use it. - `openclaw/plugin-sdk/telegram` for Telegram channel plugin types and shared channel-facing helpers. Built-in Telegram implementation internals stay private to the bundled extension. - `openclaw/plugin-sdk/discord` for Discord channel plugin types and shared channel-facing helpers. Built-in Discord implementation internals stay private to the bundled extension. - `openclaw/plugin-sdk/slack` for Slack channel plugin types and shared channel-facing helpers. Built-in Slack implementation internals stay private to the bundled extension. @@ -982,8 +990,8 @@ Compatibility note: - `openclaw/plugin-sdk` remains supported for existing external plugins. - New and migrated bundled plugins should use channel or extension-specific - subpaths; use `core` for generic surfaces and `compat` only when broader - shared helpers are required. + subpaths; use `core` plus explicit domain subpaths for generic surfaces, and + treat `compat` as migration-only. ## Read-only channel inspection diff --git a/extensions/bluebubbles/src/channel.ts b/extensions/bluebubbles/src/channel.ts index 2fe2fc3f3fb..9550c1166ed 100644 --- a/extensions/bluebubbles/src/channel.ts +++ b/extensions/bluebubbles/src/channel.ts @@ -1,3 +1,4 @@ +import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from"; import type { ChannelAccountSnapshot, ChannelPlugin } from "openclaw/plugin-sdk/bluebubbles"; import { buildChannelConfigSchema, @@ -11,13 +12,12 @@ import { resolveBlueBubblesGroupToolPolicy, setAccountEnabledInConfigSection, } from "openclaw/plugin-sdk/bluebubbles"; +import { mapAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers"; +import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle"; import { buildAccountScopedDmSecurityPolicy, collectOpenGroupPolicyRestrictSendersWarnings, - createAccountStatusSink, - formatNormalizedAllowFromEntries, - mapAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { listBlueBubblesAccountIds, type ResolvedBlueBubblesAccount, diff --git a/extensions/bluebubbles/src/config-schema.ts b/extensions/bluebubbles/src/config-schema.ts index 76fe4523f16..da66869708e 100644 --- a/extensions/bluebubbles/src/config-schema.ts +++ b/extensions/bluebubbles/src/config-schema.ts @@ -4,7 +4,7 @@ import { buildCatchallMultiAccountChannelSchema, DmPolicySchema, GroupPolicySchema, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-schema"; import { z } from "zod"; import { buildSecretInputSchema, hasConfiguredSecretInput } from "./secret-input.js"; diff --git a/extensions/bluebubbles/src/runtime.ts b/extensions/bluebubbles/src/runtime.ts index ee91445d69b..eae7bb24a29 100644 --- a/extensions/bluebubbles/src/runtime.ts +++ b/extensions/bluebubbles/src/runtime.ts @@ -1,5 +1,5 @@ import type { PluginRuntime } from "openclaw/plugin-sdk/bluebubbles"; -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const runtimeStore = createPluginRuntimeStore("BlueBubbles runtime not initialized"); type LegacyRuntimeLogShape = { log?: (message: string) => void }; diff --git a/extensions/discord/src/channel.ts b/extensions/discord/src/channel.ts index a9db3a7937f..761ccb5f8b5 100644 --- a/extensions/discord/src/channel.ts +++ b/extensions/discord/src/channel.ts @@ -10,11 +10,6 @@ import { } from "openclaw/plugin-sdk/channel-config-helpers"; import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-runtime"; import { normalizeMessageChannel } from "openclaw/plugin-sdk/channel-runtime"; -import { - buildAgentSessionKey, - resolveThreadSessionKeys, - type RoutePeer, -} from "openclaw/plugin-sdk/core"; import { buildComputedAccountStatusSnapshot, buildChannelConfigSchema, @@ -33,6 +28,11 @@ import { type ChannelPlugin, type OpenClawConfig, } from "openclaw/plugin-sdk/discord"; +import { + buildAgentSessionKey, + resolveThreadSessionKeys, + type RoutePeer, +} from "openclaw/plugin-sdk/routing"; import { listDiscordAccountIds, resolveDiscordAccount, diff --git a/extensions/discord/src/monitor/preflight-audio.runtime.ts b/extensions/discord/src/monitor/preflight-audio.runtime.ts new file mode 100644 index 00000000000..5232d2ccb54 --- /dev/null +++ b/extensions/discord/src/monitor/preflight-audio.runtime.ts @@ -0,0 +1 @@ +export { transcribeFirstAudio } from "openclaw/plugin-sdk/media-runtime"; diff --git a/extensions/discord/src/monitor/preflight-audio.ts b/extensions/discord/src/monitor/preflight-audio.ts index f26fe5de9a9..97bbbdd273d 100644 --- a/extensions/discord/src/monitor/preflight-audio.ts +++ b/extensions/discord/src/monitor/preflight-audio.ts @@ -50,7 +50,7 @@ export async function resolveDiscordPreflightAudioMentionContext(params: { }; } try { - const { transcribeFirstAudio } = await import("openclaw/plugin-sdk/media-runtime"); + const { transcribeFirstAudio } = await import("./preflight-audio.runtime.js"); if (params.abortSignal?.aborted) { return { hasAudioAttachment, diff --git a/extensions/discord/src/shared.ts b/extensions/discord/src/shared.ts index 651e6d987f3..03174404bdb 100644 --- a/extensions/discord/src/shared.ts +++ b/extensions/discord/src/shared.ts @@ -1,12 +1,14 @@ -import { createScopedChannelConfigBase } from "openclaw/plugin-sdk/compat"; +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; import { createScopedAccountConfigAccessors, - formatAllowFromLowercase, -} from "openclaw/plugin-sdk/compat"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; -import type { ChannelPlugin } from "../../../src/channels/plugins/types.plugin.js"; -import { getChatChannelMeta } from "../../../src/channels/registry.js"; -import { DiscordConfigSchema } from "../../../src/config/zod-schema.providers-core.js"; + createScopedChannelConfigBase, +} from "openclaw/plugin-sdk/channel-config-helpers"; +import { + buildChannelConfigSchema, + DiscordConfigSchema, + getChatChannelMeta, + type ChannelPlugin, +} from "openclaw/plugin-sdk/discord"; import { inspectDiscordAccount } from "./account-inspect.js"; import { listDiscordAccountIds, diff --git a/extensions/feishu/src/channel.ts b/extensions/feishu/src/channel.ts index 5d47c55e16b..1964331e7e0 100644 --- a/extensions/feishu/src/channel.ts +++ b/extensions/feishu/src/channel.ts @@ -1,8 +1,6 @@ -import { - collectAllowlistProviderRestrictSendersWarnings, - formatAllowFromLowercase, - mapAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; +import { mapAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers"; +import { collectAllowlistProviderRestrictSendersWarnings } from "openclaw/plugin-sdk/channel-policy"; import type { ChannelMeta, ChannelPlugin, ClawdbotConfig } from "openclaw/plugin-sdk/feishu"; import { buildChannelConfigSchema, diff --git a/extensions/feishu/src/directory.static.ts b/extensions/feishu/src/directory.static.ts index b79e4e94f77..4adefe2ae0f 100644 --- a/extensions/feishu/src/directory.static.ts +++ b/extensions/feishu/src/directory.static.ts @@ -1,7 +1,7 @@ import { listDirectoryGroupEntriesFromMapKeysAndAllowFrom, listDirectoryUserEntriesFromAllowFromAndMapKeys, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/directory-runtime"; import type { ClawdbotConfig } from "openclaw/plugin-sdk/feishu"; import { resolveFeishuAccount } from "./accounts.js"; import { normalizeFeishuTarget } from "./targets.js"; diff --git a/extensions/feishu/src/runtime.ts b/extensions/feishu/src/runtime.ts index 2e174a59320..aad0a41c50a 100644 --- a/extensions/feishu/src/runtime.ts +++ b/extensions/feishu/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/feishu"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setFeishuRuntime, getRuntime: getFeishuRuntime } = createPluginRuntimeStore("Feishu runtime not initialized"); diff --git a/extensions/google/gemini-cli-provider.ts b/extensions/google/gemini-cli-provider.ts index 6db7561a10b..45b00c1be28 100644 --- a/extensions/google/gemini-cli-provider.ts +++ b/extensions/google/gemini-cli-provider.ts @@ -1,9 +1,9 @@ -import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/core"; import type { OpenClawPluginApi, ProviderAuthContext, ProviderFetchUsageSnapshotContext, } from "openclaw/plugin-sdk/core"; +import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/provider-auth"; import { fetchGeminiUsage } from "openclaw/plugin-sdk/provider-usage"; import { loginGeminiCliOAuth } from "./oauth.js"; import { isModernGoogleModel, resolveGoogle31ForwardCompatModel } from "./provider-models.js"; diff --git a/extensions/googlechat/src/channel.ts b/extensions/googlechat/src/channel.ts index bd06b33f8df..faa1b4e4930 100644 --- a/extensions/googlechat/src/channel.ts +++ b/extensions/googlechat/src/channel.ts @@ -1,11 +1,13 @@ -import { createScopedChannelConfigBase } from "openclaw/plugin-sdk/compat"; +import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from"; +import { + createScopedAccountConfigAccessors, + createScopedChannelConfigBase, + createScopedDmSecurityResolver, +} from "openclaw/plugin-sdk/channel-config-helpers"; import { buildOpenGroupPolicyConfigureRouteAllowlistWarning, collectAllowlistProviderGroupPolicyWarnings, - createScopedAccountConfigAccessors, - createScopedDmSecurityResolver, - formatNormalizedAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { buildComputedAccountStatusSnapshot, buildChannelConfigSchema, diff --git a/extensions/googlechat/src/runtime.ts b/extensions/googlechat/src/runtime.ts index 44731cba8ea..333a8911cbb 100644 --- a/extensions/googlechat/src/runtime.ts +++ b/extensions/googlechat/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/googlechat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setGoogleChatRuntime, getRuntime: getGoogleChatRuntime } = createPluginRuntimeStore("Google Chat runtime not initialized"); diff --git a/extensions/imessage/src/channel.ts b/extensions/imessage/src/channel.ts index 4df6e6bf9d3..f17a9645579 100644 --- a/extensions/imessage/src/channel.ts +++ b/extensions/imessage/src/channel.ts @@ -3,7 +3,8 @@ import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderRestrictSendersWarnings, } from "openclaw/plugin-sdk/channel-config-helpers"; -import { buildAgentSessionKey, type RoutePeer } from "openclaw/plugin-sdk/core"; +import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-runtime"; +import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-runtime"; import { collectStatusIssuesFromLastError, DEFAULT_ACCOUNT_ID, @@ -14,6 +15,7 @@ import { resolveIMessageGroupToolPolicy, type ChannelPlugin, } from "openclaw/plugin-sdk/imessage"; +import { buildAgentSessionKey, type RoutePeer } from "openclaw/plugin-sdk/routing"; import { buildPassiveProbedChannelStatusSummary } from "../../shared/channel-status-summary.js"; import { resolveIMessageAccount, type ResolvedIMessageAccount } from "./accounts.js"; import { getIMessageRuntime } from "./runtime.js"; diff --git a/extensions/imessage/src/shared.ts b/extensions/imessage/src/shared.ts index 90e5c2dfe3a..1ede2ad412d 100644 --- a/extensions/imessage/src/shared.ts +++ b/extensions/imessage/src/shared.ts @@ -1,7 +1,7 @@ import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderRestrictSendersWarnings, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { deleteAccountFromConfigSection, setAccountEnabledInConfigSection, diff --git a/extensions/irc/src/accounts.ts b/extensions/irc/src/accounts.ts index 9367a7d2123..f1831b02d48 100644 --- a/extensions/irc/src/accounts.ts +++ b/extensions/irc/src/accounts.ts @@ -1,5 +1,5 @@ import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; -import { tryReadSecretFileSync } from "openclaw/plugin-sdk/core"; +import { tryReadSecretFileSync } from "openclaw/plugin-sdk/infra-runtime"; import { createAccountListHelpers, normalizeResolvedSecretInputString, diff --git a/extensions/irc/src/channel.ts b/extensions/irc/src/channel.ts index ca53d53a93d..ed754933e68 100644 --- a/extensions/irc/src/channel.ts +++ b/extensions/irc/src/channel.ts @@ -1,10 +1,10 @@ +import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from"; +import { createScopedAccountConfigAccessors } from "openclaw/plugin-sdk/channel-config-helpers"; import { buildAccountScopedDmSecurityPolicy, buildOpenGroupPolicyWarning, collectAllowlistProviderGroupPolicyWarnings, - createScopedAccountConfigAccessors, - formatNormalizedAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { buildBaseAccountStatusSnapshot, buildBaseChannelStatusSummary, diff --git a/extensions/irc/src/runtime.ts b/extensions/irc/src/runtime.ts index e1d60a14652..32d479d13e9 100644 --- a/extensions/irc/src/runtime.ts +++ b/extensions/irc/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/irc"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setIrcRuntime, getRuntime: getIrcRuntime } = createPluginRuntimeStore("IRC runtime not initialized"); diff --git a/extensions/line/src/channel.ts b/extensions/line/src/channel.ts index b184ebe8482..ee3c9597eab 100644 --- a/extensions/line/src/channel.ts +++ b/extensions/line/src/channel.ts @@ -1,9 +1,9 @@ import { - collectAllowlistProviderRestrictSendersWarnings, createScopedAccountConfigAccessors, createScopedChannelConfigBase, createScopedDmSecurityResolver, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-helpers"; +import { collectAllowlistProviderRestrictSendersWarnings } from "openclaw/plugin-sdk/channel-policy"; import { buildChannelConfigSchema, buildComputedAccountStatusSnapshot, diff --git a/extensions/line/src/runtime.ts b/extensions/line/src/runtime.ts index 57307cbe64e..65dd4d5394b 100644 --- a/extensions/line/src/runtime.ts +++ b/extensions/line/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/line"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setLineRuntime, getRuntime: getLineRuntime } = createPluginRuntimeStore("LINE runtime not initialized - plugin not registered"); diff --git a/extensions/matrix/src/channel.ts b/extensions/matrix/src/channel.ts index 6b0380bc19e..d82d3eb2bdb 100644 --- a/extensions/matrix/src/channel.ts +++ b/extensions/matrix/src/channel.ts @@ -1,10 +1,12 @@ import { - buildOpenGroupPolicyWarning, - collectAllowlistProviderGroupPolicyWarnings, createScopedAccountConfigAccessors, createScopedChannelConfigBase, createScopedDmSecurityResolver, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-helpers"; +import { + buildOpenGroupPolicyWarning, + collectAllowlistProviderGroupPolicyWarnings, +} from "openclaw/plugin-sdk/channel-policy"; import { buildChannelConfigSchema, buildProbeChannelStatusSummary, diff --git a/extensions/matrix/src/config-schema.ts b/extensions/matrix/src/config-schema.ts index a95d2fbda96..18d05d69336 100644 --- a/extensions/matrix/src/config-schema.ts +++ b/extensions/matrix/src/config-schema.ts @@ -3,7 +3,7 @@ import { buildNestedDmConfigSchema, DmPolicySchema, GroupPolicySchema, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-schema"; import { MarkdownConfigSchema, ToolPolicySchema } from "openclaw/plugin-sdk/matrix"; import { z } from "zod"; import { buildSecretInputSchema } from "./secret-input.js"; diff --git a/extensions/matrix/src/resolve-targets.ts b/extensions/matrix/src/resolve-targets.ts index 2c179492cb0..79b794e1806 100644 --- a/extensions/matrix/src/resolve-targets.ts +++ b/extensions/matrix/src/resolve-targets.ts @@ -1,4 +1,4 @@ -import { mapAllowlistResolutionInputs } from "openclaw/plugin-sdk/compat"; +import { mapAllowlistResolutionInputs } from "openclaw/plugin-sdk/allowlist-resolution"; import type { ChannelDirectoryEntry, ChannelResolveKind, diff --git a/extensions/matrix/src/runtime.ts b/extensions/matrix/src/runtime.ts index eefce7b910a..f57cd92a017 100644 --- a/extensions/matrix/src/runtime.ts +++ b/extensions/matrix/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/matrix"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setMatrixRuntime, getRuntime: getMatrixRuntime } = createPluginRuntimeStore("Matrix runtime not initialized"); diff --git a/extensions/mattermost/src/channel.ts b/extensions/mattermost/src/channel.ts index 4bf52904b3f..887a878c5e8 100644 --- a/extensions/mattermost/src/channel.ts +++ b/extensions/mattermost/src/channel.ts @@ -1,9 +1,9 @@ +import { formatNormalizedAllowFromEntries } from "openclaw/plugin-sdk/allow-from"; +import { createScopedAccountConfigAccessors } from "openclaw/plugin-sdk/channel-config-helpers"; import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderRestrictSendersWarnings, - createScopedAccountConfigAccessors, - formatNormalizedAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { buildComputedAccountStatusSnapshot, buildChannelConfigSchema, diff --git a/extensions/mattermost/src/group-mentions.ts b/extensions/mattermost/src/group-mentions.ts index 1ab85c15448..153edc2c84c 100644 --- a/extensions/mattermost/src/group-mentions.ts +++ b/extensions/mattermost/src/group-mentions.ts @@ -1,4 +1,4 @@ -import { resolveChannelGroupRequireMention } from "openclaw/plugin-sdk/compat"; +import { resolveChannelGroupRequireMention } from "openclaw/plugin-sdk/channel-policy"; import type { ChannelGroupContext } from "openclaw/plugin-sdk/mattermost"; import { resolveMattermostAccount } from "./mattermost/accounts.js"; diff --git a/extensions/mattermost/src/runtime.ts b/extensions/mattermost/src/runtime.ts index 1f112c8361f..b5ec1942973 100644 --- a/extensions/mattermost/src/runtime.ts +++ b/extensions/mattermost/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/mattermost"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setMattermostRuntime, getRuntime: getMattermostRuntime } = createPluginRuntimeStore("Mattermost runtime not initialized"); diff --git a/extensions/msteams/src/channel.ts b/extensions/msteams/src/channel.ts index c4d3f41054c..d61a377dd4d 100644 --- a/extensions/msteams/src/channel.ts +++ b/extensions/msteams/src/channel.ts @@ -1,7 +1,5 @@ -import { - collectAllowlistProviderRestrictSendersWarnings, - formatAllowFromLowercase, -} from "openclaw/plugin-sdk/compat"; +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; +import { collectAllowlistProviderRestrictSendersWarnings } from "openclaw/plugin-sdk/channel-policy"; import type { ChannelMessageActionName, ChannelPlugin, diff --git a/extensions/msteams/src/resolve-allowlist.ts b/extensions/msteams/src/resolve-allowlist.ts index 374cae2d965..3e28cf8a8cb 100644 --- a/extensions/msteams/src/resolve-allowlist.ts +++ b/extensions/msteams/src/resolve-allowlist.ts @@ -1,4 +1,4 @@ -import { mapAllowlistResolutionInputs } from "openclaw/plugin-sdk/compat"; +import { mapAllowlistResolutionInputs } from "openclaw/plugin-sdk/allowlist-resolution"; import { searchGraphUsers } from "./graph-users.js"; import { listChannelsForTeam, diff --git a/extensions/msteams/src/runtime.ts b/extensions/msteams/src/runtime.ts index f9d1dec5714..016d12e9b29 100644 --- a/extensions/msteams/src/runtime.ts +++ b/extensions/msteams/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/msteams"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setMSTeamsRuntime, getRuntime: getMSTeamsRuntime } = createPluginRuntimeStore("MSTeams runtime not initialized"); diff --git a/extensions/nextcloud-talk/src/accounts.ts b/extensions/nextcloud-talk/src/accounts.ts index 2cfba6fea44..1b9d2c16f93 100644 --- a/extensions/nextcloud-talk/src/accounts.ts +++ b/extensions/nextcloud-talk/src/accounts.ts @@ -1,4 +1,4 @@ -import { tryReadSecretFileSync } from "openclaw/plugin-sdk/core"; +import { tryReadSecretFileSync } from "openclaw/plugin-sdk/infra-runtime"; import { createAccountListHelpers, DEFAULT_ACCOUNT_ID, diff --git a/extensions/nextcloud-talk/src/channel.ts b/extensions/nextcloud-talk/src/channel.ts index 77ca7ed36f9..6101136a5e3 100644 --- a/extensions/nextcloud-talk/src/channel.ts +++ b/extensions/nextcloud-talk/src/channel.ts @@ -1,11 +1,11 @@ +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; +import { mapAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers"; +import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle"; import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderGroupPolicyWarnings, collectOpenGroupPolicyRouteAllowlistWarnings, - createAccountStatusSink, - formatAllowFromLowercase, - mapAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { buildBaseChannelStatusSummary, buildChannelConfigSchema, diff --git a/extensions/nextcloud-talk/src/runtime.ts b/extensions/nextcloud-talk/src/runtime.ts index 4e539eb3687..facf3a0cc05 100644 --- a/extensions/nextcloud-talk/src/runtime.ts +++ b/extensions/nextcloud-talk/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/nextcloud-talk"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setNextcloudTalkRuntime, getRuntime: getNextcloudTalkRuntime } = createPluginRuntimeStore("Nextcloud Talk runtime not initialized"); diff --git a/extensions/nostr/src/config-schema.ts b/extensions/nostr/src/config-schema.ts index 25d928b4837..53346b0789d 100644 --- a/extensions/nostr/src/config-schema.ts +++ b/extensions/nostr/src/config-schema.ts @@ -1,4 +1,4 @@ -import { AllowFromListSchema, DmPolicySchema } from "openclaw/plugin-sdk/compat"; +import { AllowFromListSchema, DmPolicySchema } from "openclaw/plugin-sdk/channel-config-schema"; import { MarkdownConfigSchema, buildChannelConfigSchema } from "openclaw/plugin-sdk/nostr"; import { z } from "zod"; diff --git a/extensions/nostr/src/runtime.ts b/extensions/nostr/src/runtime.ts index 347079d9750..7c70d903712 100644 --- a/extensions/nostr/src/runtime.ts +++ b/extensions/nostr/src/runtime.ts @@ -1,5 +1,5 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; import type { PluginRuntime } from "openclaw/plugin-sdk/nostr"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; const { setRuntime: setNostrRuntime, getRuntime: getNostrRuntime } = createPluginRuntimeStore("Nostr runtime not initialized"); diff --git a/extensions/openai/openai-codex-provider.ts b/extensions/openai/openai-codex-provider.ts index 6ea59a2e7a7..02407d3879a 100644 --- a/extensions/openai/openai-codex-provider.ts +++ b/extensions/openai/openai-codex-provider.ts @@ -4,7 +4,7 @@ import type { ProviderResolveDynamicModelContext, ProviderRuntimeModel, } from "openclaw/plugin-sdk/core"; -import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/core"; +import { buildOauthProviderAuthResult } from "openclaw/plugin-sdk/provider-auth"; import { CODEX_CLI_PROFILE_ID, ensureAuthProfileStore, diff --git a/extensions/shared/passive-monitor.ts b/extensions/shared/passive-monitor.ts index 0be48afd014..435f934b123 100644 --- a/extensions/shared/passive-monitor.ts +++ b/extensions/shared/passive-monitor.ts @@ -1,4 +1,4 @@ -import { runPassiveAccountLifecycle } from "openclaw/plugin-sdk/core"; +import { runPassiveAccountLifecycle } from "openclaw/plugin-sdk/channel-runtime"; type StoppableMonitor = { stop: () => void; diff --git a/extensions/shared/runtime.ts b/extensions/shared/runtime.ts index 2a75360aa20..a534fc57d4b 100644 --- a/extensions/shared/runtime.ts +++ b/extensions/shared/runtime.ts @@ -1,4 +1,4 @@ -import { createLoggerBackedRuntime } from "openclaw/plugin-sdk/core"; +import { createLoggerBackedRuntime } from "openclaw/plugin-sdk/runtime"; export function resolveLoggerBackedRuntime( runtime: TRuntime | undefined, diff --git a/extensions/signal/src/channel.ts b/extensions/signal/src/channel.ts index bd0085e9dfd..b86f0156a08 100644 --- a/extensions/signal/src/channel.ts +++ b/extensions/signal/src/channel.ts @@ -5,8 +5,8 @@ import { } from "openclaw/plugin-sdk/channel-config-helpers"; import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-runtime"; import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/config-runtime"; -import { buildAgentSessionKey, type RoutePeer } from "openclaw/plugin-sdk/core"; import { resolveTextChunkLimit } from "openclaw/plugin-sdk/reply-runtime"; +import { buildAgentSessionKey, type RoutePeer } from "openclaw/plugin-sdk/routing"; import { buildBaseAccountStatusSnapshot, buildBaseChannelStatusSummary, diff --git a/extensions/signal/src/shared.ts b/extensions/signal/src/shared.ts index b1c1982f157..60dfd0ed010 100644 --- a/extensions/signal/src/shared.ts +++ b/extensions/signal/src/shared.ts @@ -1,8 +1,8 @@ +import { createScopedAccountConfigAccessors } from "openclaw/plugin-sdk/channel-config-helpers"; import { buildAccountScopedDmSecurityPolicy, collectAllowlistProviderRestrictSendersWarnings, - createScopedAccountConfigAccessors, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import { deleteAccountFromConfigSection, setAccountEnabledInConfigSection, diff --git a/extensions/slack/src/channel.ts b/extensions/slack/src/channel.ts index 66e640e1bcf..a3b537b1f8e 100644 --- a/extensions/slack/src/channel.ts +++ b/extensions/slack/src/channel.ts @@ -12,7 +12,7 @@ import { buildAgentSessionKey, resolveThreadSessionKeys, type RoutePeer, -} from "openclaw/plugin-sdk/core"; +} from "openclaw/plugin-sdk/routing"; import { buildComputedAccountStatusSnapshot, DEFAULT_ACCOUNT_ID, diff --git a/extensions/synology-chat/src/runtime.ts b/extensions/synology-chat/src/runtime.ts index 2f9b401192c..68df66decc7 100644 --- a/extensions/synology-chat/src/runtime.ts +++ b/extensions/synology-chat/src/runtime.ts @@ -1,4 +1,4 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import type { PluginRuntime } from "openclaw/plugin-sdk/synology-chat"; const { setRuntime: setSynologyRuntime, getRuntime: getSynologyRuntime } = diff --git a/extensions/telegram/src/bot-message-context.body.ts b/extensions/telegram/src/bot-message-context.body.ts index 5b4dc2f9cae..63e6aaa12dd 100644 --- a/extensions/telegram/src/bot-message-context.body.ts +++ b/extensions/telegram/src/bot-message-context.body.ts @@ -179,7 +179,7 @@ export async function resolveTelegramInboundBody(params: { if (needsPreflightTranscription) { try { - const { transcribeFirstAudio } = await import("openclaw/plugin-sdk/media-runtime"); + const { transcribeFirstAudio } = await import("./media-understanding.runtime.js"); const tempCtx: MsgContext = { MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : undefined, MediaTypes: diff --git a/extensions/telegram/src/channel.ts b/extensions/telegram/src/channel.ts index ebd8ddc2c24..ddc21911800 100644 --- a/extensions/telegram/src/channel.ts +++ b/extensions/telegram/src/channel.ts @@ -6,13 +6,13 @@ import { } from "openclaw/plugin-sdk/channel-config-helpers"; import { type OutboundSendDeps, resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-runtime"; import { normalizeMessageChannel } from "openclaw/plugin-sdk/channel-runtime"; +import { resolveExecApprovalCommandDisplay } from "openclaw/plugin-sdk/infra-runtime"; +import { buildExecApprovalPendingReplyPayload } from "openclaw/plugin-sdk/infra-runtime"; import { buildAgentSessionKey, resolveThreadSessionKeys, type RoutePeer, -} from "openclaw/plugin-sdk/core"; -import { resolveExecApprovalCommandDisplay } from "openclaw/plugin-sdk/infra-runtime"; -import { buildExecApprovalPendingReplyPayload } from "openclaw/plugin-sdk/infra-runtime"; +} from "openclaw/plugin-sdk/routing"; import { parseTelegramTopicConversation } from "openclaw/plugin-sdk/telegram"; import { buildTokenChannelStatusSummary, diff --git a/extensions/telegram/src/media-understanding.runtime.ts b/extensions/telegram/src/media-understanding.runtime.ts new file mode 100644 index 00000000000..3d20203caa8 --- /dev/null +++ b/extensions/telegram/src/media-understanding.runtime.ts @@ -0,0 +1 @@ +export { describeImageWithModel, transcribeFirstAudio } from "openclaw/plugin-sdk/media-runtime"; diff --git a/extensions/telegram/src/shared.ts b/extensions/telegram/src/shared.ts index 3dec7b28ef5..644869dbc60 100644 --- a/extensions/telegram/src/shared.ts +++ b/extensions/telegram/src/shared.ts @@ -1,14 +1,16 @@ -import { createScopedChannelConfigBase } from "openclaw/plugin-sdk/compat"; +import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from"; import { createScopedAccountConfigAccessors, - formatAllowFromLowercase, -} from "openclaw/plugin-sdk/compat"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; -import type { ChannelPlugin } from "../../../src/channels/plugins/types.plugin.js"; -import { getChatChannelMeta } from "../../../src/channels/registry.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { TelegramConfigSchema } from "../../../src/config/zod-schema.providers-core.js"; -import { normalizeAccountId } from "../../../src/routing/session-key.js"; + createScopedChannelConfigBase, +} from "openclaw/plugin-sdk/channel-config-helpers"; +import { + buildChannelConfigSchema, + getChatChannelMeta, + normalizeAccountId, + TelegramConfigSchema, + type ChannelPlugin, + type OpenClawConfig, +} from "openclaw/plugin-sdk/telegram"; import { inspectTelegramAccount } from "./account-inspect.js"; import { listTelegramAccountIds, diff --git a/extensions/telegram/src/sticker-cache.ts b/extensions/telegram/src/sticker-cache.ts index 18bfbbf4421..ea86bd8f1bf 100644 --- a/extensions/telegram/src/sticker-cache.ts +++ b/extensions/telegram/src/sticker-cache.ts @@ -143,10 +143,10 @@ export function getCacheStats(): { count: number; oldestAt?: string; newestAt?: const STICKER_DESCRIPTION_PROMPT = "Describe this sticker image in 1-2 sentences. Focus on what the sticker depicts (character, object, action, emotion). Be concise and objective."; -let imageRuntimePromise: Promise | null = null; +let imageRuntimePromise: Promise | null = null; function loadImageRuntime() { - imageRuntimePromise ??= import("openclaw/plugin-sdk/media-runtime"); + imageRuntimePromise ??= import("./media-understanding.runtime.js"); return imageRuntimePromise; } diff --git a/extensions/tlon/src/runtime.ts b/extensions/tlon/src/runtime.ts index 8df35088912..a07eb5cf648 100644 --- a/extensions/tlon/src/runtime.ts +++ b/extensions/tlon/src/runtime.ts @@ -1,4 +1,4 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import type { PluginRuntime } from "openclaw/plugin-sdk/tlon"; const { setRuntime: setTlonRuntime, getRuntime: getTlonRuntime } = diff --git a/extensions/twitch/src/runtime.ts b/extensions/twitch/src/runtime.ts index 18deeb40c07..2b2806cfdb3 100644 --- a/extensions/twitch/src/runtime.ts +++ b/extensions/twitch/src/runtime.ts @@ -1,4 +1,4 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import type { PluginRuntime } from "openclaw/plugin-sdk/twitch"; const { setRuntime: setTwitchRuntime, getRuntime: getTwitchRuntime } = diff --git a/extensions/whatsapp/src/channel.ts b/extensions/whatsapp/src/channel.ts index 3bf9bba0c34..11ac323afec 100644 --- a/extensions/whatsapp/src/channel.ts +++ b/extensions/whatsapp/src/channel.ts @@ -3,6 +3,7 @@ import { createActionGate, createWhatsAppOutboundBase, DEFAULT_ACCOUNT_ID, + formatWhatsAppConfigAllowFromEntries, listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, readStringParam, @@ -25,6 +26,7 @@ import { WHATSAPP_CHANNEL, } from "./shared.js"; import { collectWhatsAppStatusIssues } from "./status-issues.js"; + function normalizeWhatsAppPayloadText(text: string | undefined): string { return (text ?? "").replace(/^(?:[ \t]*\r?\n)+/, ""); } @@ -165,9 +167,12 @@ export const whatsappPlugin: ChannelPlugin = { auth: { login: async ({ cfg, accountId, runtime, verbose }) => { const resolvedAccountId = accountId?.trim() || whatsappPlugin.config.defaultAccountId(cfg); - await ( - await loadWhatsAppChannelRuntime() - ).loginWeb(Boolean(verbose), undefined, runtime, resolvedAccountId); + await (await loadWhatsAppChannelRuntime()).loginWeb( + Boolean(verbose), + undefined, + runtime, + resolvedAccountId, + ); }, }, heartbeat: { @@ -176,9 +181,9 @@ export const whatsappPlugin: ChannelPlugin = { return { ok: false, reason: "whatsapp-disabled" }; } const account = resolveWhatsAppAccount({ cfg, accountId }); - const authExists = await ( - deps?.webAuthExists ?? (await loadWhatsAppChannelRuntime()).webAuthExists - )(account.authDir); + const authExists = await (deps?.webAuthExists ?? (await loadWhatsAppChannelRuntime()).webAuthExists)( + account.authDir, + ); if (!authExists) { return { ok: false, reason: "whatsapp-not-linked" }; } @@ -214,7 +219,9 @@ export const whatsappPlugin: ChannelPlugin = { ? await (await loadWhatsAppChannelRuntime()).webAuthExists(authDir) : false; const authAgeMs = - linked && authDir ? (await loadWhatsAppChannelRuntime()).getWebAuthAgeMs(authDir) : null; + linked && authDir + ? (await loadWhatsAppChannelRuntime()).getWebAuthAgeMs(authDir) + : null; const self = linked && authDir ? (await loadWhatsAppChannelRuntime()).readWebSelfId(authDir) @@ -281,9 +288,7 @@ export const whatsappPlugin: ChannelPlugin = { ); }, loginWithQrStart: async ({ accountId, force, timeoutMs, verbose }) => - await ( - await loadWhatsAppChannelRuntime() - ).startWebLoginWithQr({ + await (await loadWhatsAppChannelRuntime()).startWebLoginWithQr({ accountId, force, timeoutMs, @@ -292,9 +297,7 @@ export const whatsappPlugin: ChannelPlugin = { loginWithQrWait: async ({ accountId, timeoutMs }) => await (await loadWhatsAppChannelRuntime()).waitForWebLogin({ accountId, timeoutMs }), logoutAccount: async ({ account, runtime }) => { - const cleared = await ( - await loadWhatsAppChannelRuntime() - ).logoutWeb({ + const cleared = await (await loadWhatsAppChannelRuntime()).logoutWeb({ authDir: account.authDir, isLegacyAuthDir: account.isLegacyAuthDir, runtime, diff --git a/extensions/whatsapp/src/shared.ts b/extensions/whatsapp/src/shared.ts index 6819f70866c..43df9bd7e6a 100644 --- a/extensions/whatsapp/src/shared.ts +++ b/extensions/whatsapp/src/shared.ts @@ -1,24 +1,20 @@ import { buildAccountScopedDmSecurityPolicy, + buildChannelConfigSchema, collectAllowlistProviderGroupPolicyWarnings, collectOpenGroupPolicyRouteAllowlistWarnings, -} from "openclaw/plugin-sdk/compat"; -import { buildChannelConfigSchema } from "../../../src/channels/plugins/config-schema.js"; -import { - resolveWhatsAppGroupRequireMention, - resolveWhatsAppGroupToolPolicy, -} from "../../../src/channels/plugins/group-mentions.js"; -import type { ChannelPlugin } from "../../../src/channels/plugins/types.plugin.js"; -import { resolveWhatsAppGroupIntroHint } from "../../../src/channels/plugins/whatsapp-shared.js"; -import { getChatChannelMeta } from "../../../src/channels/registry.js"; -import { WhatsAppConfigSchema } from "../../../src/config/zod-schema.providers-whatsapp.js"; -import { + DEFAULT_ACCOUNT_ID, formatWhatsAppConfigAllowFromEntries, + getChatChannelMeta, + normalizeE164, resolveWhatsAppConfigAllowFrom, resolveWhatsAppConfigDefaultTo, -} from "../../../src/plugin-sdk/channel-config-helpers.js"; -import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js"; -import { normalizeE164 } from "../../../src/utils.js"; + resolveWhatsAppGroupIntroHint, + resolveWhatsAppGroupRequireMention, + resolveWhatsAppGroupToolPolicy, + WhatsAppConfigSchema, + type ChannelPlugin, +} from "openclaw/plugin-sdk/whatsapp"; import { listWhatsAppAccountIds, resolveDefaultWhatsAppAccountId, diff --git a/extensions/zalo/src/channel.runtime.ts b/extensions/zalo/src/channel.runtime.ts index a376d52b94e..86ddc97dcf3 100644 --- a/extensions/zalo/src/channel.runtime.ts +++ b/extensions/zalo/src/channel.runtime.ts @@ -1,4 +1,4 @@ -import { createAccountStatusSink } from "openclaw/plugin-sdk/compat"; +import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle"; import { PAIRING_APPROVED_MESSAGE } from "openclaw/plugin-sdk/zalo"; import { probeZalo } from "./probe.js"; import { resolveZaloProxyFetch } from "./proxy.js"; diff --git a/extensions/zalo/src/channel.ts b/extensions/zalo/src/channel.ts index ed735bbd1c7..16e4560cd14 100644 --- a/extensions/zalo/src/channel.ts +++ b/extensions/zalo/src/channel.ts @@ -1,10 +1,10 @@ +import { mapAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers"; import { buildAccountScopedDmSecurityPolicy, buildOpenGroupPolicyRestrictSendersWarning, buildOpenGroupPolicyWarning, collectOpenProviderGroupPolicyWarnings, - mapAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-policy"; import type { ChannelAccountSnapshot, ChannelPlugin, diff --git a/extensions/zalo/src/config-schema.ts b/extensions/zalo/src/config-schema.ts index 253830eb858..d70e1441d9b 100644 --- a/extensions/zalo/src/config-schema.ts +++ b/extensions/zalo/src/config-schema.ts @@ -3,7 +3,7 @@ import { buildCatchallMultiAccountChannelSchema, DmPolicySchema, GroupPolicySchema, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-schema"; import { MarkdownConfigSchema } from "openclaw/plugin-sdk/zalo"; import { z } from "zod"; import { buildSecretInputSchema } from "./secret-input.js"; diff --git a/extensions/zalo/src/runtime.ts b/extensions/zalo/src/runtime.ts index 10f417b3c7f..f36309db5c5 100644 --- a/extensions/zalo/src/runtime.ts +++ b/extensions/zalo/src/runtime.ts @@ -1,4 +1,4 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import type { PluginRuntime } from "openclaw/plugin-sdk/zalo"; const { setRuntime: setZaloRuntime, getRuntime: getZaloRuntime } = diff --git a/extensions/zalo/src/token.ts b/extensions/zalo/src/token.ts index 10a4aca6cd1..9e8eec34caa 100644 --- a/extensions/zalo/src/token.ts +++ b/extensions/zalo/src/token.ts @@ -1,5 +1,5 @@ import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id"; -import { tryReadSecretFileSync } from "openclaw/plugin-sdk/core"; +import { tryReadSecretFileSync } from "openclaw/plugin-sdk/infra-runtime"; import type { BaseTokenResolution } from "openclaw/plugin-sdk/zalo"; import { normalizeResolvedSecretInputString, normalizeSecretInputString } from "./secret-input.js"; import type { ZaloConfig } from "./types.js"; diff --git a/extensions/zalouser/src/channel.ts b/extensions/zalouser/src/channel.ts index 7e79b186c3d..1fee83709ef 100644 --- a/extensions/zalouser/src/channel.ts +++ b/extensions/zalouser/src/channel.ts @@ -1,8 +1,6 @@ -import { - buildAccountScopedDmSecurityPolicy, - createAccountStatusSink, - mapAllowFromEntries, -} from "openclaw/plugin-sdk/compat"; +import { mapAllowFromEntries } from "openclaw/plugin-sdk/channel-config-helpers"; +import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle"; +import { buildAccountScopedDmSecurityPolicy } from "openclaw/plugin-sdk/channel-policy"; import type { ChannelAccountSnapshot, ChannelDirectoryEntry, diff --git a/extensions/zalouser/src/config-schema.ts b/extensions/zalouser/src/config-schema.ts index 1ff115876c4..475ba16bca2 100644 --- a/extensions/zalouser/src/config-schema.ts +++ b/extensions/zalouser/src/config-schema.ts @@ -3,7 +3,7 @@ import { buildCatchallMultiAccountChannelSchema, DmPolicySchema, GroupPolicySchema, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/channel-config-schema"; import { MarkdownConfigSchema, ToolPolicySchema } from "openclaw/plugin-sdk/zalouser"; import { z } from "zod"; diff --git a/extensions/zalouser/src/monitor.ts b/extensions/zalouser/src/monitor.ts index b96ff8cdf0d..e4acdd61cb9 100644 --- a/extensions/zalouser/src/monitor.ts +++ b/extensions/zalouser/src/monitor.ts @@ -1,13 +1,15 @@ import { DM_GROUP_ACCESS_REASON, + resolveDmGroupAccessWithLists, +} from "openclaw/plugin-sdk/channel-policy"; +import { KeyedAsyncQueue } from "openclaw/plugin-sdk/keyed-async-queue"; +import { DEFAULT_GROUP_HISTORY_LIMIT, type HistoryEntry, - KeyedAsyncQueue, buildPendingHistoryContextFromMap, clearHistoryEntriesIfEnabled, recordPendingHistoryEntryIfEnabled, - resolveDmGroupAccessWithLists, -} from "openclaw/plugin-sdk/compat"; +} from "openclaw/plugin-sdk/reply-history"; import type { MarkdownTableMode, OpenClawConfig, diff --git a/extensions/zalouser/src/runtime.ts b/extensions/zalouser/src/runtime.ts index 44cf09edbc7..eaa93ec1b20 100644 --- a/extensions/zalouser/src/runtime.ts +++ b/extensions/zalouser/src/runtime.ts @@ -1,4 +1,4 @@ -import { createPluginRuntimeStore } from "openclaw/plugin-sdk/compat"; +import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store"; import type { PluginRuntime } from "openclaw/plugin-sdk/zalouser"; const { setRuntime: setZalouserRuntime, getRuntime: getZalouserRuntime } = diff --git a/package.json b/package.json index c22a05548cd..002dff9d4e5 100644 --- a/package.json +++ b/package.json @@ -310,6 +310,10 @@ "types": "./dist/plugin-sdk/allow-from.d.ts", "default": "./dist/plugin-sdk/allow-from.js" }, + "./plugin-sdk/allowlist-resolution": { + "types": "./dist/plugin-sdk/allowlist-resolution.d.ts", + "default": "./dist/plugin-sdk/allowlist-resolution.js" + }, "./plugin-sdk/allowlist-config-edit": { "types": "./dist/plugin-sdk/allowlist-config-edit.d.ts", "default": "./dist/plugin-sdk/allowlist-config-edit.js" @@ -322,10 +326,22 @@ "types": "./dist/plugin-sdk/channel-config-helpers.d.ts", "default": "./dist/plugin-sdk/channel-config-helpers.js" }, + "./plugin-sdk/channel-config-schema": { + "types": "./dist/plugin-sdk/channel-config-schema.d.ts", + "default": "./dist/plugin-sdk/channel-config-schema.js" + }, + "./plugin-sdk/channel-policy": { + "types": "./dist/plugin-sdk/channel-policy.d.ts", + "default": "./dist/plugin-sdk/channel-policy.js" + }, "./plugin-sdk/group-access": { "types": "./dist/plugin-sdk/group-access.d.ts", "default": "./dist/plugin-sdk/group-access.js" }, + "./plugin-sdk/directory-runtime": { + "types": "./dist/plugin-sdk/directory-runtime.d.ts", + "default": "./dist/plugin-sdk/directory-runtime.js" + }, "./plugin-sdk/json-store": { "types": "./dist/plugin-sdk/json-store.d.ts", "default": "./dist/plugin-sdk/json-store.js" @@ -362,6 +378,10 @@ "types": "./dist/plugin-sdk/provider-web-search.d.ts", "default": "./dist/plugin-sdk/provider-web-search.js" }, + "./plugin-sdk/reply-history": { + "types": "./dist/plugin-sdk/reply-history.d.ts", + "default": "./dist/plugin-sdk/reply-history.js" + }, "./plugin-sdk/media-understanding": { "types": "./dist/plugin-sdk/media-understanding.d.ts", "default": "./dist/plugin-sdk/media-understanding.js" diff --git a/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts b/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts index dacf30b5623..32c4646009a 100644 --- a/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts +++ b/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts @@ -5,14 +5,14 @@ import { discoverOpenClawPlugins } from "../src/plugins/discovery.js"; // Match exact monolithic-root specifier in any code path: // imports/exports, require/dynamic import, and test mocks (vi.mock/jest.mock). const ROOT_IMPORT_PATTERN = /["']openclaw\/plugin-sdk["']/; -const LEGACY_ROUTING_IMPORT_PATTERN = /["']openclaw\/plugin-sdk\/routing["']/; +const LEGACY_COMPAT_IMPORT_PATTERN = /["']openclaw\/plugin-sdk\/compat["']/; function hasMonolithicRootImport(content: string): boolean { return ROOT_IMPORT_PATTERN.test(content); } -function hasLegacyRoutingImport(content: string): boolean { - return LEGACY_ROUTING_IMPORT_PATTERN.test(content); +function hasLegacyCompatImport(content: string): boolean { + return LEGACY_COMPAT_IMPORT_PATTERN.test(content); } function isSourceFile(filePath: string): boolean { @@ -83,7 +83,7 @@ function main() { } const monolithicOffenders: string[] = []; - const legacyRoutingOffenders: string[] = []; + const legacyCompatOffenders: string[] = []; for (const entryFile of filesToCheck) { let content = ""; try { @@ -94,12 +94,12 @@ function main() { if (hasMonolithicRootImport(content)) { monolithicOffenders.push(entryFile); } - if (hasLegacyRoutingImport(content)) { - legacyRoutingOffenders.push(entryFile); + if (hasLegacyCompatImport(content)) { + legacyCompatOffenders.push(entryFile); } } - if (monolithicOffenders.length > 0 || legacyRoutingOffenders.length > 0) { + if (monolithicOffenders.length > 0 || legacyCompatOffenders.length > 0) { if (monolithicOffenders.length > 0) { console.error("Bundled plugin source files must not import monolithic openclaw/plugin-sdk."); for (const file of monolithicOffenders.toSorted()) { @@ -107,18 +107,18 @@ function main() { console.error(`- ${relative}`); } } - if (legacyRoutingOffenders.length > 0) { + if (legacyCompatOffenders.length > 0) { console.error( - "Bundled plugin source files must not import legacy openclaw/plugin-sdk/routing.", + "Bundled plugin source files must not import legacy openclaw/plugin-sdk/compat.", ); - for (const file of legacyRoutingOffenders.toSorted()) { + for (const file of legacyCompatOffenders.toSorted()) { const relative = path.relative(process.cwd(), file) || file; console.error(`- ${relative}`); } } - if (monolithicOffenders.length > 0 || legacyRoutingOffenders.length > 0) { + if (monolithicOffenders.length > 0 || legacyCompatOffenders.length > 0) { console.error( - "Use openclaw/plugin-sdk/ for channel plugins, /core for shared routing and startup surfaces, or /compat for broader internals.", + "Use openclaw/plugin-sdk/ or openclaw/plugin-sdk/ subpaths for bundled plugins; root and compat are legacy surfaces only.", ); } process.exit(1); diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 50813e8dd66..ce8b623577f 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -67,10 +67,14 @@ "account-id", "account-resolution", "allow-from", + "allowlist-resolution", "allowlist-config-edit", "boolean-param", "channel-config-helpers", + "channel-config-schema", + "channel-policy", "group-access", + "directory-runtime", "json-store", "keyed-async-queue", "provider-auth", @@ -80,6 +84,7 @@ "provider-stream", "provider-usage", "provider-web-search", + "reply-history", "media-understanding", "google", "request-url", diff --git a/src/agents/models-config.providers.moonshot.test.ts b/src/agents/models-config.providers.moonshot.test.ts index b224d1c44d3..9a84439ff6f 100644 --- a/src/agents/models-config.providers.moonshot.test.ts +++ b/src/agents/models-config.providers.moonshot.test.ts @@ -5,7 +5,7 @@ import { describe, expect, it } from "vitest"; import { MOONSHOT_BASE_URL as MOONSHOT_AI_BASE_URL, MOONSHOT_CN_BASE_URL, -} from "../plugins/provider-model-definitions.js"; +} from "../plugin-sdk/provider-models.js"; import { captureEnv } from "../test-utils/env.js"; import { resolveImplicitProvidersForTest } from "./models-config.e2e-harness.js"; import { applyNativeStreamingUsageCompat } from "./models-config.providers.js"; diff --git a/src/auto-reply/reply/elevated-allowlist-matcher.ts b/src/auto-reply/reply/elevated-allowlist-matcher.ts index 7617b671391..58774b11b80 100644 --- a/src/auto-reply/reply/elevated-allowlist-matcher.ts +++ b/src/auto-reply/reply/elevated-allowlist-matcher.ts @@ -1,8 +1,8 @@ import { CHAT_CHANNEL_ORDER } from "../../channels/registry.js"; import { normalizeAtHashSlug } from "../../shared/string-normalization.js"; -import { INTERNAL_MESSAGE_CHANNEL } from "../../utils/message-channel.js"; export type ExplicitElevatedAllowField = "id" | "from" | "e164" | "name" | "username" | "tag"; +const INTERNAL_ALLOWLIST_CHANNEL = "webchat"; const EXPLICIT_ELEVATED_ALLOW_FIELDS = new Set([ "id", @@ -15,7 +15,7 @@ const EXPLICIT_ELEVATED_ALLOW_FIELDS = new Set([ const SENDER_PREFIXES = [ ...CHAT_CHANNEL_ORDER, - INTERNAL_MESSAGE_CHANNEL, + INTERNAL_ALLOWLIST_CHANNEL, "user", "group", "channel", diff --git a/src/channels/registry.ts b/src/channels/registry.ts index 5e552e04a0e..035b7f4651a 100644 --- a/src/channels/registry.ts +++ b/src/channels/registry.ts @@ -1,4 +1,3 @@ -import { requireActivePluginRegistry } from "../plugins/runtime.js"; import { CHANNEL_IDS, CHAT_CHANNEL_ORDER, type ChatChannelId } from "./ids.js"; import type { ChannelMeta } from "./plugins/types.js"; import type { ChannelId } from "./plugins/types.js"; @@ -8,6 +7,21 @@ export type { ChatChannelId } from "./ids.js"; export type ChatChannelMeta = ChannelMeta; const WEBSITE_URL = "https://openclaw.ai"; +const REGISTRY_STATE = Symbol.for("openclaw.pluginRegistryState"); + +type RegisteredChannelPluginEntry = { + plugin: { + id?: string | null; + meta?: { aliases?: string[] | null } | null; + }; +}; + +function listRegisteredChannelPluginEntries(): RegisteredChannelPluginEntry[] { + const globalState = globalThis as typeof globalThis & { + [REGISTRY_STATE]?: { registry?: { channels?: RegisteredChannelPluginEntry[] | null } | null }; + }; + return globalState[REGISTRY_STATE]?.registry?.channels ?? []; +} const CHAT_CHANNEL_META: Record = { telegram: { @@ -154,15 +168,14 @@ export function normalizeAnyChannelId(raw?: string | null): ChannelId | null { return null; } - const registry = requireActivePluginRegistry(); - const hit = registry.channels.find((entry) => { + const hit = listRegisteredChannelPluginEntries().find((entry) => { const id = String(entry.plugin.id ?? "") .trim() .toLowerCase(); if (id && id === key) { return true; } - return (entry.plugin.meta.aliases ?? []).some((alias) => alias.trim().toLowerCase() === key); + return (entry.plugin.meta?.aliases ?? []).some((alias) => alias.trim().toLowerCase() === key); }); return hit?.plugin.id ?? null; } diff --git a/src/cli/deps.test.ts b/src/cli/deps.test.ts index d13f2998987..8dbc8539cff 100644 --- a/src/cli/deps.test.ts +++ b/src/cli/deps.test.ts @@ -19,32 +19,32 @@ const sendFns = vi.hoisted(() => ({ imessage: vi.fn(async () => ({ messageId: "i1", chatId: "imessage:1" })), })); -vi.mock("../plugin-sdk-internal/whatsapp.js", () => { +vi.mock("./send-runtime/whatsapp.js", () => { moduleLoads.whatsapp(); return { sendMessageWhatsApp: sendFns.whatsapp }; }); -vi.mock("../plugin-sdk-internal/telegram.js", () => { +vi.mock("./send-runtime/telegram.js", () => { moduleLoads.telegram(); return { sendMessageTelegram: sendFns.telegram }; }); -vi.mock("../plugin-sdk-internal/discord.js", () => { +vi.mock("./send-runtime/discord.js", () => { moduleLoads.discord(); return { sendMessageDiscord: sendFns.discord }; }); -vi.mock("../plugin-sdk-internal/slack.js", () => { +vi.mock("./send-runtime/slack.js", () => { moduleLoads.slack(); return { sendMessageSlack: sendFns.slack }; }); -vi.mock("../plugin-sdk-internal/signal.js", () => { +vi.mock("./send-runtime/signal.js", () => { moduleLoads.signal(); return { sendMessageSignal: sendFns.signal }; }); -vi.mock("../plugin-sdk-internal/imessage.js", () => { +vi.mock("./send-runtime/imessage.js", () => { moduleLoads.imessage(); return { sendMessageIMessage: sendFns.imessage }; }); diff --git a/src/cli/deps.ts b/src/cli/deps.ts index 7ebfbf74f5b..908da8cd265 100644 --- a/src/cli/deps.ts +++ b/src/cli/deps.ts @@ -35,32 +35,32 @@ export function createDefaultDeps(): CliDeps { return { whatsapp: createLazySender( "whatsapp", - () => import("../plugin-sdk/whatsapp.js") as Promise>, + () => import("./send-runtime/whatsapp.js") as Promise>, "sendMessageWhatsApp", ), telegram: createLazySender( "telegram", - () => import("../plugin-sdk/telegram.js") as Promise>, + () => import("./send-runtime/telegram.js") as Promise>, "sendMessageTelegram", ), discord: createLazySender( "discord", - () => import("../plugin-sdk/discord.js") as Promise>, + () => import("./send-runtime/discord.js") as Promise>, "sendMessageDiscord", ), slack: createLazySender( "slack", - () => import("../plugin-sdk/slack.js") as Promise>, + () => import("./send-runtime/slack.js") as Promise>, "sendMessageSlack", ), signal: createLazySender( "signal", - () => import("../plugin-sdk/signal.js") as Promise>, + () => import("./send-runtime/signal.js") as Promise>, "sendMessageSignal", ), imessage: createLazySender( "imessage", - () => import("../plugin-sdk/imessage.js") as Promise>, + () => import("./send-runtime/imessage.js") as Promise>, "sendMessageIMessage", ), }; diff --git a/src/cli/send-runtime/discord.ts b/src/cli/send-runtime/discord.ts new file mode 100644 index 00000000000..9ec4cf97247 --- /dev/null +++ b/src/cli/send-runtime/discord.ts @@ -0,0 +1 @@ +export { sendMessageDiscord } from "../../plugin-sdk/discord.js"; diff --git a/src/cli/send-runtime/imessage.ts b/src/cli/send-runtime/imessage.ts new file mode 100644 index 00000000000..3208aa24e00 --- /dev/null +++ b/src/cli/send-runtime/imessage.ts @@ -0,0 +1 @@ +export { sendMessageIMessage } from "../../plugin-sdk/imessage.js"; diff --git a/src/cli/send-runtime/signal.ts b/src/cli/send-runtime/signal.ts new file mode 100644 index 00000000000..19a366168c8 --- /dev/null +++ b/src/cli/send-runtime/signal.ts @@ -0,0 +1 @@ +export { sendMessageSignal } from "../../plugin-sdk/signal.js"; diff --git a/src/cli/send-runtime/slack.ts b/src/cli/send-runtime/slack.ts new file mode 100644 index 00000000000..1f108ac0fdc --- /dev/null +++ b/src/cli/send-runtime/slack.ts @@ -0,0 +1 @@ +export { sendMessageSlack } from "../../plugin-sdk/slack.js"; diff --git a/src/cli/send-runtime/telegram.ts b/src/cli/send-runtime/telegram.ts new file mode 100644 index 00000000000..c0037ec1f0a --- /dev/null +++ b/src/cli/send-runtime/telegram.ts @@ -0,0 +1 @@ +export { sendMessageTelegram } from "../../plugin-sdk/telegram.js"; diff --git a/src/cli/send-runtime/whatsapp.ts b/src/cli/send-runtime/whatsapp.ts new file mode 100644 index 00000000000..00ec2f1ba09 --- /dev/null +++ b/src/cli/send-runtime/whatsapp.ts @@ -0,0 +1 @@ +export { sendMessageWhatsApp } from "../../plugin-sdk/whatsapp.js"; diff --git a/src/commands/auth-choice.test.ts b/src/commands/auth-choice.test.ts index 7b16ad47341..8d6316e9acb 100644 --- a/src/commands/auth-choice.test.ts +++ b/src/commands/auth-choice.test.ts @@ -30,7 +30,7 @@ import { MINIMAX_CN_API_BASE_URL, ZAI_CODING_CN_BASE_URL, ZAI_CODING_GLOBAL_BASE_URL, -} from "../plugins/provider-model-definitions.js"; +} from "../plugin-sdk/provider-models.js"; import type { ProviderPlugin } from "../plugins/types.js"; import { registerProviderPlugins } from "../test-utils/plugin-registration.js"; import type { WizardPrompter } from "../wizard/prompts.js"; diff --git a/src/commands/onboard-auth.config-core.kilocode.test.ts b/src/commands/onboard-auth.config-core.kilocode.test.ts index 511b5550890..b27acab133a 100644 --- a/src/commands/onboard-auth.config-core.kilocode.test.ts +++ b/src/commands/onboard-auth.config-core.kilocode.test.ts @@ -17,7 +17,7 @@ import { KILOCODE_DEFAULT_CONTEXT_WINDOW, KILOCODE_DEFAULT_MAX_TOKENS, KILOCODE_DEFAULT_COST, -} from "../plugins/provider-model-definitions.js"; +} from "../plugin-sdk/provider-models.js"; import { captureEnv } from "../test-utils/env.js"; const emptyCfg: OpenClawConfig = {}; diff --git a/src/commands/onboard-auth.test.ts b/src/commands/onboard-auth.test.ts index 2ad0339a3b2..969128d343e 100644 --- a/src/commands/onboard-auth.test.ts +++ b/src/commands/onboard-auth.test.ts @@ -42,17 +42,17 @@ import { resolveAgentModelPrimaryValue, } from "../config/model-input.js"; import type { ModelApi } from "../config/types.models.js"; +import { + MISTRAL_DEFAULT_MODEL_REF, + ZAI_CODING_CN_BASE_URL, + ZAI_GLOBAL_BASE_URL, +} from "../plugin-sdk/provider-models.js"; import { applyAuthProfileConfig } from "../plugins/provider-auth-helpers.js"; import { OPENROUTER_DEFAULT_MODEL_REF, setMinimaxApiKey, writeOAuthCredentials, } from "../plugins/provider-auth-storage.js"; -import { - MISTRAL_DEFAULT_MODEL_REF, - ZAI_CODING_CN_BASE_URL, - ZAI_GLOBAL_BASE_URL, -} from "../plugins/provider-model-definitions.js"; import { applyLitellmProviderConfig } from "./onboard-auth.config-litellm.js"; import { createAuthTestLifecycle, diff --git a/src/commands/onboard-non-interactive.provider-auth.test.ts b/src/commands/onboard-non-interactive.provider-auth.test.ts index 085d9d1f102..329314d1efd 100644 --- a/src/commands/onboard-non-interactive.provider-auth.test.ts +++ b/src/commands/onboard-non-interactive.provider-auth.test.ts @@ -8,7 +8,7 @@ import { ZAI_CODING_CN_BASE_URL, ZAI_CODING_GLOBAL_BASE_URL, ZAI_GLOBAL_BASE_URL, -} from "../plugins/provider-model-definitions.js"; +} from "../plugin-sdk/provider-models.js"; import { makeTempWorkspace } from "../test-helpers/workspace.js"; import { withEnvAsync } from "../test-utils/env.js"; import { diff --git a/src/plugin-sdk-internal/accounts.ts b/src/plugin-sdk-internal/accounts.ts deleted file mode 100644 index 71807c97c6e..00000000000 --- a/src/plugin-sdk-internal/accounts.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type { OpenClawConfig } from "../config/config.js"; - -export { createAccountActionGate } from "../channels/plugins/account-action-gate.js"; -export { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; -export { normalizeChatType } from "../channels/chat-type.js"; -export { - listConfiguredAccountIds, - resolveAccountWithDefaultFallback, -} from "../plugin-sdk/account-resolution.js"; -export { resolveAccountEntry } from "../routing/account-lookup.js"; -export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; -export { normalizeE164, pathExists, resolveUserPath } from "../utils.js"; diff --git a/src/plugin-sdk-internal/channel-config.ts b/src/plugin-sdk-internal/channel-config.ts deleted file mode 100644 index 64b62fb77b0..00000000000 --- a/src/plugin-sdk-internal/channel-config.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Private bridge for bundled channel plugins. These config helpers are shared -// internally, but do not belong on the public compat surface. -export { buildAccountScopedAllowlistConfigEditor } from "../plugin-sdk/allowlist-config-edit.js"; -export { formatAllowFromLowercase } from "../plugin-sdk/allow-from.js"; -export { - createScopedAccountConfigAccessors, - createScopedChannelConfigBase, - createScopedDmSecurityResolver, -} from "../plugin-sdk/channel-config-helpers.js"; -export { - collectAllowlistProviderGroupPolicyWarnings, - collectAllowlistProviderRestrictSendersWarnings, - collectOpenGroupPolicyConfiguredRouteWarnings, - collectOpenGroupPolicyRouteAllowlistWarnings, - collectOpenProviderGroupPolicyWarnings, -} from "../channels/plugins/group-policy-warnings.js"; -export { buildAccountScopedDmSecurityPolicy } from "../channels/plugins/helpers.js"; diff --git a/src/plugin-sdk-internal/core.ts b/src/plugin-sdk-internal/core.ts deleted file mode 100644 index aa5ef23268d..00000000000 --- a/src/plugin-sdk-internal/core.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Private bridge for bundled channel plugins. Keep public sdk/core slim for -// third-party plugins; bundled channels can reach shared runtime helpers here. -export type { - ChannelMessageActionContext, - OpenClawPluginApi, - PluginRuntime, -} from "../plugin-sdk/channel-plugin-common.js"; -export { createPluginRuntimeStore } from "../plugin-sdk/runtime-store.js"; -export { - buildAgentSessionKey, - type RoutePeer, - type RoutePeerKind, -} from "../routing/resolve-route.js"; -export { resolveThreadSessionKeys } from "../routing/session-key.js"; diff --git a/src/plugin-sdk-internal/discord.ts b/src/plugin-sdk-internal/discord.ts deleted file mode 100644 index b978b678e9d..00000000000 --- a/src/plugin-sdk-internal/discord.ts +++ /dev/null @@ -1,115 +0,0 @@ -export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js"; -export type { OpenClawConfig } from "../config/config.js"; -export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js"; -export type { InspectedDiscordAccount } from "../../extensions/discord/src/account-inspect.js"; -export type { ResolvedDiscordAccount } from "../../extensions/discord/src/accounts.js"; -export type { - DiscordSendComponents, - DiscordSendEmbeds, -} from "../../extensions/discord/src/send.shared.js"; -export * from "../plugin-sdk/channel-plugin-common.js"; - -export { - createDiscordActionGate, - listDiscordAccountIds, - resolveDefaultDiscordAccountId, - resolveDiscordAccount, -} from "../../extensions/discord/src/accounts.js"; -export { inspectDiscordAccount } from "../../extensions/discord/src/account-inspect.js"; -export { - projectCredentialSnapshotFields, - resolveConfiguredFromCredentialStatuses, -} from "../channels/account-snapshot-fields.js"; -export { - listDiscordDirectoryGroupsFromConfig, - listDiscordDirectoryPeersFromConfig, -} from "../channels/plugins/directory-config.js"; -export { - looksLikeDiscordTargetId, - normalizeDiscordMessagingTarget, - normalizeDiscordOutboundTarget, -} from "../../extensions/discord/src/normalize.js"; -export { collectDiscordAuditChannelIds } from "../../extensions/discord/src/audit.js"; -export { collectDiscordStatusIssues } from "../../extensions/discord/src/status-issues.js"; -export { - DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS, - DISCORD_DEFAULT_LISTENER_TIMEOUT_MS, -} from "../../extensions/discord/src/monitor/timeouts.js"; -export { normalizeExplicitDiscordSessionKey } from "../../extensions/discord/src/session-key-normalization.js"; -export type { DiscordPluralKitConfig } from "../../extensions/discord/src/pluralkit.js"; - -export { - resolveDefaultGroupPolicy, - resolveOpenProviderRuntimeGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { - resolveDiscordGroupRequireMention, - resolveDiscordGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { discordSetupWizard } from "../../extensions/discord/src/plugin-shared.js"; -export { DiscordConfigSchema } from "../config/zod-schema.providers-core.js"; - -export { - autoBindSpawnedDiscordSubagent, - listThreadBindingsBySessionKey, - unbindThreadBindingsBySessionKey, -} from "../../extensions/discord/src/monitor/thread-bindings.js"; -export { getGateway } from "../../extensions/discord/src/monitor/gateway-registry.js"; -export { getPresence } from "../../extensions/discord/src/monitor/presence-cache.js"; -export { readDiscordComponentSpec } from "../../extensions/discord/src/components.js"; -export { resolveDiscordChannelId } from "../../extensions/discord/src/targets.js"; -export { - addRoleDiscord, - banMemberDiscord, - createChannelDiscord, - createScheduledEventDiscord, - createThreadDiscord, - deleteChannelDiscord, - deleteMessageDiscord, - editChannelDiscord, - editMessageDiscord, - fetchChannelInfoDiscord, - fetchChannelPermissionsDiscord, - fetchMemberInfoDiscord, - fetchMessageDiscord, - fetchReactionsDiscord, - fetchRoleInfoDiscord, - fetchVoiceStatusDiscord, - hasAnyGuildPermissionDiscord, - kickMemberDiscord, - listGuildChannelsDiscord, - listGuildEmojisDiscord, - listPinsDiscord, - listScheduledEventsDiscord, - listThreadsDiscord, - moveChannelDiscord, - pinMessageDiscord, - reactMessageDiscord, - readMessagesDiscord, - removeChannelPermissionDiscord, - removeOwnReactionsDiscord, - removeReactionDiscord, - removeRoleDiscord, - searchMessagesDiscord, - sendDiscordComponentMessage, - sendMessageDiscord, - sendPollDiscord, - sendStickerDiscord, - sendVoiceMessageDiscord, - setChannelPermissionDiscord, - timeoutMemberDiscord, - unpinMessageDiscord, - uploadEmojiDiscord, - uploadStickerDiscord, -} from "../../extensions/discord/src/send.js"; -export { discordMessageActions } from "../../extensions/discord/src/channel-actions.js"; -export type { - ThreadBindingManager, - ThreadBindingRecord, - ThreadBindingTargetKind, -} from "../../extensions/discord/src/monitor/thread-bindings.js"; - -export { - buildComputedAccountStatusSnapshot, - buildTokenChannelStatusSummary, -} from "../plugin-sdk/status-helpers.js"; diff --git a/src/plugin-sdk-internal/imessage.ts b/src/plugin-sdk-internal/imessage.ts deleted file mode 100644 index ec338483b98..00000000000 --- a/src/plugin-sdk-internal/imessage.ts +++ /dev/null @@ -1,46 +0,0 @@ -export type { ResolvedIMessageAccount } from "../../extensions/imessage/src/accounts.js"; -export type { IMessageAccountConfig } from "../config/types.js"; -export * from "../plugin-sdk/channel-plugin-common.js"; -export { - listIMessageAccountIds, - resolveDefaultIMessageAccountId, - resolveIMessageAccount, -} from "../../extensions/imessage/src/accounts.js"; -export { - formatTrimmedAllowFromEntries, - resolveIMessageConfigAllowFrom, - resolveIMessageConfigDefaultTo, -} from "../plugin-sdk/channel-config-helpers.js"; -export { isAllowedParsedChatSender } from "../plugin-sdk/allow-from.js"; -export { - looksLikeIMessageTargetId, - normalizeIMessageMessagingTarget, -} from "../channels/plugins/normalize/imessage.js"; -export { - createAllowedChatSenderMatcher, - parseChatAllowTargetPrefixes, - parseChatTargetPrefixesOrThrow, - resolveServicePrefixedChatTarget, - resolveServicePrefixedAllowTarget, - resolveServicePrefixedOrChatAllowTarget, - resolveServicePrefixedTarget, -} from "../../extensions/imessage/src/target-parsing-helpers.js"; -export type { - ChatSenderAllowParams, - ParsedChatTarget, -} from "../../extensions/imessage/src/target-parsing-helpers.js"; -export { sendMessageIMessage } from "../../extensions/imessage/src/send.js"; - -export { - resolveAllowlistProviderRuntimeGroupPolicy, - resolveDefaultGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { - resolveIMessageGroupRequireMention, - resolveIMessageGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { imessageSetupWizard } from "../../extensions/imessage/src/plugin-shared.js"; -export { IMessageConfigSchema } from "../config/zod-schema.providers-core.js"; - -export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; -export { collectStatusIssuesFromLastError } from "../plugin-sdk/status-helpers.js"; diff --git a/src/plugin-sdk-internal/setup.ts b/src/plugin-sdk-internal/setup.ts deleted file mode 100644 index f6643637e7e..00000000000 --- a/src/plugin-sdk-internal/setup.ts +++ /dev/null @@ -1,38 +0,0 @@ -export type { OpenClawConfig } from "../config/config.js"; -export type { DmPolicy } from "../config/types.js"; -export type { WizardPrompter } from "../wizard/prompts.js"; -export type { ChannelSetupAdapter } from "../channels/plugins/types.adapters.js"; -export type { ChannelSetupDmPolicy } from "../channels/plugins/setup-wizard-types.js"; -export type { - ChannelSetupWizard, - ChannelSetupWizardAllowFromEntry, -} from "../channels/plugins/setup-wizard.js"; - -export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; -export { - applyAccountNameToChannelSection, - migrateBaseNameToDefaultAccount, -} from "../channels/plugins/setup-helpers.js"; -export { - normalizeAllowFromEntries, - noteChannelLookupFailure, - noteChannelLookupSummary, - parseMentionOrPrefixedId, - parseSetupEntriesAllowingWildcard, - patchChannelConfigForAccount, - promptLegacyChannelAllowFrom, - promptParsedAllowFromForScopedChannel, - promptResolvedAllowFrom, - resolveSetupAccountId, - setAccountGroupPolicyForChannel, - setChannelDmPolicyWithAllowFrom, - setLegacyChannelDmPolicyWithAllowFrom, - setSetupChannelEnabled, - splitSetupEntries, -} from "../channels/plugins/setup-wizard-helpers.js"; -export { detectBinary } from "../plugins/setup-binary.js"; -export { installSignalCli } from "../plugins/signal-cli-install.js"; -export { formatCliCommand } from "../cli/command-format.js"; -export { formatDocsLink } from "../terminal/links.js"; -export { hasConfiguredSecretInput } from "../config/types.secrets.js"; -export { normalizeE164, pathExists } from "../utils.js"; diff --git a/src/plugin-sdk-internal/signal.ts b/src/plugin-sdk-internal/signal.ts deleted file mode 100644 index 237298f9111..00000000000 --- a/src/plugin-sdk-internal/signal.ts +++ /dev/null @@ -1,39 +0,0 @@ -export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js"; -export type { OpenClawConfig } from "../config/config.js"; -export type { ResolvedSignalAccount } from "../../extensions/signal/src/accounts.js"; -export type { SignalAccountConfig } from "../config/types.js"; -export * from "../plugin-sdk/channel-plugin-common.js"; -export { - listEnabledSignalAccounts, - listSignalAccountIds, - resolveDefaultSignalAccountId, - resolveSignalAccount, -} from "../../extensions/signal/src/accounts.js"; -export { resolveSignalReactionLevel } from "../../extensions/signal/src/reaction-level.js"; -export { - removeReactionSignal, - sendReactionSignal, -} from "../../extensions/signal/src/send-reactions.js"; -export { sendMessageSignal } from "../../extensions/signal/src/send.js"; -export { - looksLikeSignalTargetId, - normalizeSignalMessagingTarget, -} from "../channels/plugins/normalize/signal.js"; - -export { - resolveAllowlistProviderRuntimeGroupPolicy, - resolveDefaultGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { evaluateSenderGroupAccessForPolicy } from "../plugin-sdk/group-access.js"; -export { signalSetupWizard } from "../../extensions/signal/src/plugin-shared.js"; -export { SignalConfigSchema } from "../config/zod-schema.providers-core.js"; - -export { normalizeE164 } from "../utils.js"; -export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; - -export { - buildBaseAccountStatusSnapshot, - buildBaseChannelStatusSummary, - collectStatusIssuesFromLastError, - createDefaultChannelRuntimeState, -} from "../plugin-sdk/status-helpers.js"; diff --git a/src/plugin-sdk-internal/slack.ts b/src/plugin-sdk-internal/slack.ts deleted file mode 100644 index c375010a9de..00000000000 --- a/src/plugin-sdk-internal/slack.ts +++ /dev/null @@ -1,67 +0,0 @@ -export type { OpenClawConfig } from "../config/config.js"; -export type { SlackAccountConfig } from "../config/types.slack.js"; -export type { InspectedSlackAccount } from "../../extensions/slack/src/account-inspect.js"; -export type { ResolvedSlackAccount } from "../../extensions/slack/src/accounts.js"; -export * from "../plugin-sdk/channel-plugin-common.js"; -export { - listEnabledSlackAccounts, - listSlackAccountIds, - resolveDefaultSlackAccountId, - resolveSlackAccount, - resolveSlackReplyToMode, -} from "../../extensions/slack/src/accounts.js"; -export { isSlackInteractiveRepliesEnabled } from "../../extensions/slack/src/interactive-replies.js"; -export { inspectSlackAccount } from "../../extensions/slack/src/account-inspect.js"; -export { - projectCredentialSnapshotFields, - resolveConfiguredFromCredentialStatuses, - resolveConfiguredFromRequiredCredentialStatuses, -} from "../channels/account-snapshot-fields.js"; -export { - listSlackDirectoryGroupsFromConfig, - listSlackDirectoryPeersFromConfig, -} from "../channels/plugins/directory-config.js"; -export { - looksLikeSlackTargetId, - normalizeSlackMessagingTarget, -} from "../channels/plugins/normalize/slack.js"; -export { parseSlackTarget, resolveSlackChannelId } from "../plugin-sdk/slack-targets.js"; -export { - extractSlackToolSend, - listSlackMessageActions, -} from "../../extensions/slack/src/message-actions.js"; -export { buildSlackThreadingToolContext } from "../../extensions/slack/src/threading-tool-context.js"; -export { parseSlackBlocksInput } from "../../extensions/slack/src/blocks-input.js"; -export { handleSlackHttpRequest } from "../../extensions/slack/src/http/index.js"; -export { sendMessageSlack } from "../../extensions/slack/src/send.js"; -export { - deleteSlackMessage, - downloadSlackFile, - editSlackMessage, - getSlackMemberInfo, - listSlackEmojis, - listSlackPins, - listSlackReactions, - pinSlackMessage, - reactSlackMessage, - readSlackMessages, - removeOwnSlackReactions, - removeSlackReaction, - sendSlackMessage, - unpinSlackMessage, -} from "../../extensions/slack/src/actions.js"; -export { recordSlackThreadParticipation } from "../../extensions/slack/src/sent-thread-cache.js"; -export { buildComputedAccountStatusSnapshot } from "../plugin-sdk/status-helpers.js"; - -export { - resolveDefaultGroupPolicy, - resolveOpenProviderRuntimeGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { - resolveSlackGroupRequireMention, - resolveSlackGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { slackSetupWizard } from "../../extensions/slack/src/plugin-shared.js"; -export { SlackConfigSchema } from "../config/zod-schema.providers-core.js"; - -export { handleSlackMessageAction } from "../plugin-sdk/slack-message-actions.js"; diff --git a/src/plugin-sdk-internal/telegram.ts b/src/plugin-sdk-internal/telegram.ts deleted file mode 100644 index d5dd45a96d6..00000000000 --- a/src/plugin-sdk-internal/telegram.ts +++ /dev/null @@ -1,120 +0,0 @@ -export type { - ChannelAccountSnapshot, - ChannelGatewayContext, - ChannelMessageActionAdapter, -} from "../channels/plugins/types.js"; -export type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; -export type { OpenClawConfig } from "../config/config.js"; -export type { PluginRuntime } from "../plugins/runtime/types.js"; -export type { OpenClawPluginApi } from "../plugins/types.js"; -export type { - TelegramAccountConfig, - TelegramActionConfig, - TelegramNetworkConfig, -} from "../config/types.js"; -export type { InspectedTelegramAccount } from "../../extensions/telegram/src/account-inspect.js"; -export type { ResolvedTelegramAccount } from "../../extensions/telegram/src/accounts.js"; -export type { TelegramProbe } from "../../extensions/telegram/src/probe.js"; -export type { - TelegramButtonStyle, - TelegramInlineButtons, -} from "../../extensions/telegram/src/button-types.js"; - -export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; - -export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; - -export { - applyAccountNameToChannelSection, - migrateBaseNameToDefaultAccount, -} from "../channels/plugins/setup-helpers.js"; -export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; -export { - deleteAccountFromConfigSection, - clearAccountEntryFields, - setAccountEnabledInConfigSection, -} from "../channels/plugins/config-helpers.js"; -export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; -export { PAIRING_APPROVED_MESSAGE } from "../channels/plugins/pairing-message.js"; - -export { getChatChannelMeta } from "../channels/registry.js"; - -export { - createTelegramActionGate, - listTelegramAccountIds, - resolveDefaultTelegramAccountId, - resolveTelegramPollActionGateState, - resolveTelegramAccount, -} from "../../extensions/telegram/src/accounts.js"; -export { inspectTelegramAccount } from "../../extensions/telegram/src/account-inspect.js"; -export { - projectCredentialSnapshotFields, - resolveConfiguredFromCredentialStatuses, -} from "../channels/account-snapshot-fields.js"; -export { - listTelegramDirectoryGroupsFromConfig, - listTelegramDirectoryPeersFromConfig, -} from "../channels/plugins/directory-config.js"; -export { - looksLikeTelegramTargetId, - normalizeTelegramMessagingTarget, -} from "../../extensions/telegram/src/normalize.js"; -export { - parseTelegramReplyToMessageId, - parseTelegramThreadId, -} from "../../extensions/telegram/src/outbound-params.js"; -export { - isNumericTelegramUserId, - normalizeTelegramAllowFromEntry, -} from "../../extensions/telegram/src/allow-from.js"; -export { fetchTelegramChatId } from "../../extensions/telegram/src/api-fetch.js"; -export { - resolveTelegramInlineButtonsScope, - resolveTelegramTargetChatType, -} from "../../extensions/telegram/src/inline-buttons.js"; -export { resolveTelegramReactionLevel } from "../../extensions/telegram/src/reaction-level.js"; -export { - createForumTopicTelegram, - deleteMessageTelegram, - editForumTopicTelegram, - editMessageTelegram, - reactMessageTelegram, - sendMessageTelegram, - sendPollTelegram, - sendStickerTelegram, -} from "../../extensions/telegram/src/send.js"; -export { getCacheStats, searchStickers } from "../../extensions/telegram/src/sticker-cache.js"; -export { resolveTelegramToken } from "../../extensions/telegram/src/token.js"; -export { telegramMessageActions } from "../../extensions/telegram/src/channel-actions.js"; -export { collectTelegramStatusIssues } from "../../extensions/telegram/src/status-issues.js"; -export { sendTelegramPayloadMessages } from "../../extensions/telegram/src/outbound-adapter.js"; -export { - buildBrowseProvidersButton, - buildModelsKeyboard, - buildProviderKeyboard, - calculateTotalPages, - getModelsPageSize, - type ProviderInfo, -} from "../../extensions/telegram/src/model-buttons.js"; -export { - isTelegramExecApprovalApprover, - isTelegramExecApprovalClientEnabled, -} from "../../extensions/telegram/src/exec-approvals.js"; -export type { StickerMetadata } from "../../extensions/telegram/src/bot/types.js"; - -export { - resolveAllowlistProviderRuntimeGroupPolicy, - resolveDefaultGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { readBooleanParam } from "../plugin-sdk/boolean-param.js"; -export { evaluateMatchedGroupAccessForPolicy } from "../plugin-sdk/group-access.js"; -export { extractToolSend } from "../plugin-sdk/tool-send.js"; -export { - resolveTelegramGroupRequireMention, - resolveTelegramGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { telegramSetupWizard } from "../../extensions/telegram/src/setup-surface.js"; -export { telegramSetupAdapter } from "../../extensions/telegram/src/setup-core.js"; -export { TelegramConfigSchema } from "../config/zod-schema.providers-core.js"; - -export { buildTokenChannelStatusSummary } from "../plugin-sdk/status-helpers.js"; diff --git a/src/plugin-sdk-internal/whatsapp.ts b/src/plugin-sdk-internal/whatsapp.ts deleted file mode 100644 index a1871198c70..00000000000 --- a/src/plugin-sdk-internal/whatsapp.ts +++ /dev/null @@ -1,108 +0,0 @@ -export type { ChannelMessageActionName } from "../channels/plugins/types.js"; -export type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; -export type { OpenClawConfig } from "../config/config.js"; -export type { DmPolicy, GroupPolicy, WhatsAppAccountConfig } from "../config/types.js"; -export type { PluginRuntime } from "../plugins/runtime/types.js"; -export type { OpenClawPluginApi } from "../plugins/types.js"; - -export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; - -export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js"; - -export { - applyAccountNameToChannelSection, - migrateBaseNameToDefaultAccount, -} from "../channels/plugins/setup-helpers.js"; -export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; -export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; - -export { getChatChannelMeta } from "../channels/registry.js"; -export { - formatWhatsAppConfigAllowFromEntries, - resolveWhatsAppConfigAllowFrom, - resolveWhatsAppConfigDefaultTo, -} from "../plugin-sdk/channel-config-helpers.js"; -export { - listWhatsAppDirectoryGroupsFromConfig, - listWhatsAppDirectoryPeersFromConfig, -} from "../channels/plugins/directory-config.js"; -export { - hasAnyWhatsAppAuth, - listEnabledWhatsAppAccounts, - resolveWhatsAppAccount, -} from "../../extensions/whatsapp/src/accounts.js"; -export { - WA_WEB_AUTH_DIR, - logWebSelfId, - logoutWeb, - pickWebChannel, - webAuthExists, -} from "../../extensions/whatsapp/src/auth-store.js"; -export { - DEFAULT_WEB_MEDIA_BYTES, - HEARTBEAT_PROMPT, - HEARTBEAT_TOKEN, - monitorWebChannel, - resolveHeartbeatRecipients, - runWebHeartbeatOnce, -} from "../../extensions/whatsapp/src/auto-reply.js"; -export type { - WebChannelStatus, - WebMonitorTuning, -} from "../../extensions/whatsapp/src/auto-reply.js"; -export { - extractMediaPlaceholder, - extractText, - monitorWebInbox, -} from "../../extensions/whatsapp/src/inbound.js"; -export type { - WebInboundMessage, - WebListenerCloseReason, -} from "../../extensions/whatsapp/src/inbound.js"; -export { loginWeb } from "../../extensions/whatsapp/src/login.js"; -export { - getDefaultLocalRoots, - loadWebMedia, - loadWebMediaRaw, - optimizeImageToJpeg, -} from "../../extensions/whatsapp/src/media.js"; -export { - sendMessageWhatsApp, - sendPollWhatsApp, - sendReactionWhatsApp, -} from "../../extensions/whatsapp/src/send.js"; -export { - createWaSocket, - formatError, - getStatusCode, - waitForWaConnection, -} from "../../extensions/whatsapp/src/session.js"; -export { createWhatsAppLoginTool } from "../../extensions/whatsapp/src/agent-tools-login.js"; -export { normalizeWhatsAppAllowFromEntries } from "../channels/plugins/normalize/whatsapp.js"; -export { - collectAllowlistProviderGroupPolicyWarnings, - collectOpenGroupPolicyRouteAllowlistWarnings, -} from "../channels/plugins/group-policy-warnings.js"; -export { buildAccountScopedDmSecurityPolicy } from "../channels/plugins/helpers.js"; -export { resolveWhatsAppOutboundTarget } from "../whatsapp/resolve-outbound-target.js"; - -export { - resolveAllowlistProviderRuntimeGroupPolicy, - resolveDefaultGroupPolicy, -} from "../config/runtime-group-policy.js"; -export { - resolveWhatsAppGroupRequireMention, - resolveWhatsAppGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { - createWhatsAppOutboundBase, - resolveWhatsAppGroupIntroHint, - resolveWhatsAppMentionStripRegexes, -} from "../channels/plugins/whatsapp-shared.js"; -export { resolveWhatsAppHeartbeatRecipients } from "../channels/plugins/whatsapp-heartbeat.js"; -export { WhatsAppConfigSchema } from "../config/zod-schema.providers-whatsapp.js"; - -export { createActionGate, readStringParam } from "../agents/tools/common.js"; -export { createPluginRuntimeStore } from "../plugin-sdk/runtime-store.js"; - -export { normalizeE164 } from "../utils.js"; diff --git a/src/plugin-sdk/channel-config-schema.ts b/src/plugin-sdk/channel-config-schema.ts new file mode 100644 index 00000000000..bbf6191ae75 --- /dev/null +++ b/src/plugin-sdk/channel-config-schema.ts @@ -0,0 +1,7 @@ +/** Shared config-schema primitives for channel plugins with DM/group policy knobs. */ +export { + AllowFromListSchema, + buildCatchallMultiAccountChannelSchema, + buildNestedDmConfigSchema, +} from "../channels/plugins/config-schema.js"; +export { DmPolicySchema, GroupPolicySchema } from "../config/zod-schema.core.js"; diff --git a/src/plugin-sdk/channel-policy.ts b/src/plugin-sdk/channel-policy.ts new file mode 100644 index 00000000000..62538b68dd6 --- /dev/null +++ b/src/plugin-sdk/channel-policy.ts @@ -0,0 +1,19 @@ +/** Shared policy warnings and DM/group policy helpers for channel plugins. */ +export { + buildOpenGroupPolicyConfigureRouteAllowlistWarning, + buildOpenGroupPolicyRestrictSendersWarning, + buildOpenGroupPolicyWarning, + collectAllowlistProviderGroupPolicyWarnings, + collectAllowlistProviderRestrictSendersWarnings, + collectOpenGroupPolicyRestrictSendersWarnings, + collectOpenGroupPolicyRouteAllowlistWarnings, + collectOpenProviderGroupPolicyWarnings, +} from "../channels/plugins/group-policy-warnings.js"; +export { buildAccountScopedDmSecurityPolicy } from "../channels/plugins/helpers.js"; +export { resolveChannelGroupRequireMention } from "../config/group-policy.js"; +export { + DM_GROUP_ACCESS_REASON, + readStoreAllowFromForDmPolicy, + resolveDmGroupAccessWithLists, + resolveEffectiveAllowFromLists, +} from "../security/dm-policy-shared.js"; diff --git a/src/plugin-sdk/channel-runtime.ts b/src/plugin-sdk/channel-runtime.ts index 4fda751b6cb..fad81c36d59 100644 --- a/src/plugin-sdk/channel-runtime.ts +++ b/src/plugin-sdk/channel-runtime.ts @@ -42,6 +42,7 @@ export * from "../channels/plugins/status-issues/shared.js"; export * from "../channels/plugins/whatsapp-heartbeat.js"; export * from "../infra/outbound/send-deps.js"; export * from "../utils/message-channel.js"; +export * from "./channel-lifecycle.js"; export type { InteractiveButtonStyle, InteractiveReplyButton, diff --git a/src/plugin-sdk/compat.ts b/src/plugin-sdk/compat.ts index 8e893de15df..9f723eff1fa 100644 --- a/src/plugin-sdk/compat.ts +++ b/src/plugin-sdk/compat.ts @@ -1 +1,28 @@ -export * from "./index.js"; +// Legacy compat surface for external plugins that still depend on older +// broad plugin-sdk imports. Keep this file intentionally small. + +export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; +export { resolveControlCommandGate } from "../channels/command-gating.js"; + +export { createAccountStatusSink } from "./channel-lifecycle.js"; +export { createPluginRuntimeStore } from "./runtime-store.js"; +export { KeyedAsyncQueue } from "./keyed-async-queue.js"; + +export { + createScopedAccountConfigAccessors, + createScopedChannelConfigBase, + createScopedDmSecurityResolver, + mapAllowFromEntries, +} from "./channel-config-helpers.js"; +export { formatAllowFromLowercase, formatNormalizedAllowFromEntries } from "./allow-from.js"; +export * from "./channel-config-schema.js"; +export * from "./channel-policy.js"; +export * from "./reply-history.js"; +export * from "./directory-runtime.js"; +export { mapAllowlistResolutionInputs } from "./allowlist-resolution.js"; + +export { + resolveBlueBubblesGroupRequireMention, + resolveBlueBubblesGroupToolPolicy, +} from "../channels/plugins/group-mentions.js"; +export { collectBlueBubblesStatusIssues } from "../channels/plugins/status-issues/bluebubbles.js"; diff --git a/src/plugin-sdk/core.ts b/src/plugin-sdk/core.ts index 13b075e3352..fda11949c4e 100644 --- a/src/plugin-sdk/core.ts +++ b/src/plugin-sdk/core.ts @@ -39,36 +39,9 @@ export type { UsageProviderId, UsageWindow, } from "../infra/provider-usage.types.js"; -export type { - ChannelMessageActionContext, - ChannelPlugin, - OpenClawPluginApi, - PluginRuntime, -} from "./channel-plugin-common.js"; +export type { ChannelMessageActionContext } from "../channels/plugins/types.js"; +export type { ChannelPlugin } from "../channels/plugins/types.plugin.js"; +export type { OpenClawPluginApi } from "../plugins/types.js"; +export type { PluginRuntime } from "../plugins/runtime/types.js"; -export { emptyPluginConfigSchema } from "./channel-plugin-common.js"; -export { buildOauthProviderAuthResult } from "./provider-auth-result.js"; -export { - DEFAULT_SECRET_FILE_MAX_BYTES, - loadSecretFileSync, - readSecretFileSync, - tryReadSecretFileSync, -} from "../infra/secret-file.js"; -export type { SecretFileReadOptions, SecretFileReadResult } from "../infra/secret-file.js"; - -export { resolveGatewayBindUrl } from "../shared/gateway-bind-url.js"; -export type { GatewayBindUrlResult } from "../shared/gateway-bind-url.js"; - -export { resolveTailnetHostWithRunner } from "../shared/tailscale-status.js"; -export type { - TailscaleStatusCommandResult, - TailscaleStatusCommandRunner, -} from "../shared/tailscale-status.js"; -export { - buildAgentSessionKey, - type RoutePeer, - type RoutePeerKind, -} from "../routing/resolve-route.js"; -export { resolveThreadSessionKeys } from "../routing/session-key.js"; -export { runPassiveAccountLifecycle } from "./channel-lifecycle.js"; -export { createLoggerBackedRuntime } from "./runtime.js"; +export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; diff --git a/src/plugin-sdk/directory-runtime.ts b/src/plugin-sdk/directory-runtime.ts new file mode 100644 index 00000000000..afb0ca41822 --- /dev/null +++ b/src/plugin-sdk/directory-runtime.ts @@ -0,0 +1,9 @@ +/** Shared directory listing helpers for plugins that derive users/groups from config maps. */ +export { + applyDirectoryQueryAndLimit, + listDirectoryGroupEntriesFromMapKeys, + listDirectoryGroupEntriesFromMapKeysAndAllowFrom, + listDirectoryUserEntriesFromAllowFrom, + listDirectoryUserEntriesFromAllowFromAndMapKeys, + toDirectoryEntries, +} from "../channels/plugins/directory-config-helpers.js"; diff --git a/src/plugin-sdk/index.test.ts b/src/plugin-sdk/index.test.ts index 334f4831853..178c0e20b22 100644 --- a/src/plugin-sdk/index.test.ts +++ b/src/plugin-sdk/index.test.ts @@ -58,62 +58,11 @@ describe("plugin-sdk exports", () => { } }); - // Verify critical functions that extensions depend on are exported and callable. - // Regression guard for #27569 where isDangerousNameMatchingEnabled was missing - // from the compiled output, breaking mattermost/googlechat/msteams/irc plugins. - it("exports critical functions used by channel extensions", () => { - const requiredFunctions = [ - "isDangerousNameMatchingEnabled", - "createAccountListHelpers", - "buildAgentMediaPayload", - "createReplyPrefixOptions", - "createTypingCallbacks", - "logInboundDrop", - "logTypingFailure", - "buildPendingHistoryContextFromMap", - "clearHistoryEntriesIfEnabled", - "recordPendingHistoryEntryIfEnabled", - "resolveControlCommandGate", - "resolveDmGroupAccessWithLists", - "resolveAllowlistProviderRuntimeGroupPolicy", - "resolveDefaultGroupPolicy", - "resolveChannelMediaMaxBytes", - "warnMissingProviderGroupPolicyFallbackOnce", - "createDedupeCache", - "formatInboundFromLabel", - "resolveRuntimeGroupPolicy", - "emptyPluginConfigSchema", - "normalizePluginHttpPath", - "registerPluginHttpRoute", - "buildBaseAccountStatusSnapshot", - "buildBaseChannelStatusSummary", - "buildTokenChannelStatusSummary", - "collectStatusIssuesFromLastError", - "createDefaultChannelRuntimeState", - "resolveChannelEntryMatch", - "resolveChannelEntryMatchWithFallback", - "normalizeChannelSlug", - "buildChannelKeyCandidates", - ]; - - for (const key of requiredFunctions) { - expect(sdk).toHaveProperty(key); - expect(typeof (sdk as Record)[key]).toBe("function"); - } - }); - - // Verify critical constants that extensions depend on are exported. - it("exports critical constants used by channel extensions", () => { - const requiredConstants = [ - "DEFAULT_GROUP_HISTORY_LIMIT", - "DEFAULT_ACCOUNT_ID", - "SILENT_REPLY_TOKEN", - "PAIRING_APPROVED_MESSAGE", - ]; - - for (const key of requiredConstants) { - expect(sdk).toHaveProperty(key); - } + it("keeps the root runtime surface intentionally small", () => { + expect(typeof sdk.emptyPluginConfigSchema).toBe("function"); + expect(Object.prototype.hasOwnProperty.call(sdk, "resolveControlCommandGate")).toBe(false); + expect(Object.prototype.hasOwnProperty.call(sdk, "buildAgentSessionKey")).toBe(false); + expect(Object.prototype.hasOwnProperty.call(sdk, "isDangerousNameMatchingEnabled")).toBe(false); }); it("emits importable bundled subpath entries", { timeout: 240_000 }, async () => { diff --git a/src/plugin-sdk/index.ts b/src/plugin-sdk/index.ts index 1e926c098ab..20af3448e8f 100644 --- a/src/plugin-sdk/index.ts +++ b/src/plugin-sdk/index.ts @@ -1,829 +1,49 @@ -export { createAccountListHelpers } from "../channels/plugins/account-helpers.js"; -export { createAccountActionGate } from "../channels/plugins/account-action-gate.js"; -export { CHANNEL_MESSAGE_ACTION_NAMES } from "../channels/plugins/message-action-names.js"; -export { - BLUEBUBBLES_ACTIONS, - BLUEBUBBLES_ACTION_NAMES, - BLUEBUBBLES_GROUP_ACTIONS, -} from "../channels/plugins/bluebubbles-actions.js"; +// Shared root plugin-sdk surface. +// Keep this entry intentionally tiny. Channel/provider helpers belong on +// dedicated subpaths or, for legacy consumers, the compat surface. + export type { ChannelAccountSnapshot, - ChannelAccountState, ChannelAgentTool, ChannelAgentToolFactory, - ChannelAuthAdapter, ChannelCapabilities, - ChannelCommandAdapter, - ChannelConfigAdapter, - ChannelDirectoryAdapter, - ChannelDirectoryEntry, - ChannelDirectoryEntryKind, - ChannelElevatedAdapter, - ChannelGatewayAdapter, ChannelGatewayContext, - ChannelGroupAdapter, - ChannelGroupContext, - ChannelHeartbeatAdapter, - ChannelHeartbeatDeps, ChannelId, - ChannelLogSink, - ChannelLoginWithQrStartResult, - ChannelLoginWithQrWaitResult, - ChannelLogoutContext, - ChannelLogoutResult, - ChannelMentionAdapter, ChannelMessageActionAdapter, ChannelMessageActionContext, ChannelMessageActionName, - ChannelMessagingAdapter, - ChannelMeta, - ChannelOutboundAdapter, - ChannelOutboundContext, - ChannelOutboundTargetMode, - ChannelPairingAdapter, - ChannelPollContext, - ChannelPollResult, - ChannelResolveKind, - ChannelResolveResult, - ChannelResolverAdapter, - ChannelSecurityAdapter, - ChannelSecurityContext, - ChannelSecurityDmPolicy, - ChannelSetupAdapter, - ChannelSetupInput, - ChannelStatusAdapter, ChannelStatusIssue, - ChannelStreamingAdapter, - ChannelThreadingAdapter, - ChannelThreadingContext, - ChannelThreadingToolContext, - ChannelToolSend, - BaseProbeResult, - BaseTokenResolution, } from "../channels/plugins/types.js"; export type { ChannelConfigSchema, ChannelPlugin } from "../channels/plugins/types.plugin.js"; -export type { - ChannelSetupConfigureContext, - ChannelSetupDmPolicy, - ChannelSetupInteractiveContext, - ChannelSetupPlugin, - ChannelSetupResult, - ChannelSetupStatus, - ChannelSetupStatusContext, - ChannelSetupWizardAdapter, -} from "../channels/plugins/setup-wizard-types.js"; +export type { ChannelSetupAdapter, ChannelSetupInput } from "../channels/plugins/types.js"; export type { ChannelSetupWizard, ChannelSetupWizardAllowFromEntry, - ChannelSetupWizardCredential, - ChannelSetupWizardCredentialState, - ChannelSetupWizardFinalize, - ChannelSetupWizardGroupAccess, - ChannelSetupWizardPrepare, - ChannelSetupWizardStatus, - ChannelSetupWizardTextInput, } from "../channels/plugins/setup-wizard.js"; -export type { - AcpRuntimeCapabilities, - AcpRuntimeControl, - AcpRuntimeDoctorReport, - AcpRuntime, - AcpRuntimeEnsureInput, - AcpRuntimeEvent, - AcpRuntimeHandle, - AcpRuntimePromptMode, - AcpSessionUpdateTag, - AcpRuntimeSessionMode, - AcpRuntimeStatus, - AcpRuntimeTurnInput, -} from "../acp/runtime/types.js"; -export type { AcpRuntimeBackend } from "../acp/runtime/registry.js"; -export { - getAcpRuntimeBackend, - registerAcpRuntimeBackend, - requireAcpRuntimeBackend, - unregisterAcpRuntimeBackend, -} from "../acp/runtime/registry.js"; -export { ACP_ERROR_CODES, AcpRuntimeError } from "../acp/runtime/errors.js"; -export type { AcpRuntimeErrorCode } from "../acp/runtime/errors.js"; export type { AnyAgentTool, MediaUnderstandingProviderPlugin, - OpenClawPluginConfigSchema, OpenClawPluginApi, - OpenClawPluginService, - OpenClawPluginServiceContext, - PluginHookInboundClaimContext, - PluginHookInboundClaimEvent, - PluginHookInboundClaimResult, - PluginInteractiveDiscordHandlerContext, - PluginInteractiveHandlerRegistration, - PluginInteractiveSlackHandlerContext, - PluginInteractiveTelegramHandlerContext, + OpenClawPluginConfigSchema, PluginLogger, ProviderAuthContext, - ProviderAuthDoctorHintContext, ProviderAuthResult, - ProviderAugmentModelCatalogContext, - ProviderBuiltInModelSuppressionContext, - ProviderBuiltInModelSuppressionResult, - ProviderBuildMissingAuthMessageContext, - ProviderCacheTtlEligibilityContext, - ProviderDefaultThinkingPolicyContext, - ProviderFetchUsageSnapshotContext, - ProviderModernModelPolicyContext, - ProviderPreparedRuntimeAuth, - ProviderResolvedUsageAuth, - ProviderPrepareExtraParamsContext, - ProviderPrepareDynamicModelContext, - ProviderPrepareRuntimeAuthContext, - ProviderResolveUsageAuthContext, - ProviderResolveDynamicModelContext, - ProviderNormalizeResolvedModelContext, ProviderRuntimeModel, SpeechProviderPlugin, - ProviderThinkingPolicyContext, - ProviderWrapStreamFnContext, } from "../plugins/types.js"; -export type { - ProviderUsageSnapshot, - UsageProviderId, - UsageWindow, -} from "../infra/provider-usage.types.js"; -export type { - ConversationRef, - SessionBindingBindInput, - SessionBindingCapabilities, - SessionBindingRecord, - SessionBindingService, - SessionBindingUnbindInput, -} from "../infra/outbound/session-binding-service.js"; -export type { - GatewayRequestHandler, - GatewayRequestHandlerOptions, - RespondFn, -} from "../gateway/server-methods/types.js"; export type { PluginRuntime, RuntimeLogger, SubagentRunParams, SubagentRunResult, - SubagentWaitParams, - SubagentWaitResult, - SubagentGetSessionMessagesParams, - SubagentGetSessionMessagesResult, - SubagentGetSessionParams, - SubagentGetSessionResult, - SubagentDeleteSessionParams, } from "../plugins/runtime/types.js"; -export { normalizePluginHttpPath } from "../plugins/http-path.js"; -export { registerPluginHttpRoute } from "../plugins/http-registry.js"; -export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; export type { OpenClawConfig } from "../config/config.js"; /** @deprecated Use OpenClawConfig instead */ export type { OpenClawConfig as ClawdbotConfig } from "../config/config.js"; -export { isDangerousNameMatchingEnabled } from "../config/dangerous-name-matching.js"; -export * from "./speech.js"; - -export type { FileLockHandle, FileLockOptions } from "./file-lock.js"; -export { acquireFileLock, withFileLock } from "./file-lock.js"; -export * from "./media-understanding.js"; -export { - mapAllowlistResolutionInputs, - mapBasicAllowlistResolutionEntries, - type BasicAllowlistResolutionEntry, -} from "./allowlist-resolution.js"; -export * from "./provider-web-search.js"; -export { resolveRequestUrl } from "./request-url.js"; -export { - buildDiscordSendMediaOptions, - buildDiscordSendOptions, - tagDiscordChannelResult, -} from "./discord-send.js"; -export type { KeyedAsyncQueueHooks } from "./keyed-async-queue.js"; -export { enqueueKeyedTask, KeyedAsyncQueue } from "./keyed-async-queue.js"; -export { normalizeWebhookPath, resolveWebhookPath } from "./webhook-path.js"; -export { - registerWebhookTarget, - registerWebhookTargetWithPluginRoute, - rejectNonPostWebhookRequest, - resolveWebhookTargetWithAuthOrReject, - resolveWebhookTargetWithAuthOrRejectSync, - resolveSingleWebhookTarget, - resolveSingleWebhookTargetAsync, - resolveWebhookTargets, - withResolvedWebhookRequestPipeline, -} from "./webhook-targets.js"; -export type { - RegisterWebhookPluginRouteOptions, - RegisterWebhookTargetOptions, - WebhookTargetMatchResult, -} from "./webhook-targets.js"; -export { - applyBasicWebhookRequestGuards, - beginWebhookRequestPipelineOrReject, - createWebhookInFlightLimiter, - isJsonContentType, - readWebhookBodyOrReject, - readJsonWebhookBodyOrReject, - WEBHOOK_BODY_READ_DEFAULTS, - WEBHOOK_IN_FLIGHT_DEFAULTS, -} from "./webhook-request-guards.js"; -export type { WebhookBodyReadProfile, WebhookInFlightLimiter } from "./webhook-request-guards.js"; -export { - createAccountStatusSink, - keepHttpServerTaskAlive, - runPassiveAccountLifecycle, - waitUntilAbort, -} from "./channel-lifecycle.js"; -export type { AgentMediaPayload } from "./agent-media-payload.js"; -export { buildAgentMediaPayload } from "./agent-media-payload.js"; -export { - buildBaseAccountStatusSnapshot, - buildBaseChannelStatusSummary, - buildComputedAccountStatusSnapshot, - buildProbeChannelStatusSummary, - buildRuntimeAccountStatusSnapshot, - buildTokenChannelStatusSummary, - collectStatusIssuesFromLastError, - createDefaultChannelRuntimeState, -} from "./status-helpers.js"; -export { - normalizeAllowFromEntries, - noteChannelLookupFailure, - noteChannelLookupSummary, - parseMentionOrPrefixedId, - parseSetupEntriesAllowingWildcard, - patchChannelConfigForAccount, - promptLegacyChannelAllowFrom, - promptParsedAllowFromForScopedChannel, - promptResolvedAllowFrom, - resolveSetupAccountId, - setAccountGroupPolicyForChannel, - setChannelDmPolicyWithAllowFrom, - setLegacyChannelDmPolicyWithAllowFrom, - setSetupChannelEnabled, - splitSetupEntries, - promptSingleChannelSecretInput, - type SingleChannelSecretInputPromptResult, -} from "../channels/plugins/setup-wizard-helpers.js"; -export { buildOauthProviderAuthResult } from "./provider-auth-result.js"; -export { formatResolvedUnresolvedNote } from "./resolution-notes.js"; -export { buildChannelSendResult } from "./channel-send-result.js"; -export type { ChannelSendRawResult } from "./channel-send-result.js"; -export { createPluginRuntimeStore } from "./runtime-store.js"; -export { createScopedChannelConfigBase } from "./channel-config-helpers.js"; -export { - buildAccountScopedAllowlistConfigEditor, - resolveLegacyDmAllowlistConfigPaths, -} from "./allowlist-config-edit.js"; -export { - AllowFromEntrySchema, - AllowFromListSchema, - buildNestedDmConfigSchema, - buildCatchallMultiAccountChannelSchema, -} from "../channels/plugins/config-schema.js"; -export { getChatChannelMeta } from "../channels/registry.js"; -export { - compileAllowlist, - resolveAllowlistCandidates, - resolveAllowlistMatchByCandidates, -} from "../channels/allowlist-match.js"; -export type { - BlockStreamingCoalesceConfig, - DmPolicy, - DmConfig, - GroupPolicy, - GroupToolPolicyConfig, - GroupToolPolicyBySenderConfig, - MarkdownConfig, - MarkdownTableMode, - GoogleChatAccountConfig, - GoogleChatConfig, - GoogleChatDmConfig, - GoogleChatGroupConfig, - GoogleChatActionConfig, - MSTeamsChannelConfig, - MSTeamsConfig, - MSTeamsReplyStyle, - MSTeamsTeamConfig, -} from "../config/types.js"; -export { - GROUP_POLICY_BLOCKED_LABEL, - resetMissingProviderGroupPolicyFallbackWarningsForTesting, - resolveAllowlistProviderRuntimeGroupPolicy, - resolveDefaultGroupPolicy, - resolveOpenProviderRuntimeGroupPolicy, - resolveRuntimeGroupPolicy, - type GroupPolicyDefaultsConfig, - type RuntimeGroupPolicyResolution, - type RuntimeGroupPolicyParams, - type ResolveProviderRuntimeGroupPolicyParams, - warnMissingProviderGroupPolicyFallbackOnce, -} from "../config/runtime-group-policy.js"; -export { - DiscordConfigSchema, - GoogleChatConfigSchema, - IMessageConfigSchema, - MSTeamsConfigSchema, - SignalConfigSchema, - SlackConfigSchema, - TelegramConfigSchema, -} from "../config/zod-schema.providers-core.js"; -export { WhatsAppConfigSchema } from "../config/zod-schema.providers-whatsapp.js"; -export { - BlockStreamingCoalesceSchema, - DmConfigSchema, - DmPolicySchema, - GroupPolicySchema, - MarkdownConfigSchema, - MarkdownTableModeSchema, - normalizeAllowFrom, - ReplyRuntimeConfigSchemaShape, - requireOpenAllowFrom, - SecretInputSchema, - TtsAutoSchema, - TtsConfigSchema, - TtsModeSchema, - TtsProviderSchema, -} from "../config/zod-schema.core.js"; -export { - assertSecretInputResolved, - hasConfiguredSecretInput, - isSecretRef, - normalizeResolvedSecretInputString, - normalizeSecretInputString, -} from "../config/types.secrets.js"; export type { SecretInput, SecretRef } from "../config/types.secrets.js"; -export { ToolPolicySchema } from "../config/zod-schema.agent-runtime.js"; export type { RuntimeEnv } from "../runtime.js"; -export type { WizardPrompter } from "../wizard/prompts.js"; -export { - DEFAULT_ACCOUNT_ID, - normalizeAccountId, - normalizeAgentId, - resolveThreadSessionKeys, -} from "../routing/session-key.js"; -export { buildAgentSessionKey, type RoutePeer } from "../routing/resolve-route.js"; -export { - formatAllowFromLowercase, - formatNormalizedAllowFromEntries, - isAllowedParsedChatSender, - isNormalizedSenderAllowed, -} from "./allow-from.js"; -export { - evaluateGroupRouteAccessForPolicy, - evaluateMatchedGroupAccessForPolicy, - evaluateSenderGroupAccess, - evaluateSenderGroupAccessForPolicy, - resolveSenderScopedGroupPolicy, - type GroupRouteAccessDecision, - type GroupRouteAccessReason, - type MatchedGroupAccessDecision, - type MatchedGroupAccessReason, - type SenderGroupAccessDecision, - type SenderGroupAccessReason, -} from "./group-access.js"; -export { - resolveDirectDmAuthorizationOutcome, - resolveSenderCommandAuthorization, - resolveSenderCommandAuthorizationWithRuntime, -} from "./command-auth.js"; -export type { CommandAuthorizationRuntime } from "./command-auth.js"; -export { createScopedPairingAccess } from "./pairing-access.js"; -export { - createInboundEnvelopeBuilder, - resolveInboundRouteEnvelopeBuilder, - resolveInboundRouteEnvelopeBuilderWithRuntime, -} from "./inbound-envelope.js"; -export { resolveInboundSessionEnvelopeContext } from "../channels/session-envelope.js"; -export { - listConfiguredAccountIds, - resolveAccountWithDefaultFallback, -} from "./account-resolution.js"; -export { resolveAccountEntry } from "../routing/account-lookup.js"; -export { issuePairingChallenge } from "../pairing/pairing-challenge.js"; -export { handleSlackMessageAction } from "./slack-message-actions.js"; -export { extractToolSend } from "./tool-send.js"; -export { - createNormalizedOutboundDeliverer, - formatTextWithAttachmentLinks, - isNumericTargetId, - normalizeOutboundReplyPayload, - resolveOutboundMediaUrls, - sendPayloadWithChunkedTextAndMedia, - sendMediaWithLeadingCaption, -} from "./reply-payload.js"; -export type { OutboundReplyPayload } from "./reply-payload.js"; -export { - buildInboundReplyDispatchBase, - dispatchInboundReplyWithBase, - dispatchReplyFromConfigWithSettledDispatcher, - recordInboundSessionAndDispatchReply, -} from "./inbound-reply-dispatch.js"; -export type { OutboundMediaLoadOptions } from "./outbound-media.js"; -export { loadOutboundMediaFromUrl } from "./outbound-media.js"; -export { resolveChannelAccountConfigBasePath } from "./config-paths.js"; -export { buildMediaPayload } from "../channels/plugins/media-payload.js"; -export type { MediaPayload, MediaPayloadInput } from "../channels/plugins/media-payload.js"; -export { - createLoggerBackedRuntime, - resolveRuntimeEnv, - resolveRuntimeEnvWithUnavailableExit, -} from "./runtime.js"; -export { detectBinary } from "../plugins/setup-binary.js"; -export { installSignalCli } from "../plugins/signal-cli-install.js"; -export { chunkTextForOutbound } from "./text-chunking.js"; -export { resolveTextChunkLimit } from "../auto-reply/chunk.js"; -export { readBooleanParam } from "./boolean-param.js"; -export { readJsonFileWithFallback, writeJsonFileAtomically } from "./json-store.js"; -export { generatePkceVerifierChallenge, toFormUrlEncoded } from "./oauth-utils.js"; -export { buildRandomTempFilePath, withTempDownloadPath } from "./temp-path.js"; -export { - applyWindowsSpawnProgramPolicy, - materializeWindowsSpawnProgram, - resolveWindowsExecutablePath, - resolveWindowsSpawnProgramCandidate, - resolveWindowsSpawnProgram, -} from "./windows-spawn.js"; -export type { - ResolveWindowsSpawnProgramCandidateParams, - ResolveWindowsSpawnProgramParams, - WindowsSpawnCandidateResolution, - WindowsSpawnInvocation, - WindowsSpawnProgramCandidate, - WindowsSpawnProgram, - WindowsSpawnResolution, -} from "./windows-spawn.js"; -export { resolvePreferredOpenClawTmpDir } from "../infra/tmp-openclaw-dir.js"; -export { - runPluginCommandWithTimeout, - type PluginCommandRunOptions, - type PluginCommandRunResult, -} from "./run-command.js"; -export { resolveGatewayBindUrl } from "../shared/gateway-bind-url.js"; -export type { GatewayBindUrlResult } from "../shared/gateway-bind-url.js"; -export { resolveTailnetHostWithRunner } from "../shared/tailscale-status.js"; -export type { - TailscaleStatusCommandResult, - TailscaleStatusCommandRunner, -} from "../shared/tailscale-status.js"; -export type { ChatType } from "../channels/chat-type.js"; -export { normalizeChatType } from "../channels/chat-type.js"; -/** @deprecated Use ChatType instead */ -export type { RoutePeerKind } from "../routing/resolve-route.js"; -export { resolveAckReaction } from "../agents/identity.js"; -export type { ReplyPayload } from "../auto-reply/types.js"; -export type { ChunkMode } from "../auto-reply/chunk.js"; -export { SILENT_REPLY_TOKEN, isSilentReplyText } from "../auto-reply/tokens.js"; -export { formatInboundFromLabel } from "../auto-reply/envelope.js"; -export { - createScopedAccountConfigAccessors, - formatTrimmedAllowFromEntries, - mapAllowFromEntries, - resolveOptionalConfigString, - createScopedDmSecurityResolver, - formatWhatsAppConfigAllowFromEntries, - resolveIMessageConfigAllowFrom, - resolveIMessageConfigDefaultTo, - resolveWhatsAppConfigAllowFrom, - resolveWhatsAppConfigDefaultTo, -} from "./channel-config-helpers.js"; -export { - approveDevicePairing, - listDevicePairing, - rejectDevicePairing, -} from "../infra/device-pairing.js"; -export { createDedupeCache } from "../infra/dedupe.js"; -export type { DedupeCache } from "../infra/dedupe.js"; -export { createPersistentDedupe } from "./persistent-dedupe.js"; -export type { - PersistentDedupe, - PersistentDedupeCheckOptions, - PersistentDedupeOptions, -} from "./persistent-dedupe.js"; -export { formatErrorMessage } from "../infra/errors.js"; -export { resolveFetch } from "../infra/fetch.js"; -export { - formatUtcTimestamp, - formatZonedTimestamp, - resolveTimezone, -} from "../infra/format-time/format-datetime.js"; -export { - DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, - DEFAULT_WEBHOOK_MAX_BODY_BYTES, - RequestBodyLimitError, - installRequestBodyLimitGuard, - isRequestBodyLimitError, - readJsonBodyWithLimit, - readRequestBodyWithLimit, - requestBodyErrorToText, -} from "../infra/http-body.js"; -export { - WEBHOOK_ANOMALY_COUNTER_DEFAULTS, - WEBHOOK_ANOMALY_STATUS_CODES, - WEBHOOK_RATE_LIMIT_DEFAULTS, - createBoundedCounter, - createFixedWindowRateLimiter, - createWebhookAnomalyTracker, -} from "./webhook-memory-guards.js"; -export type { - BoundedCounter, - FixedWindowRateLimiter, - WebhookAnomalyTracker, -} from "./webhook-memory-guards.js"; - -export { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js"; -export { - SsrFBlockedError, - isBlockedHostname, - isBlockedHostnameOrIp, - isPrivateIpAddress, -} from "../infra/net/ssrf.js"; -export type { LookupFn, SsrFPolicy } from "../infra/net/ssrf.js"; -export { - buildHostnameAllowlistPolicyFromSuffixAllowlist, - isHttpsUrlAllowedByHostnameSuffixAllowlist, - normalizeHostnameSuffixAllowlist, -} from "./ssrf-policy.js"; -export { fetchWithBearerAuthScopeFallback } from "./fetch-auth.js"; -export type { ScopeTokenProvider } from "./fetch-auth.js"; -export { rawDataToString } from "../infra/ws.js"; -export { isWSLSync, isWSL2Sync, isWSLEnv } from "../infra/wsl.js"; -export { isTruthyEnvValue } from "../infra/env.js"; -export { resolveChannelGroupRequireMention, resolveToolsBySender } from "../config/group-policy.js"; -export { - buildPendingHistoryContextFromMap, - clearHistoryEntries, - clearHistoryEntriesIfEnabled, - DEFAULT_GROUP_HISTORY_LIMIT, - evictOldHistoryKeys, - recordPendingHistoryEntry, - recordPendingHistoryEntryIfEnabled, -} from "../auto-reply/reply/history.js"; -export type { HistoryEntry } from "../auto-reply/reply/history.js"; -export { mergeAllowlist, summarizeMapping } from "../channels/allowlists/resolve-utils.js"; -export { - resolveMentionGating, - resolveMentionGatingWithBypass, -} from "../channels/mention-gating.js"; -export type { - AckReactionGateParams, - AckReactionScope, - WhatsAppAckReactionMode, -} from "../channels/ack-reactions.js"; -export { - removeAckReactionAfterReply, - shouldAckReaction, - shouldAckReactionForWhatsApp, -} from "../channels/ack-reactions.js"; -export { createTypingCallbacks } from "../channels/typing.js"; -export { createReplyPrefixContext, createReplyPrefixOptions } from "../channels/reply-prefix.js"; -export { logAckFailure, logInboundDrop, logTypingFailure } from "../channels/logging.js"; -export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; -export type { NormalizedLocation } from "../channels/location.js"; -export { formatLocationText, toLocationContext } from "../channels/location.js"; -export { resolveControlCommandGate } from "../channels/command-gating.js"; -export { - resolveBlueBubblesGroupRequireMention, - resolveDiscordGroupRequireMention, - resolveGoogleChatGroupRequireMention, - resolveIMessageGroupRequireMention, - resolveSlackGroupRequireMention, - resolveTelegramGroupRequireMention, - resolveWhatsAppGroupRequireMention, - resolveBlueBubblesGroupToolPolicy, - resolveDiscordGroupToolPolicy, - resolveGoogleChatGroupToolPolicy, - resolveIMessageGroupToolPolicy, - resolveSlackGroupToolPolicy, - resolveTelegramGroupToolPolicy, - resolveWhatsAppGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; -export { recordInboundSession } from "../channels/session.js"; -export { - buildChannelKeyCandidates, - normalizeChannelSlug, - resolveChannelEntryMatch, - resolveChannelEntryMatchWithFallback, - resolveNestedAllowlistDecision, -} from "../channels/plugins/channel-config.js"; -export { - listDiscordDirectoryGroupsFromConfig, - listDiscordDirectoryPeersFromConfig, - listSlackDirectoryGroupsFromConfig, - listSlackDirectoryPeersFromConfig, - listTelegramDirectoryGroupsFromConfig, - listTelegramDirectoryPeersFromConfig, - listWhatsAppDirectoryGroupsFromConfig, - listWhatsAppDirectoryPeersFromConfig, -} from "../channels/plugins/directory-config.js"; -export type { AllowlistMatch } from "../channels/plugins/allowlist-match.js"; -export { - formatAllowlistMatchMeta, - resolveAllowlistMatchSimple, -} from "../channels/plugins/allowlist-match.js"; -export { optionalStringEnum, stringEnum } from "../agents/schema/typebox.js"; -export type { PollInput } from "../polls.js"; - -export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js"; -export { - listDirectoryGroupEntriesFromMapKeys, - listDirectoryGroupEntriesFromMapKeysAndAllowFrom, - listDirectoryUserEntriesFromAllowFrom, - listDirectoryUserEntriesFromAllowFromAndMapKeys, -} from "../channels/plugins/directory-config-helpers.js"; -export { - clearAccountEntryFields, - deleteAccountFromConfigSection, - setAccountEnabledInConfigSection, -} from "../channels/plugins/config-helpers.js"; -export { - applyAccountNameToChannelSection, - applySetupAccountConfigPatch, - migrateBaseNameToDefaultAccount, - patchScopedAccountConfig, -} from "../channels/plugins/setup-helpers.js"; -export { - buildOpenGroupPolicyConfigureRouteAllowlistWarning, - buildOpenGroupPolicyNoRouteAllowlistWarning, - buildOpenGroupPolicyRestrictSendersWarning, - buildOpenGroupPolicyWarning, - collectAllowlistProviderGroupPolicyWarnings, - collectAllowlistProviderRestrictSendersWarnings, - collectOpenProviderGroupPolicyWarnings, - collectOpenGroupPolicyConfiguredRouteWarnings, - collectOpenGroupPolicyRestrictSendersWarnings, - collectOpenGroupPolicyRouteAllowlistWarnings, -} from "../channels/plugins/group-policy-warnings.js"; -export { - buildAccountScopedDmSecurityPolicy, - formatPairingApproveHint, -} from "../channels/plugins/helpers.js"; -export { PAIRING_APPROVED_MESSAGE } from "../channels/plugins/pairing-message.js"; - -export { - createActionGate, - jsonResult, - readNumberParam, - readReactionParams, - readStringParam, -} from "../agents/tools/common.js"; -export { formatDocsLink } from "../terminal/links.js"; -export { formatCliCommand } from "../cli/command-format.js"; -export { - DM_GROUP_ACCESS_REASON, - readStoreAllowFromForDmPolicy, - resolveDmAllowState, - resolveDmGroupAccessDecision, - resolveDmGroupAccessWithCommandGate, - resolveDmGroupAccessWithLists, - resolveEffectiveAllowFromLists, -} from "../security/dm-policy-shared.js"; -export type { DmGroupAccessReasonCode } from "../security/dm-policy-shared.js"; export type { HookEntry } from "../hooks/types.js"; -export { - clamp, - escapeRegExp, - isRecord, - normalizeE164, - pathExists, - resolveUserPath, - safeParseJson, - sleep, -} from "../utils.js"; -export { fetchWithTimeout } from "../utils/fetch-timeout.js"; -export { - DEFAULT_SECRET_FILE_MAX_BYTES, - loadSecretFileSync, - readSecretFileSync, - tryReadSecretFileSync, -} from "../infra/secret-file.js"; -export { stripAnsi } from "../terminal/ansi.js"; -export { missingTargetError } from "../infra/outbound/target-errors.js"; -export { registerLogTransport } from "../logging/logger.js"; -export type { LogTransport, LogTransportRecord } from "../logging/logger.js"; -export { - emitDiagnosticEvent, - isDiagnosticsEnabled, - onDiagnosticEvent, -} from "../infra/diagnostic-events.js"; -export type { - DiagnosticEventPayload, - DiagnosticHeartbeatEvent, - DiagnosticLaneDequeueEvent, - DiagnosticLaneEnqueueEvent, - DiagnosticMessageProcessedEvent, - DiagnosticMessageQueuedEvent, - DiagnosticRunAttemptEvent, - DiagnosticSessionState, - DiagnosticSessionStateEvent, - DiagnosticSessionStuckEvent, - DiagnosticUsageEvent, - DiagnosticWebhookErrorEvent, - DiagnosticWebhookProcessedEvent, - DiagnosticWebhookReceivedEvent, -} from "../infra/diagnostic-events.js"; -export { loadConfig } from "../config/config.js"; -export { runCommandWithTimeout } from "../process/exec.js"; -export { detectMime, extensionForMime, getFileExtension } from "../media/mime.js"; -export { extractOriginalFilename } from "../media/store.js"; -export { listSkillCommandsForAgents } from "../auto-reply/skill-commands.js"; -export type { SkillCommandSpec } from "../agents/skills.js"; +export type { ReplyPayload } from "../auto-reply/types.js"; +export type { WizardPrompter } from "../wizard/prompts.js"; -// Channel: WhatsApp — WhatsApp-specific exports moved to extensions/whatsapp/src/ -export { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../whatsapp/normalize.js"; -export { resolveWhatsAppOutboundTarget } from "../whatsapp/resolve-outbound-target.js"; - -// Channel: BlueBubbles -export { collectBlueBubblesStatusIssues } from "../channels/plugins/status-issues/bluebubbles.js"; - -// Channel: LINE -export { - listLineAccountIds, - lineSetupAdapter, - lineSetupWizard, - normalizeAccountId as normalizeLineAccountId, - resolveDefaultLineAccountId, - resolveLineAccount, - LineConfigSchema, -} from "./line.js"; -export type { - LineConfig, - LineAccountConfig, - ResolvedLineAccount, - LineChannelData, -} from "../line/types.js"; -export { - createInfoCard, - createListCard, - createImageCard, - createActionCard, - createReceiptCard, - type CardAction, - type ListItem, -} from "../line/flex-templates.js"; -export { - processLineMessage, - hasMarkdownToConvert, - stripMarkdown, -} from "../line/markdown-to-line.js"; -export type { ProcessedLineMessage } from "../line/markdown-to-line.js"; - -// Media utilities -export { loadWebMedia, type WebMediaResult } from "./web-media.js"; - -// Context engine -export type { - ContextEngine, - ContextEngineInfo, - AssembleResult, - CompactResult, - IngestResult, - IngestBatchResult, - BootstrapResult, - SubagentSpawnPreparation, - SubagentEndReason, -} from "../context-engine/types.js"; -export { registerContextEngine } from "../context-engine/registry.js"; -export type { ContextEngineFactory } from "../context-engine/registry.js"; - -// Model authentication types for plugins. -// Plugins should use runtime.modelAuth (which strips unsafe overrides like -// agentDir/store) rather than importing raw helpers directly. -export { requireApiKey } from "../agents/model-auth.js"; -export type { ResolvedProviderAuth } from "../agents/model-auth.js"; -export type { - ProviderCatalogContext, - ProviderCatalogResult, - ProviderDiscoveryContext, -} from "../plugins/types.js"; -export { - applyProviderDefaultModel, - promptAndConfigureOpenAICompatibleSelfHostedProvider, - SELF_HOSTED_DEFAULT_CONTEXT_WINDOW, - SELF_HOSTED_DEFAULT_COST, - SELF_HOSTED_DEFAULT_MAX_TOKENS, -} from "../plugins/provider-self-hosted-setup.js"; -export { - OLLAMA_DEFAULT_BASE_URL, - OLLAMA_DEFAULT_MODEL, - configureOllamaNonInteractive, - ensureOllamaModelPulled, - promptAndConfigureOllama, -} from "../plugins/provider-ollama-setup.js"; -export { - VLLM_DEFAULT_BASE_URL, - VLLM_DEFAULT_CONTEXT_WINDOW, - VLLM_DEFAULT_COST, - VLLM_DEFAULT_MAX_TOKENS, - promptAndConfigureVllm, -} from "../plugins/provider-vllm-setup.js"; -export { - buildOllamaProvider, - buildSglangProvider, - buildVllmProvider, -} from "../agents/models-config.providers.discovery.js"; - -// Security utilities -export { redactSensitiveText } from "../logging/redact.js"; +export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; diff --git a/src/plugin-sdk/provider-auth.ts b/src/plugin-sdk/provider-auth.ts index baecefe62e9..d30dd81f7d6 100644 --- a/src/plugin-sdk/provider-auth.ts +++ b/src/plugin-sdk/provider-auth.ts @@ -4,6 +4,7 @@ export type { OpenClawConfig } from "../config/config.js"; export type { SecretInput } from "../config/types.secrets.js"; export type { ProviderAuthResult } from "../plugins/types.js"; export type { AuthProfileStore, OAuthCredential } from "../agents/auth-profiles/types.js"; +export { buildOauthProviderAuthResult } from "./provider-auth-result.js"; export { CLAUDE_CLI_PROFILE_ID, diff --git a/src/plugin-sdk/provider-models.ts b/src/plugin-sdk/provider-models.ts index 5694a540075..2ab00992d19 100644 --- a/src/plugin-sdk/provider-models.ts +++ b/src/plugin-sdk/provider-models.ts @@ -1,10 +1,16 @@ // Public model/catalog helpers for provider plugins. -export type { - ModelApi, - ModelDefinitionConfig, - ModelProviderConfig, -} from "../config/types.models.js"; +import type { ModelDefinitionConfig } from "../config/types.models.js"; +import { + KILOCODE_DEFAULT_CONTEXT_WINDOW, + KILOCODE_DEFAULT_COST, + KILOCODE_DEFAULT_MAX_TOKENS, + KILOCODE_DEFAULT_MODEL_ID, + KILOCODE_DEFAULT_MODEL_NAME, +} from "../providers/kilocode-shared.js"; + +export type { ModelApi, ModelProviderConfig } from "../config/types.models.js"; +export type { ModelDefinitionConfig } from "../config/types.models.js"; export type { ProviderPlugin } from "../plugins/types.js"; export { DEFAULT_CONTEXT_TOKENS } from "../agents/defaults.js"; @@ -19,8 +25,48 @@ export { applyOpenAIConfig, OPENAI_DEFAULT_MODEL } from "../plugins/provider-mod export { OPENCODE_GO_DEFAULT_MODEL_REF } from "../plugins/provider-model-defaults.js"; export { OPENCODE_ZEN_DEFAULT_MODEL } from "../plugins/provider-model-defaults.js"; export { OPENCODE_ZEN_DEFAULT_MODEL_REF } from "../agents/opencode-zen-models.js"; - -export * from "../plugins/provider-model-definitions.js"; +export { + buildMinimaxApiModelDefinition, + DEFAULT_MINIMAX_BASE_URL, + MINIMAX_API_BASE_URL, + MINIMAX_CN_API_BASE_URL, + MINIMAX_HOSTED_COST, + MINIMAX_HOSTED_MODEL_ID, + MINIMAX_HOSTED_MODEL_REF, + MINIMAX_LM_STUDIO_COST, +} from "../../extensions/minimax/model-definitions.js"; +export { + buildMistralModelDefinition, + MISTRAL_BASE_URL, + MISTRAL_DEFAULT_MODEL_ID, + MISTRAL_DEFAULT_MODEL_REF, +} from "../../extensions/mistral/model-definitions.js"; +export { + buildModelStudioDefaultModelDefinition, + buildModelStudioModelDefinition, + MODELSTUDIO_CN_BASE_URL, + MODELSTUDIO_DEFAULT_MODEL_ID, + MODELSTUDIO_DEFAULT_MODEL_REF, + MODELSTUDIO_GLOBAL_BASE_URL, +} from "../../extensions/modelstudio/model-definitions.js"; +export { MOONSHOT_BASE_URL } from "../../extensions/moonshot/provider-catalog.js"; +export { MOONSHOT_CN_BASE_URL } from "../../extensions/moonshot/onboard.js"; +export { + buildXaiModelDefinition, + XAI_BASE_URL, + XAI_DEFAULT_MODEL_ID, + XAI_DEFAULT_MODEL_REF, +} from "../../extensions/xai/model-definitions.js"; +export { + buildZaiModelDefinition, + resolveZaiBaseUrl, + ZAI_CODING_CN_BASE_URL, + ZAI_CODING_GLOBAL_BASE_URL, + ZAI_CN_BASE_URL, + ZAI_DEFAULT_MODEL_ID, + ZAI_DEFAULT_MODEL_REF, + ZAI_GLOBAL_BASE_URL, +} from "../../extensions/zai/model-definitions.js"; export { buildCloudflareAiGatewayModelDefinition, @@ -84,3 +130,15 @@ export { discoverVercelAiGatewayModels, VERCEL_AI_GATEWAY_BASE_URL, } from "../agents/vercel-ai-gateway.js"; + +export function buildKilocodeModelDefinition(): ModelDefinitionConfig { + return { + id: KILOCODE_DEFAULT_MODEL_ID, + name: KILOCODE_DEFAULT_MODEL_NAME, + reasoning: true, + input: ["text", "image"], + cost: KILOCODE_DEFAULT_COST, + contextWindow: KILOCODE_DEFAULT_CONTEXT_WINDOW, + maxTokens: KILOCODE_DEFAULT_MAX_TOKENS, + }; +} diff --git a/src/plugin-sdk/reply-history.ts b/src/plugin-sdk/reply-history.ts new file mode 100644 index 00000000000..d327b767a99 --- /dev/null +++ b/src/plugin-sdk/reply-history.ts @@ -0,0 +1,14 @@ +/** Shared reply-history helpers for plugins that keep short per-thread context windows. */ +export type { HistoryEntry } from "../auto-reply/reply/history.js"; +export { + DEFAULT_GROUP_HISTORY_LIMIT, + buildHistoryContext, + buildHistoryContextFromEntries, + buildHistoryContextFromMap, + buildPendingHistoryContextFromMap, + clearHistoryEntries, + clearHistoryEntriesIfEnabled, + evictOldHistoryKeys, + recordPendingHistoryEntry, + recordPendingHistoryEntryIfEnabled, +} from "../auto-reply/reply/history.js"; diff --git a/src/plugin-sdk/root-alias.cjs b/src/plugin-sdk/root-alias.cjs index 8f628bd5e8e..0013b32d21f 100644 --- a/src/plugin-sdk/root-alias.cjs +++ b/src/plugin-sdk/root-alias.cjs @@ -84,7 +84,7 @@ function loadMonolithicSdk() { const jiti = getJiti(); - const distCandidate = path.resolve(__dirname, "..", "..", "dist", "plugin-sdk", "index.js"); + const distCandidate = path.resolve(__dirname, "..", "..", "dist", "plugin-sdk", "compat.js"); if (fs.existsSync(distCandidate)) { try { monolithicSdk = jiti(distCandidate); @@ -94,7 +94,7 @@ function loadMonolithicSdk() { } } - monolithicSdk = jiti(path.join(__dirname, "index.ts")); + monolithicSdk = jiti(path.join(__dirname, "compat.ts")); return monolithicSdk; } diff --git a/src/plugin-sdk/subpaths.test.ts b/src/plugin-sdk/subpaths.test.ts index d7d15f88748..0166fb52081 100644 --- a/src/plugin-sdk/subpaths.test.ts +++ b/src/plugin-sdk/subpaths.test.ts @@ -12,6 +12,8 @@ import * as msteamsSdk from "openclaw/plugin-sdk/msteams"; import * as nostrSdk from "openclaw/plugin-sdk/nostr"; import * as ollamaSetupSdk from "openclaw/plugin-sdk/ollama-setup"; import * as providerSetupSdk from "openclaw/plugin-sdk/provider-setup"; +import * as routingSdk from "openclaw/plugin-sdk/routing"; +import * as runtimeSdk from "openclaw/plugin-sdk/runtime"; import * as sandboxSdk from "openclaw/plugin-sdk/sandbox"; import * as selfHostedProviderSetupSdk from "openclaw/plugin-sdk/self-hosted-provider-setup"; import * as setupSdk from "openclaw/plugin-sdk/setup"; @@ -45,17 +47,25 @@ describe("plugin-sdk subpath exports", () => { expect(typeof compatSdk.resolveControlCommandGate).toBe("function"); }); - it("exports core routing helpers", () => { - expect(typeof coreSdk.buildAgentSessionKey).toBe("function"); - expect(typeof coreSdk.resolveThreadSessionKeys).toBe("function"); - expect(typeof coreSdk.runPassiveAccountLifecycle).toBe("function"); - expect(typeof coreSdk.createLoggerBackedRuntime).toBe("function"); + it("keeps core focused on generic shared exports", () => { + expect(typeof coreSdk.emptyPluginConfigSchema).toBe("function"); + expect("runPassiveAccountLifecycle" in asExports(coreSdk)).toBe(false); + expect("createLoggerBackedRuntime" in asExports(coreSdk)).toBe(false); expect("registerSandboxBackend" in asExports(coreSdk)).toBe(false); expect("promptAndConfigureOpenAICompatibleSelfHostedProviderAuth" in asExports(coreSdk)).toBe( false, ); }); + it("exports routing helpers from the dedicated subpath", () => { + expect(typeof routingSdk.buildAgentSessionKey).toBe("function"); + expect(typeof routingSdk.resolveThreadSessionKeys).toBe("function"); + }); + + it("exports runtime helpers from the dedicated subpath", () => { + expect(typeof runtimeSdk.createLoggerBackedRuntime).toBe("function"); + }); + it("exports provider setup helpers from the dedicated subpath", () => { expect(typeof providerSetupSdk.buildVllmProvider).toBe("function"); expect(typeof providerSetupSdk.discoverOpenAICompatibleSelfHostedProvider).toBe("function");