Compare commits

...

14 Commits

Author SHA1 Message Date
Tak Hoffman
342d16404e
refactor: retire discord bridge ownership 2026-03-18 15:16:15 -05:00
Tak Hoffman
4390533672
refactor: migrate discord status ownership 2026-03-18 15:07:09 -05:00
Tak Hoffman
347610d1c7
refactor: migrate discord gateway ownership 2026-03-18 15:05:08 -05:00
Tak Hoffman
4aca379dc5
refactor: migrate discord messaging ownership 2026-03-18 15:01:10 -05:00
Tak Hoffman
beab2a6d00
refactor: migrate discord outbound ownership 2026-03-18 14:58:07 -05:00
Tak Hoffman
2ae1dcf32b
refactor: migrate discord actions ownership 2026-03-18 14:53:30 -05:00
Tak Hoffman
d4513b96f9
refactor: pilot discord directory ownership 2026-03-18 14:24:42 -05:00
Tak Hoffman
b744aaccf3
refactor: pilot discord threading ownership 2026-03-18 14:19:25 -05:00
Tak Hoffman
679271f757
refactor: expose explicit extension seams for plugin bridges 2026-03-18 14:10:32 -05:00
Tak Hoffman
713ab753c2
refactor: finalize plugin-sdk bridge cleanup 2026-03-18 13:58:15 -05:00
Tak Hoffman
841b2ca07d
refactor: clear remaining plugin-sdk facade imports 2026-03-18 13:54:04 -05:00
Tak Hoffman
c9697fdd07
refactor: finish runtime type bridge routing 2026-03-18 13:49:42 -05:00
Tak Hoffman
8e219caca8
refactor: route plugin-sdk through core bridges 2026-03-18 13:47:07 -05:00
Tak Hoffman
f98f2e2127
refactor: reduce plugin-sdk architecture smell edges 2026-03-18 13:41:13 -05:00
53 changed files with 1016 additions and 330 deletions

View File

@ -0,0 +1 @@
export * from "./src/accounts.js";

View File

@ -3,6 +3,7 @@ export * from "./src/accounts.js";
export * from "./src/actions/handle-action.guild-admin.js";
export * from "./src/actions/handle-action.js";
export * from "./src/components.js";
export * from "./src/directory-config.js";
export * from "./src/group-policy.js";
export * from "./src/normalize.js";
export * from "./src/pluralkit.js";

View File

@ -1,12 +1,12 @@
import {
createAccountActionGate,
createAccountListHelpers,
normalizeAccountId,
resolveAccountEntry,
type OpenClawConfig,
type DiscordAccountConfig,
type DiscordActionConfig,
} from "./runtime-api.js";
import { createAccountActionGate } from "openclaw/plugin-sdk/account-action-gate";
import { createAccountListHelpers } from "openclaw/plugin-sdk/account-helpers";
import { normalizeAccountId } from "openclaw/plugin-sdk/account-id";
import type {
DiscordAccountConfig,
DiscordActionConfig,
OpenClawConfig,
} from "openclaw/plugin-sdk/discord-core";
import { resolveAccountEntry } from "openclaw/plugin-sdk/routing";
import { resolveDiscordToken } from "./token.js";
export type ResolvedDiscordAccount = {

View File

@ -1 +1,7 @@
export * from "./src/accounts.js";
export * from "./src/message-actions.js";
export * from "./src/monitor.js";
export * from "./src/probe.js";
export * from "./src/reaction-level.js";
export * from "./src/send-reactions.js";
export * from "./src/send.js";

View File

@ -3,6 +3,7 @@ export * from "./src/accounts.js";
export * from "./src/actions.js";
export * from "./src/blocks-input.js";
export * from "./src/blocks-render.js";
export * from "./src/directory-config.js";
export * from "./src/http/index.js";
export * from "./src/interactive-replies.js";
export * from "./src/message-actions.js";

View File

@ -2,6 +2,7 @@ export * from "./src/account-inspect.js";
export * from "./src/accounts.js";
export * from "./src/allow-from.js";
export * from "./src/api-fetch.js";
export * from "./src/directory-config.js";
export * from "./src/exec-approvals.js";
export * from "./src/group-policy.js";
export * from "./src/inline-buttons.js";

View File

@ -1,3 +1,4 @@
export * from "./src/accounts.js";
export * from "./src/directory-config.js";
export * from "./src/group-policy.js";
export { resolveWhatsAppGroupIntroHint } from "openclaw/plugin-sdk/whatsapp-core";

View File

@ -362,6 +362,10 @@
"types": "./dist/plugin-sdk/zalouser.d.ts",
"default": "./dist/plugin-sdk/zalouser.js"
},
"./plugin-sdk/account-action-gate": {
"types": "./dist/plugin-sdk/account-action-gate.d.ts",
"default": "./dist/plugin-sdk/account-action-gate.js"
},
"./plugin-sdk/account-helpers": {
"types": "./dist/plugin-sdk/account-helpers.d.ts",
"default": "./dist/plugin-sdk/account-helpers.js"

View File

@ -80,6 +80,7 @@
"voice-call",
"zalo",
"zalouser",
"account-action-gate",
"account-helpers",
"account-id",
"account-resolution",

View File

@ -0,0 +1,4 @@
export {
resolveBlueBubblesGroupRequireMention,
resolveBlueBubblesGroupToolPolicy,
} from "../../../extensions/bluebubbles/runtime-api.js";

View File

@ -0,0 +1,5 @@
export { feishuSetupAdapter, feishuSetupWizard } from "../../../extensions/feishu/setup-api.js";
export {
buildFeishuConversationId,
parseFeishuConversationId,
} from "../../../extensions/feishu/api.js";

View File

@ -0,0 +1,8 @@
export { normalizeIMessageHandle } from "../../../extensions/imessage/api.js";
export type { ParsedChatTarget } from "../../../extensions/imessage/api.js";
export {
parseChatAllowTargetPrefixes,
parseChatTargetPrefixesOrThrow,
resolveServicePrefixedAllowTarget,
resolveServicePrefixedTarget,
} from "../../../extensions/imessage/api.js";

View File

@ -0,0 +1,9 @@
export {
monitorIMessageProvider,
probeIMessage,
sendMessageIMessage,
} from "../../../extensions/imessage/runtime-api.js";
export {
resolveIMessageGroupRequireMention,
resolveIMessageGroupToolPolicy,
} from "../../../extensions/imessage/api.js";

View File

@ -0,0 +1,7 @@
export {
ircSetupAdapter,
ircSetupWizard,
listIrcAccountIds,
resolveDefaultIrcAccountId,
resolveIrcAccount,
} from "../../../extensions/irc/api.js";

View File

@ -0,0 +1 @@
export { lineSetupAdapter, lineSetupWizard } from "../../../extensions/line/setup-api.js";

View File

@ -0,0 +1,15 @@
export type { ResolvedSignalAccount } from "../../../extensions/signal/api.js";
export {
listEnabledSignalAccounts,
listSignalAccountIds,
monitorSignalProvider,
probeSignal,
removeReactionSignal,
resolveDefaultSignalAccountId,
resolveSignalReactionLevel,
resolveSignalAccount,
sendMessageSignal,
sendReactionSignal,
signalMessageActions,
} from "../../../extensions/signal/api.js";

View File

@ -0,0 +1,51 @@
export type { InspectedSlackAccount, ResolvedSlackAccount } from "../../../extensions/slack/api.js";
export type { SlackActionContext } from "../../../extensions/slack/runtime-api.js";
export type { SlackTarget, SlackTargetKind } from "../../../extensions/slack/api.js";
export {
buildSlackThreadingToolContext,
deleteSlackMessage,
downloadSlackFile,
editSlackMessage,
extractSlackToolSend,
getSlackMemberInfo,
handleSlackHttpRequest,
inspectSlackAccount,
isSlackInteractiveRepliesEnabled,
listEnabledSlackAccounts,
listSlackAccountIds,
listSlackEmojis,
listSlackMessageActions,
listSlackPins,
listSlackReactions,
parseSlackBlocksInput,
parseSlackTarget,
pinSlackMessage,
reactSlackMessage,
readSlackMessages,
recordSlackThreadParticipation,
removeOwnSlackReactions,
removeSlackReaction,
resolveSlackAccount,
resolveSlackChannelId,
resolveDefaultSlackAccountId,
resolveSlackGroupRequireMention,
resolveSlackGroupToolPolicy,
resolveSlackReplyToMode,
sendSlackMessage,
unpinSlackMessage,
} from "../../../extensions/slack/api.js";
export {
handleSlackAction,
listSlackDirectoryGroupsLive,
listSlackDirectoryPeersLive,
monitorSlackProvider,
probeSlack,
resolveSlackChannelAllowlist,
resolveSlackUserAllowlist,
sendMessageSlack,
} from "../../../extensions/slack/runtime-api.js";
export {
listSlackDirectoryGroupsFromConfig,
listSlackDirectoryPeersFromConfig,
} from "../../../extensions/slack/api.js";

View File

@ -0,0 +1,4 @@
export {
synologyChatSetupAdapter,
synologyChatSetupWizard,
} from "../../../extensions/synology-chat/setup-api.js";

View File

@ -0,0 +1,68 @@
export type {
InspectedTelegramAccount,
ProviderInfo,
ResolvedTelegramAccount,
StickerMetadata,
TelegramButtonStyle,
TelegramInlineButtons,
} from "../../../extensions/telegram/api.js";
export type { TelegramProbe } from "../../../extensions/telegram/runtime-api.js";
export {
buildBrowseProvidersButton,
buildModelsKeyboard,
buildProviderKeyboard,
calculateTotalPages,
collectTelegramStatusIssues,
createTelegramActionGate,
fetchTelegramChatId,
getCacheStats,
getModelsPageSize,
inspectTelegramAccount,
isNumericTelegramUserId,
isTelegramExecApprovalApprover,
isTelegramExecApprovalClientEnabled,
listTelegramAccountIds,
looksLikeTelegramTargetId,
normalizeTelegramAllowFromEntry,
normalizeTelegramMessagingTarget,
parseTelegramReplyToMessageId,
parseTelegramThreadId,
resolveTelegramAccount,
resolveDefaultTelegramAccountId,
resolveTelegramGroupRequireMention,
resolveTelegramGroupToolPolicy,
resolveTelegramInlineButtonsScope,
resolveTelegramPollActionGateState,
resolveTelegramReactionLevel,
resolveTelegramTargetChatType,
searchStickers,
sendTelegramPayloadMessages,
} from "../../../extensions/telegram/api.js";
export {
auditTelegramGroupMembership,
collectTelegramUnmentionedGroupIds,
createForumTopicTelegram,
deleteMessageTelegram,
editForumTopicTelegram,
editMessageReplyMarkupTelegram,
editMessageTelegram,
monitorTelegramProvider,
pinMessageTelegram,
probeTelegram,
reactMessageTelegram,
renameForumTopicTelegram,
resolveTelegramToken,
sendMessageTelegram,
sendPollTelegram,
sendStickerTelegram,
sendTypingTelegram,
setTelegramThreadBindingIdleTimeoutBySessionKey,
setTelegramThreadBindingMaxAgeBySessionKey,
telegramMessageActions,
unpinMessageTelegram,
} from "../../../extensions/telegram/runtime-api.js";
export {
listTelegramDirectoryGroupsFromConfig,
listTelegramDirectoryPeersFromConfig,
} from "../../../extensions/telegram/api.js";

View File

@ -0,0 +1 @@
export { handleWhatsAppAction } from "../../../extensions/whatsapp/action-runtime-api.js";

View File

@ -0,0 +1 @@
export { startWebLoginWithQr, waitForWebLogin } from "../../../extensions/whatsapp/login-qr-api.js";

View File

@ -0,0 +1,50 @@
export type {
WebChannelStatus,
WebInboundMessage,
WebListenerCloseReason,
WebMonitorTuning,
} from "../../../extensions/whatsapp/runtime-api.js";
export {
hasAnyWhatsAppAuth,
listEnabledWhatsAppAccounts,
resolveWhatsAppAccount,
resolveWhatsAppGroupRequireMention,
resolveWhatsAppGroupToolPolicy,
} from "../../../extensions/whatsapp/api.js";
export {
createWhatsAppLoginTool,
createWaSocket,
DEFAULT_WEB_MEDIA_BYTES,
extractMediaPlaceholder,
extractText,
formatError,
getActiveWebListener,
getDefaultLocalRoots,
getStatusCode,
getWebAuthAgeMs,
HEARTBEAT_PROMPT,
HEARTBEAT_TOKEN,
loadWebMedia,
loadWebMediaRaw,
loginWeb,
logWebSelfId,
logoutWeb,
monitorWebChannel,
monitorWebInbox,
optimizeImageToJpeg,
pickWebChannel,
readWebSelfId,
resolveHeartbeatRecipients,
runWebHeartbeatOnce,
sendMessageWhatsApp,
sendPollWhatsApp,
sendReactionWhatsApp,
waitForWaConnection,
WA_WEB_AUTH_DIR,
webAuthExists,
} from "../../../extensions/whatsapp/runtime-api.js";
export {
listWhatsAppDirectoryGroupsFromConfig,
listWhatsAppDirectoryPeersFromConfig,
} from "../../../extensions/whatsapp/api.js";

View File

@ -0,0 +1,6 @@
export type { WebMediaResult } from "../../../extensions/whatsapp/runtime-api.js";
export {
getDefaultLocalRoots,
loadWebMedia,
loadWebMediaRaw,
} from "../../../extensions/whatsapp/runtime-api.js";

View File

@ -0,0 +1 @@
export { zaloSetupAdapter, zaloSetupWizard } from "../../../extensions/zalo/api.js";

View File

@ -4,10 +4,15 @@ import path from "node:path";
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { NON_ENV_SECRETREF_MARKER } from "../agents/model-auth-markers.js";
const resolveProviderUsageAuthWithPluginMock = vi.fn(async () => null);
type ResolveProviderUsageAuthWithPlugin =
typeof import("../plugins/provider-runtime.js").resolveProviderUsageAuthWithPlugin;
const resolveProviderUsageAuthWithPluginMock = vi.fn<ResolveProviderUsageAuthWithPlugin>(
async () => null,
);
vi.mock("../plugins/provider-runtime.js", () => ({
resolveProviderUsageAuthWithPlugin: (...args: unknown[]) =>
resolveProviderUsageAuthWithPlugin: (...args: Parameters<ResolveProviderUsageAuthWithPlugin>) =>
resolveProviderUsageAuthWithPluginMock(...args),
}));

View File

@ -0,0 +1 @@
export { createAccountActionGate } from "../channels/plugins/account-action-gate.js";

View File

@ -1,3 +1,8 @@
import {
resolveDiscordAccount as resolveDiscordAccountImpl,
type ResolvedDiscordAccount as DiscordResolvedDiscordAccount,
} from "../../extensions/discord/account-api.js";
export type { OpenClawConfig } from "../config/config.js";
export { createAccountActionGate } from "../channels/plugins/account-action-gate.js";
@ -11,15 +16,25 @@ export {
} from "../routing/session-key.js";
export { normalizeE164, pathExists, resolveUserPath } from "../utils.js";
export {
resolveDiscordAccount,
type ResolvedDiscordAccount,
} from "../../extensions/discord/api.js";
export { resolveSlackAccount, type ResolvedSlackAccount } from "../../extensions/slack/api.js";
resolveSlackAccount,
type ResolvedSlackAccount,
} from "../channels/slack/plugin-sdk-bridge.js";
export {
resolveTelegramAccount,
type ResolvedTelegramAccount,
} from "../../extensions/telegram/api.js";
export { resolveSignalAccount, type ResolvedSignalAccount } from "../../extensions/signal/api.js";
} from "../channels/telegram/plugin-sdk-bridge.js";
export {
resolveSignalAccount,
type ResolvedSignalAccount,
} from "../channels/signal/plugin-sdk-bridge.js";
export type ResolvedDiscordAccount = DiscordResolvedDiscordAccount;
export function resolveDiscordAccount(
...args: Parameters<typeof resolveDiscordAccountImpl>
): ReturnType<typeof resolveDiscordAccountImpl> {
return resolveDiscordAccountImpl(...args);
}
/** Resolve an account by id, then fall back to the default account when the primary lacks credentials. */
export function resolveAccountWithDefaultFallback<TAccount>(params: {

View File

@ -28,7 +28,7 @@ export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js";
export {
resolveBlueBubblesGroupRequireMention,
resolveBlueBubblesGroupToolPolicy,
} from "../../extensions/bluebubbles/runtime-api.js";
} from "../channels/bluebubbles/plugin-sdk-bridge.js";
export { formatPairingApproveHint } from "../channels/plugins/helpers.js";
export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js";
export {
@ -62,13 +62,13 @@ export {
export { buildSecretInputSchema } from "./secret-input-schema.js";
export { ToolPolicySchema } from "../config/zod-schema.agent-runtime.js";
export { MarkdownConfigSchema } from "../config/zod-schema.core.js";
export type { ParsedChatTarget } from "../../extensions/imessage/api.js";
export type { ParsedChatTarget } from "../channels/imessage/api-bridge.js";
export {
parseChatAllowTargetPrefixes,
parseChatTargetPrefixesOrThrow,
resolveServicePrefixedAllowTarget,
resolveServicePrefixedTarget,
} from "../../extensions/imessage/api.js";
} from "../channels/imessage/api-bridge.js";
export { stripMarkdown } from "../line/markdown-to-line.js";
export { parseFiniteNumber } from "../infra/parse-finite-number.js";
export { emptyPluginConfigSchema } from "../plugins/config-schema.js";

View File

@ -352,6 +352,106 @@ function expectNoSiblingExtensionPrivateSrcImports(file: string, imports: string
}
describe("channel import guardrails", () => {
it("keeps Discord threading ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:ThreadBindingManager|ThreadBindingRecord|ThreadBindingTargetKind)\b/,
);
expect(bridgeImports).not.toMatch(
/\b(?:autoBindSpawnedDiscordSubagent|getThreadBindingManager|listThreadBindingsBySessionKey|resolveThreadBindingIdleTimeoutMs|resolveThreadBindingInactivityExpiresAt|resolveThreadBindingMaxAgeExpiresAt|resolveThreadBindingMaxAgeMs|setThreadBindingIdleTimeoutBySessionKey|setThreadBindingMaxAgeBySessionKey|unbindThreadBindingsBySessionKey)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/session-key-api\.js";/);
});
it("keeps Discord directory ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:listDiscordDirectoryGroupsFromConfig|listDiscordDirectoryPeersFromConfig|listDiscordDirectoryGroupsLive|listDiscordDirectoryPeersLive|resolveDiscordChannelAllowlist|resolveDiscordUserAllowlist)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord actions ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:createDiscordActionGate|readDiscordComponentSpec|discordMessageActions|addRoleDiscord|auditDiscordChannelPermissions|banMemberDiscord|collectDiscordAuditChannelIds|createChannelDiscord|createScheduledEventDiscord|createThreadDiscord|deleteChannelDiscord|deleteMessageDiscord|editChannelDiscord|editMessageDiscord|fetchChannelPermissionsDiscord|fetchMemberInfoDiscord|fetchMessageDiscord|fetchReactionsDiscord|fetchRoleInfoDiscord|moveChannelDiscord|pinMessageDiscord|reactMessageDiscord|removeChannelPermissionDiscord|removeOwnReactionsDiscord|removeReactionDiscord|removeRoleDiscord|sendDiscordComponentMessage|sendPollDiscord|sendStickerDiscord|setChannelPermissionDiscord|timeoutMemberDiscord|uploadEmojiDiscord|uploadStickerDiscord)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord outbound ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:looksLikeDiscordTargetId|normalizeDiscordMessagingTarget|normalizeDiscordOutboundTarget|resolveDiscordChannelId|sendMessageDiscord|sendTypingDiscord|sendVoiceMessageDiscord)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord messaging ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:fetchChannelInfoDiscord|listGuildChannelsDiscord|listGuildEmojisDiscord|listPinsDiscord|listScheduledEventsDiscord|listThreadsDiscord|readMessagesDiscord|searchMessagesDiscord)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord gateway ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:fetchVoiceStatusDiscord|getGateway|getPresence|monitorDiscordProvider)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps Discord status ownership on extension public seams", () => {
const text = readSource("src/plugin-sdk/discord.ts");
const bridgeImports = [...text.matchAll(/import(?: type)?\s*\{[\s\S]*?\}\s*from\s+"[^"]+";/g)]
.map((match) => match[0])
.filter((statement) => statement.includes("../channels/discord/plugin-sdk-bridge.js"))
.join("\n");
expect(bridgeImports).not.toMatch(
/\b(?:collectDiscordStatusIssues|probeDiscord|DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS|DISCORD_DEFAULT_LISTENER_TIMEOUT_MS)\b/,
);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
});
it("keeps plugin-sdk/discord off the Discord bridge entirely", () => {
const text = readSource("src/plugin-sdk/discord.ts");
expect(text).not.toMatch(/plugin-sdk-bridge\.js/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/runtime-api\.js";/);
expect(text).toMatch(/from\s+"..\/..\/extensions\/discord\/session-key-api\.js";/);
});
it("keeps channel helper modules off their own SDK barrels", () => {
for (const source of SAME_CHANNEL_SDK_GUARDS) {
const text = readSource(source.path);

View File

@ -46,5 +46,5 @@ export { mapAllowlistResolutionInputs } from "./allowlist-resolution.js";
export {
resolveBlueBubblesGroupRequireMention,
resolveBlueBubblesGroupToolPolicy,
} from "../../extensions/bluebubbles/runtime-api.js";
} from "../channels/bluebubbles/plugin-sdk-bridge.js";
export { collectBlueBubblesStatusIssues } from "../channels/plugins/status-issues/bluebubbles.js";

View File

@ -1,5 +1,5 @@
export type { ChannelPlugin } from "./channel-plugin-common.js";
export type { DiscordActionConfig } from "../config/types.js";
export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js";
export { buildChannelConfigSchema, getChatChannelMeta } from "./channel-plugin-common.js";
export type { OpenClawConfig } from "../config/config.js";
export { withNormalizedTimestamp } from "../agents/date-time.js";

View File

@ -1,3 +1,101 @@
import {
createDiscordActionGate,
collectDiscordStatusIssues,
inspectDiscordAccount,
listDiscordDirectoryGroupsFromConfig,
listDiscordDirectoryPeersFromConfig,
listDiscordAccountIds,
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
readDiscordComponentSpec,
resolveDefaultDiscordAccountId,
resolveDiscordChannelId,
resolveDiscordGroupRequireMention,
resolveDiscordGroupToolPolicy,
} from "../../extensions/discord/api.js";
import type {
DiscordPluralKitConfig,
DiscordSendComponents,
DiscordSendEmbeds,
InspectedDiscordAccount,
ResolvedDiscordAccount,
} from "../../extensions/discord/api.js";
import type {
ThreadBindingManager,
ThreadBindingRecord,
ThreadBindingTargetKind,
} from "../../extensions/discord/runtime-api.js";
import {
addRoleDiscord,
auditDiscordChannelPermissions,
autoBindSpawnedDiscordSubagent,
banMemberDiscord,
collectDiscordAuditChannelIds,
createChannelDiscord,
createScheduledEventDiscord,
createThreadDiscord,
deleteChannelDiscord,
deleteMessageDiscord,
discordMessageActions,
editChannelDiscord,
editMessageDiscord,
fetchChannelPermissionsDiscord,
fetchMemberInfoDiscord,
fetchMessageDiscord,
fetchReactionsDiscord,
fetchRoleInfoDiscord,
fetchChannelInfoDiscord,
fetchVoiceStatusDiscord,
getGateway,
getPresence,
getThreadBindingManager,
hasAnyGuildPermissionDiscord,
kickMemberDiscord,
listDiscordDirectoryGroupsLive,
listDiscordDirectoryPeersLive,
listThreadBindingsBySessionKey,
listGuildChannelsDiscord,
listGuildEmojisDiscord,
listPinsDiscord,
listScheduledEventsDiscord,
listThreadsDiscord,
monitorDiscordProvider,
moveChannelDiscord,
pinMessageDiscord,
reactMessageDiscord,
removeChannelPermissionDiscord,
removeOwnReactionsDiscord,
removeReactionDiscord,
removeRoleDiscord,
resolveDiscordChannelAllowlist,
resolveDiscordUserAllowlist,
resolveThreadBindingIdleTimeoutMs,
resolveThreadBindingInactivityExpiresAt,
resolveThreadBindingMaxAgeExpiresAt,
resolveThreadBindingMaxAgeMs,
DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS,
DISCORD_DEFAULT_LISTENER_TIMEOUT_MS,
probeDiscord,
sendMessageDiscord,
sendDiscordComponentMessage,
sendPollDiscord,
sendTypingDiscord,
sendStickerDiscord,
sendVoiceMessageDiscord,
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
setChannelPermissionDiscord,
timeoutMemberDiscord,
unbindThreadBindingsBySessionKey,
unpinMessageDiscord,
uploadEmojiDiscord,
uploadStickerDiscord,
readMessagesDiscord,
searchMessagesDiscord,
} from "../../extensions/discord/runtime-api.js";
import { normalizeExplicitDiscordSessionKey } from "../../extensions/discord/session-key-api.js";
export type {
ChannelAccountSnapshot,
ChannelGatewayContext,
@ -6,15 +104,16 @@ export type {
export type { OpenClawConfig } from "../config/config.js";
export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js";
export type { DiscordConfig } from "../config/types.discord.js";
export type { DiscordPluralKitConfig } from "../../extensions/discord/api.js";
export type { InspectedDiscordAccount } from "../../extensions/discord/api.js";
export type { ResolvedDiscordAccount } from "../../extensions/discord/api.js";
export type { DiscordSendComponents, DiscordSendEmbeds } from "../../extensions/discord/api.js";
export type {
DiscordPluralKitConfig,
DiscordSendComponents,
DiscordSendEmbeds,
InspectedDiscordAccount,
ResolvedDiscordAccount,
ThreadBindingManager,
ThreadBindingRecord,
ThreadBindingTargetKind,
} from "../../extensions/discord/runtime-api.js";
};
export type {
ChannelConfiguredBindingProvider,
ChannelConfiguredBindingConversationRef,
@ -49,14 +148,8 @@ export {
resolveDefaultGroupPolicy,
resolveOpenProviderRuntimeGroupPolicy,
} from "../config/runtime-group-policy.js";
export {
listDiscordDirectoryGroupsFromConfig,
listDiscordDirectoryPeersFromConfig,
} from "../../extensions/discord/src/directory-config.js";
export {
resolveDiscordGroupRequireMention,
resolveDiscordGroupToolPolicy,
} from "../../extensions/discord/api.js";
export { listDiscordDirectoryGroupsFromConfig, listDiscordDirectoryPeersFromConfig };
export { resolveDiscordGroupRequireMention, resolveDiscordGroupToolPolicy };
export { DiscordConfigSchema } from "../config/zod-schema.providers-core.js";
export {
@ -64,49 +157,22 @@ export {
buildTokenChannelStatusSummary,
} from "./status-helpers.js";
export {
createDiscordActionGate,
listDiscordAccountIds,
resolveDefaultDiscordAccountId,
} from "../../extensions/discord/api.js";
export { inspectDiscordAccount } from "../../extensions/discord/api.js";
export {
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
} from "../../extensions/discord/api.js";
export { collectDiscordAuditChannelIds } from "../../extensions/discord/runtime-api.js";
export { collectDiscordStatusIssues } from "../../extensions/discord/api.js";
export {
DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS,
DISCORD_DEFAULT_LISTENER_TIMEOUT_MS,
} from "../../extensions/discord/runtime-api.js";
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";
export { getPresence } from "../../extensions/discord/runtime-api.js";
export { readDiscordComponentSpec } from "../../extensions/discord/api.js";
export { resolveDiscordChannelId } from "../../extensions/discord/api.js";
export {
addRoleDiscord,
auditDiscordChannelPermissions,
autoBindSpawnedDiscordSubagent,
banMemberDiscord,
collectDiscordAuditChannelIds,
collectDiscordStatusIssues,
createChannelDiscord,
createDiscordActionGate,
createScheduledEventDiscord,
createThreadDiscord,
deleteChannelDiscord,
deleteMessageDiscord,
DISCORD_DEFAULT_INBOUND_WORKER_TIMEOUT_MS,
DISCORD_DEFAULT_LISTENER_TIMEOUT_MS,
discordMessageActions,
editChannelDiscord,
editMessageDiscord,
fetchChannelInfoDiscord,
@ -116,38 +182,57 @@ export {
fetchReactionsDiscord,
fetchRoleInfoDiscord,
fetchVoiceStatusDiscord,
getGateway,
getPresence,
getThreadBindingManager,
hasAnyGuildPermissionDiscord,
inspectDiscordAccount,
kickMemberDiscord,
listDiscordAccountIds,
listDiscordDirectoryGroupsLive,
listDiscordDirectoryPeersLive,
listGuildChannelsDiscord,
listGuildEmojisDiscord,
listPinsDiscord,
listScheduledEventsDiscord,
listThreadBindingsBySessionKey,
listThreadsDiscord,
looksLikeDiscordTargetId,
monitorDiscordProvider,
moveChannelDiscord,
normalizeDiscordMessagingTarget,
normalizeDiscordOutboundTarget,
normalizeExplicitDiscordSessionKey,
pinMessageDiscord,
probeDiscord,
reactMessageDiscord,
readDiscordComponentSpec,
readMessagesDiscord,
removeChannelPermissionDiscord,
removeOwnReactionsDiscord,
removeReactionDiscord,
removeRoleDiscord,
resolveDefaultDiscordAccountId,
resolveDiscordChannelAllowlist,
resolveDiscordChannelId,
resolveDiscordUserAllowlist,
resolveThreadBindingIdleTimeoutMs,
resolveThreadBindingInactivityExpiresAt,
resolveThreadBindingMaxAgeExpiresAt,
resolveThreadBindingMaxAgeMs,
searchMessagesDiscord,
sendDiscordComponentMessage,
sendMessageDiscord,
sendPollDiscord,
sendTypingDiscord,
sendStickerDiscord,
sendTypingDiscord,
sendVoiceMessageDiscord,
setChannelPermissionDiscord,
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
timeoutMemberDiscord,
unbindThreadBindingsBySessionKey,
unpinMessageDiscord,
uploadEmojiDiscord,
uploadStickerDiscord,
} from "../../extensions/discord/runtime-api.js";
export { discordMessageActions } from "../../extensions/discord/runtime-api.js";
};

View File

@ -67,7 +67,7 @@ export type { RuntimeEnv } from "../runtime.js";
export { formatDocsLink } from "../terminal/links.js";
export { evaluateSenderGroupAccessForPolicy } from "./group-access.js";
export type { WizardPrompter } from "../wizard/prompts.js";
export { feishuSetupWizard, feishuSetupAdapter } from "../../extensions/feishu/setup-api.js";
export { feishuSetupWizard, feishuSetupAdapter } from "../channels/feishu/plugin-sdk-bridge.js";
export { buildAgentMediaPayload } from "./agent-media-payload.js";
export { readJsonFileWithFallback } from "./json-store.js";
export { createScopedPairingAccess } from "./pairing-access.js";
@ -83,7 +83,7 @@ export { withTempDownloadPath } from "./temp-path.js";
export {
buildFeishuConversationId,
parseFeishuConversationId,
} from "../../extensions/feishu/src/conversation-id.js";
} from "../channels/feishu/plugin-sdk-bridge.js";
export {
createFixedWindowRateLimiter,
createWebhookAnomalyTracker,

View File

@ -1 +1 @@
export { normalizeIMessageHandle } from "../../extensions/imessage/api.js";
export { normalizeIMessageHandle } from "../channels/imessage/api-bridge.js";

View File

@ -38,7 +38,7 @@ export {
export {
resolveIMessageGroupRequireMention,
resolveIMessageGroupToolPolicy,
} from "../../extensions/imessage/api.js";
} from "../channels/imessage/plugin-sdk-bridge.js";
export { IMessageConfigSchema } from "../config/zod-schema.providers-core.js";
export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js";
@ -47,4 +47,4 @@ export {
monitorIMessageProvider,
probeIMessage,
sendMessageIMessage,
} from "../../extensions/imessage/runtime-api.js";
} from "../channels/imessage/plugin-sdk-bridge.js";

View File

@ -62,7 +62,7 @@ export {
listIrcAccountIds,
resolveDefaultIrcAccountId,
resolveIrcAccount,
} from "../../extensions/irc/api.js";
} from "../channels/irc/plugin-sdk-bridge.js";
export {
readStoreAllowFromForDmPolicy,
resolveEffectiveAllowFromLists,
@ -72,7 +72,7 @@ export type { WizardPrompter } from "../wizard/prompts.js";
export { createScopedPairingAccess } from "./pairing-access.js";
export { issuePairingChallenge } from "../pairing/pairing-challenge.js";
export { dispatchInboundReplyWithBase } from "./inbound-reply-dispatch.js";
export { ircSetupAdapter, ircSetupWizard } from "../../extensions/irc/api.js";
export { ircSetupAdapter, ircSetupWizard } from "../channels/irc/plugin-sdk-bridge.js";
export type { OutboundReplyPayload } from "./reply-payload.js";
export {
createNormalizedOutboundDeliverer,

View File

@ -32,7 +32,7 @@ export {
resolveDefaultLineAccountId,
resolveLineAccount,
} from "../line/accounts.js";
export { lineSetupAdapter, lineSetupWizard } from "../../extensions/line/setup-api.js";
export { lineSetupAdapter, lineSetupWizard } from "../channels/line/plugin-sdk-bridge.js";
export { LineConfigSchema } from "../line/config-schema.js";
export type { LineChannelData, LineConfig, ResolvedLineAccount } from "../line/types.js";
export {

View File

@ -8,6 +8,66 @@ import {
KILOCODE_DEFAULT_MODEL_ID,
KILOCODE_DEFAULT_MODEL_NAME,
} from "../providers/kilocode-shared.js";
import {
KIMI_CODING_BASE_URL,
KIMI_CODING_DEFAULT_MODEL_ID,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildMinimaxApiModelDefinition,
buildMinimaxModelDefinition,
DEFAULT_MINIMAX_BASE_URL,
MINIMAX_API_BASE_URL,
MINIMAX_API_COST,
MINIMAX_CN_API_BASE_URL,
MINIMAX_HOSTED_COST,
MINIMAX_HOSTED_MODEL_ID,
MINIMAX_HOSTED_MODEL_REF,
MINIMAX_LM_STUDIO_COST,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildMistralModelDefinition,
MISTRAL_BASE_URL,
MISTRAL_DEFAULT_COST,
MISTRAL_DEFAULT_MODEL_ID,
MISTRAL_DEFAULT_MODEL_REF,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildModelStudioDefaultModelDefinition,
buildModelStudioModelDefinition,
MODELSTUDIO_CN_BASE_URL,
MODELSTUDIO_DEFAULT_COST,
MODELSTUDIO_DEFAULT_MODEL_ID,
MODELSTUDIO_DEFAULT_MODEL_REF,
MODELSTUDIO_GLOBAL_BASE_URL,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import { MOONSHOT_CN_BASE_URL } from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildMoonshotProvider,
MOONSHOT_BASE_URL,
MOONSHOT_DEFAULT_MODEL_ID,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
QIANFAN_BASE_URL,
QIANFAN_DEFAULT_MODEL_ID,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildXaiModelDefinition,
XAI_BASE_URL,
XAI_DEFAULT_COST,
XAI_DEFAULT_MODEL_ID,
XAI_DEFAULT_MODEL_REF,
} from "../providers/plugin-sdk-provider-models-bridge.js";
import {
buildZaiModelDefinition,
resolveZaiBaseUrl,
ZAI_CODING_CN_BASE_URL,
ZAI_CODING_GLOBAL_BASE_URL,
ZAI_CN_BASE_URL,
ZAI_DEFAULT_COST,
ZAI_DEFAULT_MODEL_ID,
ZAI_DEFAULT_MODEL_REF,
ZAI_GLOBAL_BASE_URL,
} from "../providers/plugin-sdk-provider-models-bridge.js";
export type { ModelApi, ModelProviderConfig } from "../config/types.models.js";
export type { ModelDefinitionConfig } from "../config/types.models.js";
@ -37,7 +97,15 @@ export { OPENCODE_ZEN_DEFAULT_MODEL_REF } from "../agents/opencode-zen-models.js
export {
buildMinimaxApiModelDefinition,
buildMinimaxModelDefinition,
buildMistralModelDefinition,
buildModelStudioDefaultModelDefinition,
buildModelStudioModelDefinition,
buildMoonshotProvider,
buildXaiModelDefinition,
buildZaiModelDefinition,
DEFAULT_MINIMAX_BASE_URL,
KIMI_CODING_BASE_URL,
KIMI_CODING_DEFAULT_MODEL_ID,
MINIMAX_API_BASE_URL,
MINIMAX_API_COST,
MINIMAX_CN_API_BASE_URL,
@ -45,47 +113,25 @@ export {
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_COST,
MISTRAL_DEFAULT_MODEL_ID,
MISTRAL_DEFAULT_MODEL_REF,
} from "../../extensions/mistral/model-definitions.js";
export {
buildModelStudioDefaultModelDefinition,
buildModelStudioModelDefinition,
MODELSTUDIO_CN_BASE_URL,
MODELSTUDIO_DEFAULT_COST,
MODELSTUDIO_DEFAULT_MODEL_ID,
MODELSTUDIO_DEFAULT_MODEL_REF,
MODELSTUDIO_GLOBAL_BASE_URL,
} from "../../extensions/modelstudio/model-definitions.js";
export {
buildMoonshotProvider,
MOONSHOT_BASE_URL,
MOONSHOT_CN_BASE_URL,
MOONSHOT_DEFAULT_MODEL_ID,
} from "../../extensions/moonshot/provider-catalog.js";
export { MOONSHOT_CN_BASE_URL } from "../../extensions/moonshot/onboard.js";
export {
KIMI_CODING_BASE_URL,
KIMI_CODING_DEFAULT_MODEL_ID,
} from "../../extensions/kimi-coding/provider-catalog.js";
export {
QIANFAN_BASE_URL,
QIANFAN_DEFAULT_MODEL_ID,
} from "../../extensions/qianfan/provider-catalog.js";
export {
buildXaiModelDefinition,
resolveZaiBaseUrl,
XAI_BASE_URL,
XAI_DEFAULT_COST,
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,
@ -93,7 +139,7 @@ export {
ZAI_DEFAULT_MODEL_ID,
ZAI_DEFAULT_MODEL_REF,
ZAI_GLOBAL_BASE_URL,
} from "../../extensions/zai/model-definitions.js";
};
export {
buildCloudflareAiGatewayModelDefinition,

View File

@ -1,7 +1,7 @@
export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js";
export type { OpenClawConfig } from "../config/config.js";
export type { SignalAccountConfig } from "../config/types.js";
export type { ResolvedSignalAccount } from "../../extensions/signal/api.js";
export type { ResolvedSignalAccount } from "../channels/signal/plugin-sdk-bridge.js";
export type {
ChannelMessageActionContext,
ChannelPlugin,
@ -51,13 +51,10 @@ export {
listEnabledSignalAccounts,
listSignalAccountIds,
resolveDefaultSignalAccountId,
} from "../../extensions/signal/api.js";
export { monitorSignalProvider } from "../../extensions/signal/src/monitor.js";
export { probeSignal } from "../../extensions/signal/src/probe.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 { signalMessageActions } from "../../extensions/signal/src/message-actions.js";
} from "../channels/signal/plugin-sdk-bridge.js";
export { monitorSignalProvider } from "../channels/signal/plugin-sdk-bridge.js";
export { probeSignal } from "../channels/signal/plugin-sdk-bridge.js";
export { resolveSignalReactionLevel } from "../channels/signal/plugin-sdk-bridge.js";
export { removeReactionSignal, sendReactionSignal } from "../channels/signal/plugin-sdk-bridge.js";
export { sendMessageSignal } from "../channels/signal/plugin-sdk-bridge.js";
export { signalMessageActions } from "../channels/signal/plugin-sdk-bridge.js";

View File

@ -3,4 +3,4 @@ export {
resolveSlackChannelId,
type SlackTarget,
type SlackTargetKind,
} from "../../extensions/slack/api.js";
} from "../channels/slack/plugin-sdk-bridge.js";

View File

@ -1,7 +1,54 @@
import type {
InspectedSlackAccount,
ResolvedSlackAccount,
SlackActionContext,
} from "../channels/slack/plugin-sdk-bridge.js";
import {
buildSlackThreadingToolContext,
deleteSlackMessage,
downloadSlackFile,
editSlackMessage,
extractSlackToolSend,
getSlackMemberInfo,
handleSlackHttpRequest,
inspectSlackAccount,
isSlackInteractiveRepliesEnabled,
listEnabledSlackAccounts,
listSlackAccountIds,
listSlackEmojis,
listSlackMessageActions,
listSlackPins,
listSlackReactions,
parseSlackBlocksInput,
pinSlackMessage,
reactSlackMessage,
readSlackMessages,
recordSlackThreadParticipation,
removeOwnSlackReactions,
removeSlackReaction,
resolveDefaultSlackAccountId,
resolveSlackGroupRequireMention,
resolveSlackGroupToolPolicy,
resolveSlackReplyToMode,
sendSlackMessage,
unpinSlackMessage,
} from "../channels/slack/plugin-sdk-bridge.js";
import {
handleSlackAction,
listSlackDirectoryGroupsLive,
listSlackDirectoryPeersLive,
monitorSlackProvider,
probeSlack,
resolveSlackChannelAllowlist,
resolveSlackUserAllowlist,
sendMessageSlack,
listSlackDirectoryGroupsFromConfig,
listSlackDirectoryPeersFromConfig,
} from "../channels/slack/plugin-sdk-bridge.js";
export type { OpenClawConfig } from "../config/config.js";
export type { SlackAccountConfig } from "../config/types.slack.js";
export type { InspectedSlackAccount } from "../../extensions/slack/api.js";
export type { ResolvedSlackAccount } from "../../extensions/slack/api.js";
export type { InspectedSlackAccount, ResolvedSlackAccount, SlackActionContext };
export type {
ChannelMessageActionContext,
ChannelPlugin,
@ -32,59 +79,51 @@ export {
looksLikeSlackTargetId,
normalizeSlackMessagingTarget,
} from "../channels/plugins/normalize/slack.js";
export {
listSlackDirectoryGroupsFromConfig,
listSlackDirectoryPeersFromConfig,
} from "../../extensions/slack/src/directory-config.js";
export { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig };
export {
resolveDefaultGroupPolicy,
resolveOpenProviderRuntimeGroupPolicy,
} from "../config/runtime-group-policy.js";
export {
resolveSlackGroupRequireMention,
resolveSlackGroupToolPolicy,
} from "../../extensions/slack/api.js";
export { resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy };
export { SlackConfigSchema } from "../config/zod-schema.providers-core.js";
export { buildComputedAccountStatusSnapshot } from "./status-helpers.js";
export {
inspectSlackAccount,
isSlackInteractiveRepliesEnabled,
listEnabledSlackAccounts,
listSlackAccountIds,
resolveDefaultSlackAccountId,
resolveSlackReplyToMode,
} from "../../extensions/slack/api.js";
export { isSlackInteractiveRepliesEnabled } from "../../extensions/slack/api.js";
export { inspectSlackAccount } from "../../extensions/slack/api.js";
};
export { parseSlackTarget, resolveSlackChannelId } from "./slack-targets.js";
export { extractSlackToolSend, listSlackMessageActions } from "../../extensions/slack/api.js";
export { buildSlackThreadingToolContext } from "../../extensions/slack/api.js";
export { parseSlackBlocksInput } from "../../extensions/slack/api.js";
export { handleSlackHttpRequest } from "../../extensions/slack/api.js";
export {
handleSlackAction,
listSlackDirectoryGroupsLive,
listSlackDirectoryPeersLive,
monitorSlackProvider,
probeSlack,
resolveSlackChannelAllowlist,
resolveSlackUserAllowlist,
sendMessageSlack,
} from "../../extensions/slack/runtime-api.js";
export {
buildSlackThreadingToolContext,
deleteSlackMessage,
downloadSlackFile,
editSlackMessage,
extractSlackToolSend,
getSlackMemberInfo,
handleSlackAction,
handleSlackHttpRequest,
listSlackDirectoryGroupsLive,
listSlackDirectoryPeersLive,
listSlackEmojis,
listSlackMessageActions,
listSlackPins,
listSlackReactions,
monitorSlackProvider,
parseSlackBlocksInput,
pinSlackMessage,
probeSlack,
reactSlackMessage,
readSlackMessages,
recordSlackThreadParticipation,
removeOwnSlackReactions,
removeSlackReaction,
resolveSlackChannelAllowlist,
resolveSlackUserAllowlist,
sendMessageSlack,
sendSlackMessage,
unpinSlackMessage,
} from "../../extensions/slack/api.js";
export { recordSlackThreadParticipation } from "../../extensions/slack/api.js";
export type { SlackActionContext } from "../../extensions/slack/runtime-api.js";
};

View File

@ -265,7 +265,27 @@ describe("plugin-sdk subpath exports", () => {
it("exports Discord helpers", () => {
expect(typeof discordSdk.buildChannelConfigSchema).toBe("function");
expect(typeof discordSdk.createDiscordActionGate).toBe("function");
expect(typeof discordSdk.DiscordConfigSchema).toBe("object");
expect(typeof discordSdk.discordMessageActions).toBe("object");
expect(typeof discordSdk.listDiscordDirectoryGroupsFromConfig).toBe("function");
expect(typeof discordSdk.listDiscordDirectoryPeersFromConfig).toBe("function");
expect(typeof discordSdk.listDiscordDirectoryGroupsLive).toBe("function");
expect(typeof discordSdk.listDiscordDirectoryPeersLive).toBe("function");
expect(typeof discordSdk.fetchChannelInfoDiscord).toBe("function");
expect(typeof discordSdk.fetchVoiceStatusDiscord).toBe("function");
expect(typeof discordSdk.getGateway).toBe("function");
expect(typeof discordSdk.getPresence).toBe("function");
expect(typeof discordSdk.listThreadsDiscord).toBe("function");
expect(typeof discordSdk.monitorDiscordProvider).toBe("function");
expect(typeof discordSdk.normalizeDiscordOutboundTarget).toBe("function");
expect(typeof discordSdk.probeDiscord).toBe("function");
expect(typeof discordSdk.readMessagesDiscord).toBe("function");
expect(typeof discordSdk.resolveDiscordChannelId).toBe("function");
expect(typeof discordSdk.sendMessageDiscord).toBe("function");
expect(typeof discordSdk.getThreadBindingManager).toBe("function");
expect(typeof discordSdk.listThreadBindingsBySessionKey).toBe("function");
expect(typeof discordSdk.normalizeExplicitDiscordSessionKey).toBe("function");
expect(typeof discordSdk.projectCredentialSnapshotFields).toBe("function");
expect("resolveDiscordAccount" in asExports(discordSdk)).toBe(false);
});

View File

@ -20,4 +20,4 @@ export { createFixedWindowRateLimiter } from "./webhook-memory-guards.js";
export {
synologyChatSetupAdapter,
synologyChatSetupWizard,
} from "../../extensions/synology-chat/setup-api.js";
} from "../channels/synology-chat/plugin-sdk-bridge.js";

View File

@ -1,3 +1,68 @@
import type {
InspectedTelegramAccount,
ProviderInfo,
ResolvedTelegramAccount,
StickerMetadata,
TelegramButtonStyle,
TelegramInlineButtons,
TelegramProbe,
} from "../channels/telegram/plugin-sdk-bridge.js";
import {
buildBrowseProvidersButton,
buildModelsKeyboard,
buildProviderKeyboard,
calculateTotalPages,
createTelegramActionGate,
fetchTelegramChatId,
getCacheStats,
getModelsPageSize,
inspectTelegramAccount,
isNumericTelegramUserId,
isTelegramExecApprovalApprover,
isTelegramExecApprovalClientEnabled,
listTelegramAccountIds,
looksLikeTelegramTargetId,
normalizeTelegramAllowFromEntry,
normalizeTelegramMessagingTarget,
parseTelegramReplyToMessageId,
parseTelegramThreadId,
resolveDefaultTelegramAccountId,
resolveTelegramGroupRequireMention,
resolveTelegramGroupToolPolicy,
resolveTelegramInlineButtonsScope,
resolveTelegramPollActionGateState,
resolveTelegramReactionLevel,
resolveTelegramTargetChatType,
searchStickers,
sendTelegramPayloadMessages,
collectTelegramStatusIssues,
} from "../channels/telegram/plugin-sdk-bridge.js";
import {
auditTelegramGroupMembership,
collectTelegramUnmentionedGroupIds,
createForumTopicTelegram,
deleteMessageTelegram,
editForumTopicTelegram,
editMessageReplyMarkupTelegram,
editMessageTelegram,
monitorTelegramProvider,
pinMessageTelegram,
probeTelegram,
reactMessageTelegram,
renameForumTopicTelegram,
resolveTelegramToken,
sendMessageTelegram,
sendPollTelegram,
sendStickerTelegram,
sendTypingTelegram,
setTelegramThreadBindingIdleTimeoutBySessionKey,
setTelegramThreadBindingMaxAgeBySessionKey,
telegramMessageActions,
unpinMessageTelegram,
listTelegramDirectoryGroupsFromConfig,
listTelegramDirectoryPeersFromConfig,
} from "../channels/telegram/plugin-sdk-bridge.js";
export type {
ChannelAccountSnapshot,
ChannelGatewayContext,
@ -17,11 +82,15 @@ export type {
ChannelConfiguredBindingConversationRef,
ChannelConfiguredBindingMatch,
} from "../channels/plugins/types.adapters.js";
export type { InspectedTelegramAccount } from "../../extensions/telegram/api.js";
export type { ResolvedTelegramAccount } from "../../extensions/telegram/api.js";
export type { TelegramProbe } from "../../extensions/telegram/runtime-api.js";
export type { TelegramButtonStyle, TelegramInlineButtons } from "../../extensions/telegram/api.js";
export type { StickerMetadata } from "../../extensions/telegram/api.js";
export type {
InspectedTelegramAccount,
ProviderInfo,
ResolvedTelegramAccount,
StickerMetadata,
TelegramButtonStyle,
TelegramInlineButtons,
TelegramProbe,
};
export { emptyPluginConfigSchema } from "../plugins/config-schema.js";
export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
@ -48,80 +117,58 @@ export {
resolveAllowlistProviderRuntimeGroupPolicy,
resolveDefaultGroupPolicy,
} from "../config/runtime-group-policy.js";
export {
listTelegramDirectoryGroupsFromConfig,
listTelegramDirectoryPeersFromConfig,
} from "../../extensions/telegram/src/directory-config.js";
export {
resolveTelegramGroupRequireMention,
resolveTelegramGroupToolPolicy,
} from "../../extensions/telegram/api.js";
export { listTelegramDirectoryGroupsFromConfig, listTelegramDirectoryPeersFromConfig };
export { resolveTelegramGroupRequireMention, resolveTelegramGroupToolPolicy };
export { TelegramConfigSchema } from "../config/zod-schema.providers-core.js";
export { buildTokenChannelStatusSummary } from "./status-helpers.js";
export {
createTelegramActionGate,
listTelegramAccountIds,
resolveDefaultTelegramAccountId,
resolveTelegramPollActionGateState,
} from "../../extensions/telegram/api.js";
export { inspectTelegramAccount } from "../../extensions/telegram/api.js";
export {
looksLikeTelegramTargetId,
normalizeTelegramMessagingTarget,
} from "../../extensions/telegram/api.js";
export {
parseTelegramReplyToMessageId,
parseTelegramThreadId,
} from "../../extensions/telegram/api.js";
export {
isNumericTelegramUserId,
normalizeTelegramAllowFromEntry,
} from "../../extensions/telegram/api.js";
export { fetchTelegramChatId } from "../../extensions/telegram/api.js";
export {
resolveTelegramInlineButtonsScope,
resolveTelegramTargetChatType,
} 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 {
buildBrowseProvidersButton,
buildModelsKeyboard,
buildProviderKeyboard,
calculateTotalPages,
collectTelegramStatusIssues,
collectTelegramUnmentionedGroupIds,
createForumTopicTelegram,
createTelegramActionGate,
deleteMessageTelegram,
editForumTopicTelegram,
editMessageReplyMarkupTelegram,
editMessageTelegram,
fetchTelegramChatId,
getCacheStats,
getModelsPageSize,
type ProviderInfo,
} from "../../extensions/telegram/api.js";
export {
inspectTelegramAccount,
isNumericTelegramUserId,
isTelegramExecApprovalApprover,
isTelegramExecApprovalClientEnabled,
} from "../../extensions/telegram/api.js";
listTelegramAccountIds,
looksLikeTelegramTargetId,
monitorTelegramProvider,
normalizeTelegramAllowFromEntry,
normalizeTelegramMessagingTarget,
parseTelegramReplyToMessageId,
parseTelegramThreadId,
pinMessageTelegram,
probeTelegram,
reactMessageTelegram,
renameForumTopicTelegram,
resolveDefaultTelegramAccountId,
resolveTelegramInlineButtonsScope,
resolveTelegramPollActionGateState,
resolveTelegramReactionLevel,
resolveTelegramTargetChatType,
resolveTelegramToken,
searchStickers,
sendMessageTelegram,
sendPollTelegram,
sendStickerTelegram,
sendTelegramPayloadMessages,
sendTypingTelegram,
setTelegramThreadBindingIdleTimeoutBySessionKey,
setTelegramThreadBindingMaxAgeBySessionKey,
telegramMessageActions,
unpinMessageTelegram,
};

View File

@ -3,4 +3,4 @@ export {
loadWebMedia,
loadWebMediaRaw,
type WebMediaResult,
} from "../../extensions/whatsapp/runtime-api.js";
} from "../channels/whatsapp/web-media-bridge.js";

View File

@ -1 +1 @@
export { handleWhatsAppAction } from "../../extensions/whatsapp/action-runtime-api.js";
export { handleWhatsAppAction } from "../channels/whatsapp/action-runtime-bridge.js";

View File

@ -13,7 +13,7 @@ export {
export {
resolveWhatsAppGroupRequireMention,
resolveWhatsAppGroupToolPolicy,
} from "../../extensions/whatsapp/api.js";
} from "../channels/whatsapp/plugin-sdk-bridge.js";
export { resolveWhatsAppGroupIntroHint } from "../channels/plugins/whatsapp-shared.js";
export {
ToolAuthorizationError,

View File

@ -1 +1 @@
export { startWebLoginWithQr, waitForWebLogin } from "../../extensions/whatsapp/login-qr-api.js";
export { startWebLoginWithQr, waitForWebLogin } from "../channels/whatsapp/login-qr-bridge.js";

View File

@ -1,11 +1,55 @@
import {
hasAnyWhatsAppAuth,
listEnabledWhatsAppAccounts,
resolveWhatsAppAccount,
resolveWhatsAppGroupRequireMention,
resolveWhatsAppGroupToolPolicy,
listWhatsAppDirectoryGroupsFromConfig,
listWhatsAppDirectoryPeersFromConfig,
} from "../channels/whatsapp/plugin-sdk-bridge.js";
import type {
WebChannelStatus,
WebInboundMessage,
WebListenerCloseReason,
WebMonitorTuning,
} from "../channels/whatsapp/plugin-sdk-bridge.js";
import {
createWhatsAppLoginTool,
createWaSocket,
DEFAULT_WEB_MEDIA_BYTES,
extractMediaPlaceholder,
extractText,
formatError,
getActiveWebListener,
getDefaultLocalRoots,
getStatusCode,
getWebAuthAgeMs,
HEARTBEAT_PROMPT,
HEARTBEAT_TOKEN,
loadWebMedia,
loadWebMediaRaw,
loginWeb,
logWebSelfId,
logoutWeb,
monitorWebChannel,
monitorWebInbox,
optimizeImageToJpeg,
pickWebChannel,
readWebSelfId,
resolveHeartbeatRecipients,
runWebHeartbeatOnce,
sendMessageWhatsApp,
sendPollWhatsApp,
sendReactionWhatsApp,
waitForWaConnection,
WA_WEB_AUTH_DIR,
webAuthExists,
} from "../channels/whatsapp/plugin-sdk-bridge.js";
export type { ChannelMessageActionName } from "../channels/plugins/types.js";
export type { OpenClawConfig } from "../config/config.js";
export type { DmPolicy, GroupPolicy, WhatsAppAccountConfig } from "../config/types.js";
export type { WebChannelStatus, WebMonitorTuning } from "../../extensions/whatsapp/runtime-api.js";
export type {
WebInboundMessage,
WebListenerCloseReason,
} from "../../extensions/whatsapp/runtime-api.js";
export type { WebChannelStatus, WebInboundMessage, WebListenerCloseReason, WebMonitorTuning };
export type {
ChannelMessageActionContext,
ChannelPlugin,
@ -33,10 +77,7 @@ export {
resolveWhatsAppConfigDefaultTo,
} from "./channel-config-helpers.js";
export { normalizeWhatsAppAllowFromEntries } from "../channels/plugins/normalize/whatsapp.js";
export {
listWhatsAppDirectoryGroupsFromConfig,
listWhatsAppDirectoryPeersFromConfig,
} from "../../extensions/whatsapp/src/directory-config.js";
export { listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig };
export {
collectAllowlistProviderGroupPolicyWarnings,
collectOpenGroupPolicyRouteAllowlistWarnings,
@ -49,10 +90,7 @@ export {
resolveAllowlistProviderRuntimeGroupPolicy,
resolveDefaultGroupPolicy,
} from "../config/runtime-group-policy.js";
export {
resolveWhatsAppGroupRequireMention,
resolveWhatsAppGroupToolPolicy,
} from "../../extensions/whatsapp/api.js";
export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy };
export {
createWhatsAppOutboundBase,
resolveWhatsAppGroupIntroHint,
@ -65,50 +103,36 @@ export { createActionGate, readStringParam } from "../agents/tools/common.js";
export { createPluginRuntimeStore } from "./runtime-store.js";
export { normalizeE164 } from "../utils.js";
export { hasAnyWhatsAppAuth, listEnabledWhatsAppAccounts, resolveWhatsAppAccount };
export {
hasAnyWhatsAppAuth,
listEnabledWhatsAppAccounts,
resolveWhatsAppAccount,
} from "../../extensions/whatsapp/api.js";
export {
getActiveWebListener,
getWebAuthAgeMs,
WA_WEB_AUTH_DIR,
logWebSelfId,
logoutWeb,
pickWebChannel,
readWebSelfId,
webAuthExists,
} from "../../extensions/whatsapp/runtime-api.js";
export {
createWaSocket,
createWhatsAppLoginTool,
DEFAULT_WEB_MEDIA_BYTES,
HEARTBEAT_PROMPT,
HEARTBEAT_TOKEN,
monitorWebChannel,
resolveHeartbeatRecipients,
runWebHeartbeatOnce,
} from "../../extensions/whatsapp/runtime-api.js";
export {
extractMediaPlaceholder,
extractText,
monitorWebInbox,
} from "../../extensions/whatsapp/runtime-api.js";
export { loginWeb } from "../../extensions/whatsapp/runtime-api.js";
export {
formatError,
getActiveWebListener,
getDefaultLocalRoots,
getStatusCode,
getWebAuthAgeMs,
HEARTBEAT_PROMPT,
HEARTBEAT_TOKEN,
loadWebMedia,
loadWebMediaRaw,
loginWeb,
logWebSelfId,
logoutWeb,
monitorWebChannel,
monitorWebInbox,
optimizeImageToJpeg,
} from "../../extensions/whatsapp/runtime-api.js";
export {
pickWebChannel,
readWebSelfId,
resolveHeartbeatRecipients,
runWebHeartbeatOnce,
sendMessageWhatsApp,
sendPollWhatsApp,
sendReactionWhatsApp,
} from "../../extensions/whatsapp/runtime-api.js";
export {
createWaSocket,
formatError,
getStatusCode,
waitForWaConnection,
} from "../../extensions/whatsapp/runtime-api.js";
export { createWhatsAppLoginTool } from "../../extensions/whatsapp/runtime-api.js";
WA_WEB_AUTH_DIR,
webAuthExists,
};

View File

@ -62,8 +62,8 @@ export { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.j
export type { RuntimeEnv } from "../runtime.js";
export type { WizardPrompter } from "../wizard/prompts.js";
export { formatAllowFromLowercase, isNormalizedSenderAllowed } from "./allow-from.js";
export { zaloSetupAdapter } from "../../extensions/zalo/api.js";
export { zaloSetupWizard } from "../../extensions/zalo/api.js";
export { zaloSetupAdapter } from "../channels/zalo/plugin-sdk-bridge.js";
export { zaloSetupWizard } from "../channels/zalo/plugin-sdk-bridge.js";
export {
resolveDirectDmAuthorizationOutcome,
resolveSenderCommandAuthorizationWithRuntime,

View File

@ -94,29 +94,29 @@ export type PluginRuntimeChannel = {
shouldHandleTextCommands: typeof import("../../auto-reply/commands-registry.js").shouldHandleTextCommands;
};
discord: {
messageActions: typeof import("../../../extensions/discord/runtime-api.js").discordMessageActions;
auditChannelPermissions: typeof import("../../../extensions/discord/runtime-api.js").auditDiscordChannelPermissions;
listDirectoryGroupsLive: typeof import("../../../extensions/discord/runtime-api.js").listDiscordDirectoryGroupsLive;
listDirectoryPeersLive: typeof import("../../../extensions/discord/runtime-api.js").listDiscordDirectoryPeersLive;
probeDiscord: typeof import("../../../extensions/discord/runtime-api.js").probeDiscord;
resolveChannelAllowlist: typeof import("../../../extensions/discord/runtime-api.js").resolveDiscordChannelAllowlist;
resolveUserAllowlist: typeof import("../../../extensions/discord/runtime-api.js").resolveDiscordUserAllowlist;
sendComponentMessage: typeof import("../../../extensions/discord/runtime-api.js").sendDiscordComponentMessage;
sendMessageDiscord: typeof import("../../../extensions/discord/runtime-api.js").sendMessageDiscord;
sendPollDiscord: typeof import("../../../extensions/discord/runtime-api.js").sendPollDiscord;
monitorDiscordProvider: typeof import("../../../extensions/discord/runtime-api.js").monitorDiscordProvider;
messageActions: typeof import("openclaw/plugin-sdk/discord").discordMessageActions;
auditChannelPermissions: typeof import("openclaw/plugin-sdk/discord").auditDiscordChannelPermissions;
listDirectoryGroupsLive: typeof import("openclaw/plugin-sdk/discord").listDiscordDirectoryGroupsLive;
listDirectoryPeersLive: typeof import("openclaw/plugin-sdk/discord").listDiscordDirectoryPeersLive;
probeDiscord: typeof import("openclaw/plugin-sdk/discord").probeDiscord;
resolveChannelAllowlist: typeof import("openclaw/plugin-sdk/discord").resolveDiscordChannelAllowlist;
resolveUserAllowlist: typeof import("openclaw/plugin-sdk/discord").resolveDiscordUserAllowlist;
sendComponentMessage: typeof import("openclaw/plugin-sdk/discord").sendDiscordComponentMessage;
sendMessageDiscord: typeof import("openclaw/plugin-sdk/discord").sendMessageDiscord;
sendPollDiscord: typeof import("openclaw/plugin-sdk/discord").sendPollDiscord;
monitorDiscordProvider: typeof import("openclaw/plugin-sdk/discord").monitorDiscordProvider;
threadBindings: {
getManager: typeof import("../../../extensions/discord/runtime-api.js").getThreadBindingManager;
resolveIdleTimeoutMs: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingIdleTimeoutMs;
resolveInactivityExpiresAt: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingInactivityExpiresAt;
resolveMaxAgeMs: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingMaxAgeMs;
resolveMaxAgeExpiresAt: typeof import("../../../extensions/discord/runtime-api.js").resolveThreadBindingMaxAgeExpiresAt;
setIdleTimeoutBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").setThreadBindingIdleTimeoutBySessionKey;
setMaxAgeBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").setThreadBindingMaxAgeBySessionKey;
unbindBySessionKey: typeof import("../../../extensions/discord/runtime-api.js").unbindThreadBindingsBySessionKey;
getManager: typeof import("openclaw/plugin-sdk/discord").getThreadBindingManager;
resolveIdleTimeoutMs: typeof import("openclaw/plugin-sdk/discord").resolveThreadBindingIdleTimeoutMs;
resolveInactivityExpiresAt: typeof import("openclaw/plugin-sdk/discord").resolveThreadBindingInactivityExpiresAt;
resolveMaxAgeMs: typeof import("openclaw/plugin-sdk/discord").resolveThreadBindingMaxAgeMs;
resolveMaxAgeExpiresAt: typeof import("openclaw/plugin-sdk/discord").resolveThreadBindingMaxAgeExpiresAt;
setIdleTimeoutBySessionKey: typeof import("openclaw/plugin-sdk/discord").setThreadBindingIdleTimeoutBySessionKey;
setMaxAgeBySessionKey: typeof import("openclaw/plugin-sdk/discord").setThreadBindingMaxAgeBySessionKey;
unbindBySessionKey: typeof import("openclaw/plugin-sdk/discord").unbindThreadBindingsBySessionKey;
};
typing: {
pulse: typeof import("../../../extensions/discord/runtime-api.js").sendTypingDiscord;
pulse: typeof import("openclaw/plugin-sdk/discord").sendTypingDiscord;
start: (params: {
channelId: string;
accountId?: string;
@ -128,39 +128,39 @@ export type PluginRuntimeChannel = {
}>;
};
conversationActions: {
editMessage: typeof import("../../../extensions/discord/runtime-api.js").editMessageDiscord;
deleteMessage: typeof import("../../../extensions/discord/runtime-api.js").deleteMessageDiscord;
pinMessage: typeof import("../../../extensions/discord/runtime-api.js").pinMessageDiscord;
unpinMessage: typeof import("../../../extensions/discord/runtime-api.js").unpinMessageDiscord;
createThread: typeof import("../../../extensions/discord/runtime-api.js").createThreadDiscord;
editChannel: typeof import("../../../extensions/discord/runtime-api.js").editChannelDiscord;
editMessage: typeof import("openclaw/plugin-sdk/discord").editMessageDiscord;
deleteMessage: typeof import("openclaw/plugin-sdk/discord").deleteMessageDiscord;
pinMessage: typeof import("openclaw/plugin-sdk/discord").pinMessageDiscord;
unpinMessage: typeof import("openclaw/plugin-sdk/discord").unpinMessageDiscord;
createThread: typeof import("openclaw/plugin-sdk/discord").createThreadDiscord;
editChannel: typeof import("openclaw/plugin-sdk/discord").editChannelDiscord;
};
};
slack: {
listDirectoryGroupsLive: typeof import("../../../extensions/slack/runtime-api.js").listSlackDirectoryGroupsLive;
listDirectoryPeersLive: typeof import("../../../extensions/slack/runtime-api.js").listSlackDirectoryPeersLive;
probeSlack: typeof import("../../../extensions/slack/runtime-api.js").probeSlack;
resolveChannelAllowlist: typeof import("../../../extensions/slack/runtime-api.js").resolveSlackChannelAllowlist;
resolveUserAllowlist: typeof import("../../../extensions/slack/runtime-api.js").resolveSlackUserAllowlist;
sendMessageSlack: typeof import("../../../extensions/slack/runtime-api.js").sendMessageSlack;
monitorSlackProvider: typeof import("../../../extensions/slack/runtime-api.js").monitorSlackProvider;
handleSlackAction: typeof import("../../../extensions/slack/runtime-api.js").handleSlackAction;
listDirectoryGroupsLive: typeof import("openclaw/plugin-sdk/slack").listSlackDirectoryGroupsLive;
listDirectoryPeersLive: typeof import("openclaw/plugin-sdk/slack").listSlackDirectoryPeersLive;
probeSlack: typeof import("openclaw/plugin-sdk/slack").probeSlack;
resolveChannelAllowlist: typeof import("openclaw/plugin-sdk/slack").resolveSlackChannelAllowlist;
resolveUserAllowlist: typeof import("openclaw/plugin-sdk/slack").resolveSlackUserAllowlist;
sendMessageSlack: typeof import("openclaw/plugin-sdk/slack").sendMessageSlack;
monitorSlackProvider: typeof import("openclaw/plugin-sdk/slack").monitorSlackProvider;
handleSlackAction: typeof import("openclaw/plugin-sdk/slack").handleSlackAction;
};
telegram: {
auditGroupMembership: typeof import("../../../extensions/telegram/runtime-api.js").auditTelegramGroupMembership;
collectUnmentionedGroupIds: typeof import("../../../extensions/telegram/runtime-api.js").collectTelegramUnmentionedGroupIds;
probeTelegram: typeof import("../../../extensions/telegram/runtime-api.js").probeTelegram;
resolveTelegramToken: typeof import("../../../extensions/telegram/runtime-api.js").resolveTelegramToken;
sendMessageTelegram: typeof import("../../../extensions/telegram/runtime-api.js").sendMessageTelegram;
sendPollTelegram: typeof import("../../../extensions/telegram/runtime-api.js").sendPollTelegram;
monitorTelegramProvider: typeof import("../../../extensions/telegram/runtime-api.js").monitorTelegramProvider;
messageActions: typeof import("../../../extensions/telegram/runtime-api.js").telegramMessageActions;
auditGroupMembership: typeof import("openclaw/plugin-sdk/telegram").auditTelegramGroupMembership;
collectUnmentionedGroupIds: typeof import("openclaw/plugin-sdk/telegram").collectTelegramUnmentionedGroupIds;
probeTelegram: typeof import("openclaw/plugin-sdk/telegram").probeTelegram;
resolveTelegramToken: typeof import("openclaw/plugin-sdk/telegram").resolveTelegramToken;
sendMessageTelegram: typeof import("openclaw/plugin-sdk/telegram").sendMessageTelegram;
sendPollTelegram: typeof import("openclaw/plugin-sdk/telegram").sendPollTelegram;
monitorTelegramProvider: typeof import("openclaw/plugin-sdk/telegram").monitorTelegramProvider;
messageActions: typeof import("openclaw/plugin-sdk/telegram").telegramMessageActions;
threadBindings: {
setIdleTimeoutBySessionKey: typeof import("../../../extensions/telegram/runtime-api.js").setTelegramThreadBindingIdleTimeoutBySessionKey;
setMaxAgeBySessionKey: typeof import("../../../extensions/telegram/runtime-api.js").setTelegramThreadBindingMaxAgeBySessionKey;
setIdleTimeoutBySessionKey: typeof import("openclaw/plugin-sdk/telegram").setTelegramThreadBindingIdleTimeoutBySessionKey;
setMaxAgeBySessionKey: typeof import("openclaw/plugin-sdk/telegram").setTelegramThreadBindingMaxAgeBySessionKey;
};
typing: {
pulse: typeof import("../../../extensions/telegram/runtime-api.js").sendTypingTelegram;
pulse: typeof import("openclaw/plugin-sdk/telegram").sendTypingTelegram;
start: (params: {
to: string;
accountId?: string;
@ -173,8 +173,8 @@ export type PluginRuntimeChannel = {
}>;
};
conversationActions: {
editMessage: typeof import("../../../extensions/telegram/runtime-api.js").editMessageTelegram;
editReplyMarkup: typeof import("../../../extensions/telegram/runtime-api.js").editMessageReplyMarkupTelegram;
editMessage: typeof import("openclaw/plugin-sdk/telegram").editMessageTelegram;
editReplyMarkup: typeof import("openclaw/plugin-sdk/telegram").editMessageReplyMarkupTelegram;
clearReplyMarkup: (
chatIdInput: string | number,
messageIdInput: string | number,
@ -187,22 +187,22 @@ export type PluginRuntimeChannel = {
cfg?: ReturnType<typeof import("../../config/config.js").loadConfig>;
},
) => Promise<{ ok: true; messageId: string; chatId: string }>;
deleteMessage: typeof import("../../../extensions/telegram/runtime-api.js").deleteMessageTelegram;
renameTopic: typeof import("../../../extensions/telegram/runtime-api.js").renameForumTopicTelegram;
pinMessage: typeof import("../../../extensions/telegram/runtime-api.js").pinMessageTelegram;
unpinMessage: typeof import("../../../extensions/telegram/runtime-api.js").unpinMessageTelegram;
deleteMessage: typeof import("openclaw/plugin-sdk/telegram").deleteMessageTelegram;
renameTopic: typeof import("openclaw/plugin-sdk/telegram").renameForumTopicTelegram;
pinMessage: typeof import("openclaw/plugin-sdk/telegram").pinMessageTelegram;
unpinMessage: typeof import("openclaw/plugin-sdk/telegram").unpinMessageTelegram;
};
};
signal: {
probeSignal: typeof import("../../../extensions/signal/runtime-api.js").probeSignal;
sendMessageSignal: typeof import("../../../extensions/signal/runtime-api.js").sendMessageSignal;
monitorSignalProvider: typeof import("../../../extensions/signal/runtime-api.js").monitorSignalProvider;
messageActions: typeof import("../../../extensions/signal/runtime-api.js").signalMessageActions;
probeSignal: typeof import("openclaw/plugin-sdk/signal").probeSignal;
sendMessageSignal: typeof import("openclaw/plugin-sdk/signal").sendMessageSignal;
monitorSignalProvider: typeof import("openclaw/plugin-sdk/signal").monitorSignalProvider;
messageActions: typeof import("openclaw/plugin-sdk/signal").signalMessageActions;
};
imessage: {
monitorIMessageProvider: typeof import("../../../extensions/imessage/runtime-api.js").monitorIMessageProvider;
probeIMessage: typeof import("../../../extensions/imessage/runtime-api.js").probeIMessage;
sendMessageIMessage: typeof import("../../../extensions/imessage/runtime-api.js").sendMessageIMessage;
monitorIMessageProvider: typeof import("openclaw/plugin-sdk/imessage").monitorIMessageProvider;
probeIMessage: typeof import("openclaw/plugin-sdk/imessage").probeIMessage;
sendMessageIMessage: typeof import("openclaw/plugin-sdk/imessage").sendMessageIMessage;
};
whatsapp: {
getActiveWebListener: typeof import("openclaw/plugin-sdk/whatsapp").getActiveWebListener;

View File

@ -39,7 +39,7 @@ export type PluginRuntimeCore = {
formatNativeDependencyHint: typeof import("./native-deps.js").formatNativeDependencyHint;
};
media: {
loadWebMedia: typeof import("../../../extensions/whatsapp/runtime-api.js").loadWebMedia;
loadWebMedia: typeof import("openclaw/plugin-sdk/web-media").loadWebMedia;
detectMime: typeof import("../../media/mime.js").detectMime;
mediaKindFromMime: typeof import("../../media/constants.js").mediaKindFromMime;
isVoiceCompatibleAudio: typeof import("../../media/audio.js").isVoiceCompatibleAudio;

View File

@ -0,0 +1,60 @@
export {
KIMI_CODING_BASE_URL,
KIMI_CODING_DEFAULT_MODEL_ID,
} from "../../extensions/kimi-coding/provider-catalog.js";
export {
buildMinimaxApiModelDefinition,
buildMinimaxModelDefinition,
DEFAULT_MINIMAX_BASE_URL,
MINIMAX_API_BASE_URL,
MINIMAX_API_COST,
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_COST,
MISTRAL_DEFAULT_MODEL_ID,
MISTRAL_DEFAULT_MODEL_REF,
} from "../../extensions/mistral/model-definitions.js";
export {
buildModelStudioDefaultModelDefinition,
buildModelStudioModelDefinition,
MODELSTUDIO_CN_BASE_URL,
MODELSTUDIO_DEFAULT_COST,
MODELSTUDIO_DEFAULT_MODEL_ID,
MODELSTUDIO_DEFAULT_MODEL_REF,
MODELSTUDIO_GLOBAL_BASE_URL,
} from "../../extensions/modelstudio/model-definitions.js";
export { MOONSHOT_CN_BASE_URL } from "../../extensions/moonshot/onboard.js";
export {
buildMoonshotProvider,
MOONSHOT_BASE_URL,
MOONSHOT_DEFAULT_MODEL_ID,
} from "../../extensions/moonshot/provider-catalog.js";
export {
QIANFAN_BASE_URL,
QIANFAN_DEFAULT_MODEL_ID,
} from "../../extensions/qianfan/provider-catalog.js";
export {
buildXaiModelDefinition,
XAI_BASE_URL,
XAI_DEFAULT_COST,
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_COST,
ZAI_DEFAULT_MODEL_ID,
ZAI_DEFAULT_MODEL_REF,
ZAI_GLOBAL_BASE_URL,
} from "../../extensions/zai/model-definitions.js";