import { emptyPluginConfigSchema } from "../plugins/config-schema.js"; import type { OpenClawPluginApi, OpenClawPluginCommandDefinition, OpenClawPluginConfigSchema, OpenClawPluginDefinition, PluginInteractiveTelegramHandlerContext, } from "../plugins/types.js"; export type { AnyAgentTool, MediaUnderstandingProviderPlugin, OpenClawPluginApi, PluginCommandContext, OpenClawPluginConfigSchema, ProviderDiscoveryContext, ProviderCatalogContext, ProviderCatalogResult, ProviderAugmentModelCatalogContext, ProviderBuiltInModelSuppressionContext, ProviderBuiltInModelSuppressionResult, ProviderBuildMissingAuthMessageContext, ProviderCacheTtlEligibilityContext, ProviderDefaultThinkingPolicyContext, ProviderFetchUsageSnapshotContext, ProviderModernModelPolicyContext, ProviderPreparedRuntimeAuth, ProviderResolvedUsageAuth, ProviderPrepareExtraParamsContext, ProviderPrepareDynamicModelContext, ProviderPrepareRuntimeAuthContext, ProviderResolveUsageAuthContext, ProviderResolveDynamicModelContext, ProviderNormalizeResolvedModelContext, ProviderRuntimeModel, SpeechProviderPlugin, ProviderThinkingPolicyContext, ProviderWrapStreamFnContext, OpenClawPluginService, OpenClawPluginServiceContext, ProviderAuthContext, ProviderAuthDoctorHintContext, ProviderAuthMethodNonInteractiveContext, ProviderAuthMethod, ProviderAuthResult, OpenClawPluginCommandDefinition, OpenClawPluginDefinition, PluginLogger, PluginInteractiveTelegramHandlerContext, } from "../plugins/types.js"; export type { OpenClawConfig } from "../config/config.js"; export { emptyPluginConfigSchema } from "../plugins/config-schema.js"; /** Options for a plugin entry that registers providers, tools, commands, or services. */ type DefinePluginEntryOptions = { id: string; name: string; description: string; kind?: OpenClawPluginDefinition["kind"]; configSchema?: OpenClawPluginConfigSchema | (() => OpenClawPluginConfigSchema); register: (api: OpenClawPluginApi) => void; }; /** Normalized object shape that OpenClaw loads from a plugin entry module. */ type DefinedPluginEntry = { id: string; name: string; description: string; configSchema: OpenClawPluginConfigSchema; register: NonNullable; } & Pick; /** Resolve either a concrete config schema or a lazy schema factory. */ function resolvePluginConfigSchema( configSchema: DefinePluginEntryOptions["configSchema"] = emptyPluginConfigSchema, ): OpenClawPluginConfigSchema { return typeof configSchema === "function" ? configSchema() : configSchema; } /** * Canonical entry helper for non-channel plugins. * * Use this for provider, tool, command, service, memory, and context-engine * plugins. Channel plugins should use `defineChannelPluginEntry(...)` from * `openclaw/plugin-sdk/core` so they inherit the channel capability wiring. */ export function definePluginEntry({ id, name, description, kind, configSchema = emptyPluginConfigSchema, register, }: DefinePluginEntryOptions): DefinedPluginEntry { return { id, name, description, ...(kind ? { kind } : {}), configSchema: resolvePluginConfigSchema(configSchema), register, }; }