fix(plugins): route runtime imports through sdk facades

This commit is contained in:
Peter Steinberger
2026-04-03 11:04:42 +01:00
parent ddd1c77b49
commit 122e6f0f79
8 changed files with 292 additions and 9 deletions

View File

@@ -0,0 +1,185 @@
import {
createLazyFacadeObjectValue,
loadBundledPluginPublicSurfaceModuleSync,
} from "./facade-runtime.js";
type DiscordRuntimeModule = typeof import("../../extensions/discord/runtime-api.js");
type DiscordRuntimeSurface = Pick<
DiscordRuntimeModule,
| "auditDiscordChannelPermissions"
| "createThreadDiscord"
| "deleteMessageDiscord"
| "discordMessageActions"
| "editChannelDiscord"
| "editMessageDiscord"
| "getThreadBindingManager"
| "listDiscordDirectoryGroupsLive"
| "listDiscordDirectoryPeersLive"
| "monitorDiscordProvider"
| "pinMessageDiscord"
| "probeDiscord"
| "resolveDiscordChannelAllowlist"
| "resolveDiscordUserAllowlist"
| "resolveThreadBindingIdleTimeoutMs"
| "resolveThreadBindingInactivityExpiresAt"
| "resolveThreadBindingMaxAgeExpiresAt"
| "resolveThreadBindingMaxAgeMs"
| "sendDiscordComponentMessage"
| "sendMessageDiscord"
| "sendPollDiscord"
| "sendTypingDiscord"
| "setThreadBindingIdleTimeoutBySessionKey"
| "setThreadBindingMaxAgeBySessionKey"
| "unbindThreadBindingsBySessionKey"
| "unpinMessageDiscord"
>;
function loadDiscordRuntimeSurface(): DiscordRuntimeSurface {
return loadBundledPluginPublicSurfaceModuleSync<DiscordRuntimeSurface>({
dirName: "discord",
artifactBasename: "runtime-api.js",
});
}
export const discordMessageActions: DiscordRuntimeModule["discordMessageActions"] =
createLazyFacadeObjectValue(() => loadDiscordRuntimeSurface().discordMessageActions);
export const auditDiscordChannelPermissions: DiscordRuntimeModule["auditDiscordChannelPermissions"] =
((...args) =>
loadDiscordRuntimeSurface().auditDiscordChannelPermissions(
...args,
)) as DiscordRuntimeModule["auditDiscordChannelPermissions"];
export const createThreadDiscord: DiscordRuntimeModule["createThreadDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().createThreadDiscord(
...args,
)) as DiscordRuntimeModule["createThreadDiscord"];
export const deleteMessageDiscord: DiscordRuntimeModule["deleteMessageDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().deleteMessageDiscord(
...args,
)) as DiscordRuntimeModule["deleteMessageDiscord"];
export const editChannelDiscord: DiscordRuntimeModule["editChannelDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().editChannelDiscord(
...args,
)) as DiscordRuntimeModule["editChannelDiscord"];
export const editMessageDiscord: DiscordRuntimeModule["editMessageDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().editMessageDiscord(
...args,
)) as DiscordRuntimeModule["editMessageDiscord"];
export const getThreadBindingManager: DiscordRuntimeModule["getThreadBindingManager"] = ((
...args
) =>
loadDiscordRuntimeSurface().getThreadBindingManager(
...args,
)) as DiscordRuntimeModule["getThreadBindingManager"];
export const listDiscordDirectoryGroupsLive: DiscordRuntimeModule["listDiscordDirectoryGroupsLive"] =
((...args) =>
loadDiscordRuntimeSurface().listDiscordDirectoryGroupsLive(
...args,
)) as DiscordRuntimeModule["listDiscordDirectoryGroupsLive"];
export const listDiscordDirectoryPeersLive: DiscordRuntimeModule["listDiscordDirectoryPeersLive"] =
((...args) =>
loadDiscordRuntimeSurface().listDiscordDirectoryPeersLive(
...args,
)) as DiscordRuntimeModule["listDiscordDirectoryPeersLive"];
export const monitorDiscordProvider: DiscordRuntimeModule["monitorDiscordProvider"] = ((...args) =>
loadDiscordRuntimeSurface().monitorDiscordProvider(
...args,
)) as DiscordRuntimeModule["monitorDiscordProvider"];
export const pinMessageDiscord: DiscordRuntimeModule["pinMessageDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().pinMessageDiscord(
...args,
)) as DiscordRuntimeModule["pinMessageDiscord"];
export const probeDiscord: DiscordRuntimeModule["probeDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().probeDiscord(...args)) as DiscordRuntimeModule["probeDiscord"];
export const resolveDiscordChannelAllowlist: DiscordRuntimeModule["resolveDiscordChannelAllowlist"] =
((...args) =>
loadDiscordRuntimeSurface().resolveDiscordChannelAllowlist(
...args,
)) as DiscordRuntimeModule["resolveDiscordChannelAllowlist"];
export const resolveDiscordUserAllowlist: DiscordRuntimeModule["resolveDiscordUserAllowlist"] = ((
...args
) =>
loadDiscordRuntimeSurface().resolveDiscordUserAllowlist(
...args,
)) as DiscordRuntimeModule["resolveDiscordUserAllowlist"];
export const resolveThreadBindingIdleTimeoutMs: DiscordRuntimeModule["resolveThreadBindingIdleTimeoutMs"] =
((...args) =>
loadDiscordRuntimeSurface().resolveThreadBindingIdleTimeoutMs(
...args,
)) as DiscordRuntimeModule["resolveThreadBindingIdleTimeoutMs"];
export const resolveThreadBindingInactivityExpiresAt: DiscordRuntimeModule["resolveThreadBindingInactivityExpiresAt"] =
((...args) =>
loadDiscordRuntimeSurface().resolveThreadBindingInactivityExpiresAt(
...args,
)) as DiscordRuntimeModule["resolveThreadBindingInactivityExpiresAt"];
export const resolveThreadBindingMaxAgeExpiresAt: DiscordRuntimeModule["resolveThreadBindingMaxAgeExpiresAt"] =
((...args) =>
loadDiscordRuntimeSurface().resolveThreadBindingMaxAgeExpiresAt(
...args,
)) as DiscordRuntimeModule["resolveThreadBindingMaxAgeExpiresAt"];
export const resolveThreadBindingMaxAgeMs: DiscordRuntimeModule["resolveThreadBindingMaxAgeMs"] = ((
...args
) =>
loadDiscordRuntimeSurface().resolveThreadBindingMaxAgeMs(
...args,
)) as DiscordRuntimeModule["resolveThreadBindingMaxAgeMs"];
export const sendDiscordComponentMessage: DiscordRuntimeModule["sendDiscordComponentMessage"] = ((
...args
) =>
loadDiscordRuntimeSurface().sendDiscordComponentMessage(
...args,
)) as DiscordRuntimeModule["sendDiscordComponentMessage"];
export const sendMessageDiscord: DiscordRuntimeModule["sendMessageDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().sendMessageDiscord(
...args,
)) as DiscordRuntimeModule["sendMessageDiscord"];
export const sendPollDiscord: DiscordRuntimeModule["sendPollDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().sendPollDiscord(...args)) as DiscordRuntimeModule["sendPollDiscord"];
export const sendTypingDiscord: DiscordRuntimeModule["sendTypingDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().sendTypingDiscord(
...args,
)) as DiscordRuntimeModule["sendTypingDiscord"];
export const setThreadBindingIdleTimeoutBySessionKey: DiscordRuntimeModule["setThreadBindingIdleTimeoutBySessionKey"] =
((...args) =>
loadDiscordRuntimeSurface().setThreadBindingIdleTimeoutBySessionKey(
...args,
)) as DiscordRuntimeModule["setThreadBindingIdleTimeoutBySessionKey"];
export const setThreadBindingMaxAgeBySessionKey: DiscordRuntimeModule["setThreadBindingMaxAgeBySessionKey"] =
((...args) =>
loadDiscordRuntimeSurface().setThreadBindingMaxAgeBySessionKey(
...args,
)) as DiscordRuntimeModule["setThreadBindingMaxAgeBySessionKey"];
export const unbindThreadBindingsBySessionKey: DiscordRuntimeModule["unbindThreadBindingsBySessionKey"] =
((...args) =>
loadDiscordRuntimeSurface().unbindThreadBindingsBySessionKey(
...args,
)) as DiscordRuntimeModule["unbindThreadBindingsBySessionKey"];
export const unpinMessageDiscord: DiscordRuntimeModule["unpinMessageDiscord"] = ((...args) =>
loadDiscordRuntimeSurface().unpinMessageDiscord(
...args,
)) as DiscordRuntimeModule["unpinMessageDiscord"];

View File

@@ -0,0 +1,34 @@
import {
createLazyFacadeObjectValue,
loadBundledPluginPublicSurfaceModuleSync,
} from "./facade-runtime.js";
type SignalRuntimeModule = typeof import("../../extensions/signal/runtime-api.js");
type SignalRuntimeSurface = Pick<
SignalRuntimeModule,
"monitorSignalProvider" | "probeSignal" | "sendMessageSignal" | "signalMessageActions"
>;
function loadSignalRuntimeSurface(): SignalRuntimeSurface {
return loadBundledPluginPublicSurfaceModuleSync<SignalRuntimeSurface>({
dirName: "signal",
artifactBasename: "runtime-api.js",
});
}
export const signalMessageActions: SignalRuntimeModule["signalMessageActions"] =
createLazyFacadeObjectValue(() => loadSignalRuntimeSurface().signalMessageActions);
export const monitorSignalProvider: SignalRuntimeModule["monitorSignalProvider"] = ((...args) =>
loadSignalRuntimeSurface().monitorSignalProvider(
...args,
)) as SignalRuntimeModule["monitorSignalProvider"];
export const probeSignal: SignalRuntimeModule["probeSignal"] = ((...args) =>
loadSignalRuntimeSurface().probeSignal(...args)) as SignalRuntimeModule["probeSignal"];
export const sendMessageSignal: SignalRuntimeModule["sendMessageSignal"] = ((...args) =>
loadSignalRuntimeSurface().sendMessageSignal(
...args,
)) as SignalRuntimeModule["sendMessageSignal"];

View File

@@ -0,0 +1,64 @@
import { loadBundledPluginPublicSurfaceModuleSync } from "./facade-runtime.js";
type SlackRuntimeModule = typeof import("../../extensions/slack/runtime-api.js");
type SlackRuntimeSurface = Pick<
SlackRuntimeModule,
| "handleSlackAction"
| "listSlackDirectoryGroupsLive"
| "listSlackDirectoryPeersLive"
| "monitorSlackProvider"
| "probeSlack"
| "resolveSlackChannelAllowlist"
| "resolveSlackUserAllowlist"
| "sendMessageSlack"
>;
function loadSlackRuntimeSurface(): SlackRuntimeSurface {
return loadBundledPluginPublicSurfaceModuleSync<SlackRuntimeSurface>({
dirName: "slack",
artifactBasename: "runtime-api.js",
});
}
export const handleSlackAction: SlackRuntimeModule["handleSlackAction"] = ((...args) =>
loadSlackRuntimeSurface().handleSlackAction(...args)) as SlackRuntimeModule["handleSlackAction"];
export const listSlackDirectoryGroupsLive: SlackRuntimeModule["listSlackDirectoryGroupsLive"] = ((
...args
) =>
loadSlackRuntimeSurface().listSlackDirectoryGroupsLive(
...args,
)) as SlackRuntimeModule["listSlackDirectoryGroupsLive"];
export const listSlackDirectoryPeersLive: SlackRuntimeModule["listSlackDirectoryPeersLive"] = ((
...args
) =>
loadSlackRuntimeSurface().listSlackDirectoryPeersLive(
...args,
)) as SlackRuntimeModule["listSlackDirectoryPeersLive"];
export const monitorSlackProvider: SlackRuntimeModule["monitorSlackProvider"] = ((...args) =>
loadSlackRuntimeSurface().monitorSlackProvider(
...args,
)) as SlackRuntimeModule["monitorSlackProvider"];
export const probeSlack: SlackRuntimeModule["probeSlack"] = ((...args) =>
loadSlackRuntimeSurface().probeSlack(...args)) as SlackRuntimeModule["probeSlack"];
export const resolveSlackChannelAllowlist: SlackRuntimeModule["resolveSlackChannelAllowlist"] = ((
...args
) =>
loadSlackRuntimeSurface().resolveSlackChannelAllowlist(
...args,
)) as SlackRuntimeModule["resolveSlackChannelAllowlist"];
export const resolveSlackUserAllowlist: SlackRuntimeModule["resolveSlackUserAllowlist"] = ((
...args
) =>
loadSlackRuntimeSurface().resolveSlackUserAllowlist(
...args,
)) as SlackRuntimeModule["resolveSlackUserAllowlist"];
export const sendMessageSlack: SlackRuntimeModule["sendMessageSlack"] = ((...args) =>
loadSlackRuntimeSurface().sendMessageSlack(...args)) as SlackRuntimeModule["sendMessageSlack"];

View File

@@ -1,7 +1,3 @@
import {
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
} from "../../../extensions/discord/runtime-api.js";
import { resolveEffectiveMessagesConfig, resolveHumanDelayConfig } from "../../agents/identity.js";
import {
chunkByNewline,
@@ -65,6 +61,10 @@ import {
readChannelAllowFromStore,
upsertChannelPairingRequest,
} from "../../pairing/pairing-store.js";
import {
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
} from "../../plugin-sdk/discord-runtime-surface.js";
import { buildAgentSessionKey, resolveAgentRoute } from "../../routing/resolve-route.js";
import { defineCachedValue } from "./runtime-cache.js";
import { createRuntimeDiscord } from "./runtime-discord.js";

View File

@@ -16,7 +16,7 @@ import {
sendPollDiscord as sendPollDiscordImpl,
sendTypingDiscord as sendTypingDiscordImpl,
unpinMessageDiscord as unpinMessageDiscordImpl,
} from "../../../extensions/discord/runtime-api.js";
} from "../../plugin-sdk/discord-runtime-surface.js";
import type { PluginRuntimeChannel } from "./types-channel.js";
type RuntimeDiscordOps = Pick<

View File

@@ -1,5 +1,5 @@
import { discordMessageActions } from "../../../extensions/discord/runtime-api.js";
import {
discordMessageActions,
getThreadBindingManager,
resolveThreadBindingIdleTimeoutMs,
resolveThreadBindingInactivityExpiresAt,
@@ -8,7 +8,7 @@ import {
setThreadBindingIdleTimeoutBySessionKey,
setThreadBindingMaxAgeBySessionKey,
unbindThreadBindingsBySessionKey,
} from "../../../extensions/discord/runtime-api.js";
} from "../../plugin-sdk/discord-runtime-surface.js";
import {
createLazyRuntimeMethodBinder,
createLazyRuntimeSurface,

View File

@@ -3,7 +3,7 @@ import {
probeSignal,
signalMessageActions,
sendMessageSignal,
} from "../../../extensions/signal/runtime-api.js";
} from "../../plugin-sdk/signal-runtime-surface.js";
import type { PluginRuntimeChannel } from "./types-channel.js";
export function createRuntimeSignal(): PluginRuntimeChannel["signal"] {

View File

@@ -7,7 +7,7 @@ import {
resolveSlackUserAllowlist as resolveSlackUserAllowlistImpl,
sendMessageSlack as sendMessageSlackImpl,
handleSlackAction as handleSlackActionImpl,
} from "../../../extensions/slack/runtime-api.js";
} from "../../plugin-sdk/slack-runtime-surface.js";
import type { PluginRuntimeChannel } from "./types-channel.js";
type RuntimeSlackOps = Pick<