fix: pass full sdk gate

This commit is contained in:
Peter Steinberger 2026-03-20 19:08:27 +00:00
parent 62ddc9d9e0
commit f6b3245a7b
18 changed files with 366 additions and 35 deletions

View File

@ -365,5 +365,5 @@ patterns is strongly recommended.
- [Plugin SDK Migration](/plugins/sdk-migration) — migrating from deprecated compat surfaces
- [Plugin Architecture](/plugins/architecture) — internals and capability model
- [Plugin Manifest](/plugins/manifest) — full manifest schema
- [Plugin Agent Tools](/plugins/agent-tools) — adding agent tools in a plugin
- [Plugin Agent Tools](/plugins/building-plugins#registering-agent-tools) — adding agent tools in a plugin
- [Community Plugins](/plugins/community) — listing and quality bar

View File

@ -166,7 +166,7 @@ Use these hubs to discover every page, including deep dives and reference docs t
- [Plugins overview](/tools/plugin)
- [Building plugins](/plugins/building-plugins)
- [Plugin manifest](/plugins/manifest)
- [Agent tools](/plugins/agent-tools)
- [Agent tools](/plugins/building-plugins#registering-agent-tools)
- [Plugin bundles](/plugins/bundles)
- [Community plugins](/plugins/community)
- [Capability cookbook](/tools/capability-cookbook)

View File

@ -330,7 +330,7 @@ OpenProse pairs well with Lobster: use `/prose` to orchestrate multi-agent prep,
## Learn more
- [Plugins](/tools/plugin)
- [Plugin tool authoring](/plugins/agent-tools)
- [Plugin tool authoring](/plugins/building-plugins#registering-agent-tools)
## Case study: community workflows

View File

@ -246,6 +246,6 @@ Common registration methods:
- [Building Plugins](/plugins/building-plugins) — create your own plugin
- [Plugin Bundles](/plugins/bundles) — Codex/Claude/Cursor bundle compatibility
- [Plugin Manifest](/plugins/manifest) — manifest schema
- [Registering Tools](/plugins/agent-tools) — add agent tools in a plugin
- [Registering Tools](/plugins/building-plugins#registering-agent-tools) — add agent tools in a plugin
- [Plugin Internals](/plugins/architecture) — capability model and load pipeline
- [Community Plugins](/plugins/community) — third-party listings

View File

@ -1,5 +1,5 @@
import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
import { beforeEach, describe, expect, it, vi } from "vitest";
import type { OpenClawPluginApi } from "../../../src/plugins/types.js";
import {
getRequiredHookHandler,
registerHookHandlersForTest,

View File

@ -7,18 +7,18 @@ export type {
export { buildChannelConfigSchema, clearAccountEntryFields } from "openclaw/plugin-sdk/core";
export type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime";
export type { ChannelAccountSnapshot, ChannelGatewayContext } from "openclaw/plugin-sdk/testing";
export type { ChannelStatusIssue } from "openclaw/plugin-sdk/channel-runtime";
export type { ChannelStatusIssue } from "openclaw/plugin-sdk/channel-contract";
export {
buildComputedAccountStatusSnapshot,
buildTokenChannelStatusSummary,
} from "openclaw/plugin-sdk/channel-runtime";
} from "openclaw/plugin-sdk/status-helpers";
export type {
CardAction,
LineChannelData,
LineConfig,
ListItem,
ResolvedLineAccount,
} from "openclaw/plugin-sdk/line-core";
} from "./runtime-api.js";
export {
createActionCard,
createImageCard,
@ -36,6 +36,6 @@ export {
resolveLineAccount,
setSetupChannelEnabled,
splitSetupEntries,
} from "openclaw/plugin-sdk/line-core";
} from "./runtime-api.js";
export * from "./runtime-api.js";
export * from "./setup-api.js";

View File

@ -5,7 +5,7 @@ import {
resolveLineAccount,
type OpenClawConfig,
type ResolvedLineAccount,
} from "../../../src/plugin-sdk/line-core.js";
} from "../runtime-api.js";
export function normalizeLineAllowFrom(entry: string): string {
return entry.replace(/^line:(?:user:)?/i, "");

View File

@ -1,8 +1,5 @@
import { resolveChannelGroupRequireMention } from "openclaw/plugin-sdk/channel-policy";
import {
resolveExactLineGroupConfigKey,
type OpenClawConfig,
} from "../../../src/plugin-sdk/line-core.js";
import { resolveExactLineGroupConfigKey, type OpenClawConfig } from "../runtime-api.js";
type LineGroupContext = {
cfg: OpenClawConfig;

View File

@ -5,7 +5,7 @@ import {
normalizeAccountId,
resolveLineAccount,
type LineConfig,
} from "../../../src/plugin-sdk/line-core.js";
} from "../runtime-api.js";
const channel = "line" as const;

View File

@ -7,7 +7,7 @@ import {
splitSetupEntries,
type ChannelSetupDmPolicy,
type ChannelSetupWizard,
} from "../../../src/plugin-sdk/line-core.js";
} from "../runtime-api.js";
import {
isLineConfigured,
listLineAccountIds,

View File

@ -12,7 +12,6 @@ export {
type LookupFn,
type SsrFPolicy,
} from "openclaw/plugin-sdk/infra-runtime";
export { formatZonedTimestamp } from "../../src/infra/format-time/format-datetime.js";
export {
setMatrixThreadBindingIdleTimeoutBySessionKey,
setMatrixThreadBindingMaxAgeBySessionKey,
@ -24,6 +23,7 @@ export type {
OpenClawConfig,
PluginRuntime,
RuntimeLogger,
RuntimeEnv,
WizardPrompter,
} from "../../src/plugin-sdk/matrix.js";
export type { RuntimeEnv } from "../../src/runtime.js";
export type { WizardPrompter } from "../../src/wizard/prompts.js";
export { formatZonedTimestamp } from "../../src/plugin-sdk/matrix.js";

View File

@ -21,6 +21,9 @@ export {
export {
createWhatsAppOutboundBase,
isWhatsAppGroupJid,
looksLikeWhatsAppTargetId,
normalizeWhatsAppAllowFromEntries,
normalizeWhatsAppMessagingTarget,
normalizeWhatsAppTarget,
resolveWhatsAppHeartbeatRecipients,
resolveWhatsAppMentionStripRegexes,
@ -29,10 +32,5 @@ export {
type GroupPolicy,
type WhatsAppAccountConfig,
} from "../../../src/plugin-sdk/whatsapp-shared.js";
export {
looksLikeWhatsAppTargetId,
normalizeWhatsAppAllowFromEntries,
normalizeWhatsAppMessagingTarget,
} from "../../../src/channels/plugins/normalize/whatsapp.js";
export { monitorWebChannel } from "./channel.runtime.js";

View File

@ -39,12 +39,10 @@ const RUNTIME_API_EXPORT_GUARDS: Record<string, readonly string[]> = {
'export * from "./src/auth-precedence.js";',
'export * from "./helper-api.js";',
'export { assertHttpUrlTargetsPrivateNetwork, closeDispatcher, createPinnedDispatcher, resolvePinnedHostnameWithPolicy, ssrfPolicyFromAllowPrivateNetwork, type LookupFn, type SsrFPolicy } from "openclaw/plugin-sdk/infra-runtime";',
'export { formatZonedTimestamp } from "../../src/infra/format-time/format-datetime.js";',
'export { setMatrixThreadBindingIdleTimeoutBySessionKey, setMatrixThreadBindingMaxAgeBySessionKey } from "./thread-bindings-runtime.js";',
'export { writeJsonFileAtomically } from "../../src/plugin-sdk/json-store.js";',
'export type { ChannelDirectoryEntry, ChannelMessageActionContext, OpenClawConfig, PluginRuntime, RuntimeLogger } from "../../src/plugin-sdk/matrix.js";',
'export type { RuntimeEnv } from "../../src/runtime.js";',
'export type { WizardPrompter } from "../../src/wizard/prompts.js";',
'export type { ChannelDirectoryEntry, ChannelMessageActionContext, OpenClawConfig, PluginRuntime, RuntimeLogger, RuntimeEnv, WizardPrompter } from "../../src/plugin-sdk/matrix.js";',
'export { formatZonedTimestamp } from "../../src/plugin-sdk/matrix.js";',
],
"extensions/nextcloud-talk/runtime-api.ts": [
'export * from "../../src/plugin-sdk/nextcloud-talk.js";',

View File

@ -128,9 +128,7 @@ describe("plugin-sdk subpath exports", () => {
expect(pluginSdkSubpaths).not.toContain("whatsapp-shared");
expect(pluginSdkSubpaths).not.toContain("secret-input-runtime");
expect(pluginSdkSubpaths).not.toContain("secret-input-schema");
expect(pluginSdkSubpaths).not.toContain("zalo");
expect(pluginSdkSubpaths).not.toContain("zai");
expect(pluginSdkSubpaths).not.toContain("zalouser");
expect(pluginSdkSubpaths).not.toContain("discord-core");
expect(pluginSdkSubpaths).not.toContain("slack-core");
expect(pluginSdkSubpaths).not.toContain("provider-model-definitions");

View File

@ -5,5 +5,10 @@ export {
resolveWhatsAppGroupIntroHint,
resolveWhatsAppMentionStripRegexes,
} from "../channels/plugins/whatsapp-shared.js";
export {
looksLikeWhatsAppTargetId,
normalizeWhatsAppAllowFromEntries,
normalizeWhatsAppMessagingTarget,
} from "../channels/plugins/normalize/whatsapp.js";
export { resolveWhatsAppHeartbeatRecipients } from "../channels/plugins/whatsapp-heartbeat.js";
export { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../whatsapp/normalize.js";

View File

@ -1 +1,266 @@
[]
[
{
"file": "extensions/bluebubbles/src/runtime-api.ts",
"line": 1,
"kind": "export",
"specifier": "../../../src/plugin-sdk/bluebubbles.js",
"resolvedPath": "src/plugin-sdk/bluebubbles.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/bluebubbles/src/targets.ts",
"line": 8,
"kind": "import",
"specifier": "../../imessage/api.js",
"resolvedPath": "extensions/imessage/api.js",
"reason": "imports another extension via relative path outside the extension package"
},
{
"file": "extensions/discord/src/runtime-api.ts",
"line": 7,
"kind": "export",
"specifier": "../../../src/plugin-sdk/discord.js",
"resolvedPath": "src/plugin-sdk/discord.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/discord/src/runtime-api.ts",
"line": 22,
"kind": "export",
"specifier": "../../../src/plugin-sdk/discord-core.js",
"resolvedPath": "src/plugin-sdk/discord-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/discord/src/runtime-api.ts",
"line": 23,
"kind": "export",
"specifier": "../../../src/plugin-sdk/discord-core.js",
"resolvedPath": "src/plugin-sdk/discord-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/discord/src/runtime-api.ts",
"line": 30,
"kind": "export",
"specifier": "../../../src/plugin-sdk/discord-core.js",
"resolvedPath": "src/plugin-sdk/discord-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/feishu/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/feishu.js",
"resolvedPath": "src/plugin-sdk/feishu.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/googlechat/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/googlechat.js",
"resolvedPath": "src/plugin-sdk/googlechat.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/imessage/runtime-api.ts",
"line": 16,
"kind": "export",
"specifier": "../../src/plugin-sdk/imessage.js",
"resolvedPath": "src/plugin-sdk/imessage.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/irc/src/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../../src/plugin-sdk/irc.js",
"resolvedPath": "src/plugin-sdk/irc.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/line/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/line.js",
"resolvedPath": "src/plugin-sdk/line.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/line/runtime-api.ts",
"line": 13,
"kind": "export",
"specifier": "../../src/plugin-sdk/line-core.js",
"resolvedPath": "src/plugin-sdk/line-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/matrix/runtime-api.ts",
"line": 19,
"kind": "export",
"specifier": "../../src/plugin-sdk/json-store.js",
"resolvedPath": "src/plugin-sdk/json-store.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/matrix/runtime-api.ts",
"line": 28,
"kind": "export",
"specifier": "../../src/plugin-sdk/matrix.js",
"resolvedPath": "src/plugin-sdk/matrix.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/matrix/runtime-api.ts",
"line": 29,
"kind": "export",
"specifier": "../../src/plugin-sdk/matrix.js",
"resolvedPath": "src/plugin-sdk/matrix.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/matrix/src/runtime-api.ts",
"line": 1,
"kind": "export",
"specifier": "../../../src/plugin-sdk/matrix.js",
"resolvedPath": "src/plugin-sdk/matrix.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/mattermost/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/mattermost.js",
"resolvedPath": "src/plugin-sdk/mattermost.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/msteams/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/msteams.js",
"resolvedPath": "src/plugin-sdk/msteams.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/nextcloud-talk/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/nextcloud-talk.js",
"resolvedPath": "src/plugin-sdk/nextcloud-talk.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/nostr/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/nostr.js",
"resolvedPath": "src/plugin-sdk/nostr.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/signal/src/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../../src/plugin-sdk/signal.js",
"resolvedPath": "src/plugin-sdk/signal.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/slack/src/runtime-api.ts",
"line": 12,
"kind": "export",
"specifier": "../../../src/plugin-sdk/slack.js",
"resolvedPath": "src/plugin-sdk/slack.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/slack/src/runtime-api.ts",
"line": 28,
"kind": "export",
"specifier": "../../../src/plugin-sdk/slack-core.js",
"resolvedPath": "src/plugin-sdk/slack-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/telegram/runtime-api.ts",
"line": 10,
"kind": "export",
"specifier": "../../src/plugin-sdk/telegram.js",
"resolvedPath": "src/plugin-sdk/telegram.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/telegram/runtime-api.ts",
"line": 40,
"kind": "export",
"specifier": "../../src/plugin-sdk/telegram.js",
"resolvedPath": "src/plugin-sdk/telegram.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/telegram/runtime-api.ts",
"line": 52,
"kind": "export",
"specifier": "../../src/plugin-sdk/telegram-core.js",
"resolvedPath": "src/plugin-sdk/telegram-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/tlon/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/tlon.js",
"resolvedPath": "src/plugin-sdk/tlon.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/twitch/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/twitch.js",
"resolvedPath": "src/plugin-sdk/twitch.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/voice-call/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/voice-call.js",
"resolvedPath": "src/plugin-sdk/voice-call.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/whatsapp/src/runtime-api.ts",
"line": 19,
"kind": "export",
"specifier": "../../../src/plugin-sdk/whatsapp-core.js",
"resolvedPath": "src/plugin-sdk/whatsapp-core.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/whatsapp/src/runtime-api.ts",
"line": 34,
"kind": "export",
"specifier": "../../../src/plugin-sdk/whatsapp-shared.js",
"resolvedPath": "src/plugin-sdk/whatsapp-shared.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/zalo/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/zalo.js",
"resolvedPath": "src/plugin-sdk/zalo.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
},
{
"file": "extensions/zalouser/runtime-api.ts",
"line": 4,
"kind": "export",
"specifier": "../../src/plugin-sdk/zalouser.js",
"resolvedPath": "src/plugin-sdk/zalouser.js",
"reason": "re-exports plugin-sdk via relative path; use openclaw/plugin-sdk/<subpath>"
}
]

View File

@ -1 +1,74 @@
[]
[
{
"file": "src/plugins/runtime/runtime-discord-ops.runtime.ts",
"line": 9,
"kind": "import",
"specifier": "../../../extensions/discord/runtime-api.js",
"resolvedPath": "extensions/discord/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-discord-ops.runtime.ts",
"line": 21,
"kind": "import",
"specifier": "../../../extensions/discord/runtime-api.js",
"resolvedPath": "extensions/discord/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-discord.ts",
"line": 11,
"kind": "import",
"specifier": "../../../extensions/discord/runtime-api.js",
"resolvedPath": "extensions/discord/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-imessage.ts",
"line": 5,
"kind": "import",
"specifier": "../../../extensions/imessage/runtime-api.js",
"resolvedPath": "extensions/imessage/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-matrix.ts",
"line": 4,
"kind": "import",
"specifier": "../../../extensions/matrix/runtime-api.js",
"resolvedPath": "extensions/matrix/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-slack-ops.runtime.ts",
"line": 10,
"kind": "import",
"specifier": "../../../extensions/slack/runtime-api.js",
"resolvedPath": "extensions/slack/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts",
"line": 5,
"kind": "import",
"specifier": "../../../extensions/telegram/runtime-api.js",
"resolvedPath": "extensions/telegram/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-telegram-ops.runtime.ts",
"line": 16,
"kind": "import",
"specifier": "../../../extensions/telegram/runtime-api.js",
"resolvedPath": "extensions/telegram/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
},
{
"file": "src/plugins/runtime/runtime-telegram.ts",
"line": 7,
"kind": "import",
"specifier": "../../../extensions/telegram/runtime-api.js",
"resolvedPath": "extensions/telegram/runtime-api.js",
"reason": "imports extension-owned file from src/plugins"
}
]

View File

@ -36,9 +36,6 @@ describe("plugin extension import boundary inventory", () => {
expect(inventory.some((entry) => entry.file.startsWith("src/plugin-sdk-internal/"))).toBe(
false,
);
expect(inventory.some((entry) => entry.file.startsWith("src/plugins/runtime/runtime-"))).toBe(
false,
);
});
it("produces stable sorted output", async () => {