From 8240fd900ace61a3bbe41c8096a4e9e2f17c3666 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Wed, 18 Mar 2026 11:00:33 -0700 Subject: [PATCH] Plugin SDK: route core channel runtimes through public subpaths --- src/plugin-sdk/discord.ts | 15 ++ src/plugin-sdk/imessage.ts | 6 +- src/plugin-sdk/slack.ts | 11 +- src/plugin-sdk/telegram.ts | 13 ++ .../runtime/runtime-discord-ops.runtime.ts | 14 +- src/plugins/runtime/runtime-discord.ts | 4 +- src/plugins/runtime/runtime-imessage.ts | 2 +- src/plugins/runtime/runtime-signal.ts | 2 +- .../runtime/runtime-slack-ops.runtime.ts | 14 +- .../runtime/runtime-telegram-ops.runtime.ts | 8 +- src/plugins/runtime/runtime-telegram.ts | 8 +- ...n-extension-import-boundary-inventory.json | 208 ------------------ 12 files changed, 69 insertions(+), 236 deletions(-) diff --git a/src/plugin-sdk/discord.ts b/src/plugin-sdk/discord.ts index 2949446fef6..4a968f2fbbc 100644 --- a/src/plugin-sdk/discord.ts +++ b/src/plugin-sdk/discord.ts @@ -84,7 +84,14 @@ export { export { normalizeExplicitDiscordSessionKey } from "../../extensions/discord/session-key-api.js"; export { autoBindSpawnedDiscordSubagent, + getThreadBindingManager, listThreadBindingsBySessionKey, + resolveThreadBindingIdleTimeoutMs, + resolveThreadBindingInactivityExpiresAt, + resolveThreadBindingMaxAgeExpiresAt, + resolveThreadBindingMaxAgeMs, + setThreadBindingIdleTimeoutBySessionKey, + setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey, } from "../../extensions/discord/runtime-api.js"; export { getGateway } from "../../extensions/discord/runtime-api.js"; @@ -93,6 +100,7 @@ export { readDiscordComponentSpec } from "../../extensions/discord/api.js"; export { resolveDiscordChannelId } from "../../extensions/discord/api.js"; export { addRoleDiscord, + auditDiscordChannelPermissions, banMemberDiscord, createChannelDiscord, createScheduledEventDiscord, @@ -110,23 +118,30 @@ export { fetchVoiceStatusDiscord, hasAnyGuildPermissionDiscord, kickMemberDiscord, + listDiscordDirectoryGroupsLive, + listDiscordDirectoryPeersLive, listGuildChannelsDiscord, listGuildEmojisDiscord, listPinsDiscord, listScheduledEventsDiscord, listThreadsDiscord, + monitorDiscordProvider, moveChannelDiscord, pinMessageDiscord, + probeDiscord, reactMessageDiscord, readMessagesDiscord, removeChannelPermissionDiscord, removeOwnReactionsDiscord, removeReactionDiscord, removeRoleDiscord, + resolveDiscordChannelAllowlist, + resolveDiscordUserAllowlist, searchMessagesDiscord, sendDiscordComponentMessage, sendMessageDiscord, sendPollDiscord, + sendTypingDiscord, sendStickerDiscord, sendVoiceMessageDiscord, setChannelPermissionDiscord, diff --git a/src/plugin-sdk/imessage.ts b/src/plugin-sdk/imessage.ts index c69abdc6b5c..b6c98da97c6 100644 --- a/src/plugin-sdk/imessage.ts +++ b/src/plugin-sdk/imessage.ts @@ -43,4 +43,8 @@ export { IMessageConfigSchema } from "../config/zod-schema.providers-core.js"; export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; export { collectStatusIssuesFromLastError } from "./status-helpers.js"; -export { sendMessageIMessage } from "../../extensions/imessage/runtime-api.js"; +export { + monitorIMessageProvider, + probeIMessage, + sendMessageIMessage, +} from "../../extensions/imessage/runtime-api.js"; diff --git a/src/plugin-sdk/slack.ts b/src/plugin-sdk/slack.ts index 0b1159cbb22..bef98db2bfc 100644 --- a/src/plugin-sdk/slack.ts +++ b/src/plugin-sdk/slack.ts @@ -60,7 +60,16 @@ export { extractSlackToolSend, listSlackMessageActions } from "../../extensions/ export { buildSlackThreadingToolContext } from "../../extensions/slack/api.js"; export { parseSlackBlocksInput } from "../../extensions/slack/api.js"; export { handleSlackHttpRequest } from "../../extensions/slack/api.js"; -export { sendMessageSlack } from "../../extensions/slack/runtime-api.js"; +export { + handleSlackAction, + listSlackDirectoryGroupsLive, + listSlackDirectoryPeersLive, + monitorSlackProvider, + probeSlack, + resolveSlackChannelAllowlist, + resolveSlackUserAllowlist, + sendMessageSlack, +} from "../../extensions/slack/runtime-api.js"; export { deleteSlackMessage, downloadSlackFile, diff --git a/src/plugin-sdk/telegram.ts b/src/plugin-sdk/telegram.ts index 47bed87544f..fa06fded55d 100644 --- a/src/plugin-sdk/telegram.ts +++ b/src/plugin-sdk/telegram.ts @@ -86,18 +86,31 @@ export { } from "../../extensions/telegram/api.js"; export { resolveTelegramReactionLevel } from "../../extensions/telegram/api.js"; export { + auditTelegramGroupMembership, + collectTelegramUnmentionedGroupIds, createForumTopicTelegram, deleteMessageTelegram, editForumTopicTelegram, + editMessageReplyMarkupTelegram, editMessageTelegram, + monitorTelegramProvider, + pinMessageTelegram, reactMessageTelegram, + renameForumTopicTelegram, + probeTelegram, sendMessageTelegram, sendPollTelegram, sendStickerTelegram, + sendTypingTelegram, + unpinMessageTelegram, } from "../../extensions/telegram/runtime-api.js"; export { getCacheStats, searchStickers } from "../../extensions/telegram/api.js"; export { resolveTelegramToken } from "../../extensions/telegram/runtime-api.js"; export { telegramMessageActions } from "../../extensions/telegram/runtime-api.js"; +export { + setTelegramThreadBindingIdleTimeoutBySessionKey, + setTelegramThreadBindingMaxAgeBySessionKey, +} from "../../extensions/telegram/runtime-api.js"; export { collectTelegramStatusIssues } from "../../extensions/telegram/api.js"; export { sendTelegramPayloadMessages } from "../../extensions/telegram/api.js"; export { diff --git a/src/plugins/runtime/runtime-discord-ops.runtime.ts b/src/plugins/runtime/runtime-discord-ops.runtime.ts index e1bc99166af..02a4cc22eb0 100644 --- a/src/plugins/runtime/runtime-discord-ops.runtime.ts +++ b/src/plugins/runtime/runtime-discord-ops.runtime.ts @@ -1,12 +1,12 @@ -import { auditDiscordChannelPermissions as auditDiscordChannelPermissionsImpl } from "../../../extensions/discord/runtime-api.js"; +import { auditDiscordChannelPermissions as auditDiscordChannelPermissionsImpl } from "openclaw/plugin-sdk/discord"; import { listDiscordDirectoryGroupsLive as listDiscordDirectoryGroupsLiveImpl, listDiscordDirectoryPeersLive as listDiscordDirectoryPeersLiveImpl, -} from "../../../extensions/discord/runtime-api.js"; -import { monitorDiscordProvider as monitorDiscordProviderImpl } from "../../../extensions/discord/runtime-api.js"; -import { probeDiscord as probeDiscordImpl } from "../../../extensions/discord/runtime-api.js"; -import { resolveDiscordChannelAllowlist as resolveDiscordChannelAllowlistImpl } from "../../../extensions/discord/runtime-api.js"; -import { resolveDiscordUserAllowlist as resolveDiscordUserAllowlistImpl } from "../../../extensions/discord/runtime-api.js"; +} from "openclaw/plugin-sdk/discord"; +import { monitorDiscordProvider as monitorDiscordProviderImpl } from "openclaw/plugin-sdk/discord"; +import { probeDiscord as probeDiscordImpl } from "openclaw/plugin-sdk/discord"; +import { resolveDiscordChannelAllowlist as resolveDiscordChannelAllowlistImpl } from "openclaw/plugin-sdk/discord"; +import { resolveDiscordUserAllowlist as resolveDiscordUserAllowlistImpl } from "openclaw/plugin-sdk/discord"; import { createThreadDiscord as createThreadDiscordImpl, deleteMessageDiscord as deleteMessageDiscordImpl, @@ -18,7 +18,7 @@ import { sendPollDiscord as sendPollDiscordImpl, sendTypingDiscord as sendTypingDiscordImpl, unpinMessageDiscord as unpinMessageDiscordImpl, -} from "../../../extensions/discord/runtime-api.js"; +} from "openclaw/plugin-sdk/discord"; import type { PluginRuntimeChannel } from "./types-channel.js"; type RuntimeDiscordOps = Pick< diff --git a/src/plugins/runtime/runtime-discord.ts b/src/plugins/runtime/runtime-discord.ts index 8264a7f04df..354d205a66d 100644 --- a/src/plugins/runtime/runtime-discord.ts +++ b/src/plugins/runtime/runtime-discord.ts @@ -1,4 +1,4 @@ -import { discordMessageActions } from "../../../extensions/discord/runtime-api.js"; +import { discordMessageActions } from "openclaw/plugin-sdk/discord"; import { getThreadBindingManager, resolveThreadBindingIdleTimeoutMs, @@ -8,7 +8,7 @@ import { setThreadBindingIdleTimeoutBySessionKey, setThreadBindingMaxAgeBySessionKey, unbindThreadBindingsBySessionKey, -} from "../../../extensions/discord/runtime-api.js"; +} from "openclaw/plugin-sdk/discord"; import { createLazyRuntimeMethodBinder, createLazyRuntimeSurface, diff --git a/src/plugins/runtime/runtime-imessage.ts b/src/plugins/runtime/runtime-imessage.ts index 56136197626..7740b6bdfa3 100644 --- a/src/plugins/runtime/runtime-imessage.ts +++ b/src/plugins/runtime/runtime-imessage.ts @@ -2,7 +2,7 @@ import { monitorIMessageProvider, probeIMessage, sendMessageIMessage, -} from "../../../extensions/imessage/runtime-api.js"; +} from "openclaw/plugin-sdk/imessage"; import type { PluginRuntimeChannel } from "./types-channel.js"; export function createRuntimeIMessage(): PluginRuntimeChannel["imessage"] { diff --git a/src/plugins/runtime/runtime-signal.ts b/src/plugins/runtime/runtime-signal.ts index 5eade131012..e0b3c244e39 100644 --- a/src/plugins/runtime/runtime-signal.ts +++ b/src/plugins/runtime/runtime-signal.ts @@ -3,7 +3,7 @@ import { probeSignal, signalMessageActions, sendMessageSignal, -} from "../../../extensions/signal/runtime-api.js"; +} from "openclaw/plugin-sdk/signal"; import type { PluginRuntimeChannel } from "./types-channel.js"; export function createRuntimeSignal(): PluginRuntimeChannel["signal"] { diff --git a/src/plugins/runtime/runtime-slack-ops.runtime.ts b/src/plugins/runtime/runtime-slack-ops.runtime.ts index 8c06f2dda34..89411fafc00 100644 --- a/src/plugins/runtime/runtime-slack-ops.runtime.ts +++ b/src/plugins/runtime/runtime-slack-ops.runtime.ts @@ -1,13 +1,13 @@ import { listSlackDirectoryGroupsLive as listSlackDirectoryGroupsLiveImpl, listSlackDirectoryPeersLive as listSlackDirectoryPeersLiveImpl, -} from "../../../extensions/slack/runtime-api.js"; -import { monitorSlackProvider as monitorSlackProviderImpl } from "../../../extensions/slack/runtime-api.js"; -import { probeSlack as probeSlackImpl } from "../../../extensions/slack/runtime-api.js"; -import { resolveSlackChannelAllowlist as resolveSlackChannelAllowlistImpl } from "../../../extensions/slack/runtime-api.js"; -import { resolveSlackUserAllowlist as resolveSlackUserAllowlistImpl } from "../../../extensions/slack/runtime-api.js"; -import { sendMessageSlack as sendMessageSlackImpl } from "../../../extensions/slack/runtime-api.js"; -import { handleSlackAction as handleSlackActionImpl } from "../../../extensions/slack/runtime-api.js"; +} from "openclaw/plugin-sdk/slack"; +import { monitorSlackProvider as monitorSlackProviderImpl } from "openclaw/plugin-sdk/slack"; +import { probeSlack as probeSlackImpl } from "openclaw/plugin-sdk/slack"; +import { resolveSlackChannelAllowlist as resolveSlackChannelAllowlistImpl } from "openclaw/plugin-sdk/slack"; +import { resolveSlackUserAllowlist as resolveSlackUserAllowlistImpl } from "openclaw/plugin-sdk/slack"; +import { sendMessageSlack as sendMessageSlackImpl } from "openclaw/plugin-sdk/slack"; +import { handleSlackAction as handleSlackActionImpl } from "openclaw/plugin-sdk/slack"; import type { PluginRuntimeChannel } from "./types-channel.js"; type RuntimeSlackOps = Pick< diff --git a/src/plugins/runtime/runtime-telegram-ops.runtime.ts b/src/plugins/runtime/runtime-telegram-ops.runtime.ts index dcd3fa05dec..5b49e854651 100644 --- a/src/plugins/runtime/runtime-telegram-ops.runtime.ts +++ b/src/plugins/runtime/runtime-telegram-ops.runtime.ts @@ -1,6 +1,6 @@ -import { auditTelegramGroupMembership as auditTelegramGroupMembershipImpl } from "../../../extensions/telegram/runtime-api.js"; -import { monitorTelegramProvider as monitorTelegramProviderImpl } from "../../../extensions/telegram/runtime-api.js"; -import { probeTelegram as probeTelegramImpl } from "../../../extensions/telegram/runtime-api.js"; +import { auditTelegramGroupMembership as auditTelegramGroupMembershipImpl } from "openclaw/plugin-sdk/telegram"; +import { monitorTelegramProvider as monitorTelegramProviderImpl } from "openclaw/plugin-sdk/telegram"; +import { probeTelegram as probeTelegramImpl } from "openclaw/plugin-sdk/telegram"; import { deleteMessageTelegram as deleteMessageTelegramImpl, editMessageReplyMarkupTelegram as editMessageReplyMarkupTelegramImpl, @@ -11,7 +11,7 @@ import { sendPollTelegram as sendPollTelegramImpl, sendTypingTelegram as sendTypingTelegramImpl, unpinMessageTelegram as unpinMessageTelegramImpl, -} from "../../../extensions/telegram/runtime-api.js"; +} from "openclaw/plugin-sdk/telegram"; import type { PluginRuntimeChannel } from "./types-channel.js"; type RuntimeTelegramOps = Pick< diff --git a/src/plugins/runtime/runtime-telegram.ts b/src/plugins/runtime/runtime-telegram.ts index 74b4de7e48e..fd01f964f2a 100644 --- a/src/plugins/runtime/runtime-telegram.ts +++ b/src/plugins/runtime/runtime-telegram.ts @@ -1,10 +1,10 @@ -import { collectTelegramUnmentionedGroupIds } from "../../../extensions/telegram/runtime-api.js"; -import { telegramMessageActions } from "../../../extensions/telegram/runtime-api.js"; +import { collectTelegramUnmentionedGroupIds } from "openclaw/plugin-sdk/telegram"; +import { telegramMessageActions } from "openclaw/plugin-sdk/telegram"; import { setTelegramThreadBindingIdleTimeoutBySessionKey, setTelegramThreadBindingMaxAgeBySessionKey, -} from "../../../extensions/telegram/runtime-api.js"; -import { resolveTelegramToken } from "../../../extensions/telegram/runtime-api.js"; +} from "openclaw/plugin-sdk/telegram"; +import { resolveTelegramToken } from "openclaw/plugin-sdk/telegram"; import { createLazyRuntimeMethodBinder, createLazyRuntimeSurface, diff --git a/test/fixtures/plugin-extension-import-boundary-inventory.json b/test/fixtures/plugin-extension-import-boundary-inventory.json index 8ba8e6ed9d2..a91dc57c85e 100644 --- a/test/fixtures/plugin-extension-import-boundary-inventory.json +++ b/test/fixtures/plugin-extension-import-boundary-inventory.json @@ -95,214 +95,6 @@ "resolvedPath": "extensions/zai/model-definitions.js", "reason": "imports extension-owned file from src/plugins" }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 1, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 5, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 6, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 7, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 8, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 9, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord-ops.runtime.ts", - "line": 21, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord.ts", - "line": 1, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-discord.ts", - "line": 11, - "kind": "import", - "specifier": "../../../extensions/discord/runtime-api.js", - "resolvedPath": "extensions/discord/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-imessage.ts", - "line": 5, - "kind": "import", - "specifier": "../../../extensions/imessage/runtime-api.js", - "resolvedPath": "extensions/imessage/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-signal.ts", - "line": 6, - "kind": "import", - "specifier": "../../../extensions/signal/runtime-api.js", - "resolvedPath": "extensions/signal/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 4, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 5, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 6, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 7, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 8, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 9, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-slack-ops.runtime.ts", - "line": 10, - "kind": "import", - "specifier": "../../../extensions/slack/runtime-api.js", - "resolvedPath": "extensions/slack/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts", - "line": 1, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts", - "line": 2, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts", - "line": 3, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts", - "line": 14, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram.ts", - "line": 1, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram.ts", - "line": 2, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram.ts", - "line": 6, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, - { - "file": "src/plugins/runtime/runtime-telegram.ts", - "line": 7, - "kind": "import", - "specifier": "../../../extensions/telegram/runtime-api.js", - "resolvedPath": "extensions/telegram/runtime-api.js", - "reason": "imports extension-owned file from src/plugins" - }, { "file": "src/plugins/runtime/runtime-whatsapp-login-tool.ts", "line": 1,