diff --git a/extensions/discord/src/actions/runtime.guild.ts b/extensions/discord/src/actions/runtime.guild.ts index 5b3ed54dc83..71618b073d8 100644 --- a/extensions/discord/src/actions/runtime.guild.ts +++ b/extensions/discord/src/actions/runtime.guild.ts @@ -6,8 +6,8 @@ import { readNumberParam, readStringArrayParam, readStringParam, -} from "../../../../src/agents/tools/common.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; + type DiscordActionConfig, +} from "openclaw/plugin-sdk/discord-core"; import { getPresence } from "../monitor/presence-cache.js"; import { addRoleDiscord, diff --git a/extensions/discord/src/actions/runtime.messaging.ts b/extensions/discord/src/actions/runtime.messaging.ts index 92ef443cf44..d5cf900207b 100644 --- a/extensions/discord/src/actions/runtime.messaging.ts +++ b/extensions/discord/src/actions/runtime.messaging.ts @@ -1,18 +1,18 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param"; -import { withNormalizedTimestamp } from "../../../../src/agents/date-time.js"; -import { assertMediaNotDataUrl } from "../../../../src/agents/sandbox-paths.js"; import { type ActionGate, + assertMediaNotDataUrl, jsonResult, readNumberParam, readReactionParams, readStringArrayParam, readStringParam, -} from "../../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; -import { resolvePollMaxSelections } from "../../../../src/polls.js"; + resolvePollMaxSelections, + type DiscordActionConfig, + type OpenClawConfig, + withNormalizedTimestamp, +} from "openclaw/plugin-sdk/discord-core"; import { readDiscordComponentSpec } from "../components.js"; import { createThreadDiscord, diff --git a/extensions/discord/src/actions/runtime.moderation-shared.ts b/extensions/discord/src/actions/runtime.moderation-shared.ts index 7b6ef95d8f1..9fd7334fce6 100644 --- a/extensions/discord/src/actions/runtime.moderation-shared.ts +++ b/extensions/discord/src/actions/runtime.moderation-shared.ts @@ -1,5 +1,5 @@ import { PermissionFlagsBits } from "discord-api-types/v10"; -import { readNumberParam, readStringParam } from "../../../../src/agents/tools/common.js"; +import { readNumberParam, readStringParam } from "openclaw/plugin-sdk/discord-core"; export type DiscordModerationAction = "timeout" | "kick" | "ban"; diff --git a/extensions/discord/src/actions/runtime.moderation.ts b/extensions/discord/src/actions/runtime.moderation.ts index 3278daa6532..f44a39082b9 100644 --- a/extensions/discord/src/actions/runtime.moderation.ts +++ b/extensions/discord/src/actions/runtime.moderation.ts @@ -3,8 +3,8 @@ import { type ActionGate, jsonResult, readStringParam, -} from "../../../../src/agents/tools/common.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; + type DiscordActionConfig, +} from "openclaw/plugin-sdk/discord-core"; import { banMemberDiscord, hasAnyGuildPermissionDiscord, diff --git a/extensions/discord/src/actions/runtime.presence.ts b/extensions/discord/src/actions/runtime.presence.ts index 6d3a9f15bc2..6691f214c98 100644 --- a/extensions/discord/src/actions/runtime.presence.ts +++ b/extensions/discord/src/actions/runtime.presence.ts @@ -4,8 +4,8 @@ import { type ActionGate, jsonResult, readStringParam, -} from "../../../../src/agents/tools/common.js"; -import type { DiscordActionConfig } from "../../../../src/config/types.discord.js"; + type DiscordActionConfig, +} from "openclaw/plugin-sdk/discord-core"; import { getGateway } from "../monitor/gateway-registry.js"; const ACTIVITY_TYPE_MAP: Record = { diff --git a/extensions/discord/src/actions/runtime.shared.ts b/extensions/discord/src/actions/runtime.shared.ts index bd2ce7a08d6..0f5b0bb7152 100644 --- a/extensions/discord/src/actions/runtime.shared.ts +++ b/extensions/discord/src/actions/runtime.shared.ts @@ -1,4 +1,4 @@ -import { readStringParam } from "../../../../src/agents/tools/common.js"; +import { readStringParam } from "openclaw/plugin-sdk/discord-core"; export function readDiscordParentIdParam( params: Record, diff --git a/extensions/discord/src/actions/runtime.ts b/extensions/discord/src/actions/runtime.ts index 7efa5a1536f..6a8e03d99ef 100644 --- a/extensions/discord/src/actions/runtime.ts +++ b/extensions/discord/src/actions/runtime.ts @@ -1,6 +1,5 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; -import { readStringParam } from "../../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../../src/config/config.js"; +import { readStringParam, type OpenClawConfig } from "openclaw/plugin-sdk/discord-core"; import { createDiscordActionGate } from "../accounts.js"; import { handleDiscordGuildAction } from "./runtime.guild.js"; import { handleDiscordMessagingAction } from "./runtime.messaging.js"; diff --git a/extensions/line/api.ts b/extensions/line/api.ts index c4150b2a242..5fdc62bdfb4 100644 --- a/extensions/line/api.ts +++ b/extensions/line/api.ts @@ -1,3 +1,2 @@ export * from "openclaw/plugin-sdk/line"; -export * from "./src/setup-core.js"; -export * from "./src/setup-surface.js"; +export * from "./setup-api.js"; diff --git a/extensions/line/setup-api.ts b/extensions/line/setup-api.ts new file mode 100644 index 00000000000..fb50302ead1 --- /dev/null +++ b/extensions/line/setup-api.ts @@ -0,0 +1,2 @@ +export { lineSetupAdapter } from "./src/setup-core.js"; +export { lineSetupWizard } from "./src/setup-surface.js"; diff --git a/extensions/line/src/setup-core.ts b/extensions/line/src/setup-core.ts index 95554e0a835..d6e8612cd92 100644 --- a/extensions/line/src/setup-core.ts +++ b/extensions/line/src/setup-core.ts @@ -1,7 +1,11 @@ -import type { ChannelSetupAdapter, OpenClawConfig } from "openclaw/plugin-sdk/setup"; -import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup"; -import { normalizeAccountId, resolveLineAccount } from "../../../src/line/accounts.js"; -import type { LineConfig } from "../../../src/line/types.js"; +import { + DEFAULT_ACCOUNT_ID, + normalizeAccountId, + resolveLineAccount, + type ChannelSetupAdapter, + type LineConfig, + type OpenClawConfig, +} from "openclaw/plugin-sdk/line-core"; const channel = "line" as const; @@ -154,4 +158,4 @@ export const lineSetupAdapter: ChannelSetupAdapter = { }, }; -export { listLineAccountIds } from "../../../src/line/accounts.js"; +export { listLineAccountIds } from "openclaw/plugin-sdk/line-core"; diff --git a/extensions/line/src/setup-surface.ts b/extensions/line/src/setup-surface.ts index 1d994ebb128..154419d7527 100644 --- a/extensions/line/src/setup-surface.ts +++ b/extensions/line/src/setup-surface.ts @@ -1,13 +1,13 @@ import { DEFAULT_ACCOUNT_ID, formatDocsLink, + resolveLineAccount, setSetupChannelEnabled, setTopLevelChannelDmPolicyWithAllowFrom, splitSetupEntries, type ChannelSetupDmPolicy, type ChannelSetupWizard, -} from "openclaw/plugin-sdk/setup"; -import { resolveLineAccount } from "../../../src/line/accounts.js"; +} from "openclaw/plugin-sdk/line-core"; import { isLineConfigured, listLineAccountIds, diff --git a/extensions/nostr/api.ts b/extensions/nostr/api.ts index f2914e34190..2de81f11142 100644 --- a/extensions/nostr/api.ts +++ b/extensions/nostr/api.ts @@ -1,2 +1,2 @@ export * from "openclaw/plugin-sdk/nostr"; -export * from "./src/setup-surface.js"; +export * from "./setup-api.js"; diff --git a/extensions/nostr/setup-api.ts b/extensions/nostr/setup-api.ts new file mode 100644 index 00000000000..f9824d063b4 --- /dev/null +++ b/extensions/nostr/setup-api.ts @@ -0,0 +1 @@ +export { nostrSetupAdapter, nostrSetupWizard } from "./src/setup-surface.js"; diff --git a/extensions/slack/src/action-runtime.ts b/extensions/slack/src/action-runtime.ts index deb5eb0218e..1e42eacef28 100644 --- a/extensions/slack/src/action-runtime.ts +++ b/extensions/slack/src/action-runtime.ts @@ -1,5 +1,4 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; -import { withNormalizedTimestamp } from "../../../src/agents/date-time.js"; import { createActionGate, imageResultFromFile, @@ -7,8 +6,9 @@ import { readNumberParam, readReactionParams, readStringParam, -} from "../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; + type OpenClawConfig, + withNormalizedTimestamp, +} from "openclaw/plugin-sdk/slack-core"; import { resolveSlackAccount } from "./accounts.js"; import { deleteSlackMessage, diff --git a/extensions/synology-chat/api.ts b/extensions/synology-chat/api.ts index 1707865e258..4ff5241bd49 100644 --- a/extensions/synology-chat/api.ts +++ b/extensions/synology-chat/api.ts @@ -1,2 +1,2 @@ export * from "openclaw/plugin-sdk/synology-chat"; -export * from "./src/setup-surface.js"; +export * from "./setup-api.js"; diff --git a/extensions/synology-chat/setup-api.ts b/extensions/synology-chat/setup-api.ts new file mode 100644 index 00000000000..7166027bfea --- /dev/null +++ b/extensions/synology-chat/setup-api.ts @@ -0,0 +1 @@ +export { synologyChatSetupAdapter, synologyChatSetupWizard } from "./src/setup-surface.js"; diff --git a/extensions/telegram/src/action-runtime.ts b/extensions/telegram/src/action-runtime.ts index e6e56e9eb3a..f4083481026 100644 --- a/extensions/telegram/src/action-runtime.ts +++ b/extensions/telegram/src/action-runtime.ts @@ -7,10 +7,10 @@ import { readStringArrayParam, readStringOrNumberParam, readStringParam, -} from "../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import type { TelegramActionConfig } from "../../../src/config/types.telegram.js"; -import { resolvePollMaxSelections } from "../../../src/polls.js"; + resolvePollMaxSelections, + type OpenClawConfig, + type TelegramActionConfig, +} from "openclaw/plugin-sdk/telegram-core"; import { createTelegramActionGate, resolveTelegramPollActionGateState } from "./accounts.js"; import type { TelegramButtonStyle, TelegramInlineButtons } from "./button-types.js"; import { diff --git a/extensions/tlon/api.ts b/extensions/tlon/api.ts index ca61d62ee69..bccfa85fbac 100644 --- a/extensions/tlon/api.ts +++ b/extensions/tlon/api.ts @@ -1,3 +1,2 @@ export * from "openclaw/plugin-sdk/tlon"; -export * from "./src/setup-core.js"; -export * from "./src/setup-surface.js"; +export * from "./setup-api.js"; diff --git a/extensions/tlon/setup-api.ts b/extensions/tlon/setup-api.ts new file mode 100644 index 00000000000..cf444e388fc --- /dev/null +++ b/extensions/tlon/setup-api.ts @@ -0,0 +1,2 @@ +export { tlonSetupAdapter } from "./src/setup-core.js"; +export { tlonSetupWizard } from "./src/setup-surface.js"; diff --git a/extensions/whatsapp/src/action-runtime-target-auth.ts b/extensions/whatsapp/src/action-runtime-target-auth.ts index 8686ac24261..d641e004df6 100644 --- a/extensions/whatsapp/src/action-runtime-target-auth.ts +++ b/extensions/whatsapp/src/action-runtime-target-auth.ts @@ -1,6 +1,8 @@ -import { ToolAuthorizationError } from "../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; -import { resolveWhatsAppOutboundTarget } from "../../../src/whatsapp/resolve-outbound-target.js"; +import { + ToolAuthorizationError, + resolveWhatsAppOutboundTarget, + type OpenClawConfig, +} from "openclaw/plugin-sdk/whatsapp-core"; import { resolveWhatsAppAccount } from "./accounts.js"; export function resolveAuthorizedWhatsAppOutboundTarget(params: { diff --git a/extensions/whatsapp/src/action-runtime.ts b/extensions/whatsapp/src/action-runtime.ts index 6a805440633..c6046e4eaa4 100644 --- a/extensions/whatsapp/src/action-runtime.ts +++ b/extensions/whatsapp/src/action-runtime.ts @@ -4,8 +4,8 @@ import { jsonResult, readReactionParams, readStringParam, -} from "../../../src/agents/tools/common.js"; -import type { OpenClawConfig } from "../../../src/config/config.js"; + type OpenClawConfig, +} from "openclaw/plugin-sdk/whatsapp-core"; import { resolveAuthorizedWhatsAppOutboundTarget } from "./action-runtime-target-auth.js"; import { sendReactionWhatsApp } from "./send.js"; diff --git a/package.json b/package.json index 0fecff9952d..2a0431f0281 100644 --- a/package.json +++ b/package.json @@ -210,6 +210,10 @@ "types": "./dist/plugin-sdk/line.d.ts", "default": "./dist/plugin-sdk/line.js" }, + "./plugin-sdk/line-core": { + "types": "./dist/plugin-sdk/line-core.d.ts", + "default": "./dist/plugin-sdk/line-core.js" + }, "./plugin-sdk/msteams": { "types": "./dist/plugin-sdk/msteams.d.ts", "default": "./dist/plugin-sdk/msteams.js" diff --git a/scripts/lib/plugin-sdk-entrypoints.json b/scripts/lib/plugin-sdk-entrypoints.json index 72de88ed3ca..c59e7930ba2 100644 --- a/scripts/lib/plugin-sdk-entrypoints.json +++ b/scripts/lib/plugin-sdk-entrypoints.json @@ -42,6 +42,7 @@ "whatsapp", "whatsapp-core", "line", + "line-core", "msteams", "acpx", "bluebubbles", diff --git a/src/channels/plugins/contracts/registry.ts b/src/channels/plugins/contracts/registry.ts index 8b203c9b541..134d8dddfb1 100644 --- a/src/channels/plugins/contracts/registry.ts +++ b/src/channels/plugins/contracts/registry.ts @@ -4,7 +4,7 @@ import { createThreadBindingManager as createDiscordThreadBindingManager, } from "../../../../extensions/discord/runtime-api.js"; import { createFeishuThreadBindingManager } from "../../../../extensions/feishu/api.js"; -import { setMatrixRuntime } from "../../../../extensions/matrix/src/runtime.js"; +import { setMatrixRuntime } from "../../../../extensions/matrix/index.js"; import { createTelegramThreadBindingManager } from "../../../../extensions/telegram/runtime-api.js"; import type { OpenClawConfig } from "../../../config/config.js"; import { diff --git a/src/plugin-sdk/channel-import-guardrails.test.ts b/src/plugin-sdk/channel-import-guardrails.test.ts index b953d4d974a..e9a9e9b1b59 100644 --- a/src/plugin-sdk/channel-import-guardrails.test.ts +++ b/src/plugin-sdk/channel-import-guardrails.test.ts @@ -5,10 +5,12 @@ import { describe, expect, it } from "vitest"; const ROOT_DIR = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const ALLOWED_EXTENSION_PUBLIC_SEAMS = new Set([ + "action-runtime.runtime.js", "api.js", "index.js", "login-qr-api.js", "runtime-api.js", + "setup-api.js", "setup-entry.js", ]); const GUARDED_CHANNEL_EXTENSIONS = new Set([ @@ -328,6 +330,15 @@ describe("channel import guardrails", () => { } }); + it("keeps extension production files off direct core src imports", () => { + for (const file of collectExtensionSourceFiles()) { + const text = readFileSync(file, "utf8"); + expect(text, `${file} should not import ../../src/* core internals directly`).not.toMatch( + /["'][^"']*(?:\.\.\/){2,}src\//, + ); + } + }); + it("keeps core production files off extension private src imports", () => { for (const file of collectCoreSourceFiles()) { const text = readFileSync(file, "utf8"); diff --git a/src/plugin-sdk/discord-core.ts b/src/plugin-sdk/discord-core.ts index 3e87e17ef42..5a3a20cea28 100644 --- a/src/plugin-sdk/discord-core.ts +++ b/src/plugin-sdk/discord-core.ts @@ -1,3 +1,17 @@ export type { ChannelPlugin } from "./channel-plugin-common.js"; export { buildChannelConfigSchema, getChatChannelMeta } from "./channel-plugin-common.js"; +export type { OpenClawConfig } from "../config/config.js"; +export type { DiscordActionConfig } from "../config/types.js"; +export { withNormalizedTimestamp } from "../agents/date-time.js"; +export { assertMediaNotDataUrl } from "../agents/sandbox-paths.js"; +export { + type ActionGate, + jsonResult, + parseAvailableTags, + readNumberParam, + readReactionParams, + readStringArrayParam, + readStringParam, +} from "../agents/tools/common.js"; export { DiscordConfigSchema } from "../config/zod-schema.providers-core.js"; +export { resolvePollMaxSelections } from "../polls.js"; diff --git a/src/plugin-sdk/line-core.ts b/src/plugin-sdk/line-core.ts new file mode 100644 index 00000000000..8f2b9f1949d --- /dev/null +++ b/src/plugin-sdk/line-core.ts @@ -0,0 +1,16 @@ +export type { OpenClawConfig } from "../config/config.js"; +export type { LineConfig } from "../line/types.js"; +export { + DEFAULT_ACCOUNT_ID, + formatDocsLink, + normalizeAccountId, + setSetupChannelEnabled, + setTopLevelChannelDmPolicyWithAllowFrom, + splitSetupEntries, +} from "./setup.js"; +export type { ChannelSetupAdapter, ChannelSetupDmPolicy, ChannelSetupWizard } from "./setup.js"; +export { + listLineAccountIds, + resolveDefaultLineAccountId, + resolveLineAccount, +} from "../line/accounts.js"; diff --git a/src/plugin-sdk/line.ts b/src/plugin-sdk/line.ts index b6617199472..16a6c235ac3 100644 --- a/src/plugin-sdk/line.ts +++ b/src/plugin-sdk/line.ts @@ -32,8 +32,7 @@ export { resolveDefaultLineAccountId, resolveLineAccount, } from "../line/accounts.js"; -export { lineSetupAdapter } from "../../extensions/line/src/setup-core.js"; -export { lineSetupWizard } from "../../extensions/line/src/setup-surface.js"; +export { lineSetupAdapter, lineSetupWizard } from "../../extensions/line/setup-api.js"; export { LineConfigSchema } from "../line/config-schema.js"; export type { LineChannelData, LineConfig, ResolvedLineAccount } from "../line/types.js"; export { diff --git a/src/plugin-sdk/nostr.ts b/src/plugin-sdk/nostr.ts index a2997c5702c..4c8abc0f15a 100644 --- a/src/plugin-sdk/nostr.ts +++ b/src/plugin-sdk/nostr.ts @@ -19,4 +19,4 @@ export { } from "./status-helpers.js"; export { createFixedWindowRateLimiter } from "./webhook-memory-guards.js"; export { mapAllowFromEntries } from "./channel-config-helpers.js"; -export { nostrSetupAdapter, nostrSetupWizard } from "../../extensions/nostr/src/setup-surface.js"; +export { nostrSetupAdapter, nostrSetupWizard } from "../../extensions/nostr/setup-api.js"; diff --git a/src/plugin-sdk/slack-core.ts b/src/plugin-sdk/slack-core.ts index 8df7ad669a7..1eaa6eb02e7 100644 --- a/src/plugin-sdk/slack-core.ts +++ b/src/plugin-sdk/slack-core.ts @@ -1,4 +1,13 @@ export type { OpenClawConfig } from "../config/config.js"; export type { ChannelPlugin } from "./channel-plugin-common.js"; export { buildChannelConfigSchema, getChatChannelMeta } from "./channel-plugin-common.js"; +export { withNormalizedTimestamp } from "../agents/date-time.js"; +export { + createActionGate, + imageResultFromFile, + jsonResult, + readNumberParam, + readReactionParams, + readStringParam, +} from "../agents/tools/common.js"; export { SlackConfigSchema } from "../config/zod-schema.providers-core.js"; diff --git a/src/plugin-sdk/synology-chat.ts b/src/plugin-sdk/synology-chat.ts index f5fae73fbb2..1b10e475f67 100644 --- a/src/plugin-sdk/synology-chat.ts +++ b/src/plugin-sdk/synology-chat.ts @@ -20,4 +20,4 @@ export { createFixedWindowRateLimiter } from "./webhook-memory-guards.js"; export { synologyChatSetupAdapter, synologyChatSetupWizard, -} from "../../extensions/synology-chat/src/setup-surface.js"; +} from "../../extensions/synology-chat/setup-api.js"; diff --git a/src/plugin-sdk/telegram-core.ts b/src/plugin-sdk/telegram-core.ts index a020a333fd3..6745072c497 100644 --- a/src/plugin-sdk/telegram-core.ts +++ b/src/plugin-sdk/telegram-core.ts @@ -1,5 +1,15 @@ export type { OpenClawConfig } from "../config/config.js"; +export type { TelegramActionConfig } from "../config/types.js"; export type { ChannelPlugin } from "./channel-plugin-common.js"; export { buildChannelConfigSchema, getChatChannelMeta } from "./channel-plugin-common.js"; export { normalizeAccountId } from "../routing/session-key.js"; +export { + jsonResult, + readNumberParam, + readReactionParams, + readStringArrayParam, + readStringOrNumberParam, + readStringParam, +} from "../agents/tools/common.js"; export { TelegramConfigSchema } from "../config/zod-schema.providers-core.js"; +export { resolvePollMaxSelections } from "../polls.js"; diff --git a/src/plugin-sdk/tlon.ts b/src/plugin-sdk/tlon.ts index 291834b9648..1bcd9078292 100644 --- a/src/plugin-sdk/tlon.ts +++ b/src/plugin-sdk/tlon.ts @@ -27,5 +27,4 @@ export type { RuntimeEnv } from "../runtime.js"; export { formatDocsLink } from "../terminal/links.js"; export type { WizardPrompter } from "../wizard/prompts.js"; export { createLoggerBackedRuntime } from "./runtime.js"; -export { tlonSetupAdapter } from "../../extensions/tlon/src/setup-core.js"; -export { tlonSetupWizard } from "../../extensions/tlon/src/setup-surface.js"; +export { tlonSetupAdapter, tlonSetupWizard } from "../../extensions/tlon/setup-api.js"; diff --git a/src/plugin-sdk/whatsapp-core.ts b/src/plugin-sdk/whatsapp-core.ts index 036fda6a5a9..d2045f007d9 100644 --- a/src/plugin-sdk/whatsapp-core.ts +++ b/src/plugin-sdk/whatsapp-core.ts @@ -1,4 +1,5 @@ export type { ChannelPlugin } from "./channel-plugin-common.js"; +export type { OpenClawConfig } from "../config/config.js"; export { DEFAULT_ACCOUNT_ID, buildChannelConfigSchema, @@ -14,5 +15,13 @@ export { resolveWhatsAppGroupToolPolicy, } from "../channels/plugins/group-mentions.js"; export { resolveWhatsAppGroupIntroHint } from "../channels/plugins/whatsapp-shared.js"; +export { + ToolAuthorizationError, + createActionGate, + jsonResult, + readReactionParams, + readStringParam, +} from "../agents/tools/common.js"; export { WhatsAppConfigSchema } from "../config/zod-schema.providers-whatsapp.js"; export { normalizeE164 } from "../utils.js"; +export { resolveWhatsAppOutboundTarget } from "../whatsapp/resolve-outbound-target.js";