openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
211 lines (210 loc) • 11.7 kB
JavaScript
//#region src/plugins/api-facades.ts
/** Attaches nested facade namespaces to the flat plugin API implementation. */
function attachPluginApiFacades(api) {
api.session = {
state: { registerSessionExtension: (...args) => api.registerSessionExtension(...args) },
workflow: {
enqueueNextTurnInjection: (...args) => api.enqueueNextTurnInjection(...args),
registerSessionSchedulerJob: (...args) => api.registerSessionSchedulerJob(...args),
sendSessionAttachment: (...args) => api.sendSessionAttachment(...args),
scheduleSessionTurn: (...args) => api.scheduleSessionTurn(...args),
unscheduleSessionTurnsByTag: (...args) => api.unscheduleSessionTurnsByTag(...args)
},
controls: {
registerSessionAction: (...args) => api.registerSessionAction(...args),
registerControlUiDescriptor: (...args) => api.registerControlUiDescriptor(...args)
}
};
api.agent = { events: {
registerAgentEventSubscription: (...args) => api.registerAgentEventSubscription(...args),
emitAgentEvent: (...args) => api.emitAgentEvent(...args)
} };
api.runContext = {
setRunContext: (...args) => api.setRunContext(...args),
getRunContext: (...args) => api.getRunContext(...args),
clearRunContext: (...args) => api.clearRunContext(...args)
};
api.lifecycle = { registerRuntimeLifecycle: (...args) => api.registerRuntimeLifecycle(...args) };
return api;
}
//#endregion
//#region src/plugins/api-builder.ts
const noops = {
registerTool: () => {},
registerHook: () => {},
registerHttpRoute: () => {},
registerHostedMediaResolver: () => {},
registerWidgetPresenter: () => {},
registerMcpServerConnectionResolver: () => {},
registerChannel: () => {},
registerGatewayMethod: () => {},
registerSessionCatalog: () => {},
registerCli: () => {},
registerReload: () => {},
registerNodeHostCommand: () => {},
registerNodeInvokePolicy: () => {},
registerSecurityAuditCollector: () => {},
registerService: () => {},
registerGatewayDiscoveryService: () => {},
registerCliBackend: () => {},
registerTextTransforms: () => {},
registerConfigMigration: () => {},
registerMigrationProvider: () => {},
registerAutoEnableProbe: () => {},
registerProvider: () => {},
registerWorkerProvider: () => {},
registerModelCatalogProvider: () => {},
registerEmbeddingProvider: () => {},
registerSpeechProvider: () => {},
registerRealtimeTranscriptionProvider: () => {},
registerRealtimeVoiceProvider: () => {},
registerMediaUnderstandingProvider: () => {},
registerTranscriptSourceProvider: () => {},
registerImageGenerationProvider: () => {},
registerVideoGenerationProvider: () => {},
registerMusicGenerationProvider: () => {},
registerWebFetchProvider: () => {},
registerWebSearchProvider: () => {},
registerInteractiveHandler: () => {},
onConversationBindingResolved: () => {},
registerCommand: () => {},
registerContextEngine: () => {},
registerCompactionProvider: () => {},
registerAgentHarness: () => {},
registerCodexAppServerExtensionFactory: () => {},
registerAgentToolResultMiddleware: () => {},
registerSessionExtension: () => {},
enqueueNextTurnInjection: async (injection) => ({
enqueued: false,
id: "",
sessionKey: injection.sessionKey
}),
registerTrustedToolPolicy: () => {},
registerToolMetadata: () => {},
registerControlUiDescriptor: () => {},
registerBoardWidgetContentKind: () => {},
registerRuntimeLifecycle: () => {},
registerAgentEventSubscription: () => {},
emitAgentEvent: () => ({
emitted: false,
reason: "not wired"
}),
setRunContext: () => false,
getRunContext: () => void 0,
clearRunContext: () => {},
registerSessionSchedulerJob: () => void 0,
registerSessionAction: () => {},
sendSessionAttachment: async () => ({
ok: false,
error: "not wired"
}),
scheduleSessionTurn: async () => void 0,
unscheduleSessionTurnsByTag: async () => ({
removed: 0,
failed: 0
}),
registerDetachedTaskRuntime: () => {},
registerMemoryCapability: () => {},
registerMemoryPromptSupplement: () => {},
registerMemoryPromptPreparation: () => {},
registerMemoryCorpusSupplement: () => {},
on: () => {}
};
function createUnavailableRuntime(registrationMode, pluginId) {
const owner = pluginId ? `Plugin "${pluginId}"` : "Plugin";
const guidance = registrationMode === "cli-metadata" ? "Declare root commands in the manifest's cliCommands or defer runtime access out of register()." : "Defer runtime access out of register().";
return new Proxy(Object.create(null), { get(_target, property) {
if (typeof property === "symbol") return;
throw new Error(`${owner} runtime is intentionally unavailable during "${registrationMode}" registration. ${guidance}`);
} });
}
function buildPluginApi(params) {
const handlers = params.handlers ?? {};
const registerCli = handlers.registerCli ?? noops.registerCli;
return attachPluginApiFacades({
id: params.id,
name: params.name,
version: params.version,
description: params.description,
source: params.source,
rootDir: params.rootDir,
registrationMode: params.registrationMode,
config: params.config,
pluginConfig: params.pluginConfig,
runtime: params.runtime,
logger: params.logger,
registerTool: handlers.registerTool ?? noops.registerTool,
registerHook: handlers.registerHook ?? noops.registerHook,
registerHttpRoute: handlers.registerHttpRoute ?? noops.registerHttpRoute,
registerHostedMediaResolver: handlers.registerHostedMediaResolver ?? noops.registerHostedMediaResolver,
registerWidgetPresenter: handlers.registerWidgetPresenter ?? noops.registerWidgetPresenter,
registerMcpServerConnectionResolver: handlers.registerMcpServerConnectionResolver ?? noops.registerMcpServerConnectionResolver,
registerChannel: handlers.registerChannel ?? noops.registerChannel,
registerGatewayMethod: handlers.registerGatewayMethod ?? noops.registerGatewayMethod,
registerSessionCatalog: handlers.registerSessionCatalog ?? noops.registerSessionCatalog,
registerCli,
registerNodeCliFeature: (registrar, opts) => registerCli(registrar, {
...opts,
parentPath: ["nodes"]
}),
registerReload: handlers.registerReload ?? noops.registerReload,
registerNodeHostCommand: handlers.registerNodeHostCommand ?? noops.registerNodeHostCommand,
registerNodeInvokePolicy: handlers.registerNodeInvokePolicy ?? noops.registerNodeInvokePolicy,
registerSecurityAuditCollector: handlers.registerSecurityAuditCollector ?? noops.registerSecurityAuditCollector,
registerService: handlers.registerService ?? noops.registerService,
registerGatewayDiscoveryService: handlers.registerGatewayDiscoveryService ?? noops.registerGatewayDiscoveryService,
registerCliBackend: handlers.registerCliBackend ?? noops.registerCliBackend,
registerTextTransforms: handlers.registerTextTransforms ?? noops.registerTextTransforms,
registerConfigMigration: handlers.registerConfigMigration ?? noops.registerConfigMigration,
registerMigrationProvider: handlers.registerMigrationProvider ?? noops.registerMigrationProvider,
registerAutoEnableProbe: handlers.registerAutoEnableProbe ?? noops.registerAutoEnableProbe,
registerProvider: handlers.registerProvider ?? noops.registerProvider,
registerWorkerProvider: handlers.registerWorkerProvider ?? noops.registerWorkerProvider,
registerModelCatalogProvider: handlers.registerModelCatalogProvider ?? noops.registerModelCatalogProvider,
registerEmbeddingProvider: handlers.registerEmbeddingProvider ?? noops.registerEmbeddingProvider,
registerSpeechProvider: handlers.registerSpeechProvider ?? noops.registerSpeechProvider,
registerRealtimeTranscriptionProvider: handlers.registerRealtimeTranscriptionProvider ?? noops.registerRealtimeTranscriptionProvider,
registerRealtimeVoiceProvider: handlers.registerRealtimeVoiceProvider ?? noops.registerRealtimeVoiceProvider,
registerMediaUnderstandingProvider: handlers.registerMediaUnderstandingProvider ?? noops.registerMediaUnderstandingProvider,
registerTranscriptSourceProvider: handlers.registerTranscriptSourceProvider ?? noops.registerTranscriptSourceProvider,
registerImageGenerationProvider: handlers.registerImageGenerationProvider ?? noops.registerImageGenerationProvider,
registerVideoGenerationProvider: handlers.registerVideoGenerationProvider ?? noops.registerVideoGenerationProvider,
registerMusicGenerationProvider: handlers.registerMusicGenerationProvider ?? noops.registerMusicGenerationProvider,
registerWebFetchProvider: handlers.registerWebFetchProvider ?? noops.registerWebFetchProvider,
registerWebSearchProvider: handlers.registerWebSearchProvider ?? noops.registerWebSearchProvider,
registerInteractiveHandler: handlers.registerInteractiveHandler ?? noops.registerInteractiveHandler,
onConversationBindingResolved: handlers.onConversationBindingResolved ?? noops.onConversationBindingResolved,
registerCommand: handlers.registerCommand ?? noops.registerCommand,
registerContextEngine: handlers.registerContextEngine ?? noops.registerContextEngine,
registerCompactionProvider: handlers.registerCompactionProvider ?? noops.registerCompactionProvider,
registerAgentHarness: handlers.registerAgentHarness ?? noops.registerAgentHarness,
registerCodexAppServerExtensionFactory: handlers.registerCodexAppServerExtensionFactory ?? noops.registerCodexAppServerExtensionFactory,
registerAgentToolResultMiddleware: handlers.registerAgentToolResultMiddleware ?? noops.registerAgentToolResultMiddleware,
registerSessionExtension: handlers.registerSessionExtension ?? noops.registerSessionExtension,
enqueueNextTurnInjection: handlers.enqueueNextTurnInjection ?? noops.enqueueNextTurnInjection,
registerTrustedToolPolicy: handlers.registerTrustedToolPolicy ?? noops.registerTrustedToolPolicy,
registerToolMetadata: handlers.registerToolMetadata ?? noops.registerToolMetadata,
registerControlUiDescriptor: handlers.registerControlUiDescriptor ?? noops.registerControlUiDescriptor,
registerBoardWidgetContentKind: handlers.registerBoardWidgetContentKind ?? noops.registerBoardWidgetContentKind,
registerRuntimeLifecycle: handlers.registerRuntimeLifecycle ?? noops.registerRuntimeLifecycle,
registerAgentEventSubscription: handlers.registerAgentEventSubscription ?? noops.registerAgentEventSubscription,
emitAgentEvent: handlers.emitAgentEvent ?? noops.emitAgentEvent,
setRunContext: handlers.setRunContext ?? noops.setRunContext,
getRunContext: handlers.getRunContext ?? noops.getRunContext,
clearRunContext: handlers.clearRunContext ?? noops.clearRunContext,
registerSessionSchedulerJob: handlers.registerSessionSchedulerJob ?? noops.registerSessionSchedulerJob,
registerSessionAction: handlers.registerSessionAction ?? noops.registerSessionAction,
sendSessionAttachment: handlers.sendSessionAttachment ?? noops.sendSessionAttachment,
scheduleSessionTurn: handlers.scheduleSessionTurn ?? noops.scheduleSessionTurn,
unscheduleSessionTurnsByTag: handlers.unscheduleSessionTurnsByTag ?? noops.unscheduleSessionTurnsByTag,
registerDetachedTaskRuntime: handlers.registerDetachedTaskRuntime ?? noops.registerDetachedTaskRuntime,
registerMemoryCapability: handlers.registerMemoryCapability ?? noops.registerMemoryCapability,
registerMemoryPromptSupplement: handlers.registerMemoryPromptSupplement ?? noops.registerMemoryPromptSupplement,
registerMemoryPromptPreparation: handlers.registerMemoryPromptPreparation ?? noops.registerMemoryPromptPreparation,
registerMemoryCorpusSupplement: handlers.registerMemoryCorpusSupplement ?? noops.registerMemoryCorpusSupplement,
resolvePath: params.resolvePath,
on: handlers.on ?? noops.on
});
}
//#endregion
export { createUnavailableRuntime as n, attachPluginApiFacades as r, buildPluginApi as t };