import { attachPluginApiFacades, type OpenClawPluginApiWithoutFacades, } from "../plugins/api-facades.js"; import type { OpenClawPluginApi } from "./plugin-runtime.js"; export type TestPluginApiInput = Partial; export function createTestPluginApi(api: TestPluginApiInput = {}): OpenClawPluginApi { const { agent, lifecycle, runContext, session, ...flatApi } = api; const mergedApi = { id: "test-plugin", name: "test-plugin", source: "test", registrationMode: "full", config: {}, runtime: {} as OpenClawPluginApi["runtime"], logger: { info() {}, warn() {}, error() {}, debug() {} }, registerTool() {}, registerHook() {}, registerHttpRoute() {}, registerHostedMediaResolver() {}, registerChannel() {}, registerGatewayMethod() {}, registerCli() {}, registerNodeCliFeature() {}, registerCliBackend() {}, registerTextTransforms() {}, registerService() {}, registerGatewayDiscoveryService() {}, registerReload() {}, registerNodeHostCommand() {}, registerNodeInvokePolicy() {}, registerSecurityAuditCollector() {}, registerConfigMigration() {}, registerMigrationProvider() {}, registerAutoEnableProbe() {}, registerProvider() {}, registerModelCatalogProvider() {}, registerSpeechProvider() {}, registerRealtimeTranscriptionProvider() {}, registerRealtimeVoiceProvider() {}, registerMediaUnderstandingProvider() {}, registerImageGenerationProvider() {}, registerMusicGenerationProvider() {}, registerVideoGenerationProvider() {}, registerWebFetchProvider() {}, registerWebSearchProvider() {}, registerInteractiveHandler() {}, onConversationBindingResolved() {}, registerCommand() {}, registerContextEngine() {}, registerCompactionProvider() {}, registerAgentHarness() {}, registerCodexAppServerExtensionFactory() {}, registerAgentToolResultMiddleware() {}, registerDetachedTaskRuntime() {}, registerSessionExtension() {}, enqueueNextTurnInjection: async (injection) => ({ enqueued: false, id: "", sessionKey: injection.sessionKey, }), registerTrustedToolPolicy() {}, registerToolMetadata() {}, registerControlUiDescriptor() {}, registerRuntimeLifecycle() {}, registerAgentEventSubscription() {}, emitAgentEvent: () => ({ emitted: false as const, reason: "test api" }), setRunContext: () => false, getRunContext: () => undefined, clearRunContext() {}, registerSessionSchedulerJob: () => undefined, registerSessionAction() {}, sendSessionAttachment: async () => ({ ok: false, error: "test plugin api" }), scheduleSessionTurn: async () => undefined, unscheduleSessionTurnsByTag: async () => ({ removed: 0, failed: 0 }), registerMemoryCapability() {}, registerMemoryPromptSection() {}, registerMemoryPromptSupplement() {}, registerMemoryCorpusSupplement() {}, registerMemoryFlushPlan() {}, registerMemoryRuntime() {}, registerMemoryEmbeddingProvider() {}, resolvePath(input: string) { return input; }, on() {}, ...flatApi, } as OpenClawPluginApiWithoutFacades; const withFacades = attachPluginApiFacades(mergedApi); return { ...withFacades, ...(agent ? { agent } : {}), ...(lifecycle ? { lifecycle } : {}), ...(runContext ? { runContext } : {}), ...(session ? { session } : {}), }; }