Files
openclaw/src/plugins/registry-types.ts
T
Peter Steinberger e4d1b7e0d3 refactor(plugins): move plugin contributions into the registry bundle (#117372)
* refactor(plugins): move plugin contributions into the registry bundle

* fix(plugins): guard embedding owner union and drop unused test-util imports

* fix(plugins): break registry facade import cycles

* fix(plugins): remove obsolete registry snapshot seams

* test(gateway): preserve plugin runtime mock exports

* test(auto-reply): install builder registry in diagnostics fixture

* test(plugins): activate registry-backed capability fixtures
2026-08-01 06:57:01 -07:00

594 lines
21 KiB
TypeScript

/** Shared registration types that make up the in-memory plugin registry. */
import type { AgentHarness } from "../agents/harness/types.js";
import type { GatewayMethodDescriptor } from "../gateway/methods/descriptor.js";
import type { GatewayRequestHandlers } from "../gateway/server-methods/types.js";
import type { InternalHookHandler } from "../hooks/internal-hook-types.js";
import type { HookEntry } from "../hooks/types.js";
import type { JsonSchemaObject } from "../shared/json-schema.types.js";
import type { DetachedTaskLifecycleRuntimeRegistration } from "../tasks/detached-task-runtime-contract.js";
import type {
AgentToolResultMiddleware,
AgentToolResultMiddlewareRuntime,
AgentToolResultMiddlewareScope,
} from "./agent-tool-result-middleware-types.js";
import type { CodexAppServerExtensionFactory } from "./codex-app-server-extension-types.js";
import type { PluginCompatCode } from "./compat/registry.js";
import type { PluginActivationSource } from "./config-state.js";
import type { EmbeddingProviderAdapter } from "./embedding-provider-types.js";
import type {
PluginAgentEventSubscriptionRegistration,
PluginControlUiDescriptor,
PluginRuntimeLifecycleRegistration,
PluginSessionActionRegistration,
PluginSessionSchedulerJobRegistration,
PluginSessionExtensionRegistration,
PluginToolMetadataRegistration,
PluginTrustedToolPolicyRegistration,
} from "./host-hooks.js";
import type { PluginManifestRecord } from "./manifest-registry.js";
import type {
PluginBundleFormat,
PluginConfigUiHint,
PluginDiagnostic,
PluginFormat,
} from "./manifest-types.js";
import type {
PluginManifestContracts,
PluginManifestDashboard,
PluginManifestDashboardActionVerb,
PluginManifestDashboardDataBinding,
PluginManifestMcpServer,
} from "./manifest.js";
import type { PluginKind } from "./plugin-kind.types.js";
import type {
ContextEngineRegistration,
MemoryCorpusSupplementRegistration,
MemoryEmbeddingProviderAdapter,
MemoryPluginCapabilityRegistration,
MemoryPromptPreparationRegistration,
MemoryPromptSupplementRegistration,
RegisteredCompactionProvider,
ResolvedPluginRuntimeArtifact,
SessionDiscussionProvider,
} from "./registry-contribution-types.js";
import type { PluginRuntime } from "./runtime/types.js";
import type { SessionCatalogProvider } from "./session-catalog.js";
import type { PluginDependencyStatus } from "./status-dependencies-core.js";
import type {
OpenClawPluginHttpRouteAuth,
OpenClawPluginHttpRouteUpgradeHandler,
} from "./types.js";
import type { PluginMcpServerConnectionResolverRegistration } from "./types.mcp-connection.js";
type ChannelPlugin = import("../channels/plugins/types.plugin.js").ChannelPlugin;
type CliBackendPlugin = import("./types.js").CliBackendPlugin;
type ImageGenerationProviderPlugin = import("./types.js").ImageGenerationProviderPlugin;
type MediaUnderstandingProviderPlugin = import("./types.js").MediaUnderstandingProviderPlugin;
type TranscriptSourceProvider = import("./types.js").TranscriptSourceProvider;
type MusicGenerationProviderPlugin = import("./types.js").MusicGenerationProviderPlugin;
type OpenClawPluginCliRootCommandDescriptor =
import("./types.js").OpenClawPluginCliRootCommandDescriptor;
type OpenClawPluginCliRegistrar = import("./types.js").OpenClawPluginCliRegistrar;
type OpenClawPluginCommandDefinition = import("./types.js").OpenClawPluginCommandDefinition;
type PluginInteractiveHandlerRegistration =
import("./types.js").PluginInteractiveHandlerRegistration;
type OpenClawPluginGatewayRuntimeScopeSurface =
import("./types.js").OpenClawPluginGatewayRuntimeScopeSurface;
type OpenClawGatewayDiscoveryService = import("./types.js").OpenClawGatewayDiscoveryService;
type OpenClawPluginHttpRouteHandler = import("./types.js").OpenClawPluginHttpRouteHandler;
type OpenClawPluginHttpRouteMatch = import("./types.js").OpenClawPluginHttpRouteMatch;
type OpenClawPluginHostedMediaResolver = import("./types.js").OpenClawPluginHostedMediaResolver;
type OpenClawPluginReloadRegistration = import("./types.js").OpenClawPluginReloadRegistration;
type OpenClawPluginSecurityAuditCollector =
import("./types.js").OpenClawPluginSecurityAuditCollector;
type OpenClawPluginService = import("./types.js").OpenClawPluginService;
type OpenClawPluginToolFactory = import("./types.js").OpenClawPluginToolFactory;
type PluginConversationBindingResolvedEvent =
import("./types.js").PluginConversationBindingResolvedEvent;
type TypedPluginHookRegistration = import("./types.js").PluginHookRegistration;
type PluginLogger = import("./types.js").PluginLogger;
type PluginOrigin = import("./types.js").PluginOrigin;
type PluginTextTransformRegistration = import("./types.js").PluginTextTransformRegistration;
type MigrationProviderPlugin = import("./types.js").MigrationProviderPlugin;
type ProviderPlugin = import("./types.js").ProviderPlugin;
type RealtimeTranscriptionProviderPlugin = import("./types.js").RealtimeTranscriptionProviderPlugin;
type RealtimeVoiceProviderPlugin = import("./types.js").RealtimeVoiceProviderPlugin;
type SpeechProviderPlugin = import("./types.js").SpeechProviderPlugin;
type VideoGenerationProviderPlugin = import("./types.js").VideoGenerationProviderPlugin;
type WebFetchProviderPlugin = import("./types.js").WebFetchProviderPlugin;
type WebSearchProviderPlugin = import("./types.js").WebSearchProviderPlugin;
type WorkerProvider = import("./types.js").WorkerProvider;
type UnifiedModelCatalogProviderPlugin = import("./types.js").UnifiedModelCatalogProviderPlugin;
/** Agent tool factory registered by one plugin runtime. */
export type PluginToolRegistration = {
pluginId: string;
pluginName?: string;
factory: OpenClawPluginToolFactory;
names: string[];
declaredNames?: string[];
optional: boolean;
/** Loader-owned provenance. Missing values are conservative legacy registrations. */
origin?: PluginOrigin;
source: string;
rootDir?: string;
};
type PluginCliRegistration = {
pluginId: string;
pluginName?: string;
register: OpenClawPluginCliRegistrar;
parentPath: string[];
commands: string[];
descriptors: OpenClawPluginCliRootCommandDescriptor[];
source: string;
rootDir?: string;
};
/** Gateway HTTP route registered by a plugin runtime. */
export type PluginHttpRouteRegistration = {
pluginId?: string;
path: string;
handler: OpenClawPluginHttpRouteHandler;
handleUpgrade?: OpenClawPluginHttpRouteUpgradeHandler;
auth: OpenClawPluginHttpRouteAuth;
match: OpenClawPluginHttpRouteMatch;
gatewayRuntimeScopeSurface?: OpenClawPluginGatewayRuntimeScopeSurface;
gatewayMethodDispatchAllowed?: boolean;
nodeCapability?: {
surface: string;
ttlMs?: number;
};
source?: string;
};
type PluginHostedMediaResolverRegistration = {
pluginId: string;
pluginName?: string;
resolver: OpenClawPluginHostedMediaResolver;
source: string;
rootDir?: string;
};
export type PluginChannelRegistration = {
pluginId: string;
pluginName?: string;
plugin: ChannelPlugin;
/** Loader-owned provenance. Missing values are conservative legacy registrations. */
origin?: PluginOrigin;
source: string;
rootDir?: string;
};
type PluginChannelSetupRegistration = {
pluginId: string;
pluginName?: string;
plugin: ChannelPlugin;
/** Loader-owned provenance. Missing values are conservative legacy registrations. */
origin?: PluginOrigin;
source: string;
enabled: boolean;
rootDir?: string;
};
type PluginProviderRegistration = {
pluginId: string;
pluginName?: string;
provider: ProviderPlugin;
source: string;
rootDir?: string;
};
type PluginModelCatalogProviderRegistration = {
pluginId: string;
pluginName?: string;
provider: UnifiedModelCatalogProviderPlugin;
source: string;
rootDir?: string;
};
type PluginSessionCatalogRegistration = {
pluginId: string;
pluginName?: string;
provider: SessionCatalogProvider;
source: string;
rootDir?: string;
};
export type PluginDashboardDataBindingRegistration = PluginManifestDashboardDataBinding & {
pluginId: string;
capabilityId: string;
handler: GatewayRequestHandlers[string];
};
export type PluginDashboardActionVerbRegistration = PluginManifestDashboardActionVerb & {
pluginId: string;
capabilityId: string;
handler: GatewayRequestHandlers[string];
};
type PluginCliBackendRegistration = {
pluginId: string;
pluginName?: string;
builtWithOpenClawVersion?: string;
backend: CliBackendPlugin;
source: string;
rootDir?: string;
};
export type PluginTextTransformsRegistration = {
pluginId: string;
pluginName?: string;
transforms: PluginTextTransformRegistration;
source: string;
rootDir?: string;
};
type PluginOwnedProviderRegistration<T extends { id: string }> = {
pluginId: string;
pluginName?: string;
provider: T;
source: string;
rootDir?: string;
};
type PluginSpeechProviderRegistration = PluginOwnedProviderRegistration<SpeechProviderPlugin>;
type PluginEmbeddingProviderRegistration =
PluginOwnedProviderRegistration<EmbeddingProviderAdapter>;
type PluginRealtimeTranscriptionProviderRegistration =
PluginOwnedProviderRegistration<RealtimeTranscriptionProviderPlugin>;
type PluginRealtimeVoiceProviderRegistration =
PluginOwnedProviderRegistration<RealtimeVoiceProviderPlugin>;
type PluginMediaUnderstandingProviderRegistration =
PluginOwnedProviderRegistration<MediaUnderstandingProviderPlugin>;
type PluginTranscriptsSourceProviderRegistration =
PluginOwnedProviderRegistration<TranscriptSourceProvider>;
type PluginImageGenerationProviderRegistration =
PluginOwnedProviderRegistration<ImageGenerationProviderPlugin>;
type PluginVideoGenerationProviderRegistration =
PluginOwnedProviderRegistration<VideoGenerationProviderPlugin>;
type PluginMusicGenerationProviderRegistration =
PluginOwnedProviderRegistration<MusicGenerationProviderPlugin>;
type PluginWebFetchProviderRegistration = PluginOwnedProviderRegistration<WebFetchProviderPlugin>;
type PluginWebSearchProviderRegistration = PluginOwnedProviderRegistration<WebSearchProviderPlugin>;
type PluginWorkerProviderRegistration = PluginOwnedProviderRegistration<WorkerProvider>;
type PluginMigrationProviderRegistration = PluginOwnedProviderRegistration<MigrationProviderPlugin>;
type PluginMemoryEmbeddingProviderRegistration =
PluginOwnedProviderRegistration<MemoryEmbeddingProviderAdapter>;
type PluginCodexAppServerExtensionFactoryRegistration = {
pluginId: string;
pluginName?: string;
rawFactory: CodexAppServerExtensionFactory;
factory: CodexAppServerExtensionFactory;
source: string;
rootDir?: string;
};
export type PluginAgentToolResultMiddlewareRegistration = {
pluginId: string;
pluginName?: string;
rawHandler: AgentToolResultMiddleware;
handler: AgentToolResultMiddleware;
runtimes: AgentToolResultMiddlewareRuntime[];
scopes?: AgentToolResultMiddlewareScope[];
source: string;
rootDir?: string;
};
export type PluginAgentToolResultMiddlewareOwner = {
pluginId: string;
runtimes: AgentToolResultMiddlewareRuntime[];
manifest: PluginManifestRecord;
};
type PluginAgentHarnessRegistration = {
pluginId: string;
pluginName?: string;
harness: AgentHarness;
source: string;
rootDir?: string;
};
type PluginHookRegistration = {
pluginId: string;
entry: HookEntry;
events: string[];
source: string;
rootDir?: string;
};
export type PluginServiceRegistration = {
pluginId: string;
pluginName?: string;
service: OpenClawPluginService;
source: string;
origin: PluginOrigin;
trustedOfficialInstall?: boolean;
rootDir?: string;
};
export type PluginGatewayDiscoveryServiceRegistration = {
pluginId: string;
pluginName?: string;
service: OpenClawGatewayDiscoveryService;
source: string;
rootDir?: string;
};
type PluginReloadRegistration = {
pluginId: string;
pluginName?: string;
registration: OpenClawPluginReloadRegistration;
source: string;
rootDir?: string;
};
export type PluginNodeHostCommandRegistration = {
pluginId: string;
pluginName?: string;
command: import("./types.js").OpenClawPluginNodeHostCommand;
source: string;
rootDir?: string;
};
type PluginNodeInvokePolicyRegistration = {
pluginId: string;
pluginName?: string;
policy: import("./types.js").OpenClawPluginNodeInvokePolicy;
pluginConfig?: Record<string, unknown>;
source: string;
rootDir?: string;
};
type PluginSecurityAuditCollectorRegistration = {
pluginId: string;
pluginName?: string;
collector: OpenClawPluginSecurityAuditCollector;
source: string;
rootDir?: string;
};
export type PluginCommandRegistration = {
pluginId: string;
pluginName?: string;
command: OpenClawPluginCommandDefinition;
source: string;
rootDir?: string;
trustedOwnerStatusExposure?: true;
};
type PluginLegacyInternalHookRegistration = {
pluginId: string;
name: string;
event: string;
handler: InternalHookHandler;
};
type PluginSessionDiscussionRegistration = {
pluginId: string;
provider: SessionDiscussionProvider;
};
type PluginInteractiveHandlerRegistryRegistration = PluginInteractiveHandlerRegistration & {
pluginId: string;
pluginName?: string;
pluginRoot?: string;
};
type PluginSessionExtensionRegistryRegistration = {
pluginId: string;
pluginName?: string;
extension: PluginSessionExtensionRegistration;
source: string;
rootDir?: string;
};
export type PluginTrustedToolPolicyRegistryRegistration = {
pluginId: string;
pluginName?: string;
policy: PluginTrustedToolPolicyRegistration;
origin?: PluginRecord["origin"];
source: string;
rootDir?: string;
};
type PluginToolMetadataRegistryRegistration = {
pluginId: string;
pluginName?: string;
metadata: PluginToolMetadataRegistration;
source: string;
rootDir?: string;
};
type PluginControlUiDescriptorRegistryRegistration = {
pluginId: string;
pluginName?: string;
descriptor: PluginControlUiDescriptor;
source: string;
rootDir?: string;
};
type PluginRuntimeLifecycleRegistryRegistration = {
pluginId: string;
pluginName?: string;
lifecycle: PluginRuntimeLifecycleRegistration;
source: string;
rootDir?: string;
};
type PluginAgentEventSubscriptionRegistryRegistration = {
pluginId: string;
pluginName?: string;
subscription: PluginAgentEventSubscriptionRegistration;
source: string;
rootDir?: string;
};
type PluginSessionSchedulerJobRegistryRegistration = {
pluginId: string;
pluginName?: string;
job: PluginSessionSchedulerJobRegistration;
generation?: number;
source: string;
rootDir?: string;
};
export type PluginSessionActionRegistryRegistration = {
pluginId: string;
pluginName?: string;
action: PluginSessionActionRegistration;
source: string;
rootDir?: string;
};
type PluginConversationBindingResolvedHandlerRegistration = {
pluginId: string;
pluginName?: string;
pluginRoot?: string;
handler: (event: PluginConversationBindingResolvedEvent) => void | Promise<void>;
source: string;
rootDir?: string;
};
export type PluginRecord = {
id: string;
name: string;
packageVersion?: string;
version?: string;
builtWithOpenClawVersion?: string;
packageName?: string;
description?: string;
format?: PluginFormat;
bundleFormat?: PluginBundleFormat;
bundleCapabilities?: string[];
kind?: PluginKind | PluginKind[];
source: string;
rootDir?: string;
origin: PluginOrigin;
workspaceDir?: string;
trustedOfficialInstall?: boolean;
enabled: boolean;
explicitlyEnabled?: boolean;
activated?: boolean;
imported?: boolean;
compat?: readonly PluginCompatCode[];
activationSource?: PluginActivationSource;
activationReason?: string;
status: "loaded" | "disabled" | "error";
error?: string;
failedAt?: Date;
failurePhase?: "validation" | "load" | "register";
toolNames: string[];
hookNames: string[];
channelIds: string[];
cliBackendIds: string[];
providerIds: string[];
syntheticAuthRefs?: string[];
embeddingProviderIds: string[];
speechProviderIds: string[];
realtimeTranscriptionProviderIds: string[];
realtimeVoiceProviderIds: string[];
mediaUnderstandingProviderIds: string[];
transcriptSourceProviderIds: string[];
imageGenerationProviderIds: string[];
videoGenerationProviderIds: string[];
musicGenerationProviderIds: string[];
webFetchProviderIds: string[];
webSearchProviderIds: string[];
migrationProviderIds: string[];
contextEngineIds?: string[];
memoryEmbeddingProviderIds: string[];
agentHarnessIds: string[];
cliCommands: string[];
services: string[];
gatewayDiscoveryServiceIds: string[];
commands: string[];
httpRoutes: number;
hookCount: number;
configSchema: boolean;
configUiHints?: Record<string, PluginConfigUiHint>;
configJsonSchema?: JsonSchemaObject;
contracts?: PluginManifestContracts;
dashboard?: PluginManifestDashboard;
mcpServers?: Record<string, PluginManifestMcpServer>;
memorySlotSelected?: boolean;
dependencyStatus?: PluginDependencyStatus;
};
export type PluginRegistry = {
plugins: PluginRecord[];
tools: PluginToolRegistration[];
hooks: PluginHookRegistration[];
typedHooks: TypedPluginHookRegistration[];
channels: PluginChannelRegistration[];
channelSetups: PluginChannelSetupRegistration[];
providers: PluginProviderRegistration[];
modelCatalogProviders: PluginModelCatalogProviderRegistration[];
sessionCatalogs: PluginSessionCatalogRegistration[];
cliBackends: PluginCliBackendRegistration[];
textTransforms: PluginTextTransformsRegistration[];
embeddingProviders: PluginEmbeddingProviderRegistration[];
speechProviders: PluginSpeechProviderRegistration[];
realtimeTranscriptionProviders: PluginRealtimeTranscriptionProviderRegistration[];
realtimeVoiceProviders: PluginRealtimeVoiceProviderRegistration[];
mediaUnderstandingProviders: PluginMediaUnderstandingProviderRegistration[];
transcriptSourceProviders: PluginTranscriptsSourceProviderRegistration[];
imageGenerationProviders: PluginImageGenerationProviderRegistration[];
videoGenerationProviders: PluginVideoGenerationProviderRegistration[];
musicGenerationProviders: PluginMusicGenerationProviderRegistration[];
webFetchProviders: PluginWebFetchProviderRegistration[];
webSearchProviders: PluginWebSearchProviderRegistration[];
workerProviders: Map<string, PluginWorkerProviderRegistration>;
migrationProviders: PluginMigrationProviderRegistration[];
codexAppServerExtensionFactories: PluginCodexAppServerExtensionFactoryRegistration[];
agentToolResultMiddlewareOwners: PluginAgentToolResultMiddlewareOwner[];
agentToolResultMiddlewares: PluginAgentToolResultMiddlewareRegistration[];
memoryEmbeddingProviders: PluginMemoryEmbeddingProviderRegistration[];
agentHarnesses: PluginAgentHarnessRegistration[];
pluginRuntimeArtifacts: Map<string, ResolvedPluginRuntimeArtifact>;
compactionProviders: RegisteredCompactionProvider[];
detachedTaskRuntimes: DetachedTaskLifecycleRuntimeRegistration[];
legacyInternalHooks: PluginLegacyInternalHookRegistration[];
memoryCapabilities: MemoryPluginCapabilityRegistration[];
memoryCorpusSupplements: MemoryCorpusSupplementRegistration[];
memoryPromptPreparations: MemoryPromptPreparationRegistration[];
memoryPromptSupplements: MemoryPromptSupplementRegistration[];
sessionDiscussionProviders: Map<string, PluginSessionDiscussionRegistration>;
contextEngines: Map<string, ContextEngineRegistration>;
commandRegistryLocked: boolean;
gatewayHandlers: GatewayRequestHandlers;
gatewayMethodDescriptors: GatewayMethodDescriptor[];
dashboardDataBindings: Map<string, PluginDashboardDataBindingRegistration>;
dashboardActionVerbs: Map<string, PluginDashboardActionVerbRegistration>;
coreGatewayMethodNames: string[];
httpRoutes: PluginHttpRouteRegistration[];
hostedMediaResolvers: PluginHostedMediaResolverRegistration[];
mcpServerConnectionResolvers: PluginMcpServerConnectionResolverRegistration[];
cliRegistrars: PluginCliRegistration[];
reloads: PluginReloadRegistration[];
nodeHostCommands: PluginNodeHostCommandRegistration[];
nodeInvokePolicies: PluginNodeInvokePolicyRegistration[];
securityAuditCollectors: PluginSecurityAuditCollectorRegistration[];
services: PluginServiceRegistration[];
gatewayDiscoveryServices: PluginGatewayDiscoveryServiceRegistration[];
commands: PluginCommandRegistration[];
interactiveHandlers: PluginInteractiveHandlerRegistryRegistration[];
sessionExtensions: PluginSessionExtensionRegistryRegistration[];
trustedToolPolicies: PluginTrustedToolPolicyRegistryRegistration[];
toolMetadata: PluginToolMetadataRegistryRegistration[];
controlUiDescriptors: PluginControlUiDescriptorRegistryRegistration[];
runtimeLifecycles: PluginRuntimeLifecycleRegistryRegistration[];
agentEventSubscriptions: PluginAgentEventSubscriptionRegistryRegistration[];
sessionSchedulerJobs: PluginSessionSchedulerJobRegistryRegistration[];
sessionActions: PluginSessionActionRegistryRegistration[];
conversationBindingResolvedHandlers: PluginConversationBindingResolvedHandlerRegistration[];
diagnostics: PluginDiagnostic[];
};
export type PluginRegistryParams = {
logger: PluginLogger;
coreGatewayHandlers?: GatewayRequestHandlers;
coreGatewayMethodNames?: readonly string[];
runtime: PluginRuntime;
hostServices?: {
/** May be a live accessor; plugin APIs must read it at call time. */
cron?: import("../cron/service-contract.js").CronServiceContract;
};
activateGlobalSideEffects?: boolean;
};